From 33e994e5312932fcdc0bc464cbbb80887b97afd3 Mon Sep 17 00:00:00 2001 From: Jiaju Zhuang Date: Wed, 25 Sep 2019 18:41:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D07=E7=89=88=E6=95=B4=E4=B8=AA?= =?UTF-8?q?excel=E4=BB=85=E5=AD=98=E5=9C=A8=E6=95=B0=E5=AD=97=E6=97=B6?= =?UTF-8?q?=E4=BC=9A=E5=87=BA=E7=8E=B0=E7=9A=84NPE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- quickstart.md | 2 ++ .../excel/analysis/v07/XlsxSaxAnalyser.java | 17 +++++++++++------ .../v07/handlers/DefaultCellHandler.java | 3 +-- .../com/alibaba/excel/util/NumberUtils.java | 6 +++++- .../easyexcel/test/temp/simple/HgTest.java | 2 +- update.md | 4 ++++ 7 files changed, 25 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index 3e76a55..52bfae0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.alibaba easyexcel - 2.0.3 + 2.0.4 jar easyexcel diff --git a/quickstart.md b/quickstart.md index cc968c9..ecee760 100644 --- a/quickstart.md +++ b/quickstart.md @@ -7,9 +7,11 @@ * 单个文件的并发写入、读取 * 读取图片 * 宏 +ClassNotFoundException与java.lang.NoClassDefFoundError的区别 * csv读取(这个后续可能会考虑) #### 常见问题 * 关于@Data,读写的对象都用到了[Lombok](https://www.projectlombok.org/),他会自动生成`get`,`set` ,如果不需要的话,自己创建对象并生成`get`,`set` 。 +* 出现`NoSuchMethodException`,`ClassNotFoundException`,`NoClassDefFoundError`极大概率是jar冲突,建议`clean`项目,或者统一`poi` 的版本,理论上来说`easyexcel`兼容poi的`3.17`,`4.0.1`,`4.1.0`所有较新版本 * 如果在读的时候`Listener`里面需要使用spring的`@Autowired`,给`Listener`创建成员变量,然后在构造方法里面传进去。而别必须不让spring管理`Listener`,每次读取都要`new`一个。 * 如果用`String`去接收数字,出现小数点等情况,这个是BUG,但是很难修复,后续版本会修复这个问题。目前请使用`@NumberFormat`直接,里面的参数就是调用了java自带的`NumberFormat.format`方法,不知道怎么入参的可以自己网上查询。 #### 详细参数介绍 diff --git a/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java b/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java index f16f926..2a8b36e 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/XlsxSaxAnalyser.java @@ -33,6 +33,7 @@ import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.exception.ExcelAnalysisException; import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.excel.read.metadata.holder.ReadWorkbookHolder; +import com.alibaba.excel.util.CollectionUtils; import com.alibaba.excel.util.FileUtils; /** @@ -60,14 +61,18 @@ public class XlsxSaxAnalyser implements ExcelExecutor { OPCPackage pkg = readOpcPackage(readWorkbookHolder, decryptedStream); readWorkbookHolder.setOpcPackage(pkg); - PackagePart sharedStringsTablePackagePart = - pkg.getPartsByContentType(XSSFRelation.SHARED_STRINGS.getContentType()).get(0); - // Specify default cache - defaultReadCache(readWorkbookHolder, sharedStringsTablePackagePart); + ArrayList packageParts = pkg.getPartsByContentType(XSSFRelation.SHARED_STRINGS.getContentType()); - // Analysis sharedStringsTable.xml - analysisSharedStringsTable(sharedStringsTablePackagePart.getInputStream(), readWorkbookHolder); + if (!CollectionUtils.isEmpty(packageParts)) { + PackagePart sharedStringsTablePackagePart = packageParts.get(0); + + // Specify default cache + defaultReadCache(readWorkbookHolder, sharedStringsTablePackagePart); + + // Analysis sharedStringsTable.xml + analysisSharedStringsTable(sharedStringsTablePackagePart.getInputStream(), readWorkbookHolder); + } XSSFReader xssfReader = new XSSFReader(pkg); analysisUse1904WindowDate(xssfReader, readWorkbookHolder); diff --git a/src/main/java/com/alibaba/excel/analysis/v07/handlers/DefaultCellHandler.java b/src/main/java/com/alibaba/excel/analysis/v07/handlers/DefaultCellHandler.java index c21d6cc..0d44a95 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/handlers/DefaultCellHandler.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/handlers/DefaultCellHandler.java @@ -27,7 +27,6 @@ import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.util.BooleanUtils; import com.alibaba.excel.util.PositionUtils; -import com.alibaba.excel.util.StringUtils; /** * Cell Handler @@ -106,6 +105,7 @@ public class DefaultCellHandler implements XlsxCellHandler, XlsxRowResultHolder @Override public void endHandle(String name) { + currentTagDeque.pop(); // cell is formula if (CELL_FORMULA_TAG.equals(name)) { currentCellData.setFormulaValue(formulaStringBuilder.toString()); @@ -158,7 +158,6 @@ public class DefaultCellHandler implements XlsxCellHandler, XlsxRowResultHolder currentCellData.checkEmpty(); curRowContent.put(curCol, currentCellData); } - currentTagDeque.pop(); } @Override diff --git a/src/main/java/com/alibaba/excel/util/NumberUtils.java b/src/main/java/com/alibaba/excel/util/NumberUtils.java index 791687d..e687fbf 100644 --- a/src/main/java/com/alibaba/excel/util/NumberUtils.java +++ b/src/main/java/com/alibaba/excel/util/NumberUtils.java @@ -26,7 +26,11 @@ public class NumberUtils { public static String format(Number num, ExcelContentProperty contentProperty) { if (contentProperty == null || contentProperty.getNumberFormatProperty() == null || StringUtils.isEmpty(contentProperty.getNumberFormatProperty().getFormat())) { - return num.toString(); + if (num instanceof BigDecimal) { + return ((BigDecimal)num).toPlainString(); + } else { + return num.toString(); + } } String format = contentProperty.getNumberFormatProperty().getFormat(); RoundingMode roundingMode = contentProperty.getNumberFormatProperty().getRoundingMode(); diff --git a/src/test/java/com/alibaba/easyexcel/test/temp/simple/HgTest.java b/src/test/java/com/alibaba/easyexcel/test/temp/simple/HgTest.java index 1f1db7b..eed6f92 100644 --- a/src/test/java/com/alibaba/easyexcel/test/temp/simple/HgTest.java +++ b/src/test/java/com/alibaba/easyexcel/test/temp/simple/HgTest.java @@ -24,7 +24,7 @@ public class HgTest { @Test public void hh() throws IOException { List list = - EasyExcel.read(new FileInputStream("D:\\test\\折扣2007.xls")).headRowNumber(0).sheet().doReadSync(); + EasyExcel.read(new FileInputStream("D:\\test\\1.xls")).headRowNumber(0).sheet().doReadSync(); for (Object data : list) { LOGGER.info("返回数据:{}", JSON.toJSONString(data)); } diff --git a/update.md b/update.md index 577c414..9d91b9f 100644 --- a/update.md +++ b/update.md @@ -1,3 +1,7 @@ +# 2.0.4 +* 修复07版整个excel仅存在数字时会出现的NPE +* 修复03版 用String接收电话会出现科学计数法的问题 + # 2.0.3 * 修复重大bug 在07版读取文件的时候 小概率导致数字部分丢失