Browse Source

修复批量读取可能导致数字丢失的bug

bugfix
Jiaju Zhuang 5 years ago
parent
commit
74e1a711df
  1. 2
      pom.xml
  2. 2
      src/main/java/com/alibaba/excel/analysis/v07/SharedStringsTableHandler.java
  3. 2
      src/main/java/com/alibaba/excel/analysis/v07/XlsxRowHandler.java
  4. 6
      src/main/java/com/alibaba/excel/analysis/v07/XlsxRowResultHolder.java
  5. 103
      src/main/java/com/alibaba/excel/analysis/v07/handlers/DefaultCellHandler.java

2
pom.xml

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId> <artifactId>easyexcel</artifactId>
<version>2.0.2</version> <version>2.0.3</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>easyexcel</name> <name>easyexcel</name>

2
src/main/java/com/alibaba/excel/analysis/v07/SharedStringsTableHandler.java

@ -82,6 +82,6 @@ public class SharedStringsTableHandler extends DefaultHandler {
if (currentElementData == null) { if (currentElementData == null) {
currentElementData = new StringBuilder(); currentElementData = new StringBuilder();
} }
currentElementData.append(new String(ch, start, length)); currentElementData.append(ch, start, length);
} }
} }

2
src/main/java/com/alibaba/excel/analysis/v07/XlsxRowHandler.java

@ -49,7 +49,7 @@ public class XlsxRowHandler extends DefaultHandler {
@Override @Override
public void characters(char[] ch, int start, int length) throws SAXException { public void characters(char[] ch, int start, int length) throws SAXException {
if (rowResultHolder != null) { if (rowResultHolder != null) {
rowResultHolder.appendCurrentCellValue(new String(ch, start, length)); rowResultHolder.appendCurrentCellValue(ch, start, length);
} }
} }
} }

6
src/main/java/com/alibaba/excel/analysis/v07/XlsxRowResultHolder.java

@ -18,9 +18,11 @@ public interface XlsxRowResultHolder {
/** /**
* Append current 'cellValue' * 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 * Get row content

103
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 int curCol;
private Map<Integer, CellData> curRowContent = new TreeMap<Integer, CellData>(); private Map<Integer, CellData> curRowContent = new TreeMap<Integer, CellData>();
private CellData currentCellData; private CellData currentCellData;
private StringBuilder dataStringBuilder;
private StringBuilder formulaStringBuilder;
/** /**
* Current style information * Current style information
*/ */
@ -77,6 +80,7 @@ public class DefaultCellHandler implements XlsxCellHandler, XlsxRowResultHolder
// t is null ,it's means Empty or Number // t is null ,it's means Empty or Number
CellDataTypeEnum type = CellDataTypeEnum.buildFromCellType(attributes.getValue(CELL_VALUE_TYPE_TAG)); CellDataTypeEnum type = CellDataTypeEnum.buildFromCellType(attributes.getValue(CELL_VALUE_TYPE_TAG));
currentCellData = new CellData(type); currentCellData = new CellData(type);
dataStringBuilder = new StringBuilder();
// Put in data transformation information // Put in data transformation information
String dateFormatIndex = attributes.getValue(CELL_DATA_FORMAT_TAG); String dateFormatIndex = attributes.getValue(CELL_DATA_FORMAT_TAG);
@ -96,82 +100,81 @@ public class DefaultCellHandler implements XlsxCellHandler, XlsxRowResultHolder
// cell is formula // cell is formula
if (CELL_FORMULA_TAG.equals(name)) { if (CELL_FORMULA_TAG.equals(name)) {
currentCellData.setFormula(Boolean.TRUE); currentCellData.setFormula(Boolean.TRUE);
formulaStringBuilder = new StringBuilder();
} }
} }
@Override @Override
public void endHandle(String name) { public void endHandle(String name) {
currentTagDeque.pop(); // cell is formula
if (CELL_VALUE_TAG.equals(name)) { if (CELL_FORMULA_TAG.equals(name)) {
// Have to go "sharedStrings.xml" and get it currentCellData.setFormulaValue(formulaStringBuilder.toString());
if (currentCellData.getType() == CellDataTypeEnum.STRING) { return;
String stringValue = analysisContext.readWorkbookHolder().getReadCache() }
.get(Integer.valueOf(currentCellData.getStringValue())); 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()) { if (stringValue != null && analysisContext.currentReadHolder().globalConfiguration().getAutoTrim()) {
stringValue = stringValue.trim(); stringValue = stringValue.trim();
} }
currentCellData.setStringValue(stringValue); currentCellData.setStringValue(stringValue);
} else if (currentCellData.getType() == CellDataTypeEnum.DIRECT_STRING) {
currentCellData.setType(CellDataTypeEnum.STRING);
} }
currentCellData.checkEmpty(); currentCellData.checkEmpty();
curRowContent.put(curCol, currentCellData); curRowContent.put(curCol, currentCellData);
} }
// This is a special form of string currentTagDeque.pop();
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);
}
} }
@Override @Override
public void appendCurrentCellValue(String currentCellValue) { public void appendCurrentCellValue(char[] ch, int start, int length) {
if (StringUtils.isEmpty(currentCellValue)) {
return;
}
String currentTag = currentTagDeque.peek(); String currentTag = currentTagDeque.peek();
if (currentTag == null) { if (currentTag == null) {
return; return;
} }
if (CELL_FORMULA_TAG.equals(currentTag)) { if (CELL_FORMULA_TAG.equals(currentTag)) {
currentCellData.setFormulaValue(currentCellValue); formulaStringBuilder.append(ch, start, length);
return; return;
} }
if (!CELL_VALUE_TAG.equals(currentTag) && !CELL_INLINE_STRING_VALUE_TAG.equals(currentTag)) { if (!CELL_VALUE_TAG.equals(currentTag) && !CELL_INLINE_STRING_VALUE_TAG.equals(currentTag)) {
return; return;
} }
CellDataTypeEnum oldType = currentCellData.getType(); dataStringBuilder.append(ch, start, length);
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");
}
} }
@Override @Override

Loading…
Cancel
Save