Browse Source

支持子级使用父级的转换器, 优先使用子级自己的

pull/3662/head
lingting 1 year ago
parent
commit
d5b24f888f
  1. 37
      easyexcel-core/src/main/java/com/alibaba/excel/util/ConverterUtils.java
  2. 7
      easyexcel-core/src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java

37
easyexcel-core/src/main/java/com/alibaba/excel/util/ConverterUtils.java

@ -4,6 +4,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;
import java.util.Objects;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.converters.Converter;
@ -170,7 +171,8 @@ public class ConverterUtils {
}
if (converter == null) {
converter = converterMap.get(ConverterKeyBuild.buildKey(clazz, cellData.getType()));
ConverterKey key = ConverterKeyBuild.buildKey(clazz, cellData.getType());
converter = findConverter(key, converterMap);
}
if (converter == null) {
throw new ExcelDataConvertException(rowIndex, columnIndex, cellData, contentProperty,
@ -184,4 +186,37 @@ public class ConverterUtils {
"Convert data " + cellData + " to " + clazz + " error ", e);
}
}
/**
* 支持子级使用父级的转换器, 优先使用子级自己的
*
* @param key
* @param map
* @return
*/
public static Converter<?> findConverter(ConverterKey key, Map<ConverterKey, Converter<?>> map) {
// 先直接获取
Converter<?> converter = map.get(key);
if (converter != null) {
return converter;
}
// 通过继承关系获取
for (Map.Entry<ConverterKey, Converter<?>> entry : map.entrySet()) {
ConverterKey converterKey = entry.getKey();
Converter<?> value = entry.getValue();
// 行数据类型不一致, 跳过
if (Objects.equals(converterKey.getCellDataTypeEnum(), key.getCellDataTypeEnum())) {
Class<?> converterClz = converterKey.getClazz();
// Java数据类型匹配
if (converterClz.isAssignableFrom(key.getClazz())) {
return value;
}
}
}
return null;
}
}

7
easyexcel-core/src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java

@ -16,6 +16,7 @@ import com.alibaba.excel.metadata.data.ImageData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.util.ConverterUtils;
import com.alibaba.excel.util.DateUtils;
import com.alibaba.excel.util.FileTypeUtils;
import com.alibaba.excel.util.ListUtils;
@ -310,9 +311,9 @@ public abstract class AbstractExcelWriteExecutor implements ExcelWriteExecutor {
if (writeContext.writeWorkbookHolder().getExcelType() == ExcelTypeEnum.CSV) {
cellWriteHandlerContext.setTargetCellDataType(CellDataTypeEnum.STRING);
}
converter = writeContext.currentWriteHolder().converterMap().get(
ConverterKeyBuild.buildKey(cellWriteHandlerContext.getOriginalFieldClass(),
cellWriteHandlerContext.getTargetCellDataType()));
ConverterKeyBuild.ConverterKey key = ConverterKeyBuild.buildKey(cellWriteHandlerContext.getOriginalFieldClass(),
cellWriteHandlerContext.getTargetCellDataType());
converter = ConverterUtils.findConverter(key, writeContext.currentWriteHolder().converterMap());
}
if (cellWriteHandlerContext.getOriginalValue() == null && !(converter instanceof NullableObjectConverter)) {
return new WriteCellData<>(CellDataTypeEnum.EMPTY);

Loading…
Cancel
Save