diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/util/ConverterUtils.java b/easyexcel-core/src/main/java/com/alibaba/excel/util/ConverterUtils.java index 6359a99d..fea5a12a 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/util/ConverterUtils.java +++ b/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> map) { + // 先直接获取 + Converter converter = map.get(key); + if (converter != null) { + return converter; + } + + // 通过继承关系获取 + for (Map.Entry> 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; + } + } diff --git a/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java b/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java index 7f8fe0ea..1b6058ae 100644 --- a/easyexcel-core/src/main/java/com/alibaba/excel/write/executor/AbstractExcelWriteExecutor.java +++ b/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);