Browse Source

新增支持自定义转换器 入参可以为空 #1084

developing
Jiaju Zhuang 5 years ago
parent
commit
ae63dd2ae0
  1. 11
      src/main/java/com/alibaba/excel/converters/NullableObjectConverter.java
  2. 16
      src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java
  3. 4
      src/test/java/com/alibaba/easyexcel/test/temp/read/HeadListener.java
  4. 5
      src/test/java/com/alibaba/easyexcel/test/temp/read/HeadReadData.java
  5. 4
      src/test/java/com/alibaba/easyexcel/test/temp/read/HeadReadTest.java
  6. 1
      update.md

11
src/main/java/com/alibaba/excel/converters/NullableObjectConverter.java

@ -0,0 +1,11 @@
package com.alibaba.excel.converters;
/**
* When implementing <code>convertToExcelData</code> method, pay attention to the reference <code>value</code> may be
* null
*
* @author JiaJu Zhuang
**/
public interface NullableObjectConverter<T> extends Converter<T> {
}

16
src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java

@ -10,6 +10,7 @@ import org.apache.poi.ss.usermodel.Sheet;
import com.alibaba.excel.context.WriteContext; import com.alibaba.excel.context.WriteContext;
import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.ConverterKeyBuild; import com.alibaba.excel.converters.ConverterKeyBuild;
import com.alibaba.excel.converters.NullableObjectConverter;
import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.exception.ExcelDataConvertException; import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.CellData;
@ -32,11 +33,10 @@ public abstract class AbstractExcelWriteExecutor implements ExcelWriteExecutor {
protected CellData converterAndSet(WriteHolder currentWriteHolder, Class clazz, Cell cell, Object value, protected CellData converterAndSet(WriteHolder currentWriteHolder, Class clazz, Cell cell, Object value,
ExcelContentProperty excelContentProperty, Head head, Integer relativeRowIndex) { ExcelContentProperty excelContentProperty, Head head, Integer relativeRowIndex) {
if (value == null) { boolean needTrim =
return new CellData(CellDataTypeEnum.EMPTY); value != null && (value instanceof String && currentWriteHolder.globalConfiguration().getAutoTrim());
} if (needTrim) {
if (value instanceof String && currentWriteHolder.globalConfiguration().getAutoTrim()) { value = ((String) value).trim();
value = ((String)value).trim();
} }
CellData cellData = convert(currentWriteHolder, clazz, cell, value, excelContentProperty); CellData cellData = convert(currentWriteHolder, clazz, cell, value, excelContentProperty);
if (cellData.getFormula() != null && cellData.getFormula()) { if (cellData.getFormula() != null && cellData.getFormula()) {
@ -70,9 +70,6 @@ public abstract class AbstractExcelWriteExecutor implements ExcelWriteExecutor {
protected CellData convert(WriteHolder currentWriteHolder, Class clazz, Cell cell, Object value, protected CellData convert(WriteHolder currentWriteHolder, Class clazz, Cell cell, Object value,
ExcelContentProperty excelContentProperty) { ExcelContentProperty excelContentProperty) {
if (value == null) {
return new CellData(CellDataTypeEnum.EMPTY);
}
// This means that the user has defined the data. // This means that the user has defined the data.
if (value instanceof CellData) { if (value instanceof CellData) {
CellData cellDataValue = (CellData)value; CellData cellDataValue = (CellData)value;
@ -110,6 +107,9 @@ public abstract class AbstractExcelWriteExecutor implements ExcelWriteExecutor {
new CellData(CellDataTypeEnum.EMPTY), excelContentProperty, new CellData(CellDataTypeEnum.EMPTY), excelContentProperty,
"Can not find 'Converter' support class " + clazz.getSimpleName() + "."); "Can not find 'Converter' support class " + clazz.getSimpleName() + ".");
} }
if (value == null && !(converter instanceof NullableObjectConverter)) {
return new CellData(CellDataTypeEnum.EMPTY);
}
CellData cellData; CellData cellData;
try { try {
cellData = cellData =

4
src/test/java/com/alibaba/easyexcel/test/temp/read/HeadListener.java

@ -14,7 +14,7 @@ import com.alibaba.fastjson.JSON;
* *
* @author Jiaju Zhuang * @author Jiaju Zhuang
*/ */
public class HeadListener extends AnalysisEventListener<Map<Integer,String>> { public class HeadListener extends AnalysisEventListener<HeadReadData> {
private static final Logger LOGGER = LoggerFactory.getLogger(HeadListener.class); private static final Logger LOGGER = LoggerFactory.getLogger(HeadListener.class);
/** /**
* 每隔5条存储数据库实际使用中可以3000条然后清理list 方便内存回收 * 每隔5条存储数据库实际使用中可以3000条然后清理list 方便内存回收
@ -29,7 +29,7 @@ public class HeadListener extends AnalysisEventListener<Map<Integer,String>> {
} }
@Override @Override
public void invoke(Map<Integer,String> data, AnalysisContext context) { public void invoke(HeadReadData data, AnalysisContext context) {
LOGGER.info("index:{}", context.readRowHolder().getRowIndex()); LOGGER.info("index:{}", context.readRowHolder().getRowIndex());
LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data)); LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
} }

5
src/test/java/com/alibaba/easyexcel/test/temp/read/HeadReadData.java

@ -11,10 +11,9 @@ import lombok.experimental.Accessors;
* @author Jiaju Zhuang * @author Jiaju Zhuang
**/ **/
@Data @Data
@Accessors(chain = true)
public class HeadReadData { public class HeadReadData {
@ExcelProperty("头1") @ExcelProperty({"主标题","数据1"})
private String h1; private String h1;
@ExcelProperty({"头", "头2"}) @ExcelProperty({"主标题", "数据2"})
private String h2; private String h2;
} }

4
src/test/java/com/alibaba/easyexcel/test/temp/read/HeadReadTest.java

@ -32,8 +32,8 @@ public class HeadReadTest {
@Test @Test
public void test() throws Exception { public void test() throws Exception {
File file = TestFileUtil.readUserHomeFile("test/t1.xlsx"); File file = TestFileUtil.readUserHomeFile("test/t2.xlsx");
EasyExcel.read(file, null, new HeadListener()).ignoreEmptyRow(false).sheet(0).doRead(); EasyExcel.read(file, HeadReadData.class, new HeadListener()).ignoreEmptyRow(false).sheet(0).doRead();
} }

1
update.md

@ -2,6 +2,7 @@
* 发布正式版 * 发布正式版
* 修复第一行为空不会调用`invokeHeadMap`的bug [Issue #993](https://github.com/alibaba/easyexcel/issues/993) * 修复第一行为空不会调用`invokeHeadMap`的bug [Issue #993](https://github.com/alibaba/easyexcel/issues/993)
* 当类的属性没有按照ExcelProperty的属性index顺序排序的时候,写数据出现错乱 [Issue #1046](https://github.com/alibaba/easyexcel/issues/1046) * 当类的属性没有按照ExcelProperty的属性index顺序排序的时候,写数据出现错乱 [Issue #1046](https://github.com/alibaba/easyexcel/issues/1046)
* 新增支持自定义转换器 入参可以为空 实现`NullableObjectConverter` 即可 [Issue #1084](https://github.com/alibaba/easyexcel/issues/1084)
# 2.2.0-beta2 # 2.2.0-beta2
* 修复最长匹配策略不同表格会有影响的bug [Issue #1010](https://github.com/alibaba/easyexcel/issues/1010) * 修复最长匹配策略不同表格会有影响的bug [Issue #1010](https://github.com/alibaba/easyexcel/issues/1010)

Loading…
Cancel
Save