diff --git a/pom.xml b/pom.xml
index 958a85d7..3e76a55c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.alibaba
easyexcel
- 2.0.2
+ 2.0.3
jar
easyexcel
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