Browse Source

Merge branch 'master' into 2.1.0-beta1

# Conflicts:
#	pom.xml
#	update.md
bugfix
Jiaju Zhuang 5 years ago
parent
commit
b9c0187cb0
  1. 2
      quickstart.md
  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
  6. 3
      update.md

2
quickstart.md

@ -1,4 +1,6 @@
# easyexcel核心功能
## 各位读取文件务必使用2.0.3起
2.0.0-beta1到2.0.2有小概率会丢失数字。
## 目录
### 前言
#### 以下功能目前不支持

2
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);
}
}

2
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);
}
}
}

6
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

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 Map<Integer, CellData> curRowContent = new TreeMap<Integer, CellData>();
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

3
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

Loading…
Cancel
Save