diff --git a/quickstart.md b/quickstart.md index 9ca53df9..cc968c99 100644 --- a/quickstart.md +++ b/quickstart.md @@ -1,4 +1,6 @@ # easyexcel核心功能 +## 各位读取文件务必使用2.0.3起 +2.0.0-beta1到2.0.2有小概率会丢失数字。 ## 目录 ### 前言 #### 以下功能目前不支持 diff --git a/src/main/java/com/alibaba/excel/analysis/v07/SharedStringsTableHandler.java b/src/main/java/com/alibaba/excel/analysis/v07/SharedStringsTableHandler.java index 957dd91c..5e001ed0 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/SharedStringsTableHandler.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/SharedStringsTableHandler.java @@ -82,6 +82,6 @@ public class SharedStringsTableHandler extends DefaultHandler { if (currentElementData == null) { currentElementData = new StringBuilder(); } - currentElementData.append(new String(ch, start, length)); + currentElementData.append(ch, start, length); } } diff --git a/src/main/java/com/alibaba/excel/analysis/v07/XlsxRowHandler.java b/src/main/java/com/alibaba/excel/analysis/v07/XlsxRowHandler.java index 8306fc15..ececb471 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/XlsxRowHandler.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/XlsxRowHandler.java @@ -49,7 +49,7 @@ public class XlsxRowHandler extends DefaultHandler { @Override public void characters(char[] ch, int start, int length) throws SAXException { if (rowResultHolder != null) { - rowResultHolder.appendCurrentCellValue(new String(ch, start, length)); + rowResultHolder.appendCurrentCellValue(ch, start, length); } } } diff --git a/src/main/java/com/alibaba/excel/analysis/v07/XlsxRowResultHolder.java b/src/main/java/com/alibaba/excel/analysis/v07/XlsxRowResultHolder.java index 953d45e0..d13da731 100644 --- a/src/main/java/com/alibaba/excel/analysis/v07/XlsxRowResultHolder.java +++ b/src/main/java/com/alibaba/excel/analysis/v07/XlsxRowResultHolder.java @@ -18,9 +18,11 @@ public interface XlsxRowResultHolder { /** * Append current 'cellValue' * - * @param currentCellValue + * @param ch + * @param start + * @param length */ - void appendCurrentCellValue(String currentCellValue); + void appendCurrentCellValue(char[] ch, int start, int length); /** * Get row content 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 c0ad7064..c21d6cc3 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 @@ -40,6 +40,9 @@ public class DefaultCellHandler implements XlsxCellHandler, XlsxRowResultHolder private int curCol; private Map curRowContent = new TreeMap(); private CellData currentCellData; + private StringBuilder dataStringBuilder; + private StringBuilder formulaStringBuilder; + /** * Current style information */ @@ -77,6 +80,7 @@ public class DefaultCellHandler implements XlsxCellHandler, XlsxRowResultHolder // t is null ,it's means Empty or Number CellDataTypeEnum type = CellDataTypeEnum.buildFromCellType(attributes.getValue(CELL_VALUE_TYPE_TAG)); currentCellData = new CellData(type); + dataStringBuilder = new StringBuilder(); // Put in data transformation information String dateFormatIndex = attributes.getValue(CELL_DATA_FORMAT_TAG); @@ -96,82 +100,81 @@ public class DefaultCellHandler implements XlsxCellHandler, XlsxRowResultHolder // cell is formula if (CELL_FORMULA_TAG.equals(name)) { currentCellData.setFormula(Boolean.TRUE); + formulaStringBuilder = new StringBuilder(); } } @Override public void endHandle(String name) { - currentTagDeque.pop(); - if (CELL_VALUE_TAG.equals(name)) { - // Have to go "sharedStrings.xml" and get it - if (currentCellData.getType() == CellDataTypeEnum.STRING) { - String stringValue = analysisContext.readWorkbookHolder().getReadCache() - .get(Integer.valueOf(currentCellData.getStringValue())); + // cell is formula + if (CELL_FORMULA_TAG.equals(name)) { + currentCellData.setFormulaValue(formulaStringBuilder.toString()); + return; + } + if (CELL_VALUE_TAG.equals(name) || CELL_INLINE_STRING_VALUE_TAG.equals(name)) { + CellDataTypeEnum oldType = currentCellData.getType(); + switch (oldType) { + case DIRECT_STRING: + case STRING: + case ERROR: + currentCellData.setStringValue(dataStringBuilder.toString()); + break; + case BOOLEAN: + currentCellData.setBooleanValue(BooleanUtils.valueOf(dataStringBuilder.toString())); + break; + case NUMBER: + case EMPTY: + currentCellData.setType(CellDataTypeEnum.NUMBER); + currentCellData.setNumberValue(new BigDecimal(dataStringBuilder.toString())); + break; + default: + throw new IllegalStateException("Cannot set values now"); + } + + if (CELL_VALUE_TAG.equals(name)) { + // Have to go "sharedStrings.xml" and get it + if (currentCellData.getType() == CellDataTypeEnum.STRING) { + String stringValue = analysisContext.readWorkbookHolder().getReadCache() + .get(Integer.valueOf(currentCellData.getStringValue())); + if (stringValue != null + && analysisContext.currentReadHolder().globalConfiguration().getAutoTrim()) { + stringValue = stringValue.trim(); + } + currentCellData.setStringValue(stringValue); + } else if (currentCellData.getType() == CellDataTypeEnum.DIRECT_STRING) { + currentCellData.setType(CellDataTypeEnum.STRING); + } + } + // This is a special form of string + if (CELL_INLINE_STRING_VALUE_TAG.equals(name)) { + XSSFRichTextString richTextString = new XSSFRichTextString(currentCellData.getStringValue()); + String stringValue = richTextString.toString(); if (stringValue != null && analysisContext.currentReadHolder().globalConfiguration().getAutoTrim()) { stringValue = stringValue.trim(); } currentCellData.setStringValue(stringValue); - } else if (currentCellData.getType() == CellDataTypeEnum.DIRECT_STRING) { - currentCellData.setType(CellDataTypeEnum.STRING); } + currentCellData.checkEmpty(); curRowContent.put(curCol, currentCellData); } - // This is a special form of string - if (CELL_INLINE_STRING_VALUE_TAG.equals(name)) { - XSSFRichTextString richTextString = new XSSFRichTextString(currentCellData.getStringValue()); - String stringValue = richTextString.toString(); - if (stringValue != null && analysisContext.currentReadHolder().globalConfiguration().getAutoTrim()) { - stringValue = stringValue.trim(); - } - currentCellData.setStringValue(stringValue); - currentCellData.checkEmpty(); - curRowContent.put(curCol, currentCellData); - } + currentTagDeque.pop(); } @Override - public void appendCurrentCellValue(String currentCellValue) { - if (StringUtils.isEmpty(currentCellValue)) { - return; - } + public void appendCurrentCellValue(char[] ch, int start, int length) { String currentTag = currentTagDeque.peek(); if (currentTag == null) { return; } if (CELL_FORMULA_TAG.equals(currentTag)) { - currentCellData.setFormulaValue(currentCellValue); + formulaStringBuilder.append(ch, start, length); return; } if (!CELL_VALUE_TAG.equals(currentTag) && !CELL_INLINE_STRING_VALUE_TAG.equals(currentTag)) { return; } - CellDataTypeEnum oldType = currentCellData.getType(); - switch (oldType) { - case DIRECT_STRING: - case STRING: - case ERROR: - if (currentCellData.getStringValue() == null) { - currentCellData.setStringValue(currentCellValue); - } else { - currentCellData.setStringValue(currentCellData.getStringValue() + currentCellValue); - } - break; - case BOOLEAN: - if (currentCellData.getBooleanValue() == null) { - currentCellData.setBooleanValue(BooleanUtils.valueOf(currentCellValue)); - } - break; - case NUMBER: - case EMPTY: - currentCellData.setType(CellDataTypeEnum.NUMBER); - if (currentCellData.getNumberValue() == null) { - currentCellData.setNumberValue(new BigDecimal(currentCellValue)); - } - break; - default: - throw new IllegalStateException("Cannot set values now"); - } + dataStringBuilder.append(ch, start, length); } @Override diff --git a/update.md b/update.md index 14d339c9..8b48d9aa 100644 --- a/update.md +++ b/update.md @@ -4,6 +4,9 @@ * 新增支持读取单元格类型、写入指定单元格类型 * 支持通过模板填充数据 +# 2.0.3 +* 修复重大bug 在07版读取文件的时候 小概率导致数字部分丢失 + # 2.0.2 * 修复xls无法获取sheetList的bug [Issue #621](https://github.com/alibaba/easyexcel/issues/621) * 修复监听器转换异常会重复提示的bug