Commit 78e23f0f677dd1ef0bc676b21b465b2223a25ca7
Exists in
master
优化excel
Showing
4 changed files
with
65 additions
and
27 deletions
Show diff stats
build.gradle
src/main/java/com/taover/util/UtilExcel.java
... | ... | @@ -2,6 +2,7 @@ package com.taover.util; |
2 | 2 | |
3 | 3 | import java.io.File; |
4 | 4 | import java.io.FileOutputStream; |
5 | +import java.math.BigDecimal; | |
5 | 6 | import java.text.DecimalFormat; |
6 | 7 | import java.text.SimpleDateFormat; |
7 | 8 | import java.util.ArrayList; |
... | ... | @@ -10,7 +11,9 @@ import java.util.HashMap; |
10 | 11 | import java.util.List; |
11 | 12 | import java.util.Map; |
12 | 13 | |
14 | +import org.apache.poi.hssf.usermodel.HSSFDataFormatter; | |
13 | 15 | import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
16 | +import org.apache.poi.openxml4j.util.ZipSecureFile; | |
14 | 17 | import org.apache.poi.ss.usermodel.Cell; |
15 | 18 | import org.apache.poi.ss.usermodel.CellStyle; |
16 | 19 | import org.apache.poi.ss.usermodel.CellType; |
... | ... | @@ -28,7 +31,11 @@ public class UtilExcel { |
28 | 31 | private final static String CSV =".csv"; //csv |
29 | 32 | |
30 | 33 | private final static int maxExcelRowNum = 10000; |
31 | - private final static int maxExcelColumnNum = 50; | |
34 | + private final static int maxExcelColumnNum = 100; | |
35 | + | |
36 | + static { | |
37 | + ZipSecureFile.setMinInflateRatio(-1.0d); | |
38 | + } | |
32 | 39 | |
33 | 40 | /** |
34 | 41 | * 描述:根据文件后缀,自适应上传文件的版本 |
... | ... | @@ -382,10 +389,6 @@ public class UtilExcel { |
382 | 389 | } |
383 | 390 | Workbook wb = UtilExcel.getWorkbook(filepath, true); |
384 | 391 | Sheet sheet = wb.getSheetAt(sheetIndex); |
385 | - int end = sheet.getLastRowNum(); | |
386 | - if(end > UtilExcel.maxExcelRowNum){ | |
387 | - throw new Exception("目前系统只支持读取10000行以内记录,您当前Excel行数过大"); | |
388 | - } | |
389 | 392 | return readExcelBySheet(sheet, UtilExcel.maxExcelRowNum, false); |
390 | 393 | } |
391 | 394 | |
... | ... | @@ -395,11 +398,7 @@ public class UtilExcel { |
395 | 398 | |
396 | 399 | private static List<List<Object>> readExcelBySheetIndex(Workbook wb, int sheetIndex, boolean hasRowLimit) throws Exception{ |
397 | 400 | Sheet sheet = wb.getSheetAt(sheetIndex); |
398 | - int end = sheet.getLastRowNum(); | |
399 | 401 | if(hasRowLimit){ |
400 | - if(end > UtilExcel.maxExcelRowNum) { | |
401 | - throw new Exception("目前系统只支持读取10000行以内记录,您当前Excel行数过大"); | |
402 | - } | |
403 | 402 | return readExcelBySheet(sheet, UtilExcel.maxExcelRowNum, false); |
404 | 403 | }else { |
405 | 404 | return readExcelBySheet(sheet, Integer.MAX_VALUE, false); |
... | ... | @@ -454,14 +453,43 @@ public class UtilExcel { |
454 | 453 | if(currCellType.compareTo(CellType.STRING) == 0){ |
455 | 454 | return UtilString.trimCodePage(cell.getRichStringCellValue().getString()); |
456 | 455 | }else if(currCellType.compareTo(CellType.NUMERIC) == 0){ |
457 | - if (cell.getCellStyle().getDataFormat()==28||cell.getCellStyle().getDataFormat()==31 || cell.getCellStyle().getDataFormat() == 58) { | |
458 | - // 如果是date类型则 ,获取该cell的date值 | |
459 | - return new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.getJavaDate(cell.getNumericCellValue())); | |
460 | - } else { | |
461 | - // 纯数字gaoming 新增兼容浮点型,转成字符串读取,不然小数点被省略了 | |
462 | - cell.setCellType(CellType.STRING); | |
463 | - return UtilString.trimCodePage(cell.getRichStringCellValue().getString()); | |
456 | + | |
457 | + /** | |
458 | + * yyyy-MM-dd----- 14 | |
459 | + yyyy年m月d日--- 31 | |
460 | + yyyy年m月------- 57 | |
461 | + m月d日 ---------- 58 | |
462 | + HH:mm----------- 20 | |
463 | + h时mm分 ------- 32 | |
464 | + yyyy-MM-dd HH:hh:ss 22 | |
465 | + */ | |
466 | + System.out.println(cell.getCellStyle().getDataFormat()); | |
467 | + short format = cell.getCellStyle().getDataFormat(); | |
468 | + if (cell.getCellStyle().getDataFormat()==28 || cell.getCellStyle().getDataFormat()==22||cell.getCellStyle().getDataFormat()==31 | |
469 | + || cell.getCellStyle().getDataFormat() == 58 || cell.getCellStyle().getDataFormat()==14 | |
470 | + || cell.getCellStyle().getDataFormat()==57 || cell.getCellStyle().getDataFormat()==32 || cell.getCellStyle().getDataFormat()==20) { | |
471 | + | |
472 | + // 如果是date类型则 ,获取该cell的date值 | |
473 | + //return new SimpleDateFormat("yyyy-MM-dd").format(DateUtil.getJavaDate(cell.getNumericCellValue())); | |
474 | + SimpleDateFormat sdf = null; | |
475 | + if(format == 14 || format == 31 || format == 57 || format == 58){ | |
476 | + //日期 | |
477 | + sdf = new SimpleDateFormat("yyyy-MM-dd"); | |
478 | + }else if (format == 20 || format == 32) { | |
479 | + //时间 | |
480 | + sdf = new SimpleDateFormat("HH:mm"); | |
481 | + }else { | |
482 | + sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | |
483 | + } | |
484 | + double value = cell.getNumericCellValue(); | |
485 | + Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value); | |
486 | + return sdf.format(date); | |
487 | + } else { | |
488 | + //gaoming 这个是poi自带获取value通用,如果再有问题就用这个试试!!!此处用于获取纯数字和小数类型 | |
489 | + HSSFDataFormatter dataFormatter = new HSSFDataFormatter(); | |
490 | + return dataFormatter.formatCellValue(cell); | |
464 | 491 | } |
492 | + | |
465 | 493 | }else if(currCellType.compareTo(CellType.BOOLEAN) == 0){ |
466 | 494 | return cell.getBooleanCellValue(); |
467 | 495 | }else if(currCellType.compareTo(CellType.FORMULA) == 0){ |
... | ... | @@ -492,16 +520,13 @@ public class UtilExcel { |
492 | 520 | } |
493 | 521 | Workbook wb = UtilExcel.getWorkbook(filepath, true); |
494 | 522 | Sheet sheet = wb.getSheetAt(sheetIndex); |
495 | - int end = sheet.getLastRowNum(); | |
496 | - if(end > UtilExcel.maxExcelRowNum){ | |
497 | - throw new Exception("目前系统只支持读取10000行以内记录,您当前Excel行数过大"); | |
498 | - } | |
499 | 523 | return readExcelBySheet(sheet, UtilExcel.maxExcelRowNum, true); |
500 | 524 | } |
501 | 525 | |
502 | 526 | public static void main(String args[]){ |
503 | 527 | //String filepath = "C:\\Users\\root\\Desktop\\千丁-6.27.xlsx"; |
504 | - String filepath = "C:\\Users\\gaoming\\Desktop\\jvm_crash.xls"; | |
528 | + String filepath = "C:\\Users\\gaoming\\Desktop\\测试返单数量.xlsx"; | |
529 | + //String filepath = "C:\\Users\\EDZ\\Desktop\\aaa.xlsx"; | |
505 | 530 | List<List<Object>> data = null; |
506 | 531 | |
507 | 532 | try { |
... | ... | @@ -513,10 +538,12 @@ public class UtilExcel { |
513 | 538 | System.out.println((end-start)/1000); |
514 | 539 | |
515 | 540 | |
516 | - System.out.println(map); | |
517 | -// data = map.get("0"); | |
518 | -// | |
519 | -// System.out.println(data); | |
541 | + //System.out.println(map); | |
542 | + data = map.get("0"); | |
543 | + System.out.println(data); | |
544 | + for (int i = 0; i < data.size(); i++) { | |
545 | + System.out.println(data.get(i).get(1)); | |
546 | + } | |
520 | 547 | // System.out.println(data.size()); |
521 | 548 | // System.out.println(UtilExcel.readExcelAllSheetMap(filepath)); |
522 | 549 | } catch (Exception e) { | ... | ... |
src/main/java/com/taover/util/UtilString.java
... | ... | @@ -45,7 +45,7 @@ public class UtilString { |
45 | 45 | } |
46 | 46 | |
47 | 47 | Pattern pattern = Pattern.compile("\\S"); |
48 | - int endIndex = source.length(); | |
48 | + int endIndex = source.length()-1; | |
49 | 49 | for(int i=source.length()-1; i>=0; --i){ |
50 | 50 | char data = source.charAt(i); |
51 | 51 | if(pattern.matcher(data+"").find()){ | ... | ... |
src/test/java/TempExcel.java
... | ... | @@ -9,6 +9,17 @@ import com.taover.util.UtilExcel; |
9 | 9 | |
10 | 10 | public class TempExcel { |
11 | 11 | public static void main(String[] args){ |
12 | + checkExcelError(); | |
13 | + } | |
14 | + | |
15 | + public static void checkExcelError() { | |
16 | + List<List<Object>> data = null; | |
17 | + try { | |
18 | + data = UtilExcel.readExcelAllSheet("C:\\Users\\Administrator\\Desktop\\异常Excel\\大文件测试2.xlsx"); | |
19 | + } catch (Exception e) { | |
20 | + e.printStackTrace(); | |
21 | + } | |
22 | + System.out.println("end"); | |
12 | 23 | //dealExcel(); |
13 | 24 | readExcel(); |
14 | 25 | } | ... | ... |