Skip to content
This repository was archived by the owner on Sep 4, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
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;
Expand Down Expand Up @@ -170,7 +171,8 @@ private static Object doConvertToJavaObject(ReadCellData<?> cellData, Class<?> c
}

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,
Expand All @@ -184,4 +186,37 @@ private static Object doConvertToJavaObject(ReadCellData<?> cellData, Class<?> c
"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;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
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;
Expand Down Expand Up @@ -310,9 +311,9 @@ private WriteCellData<?> doConvert(CellWriteHandlerContext cellWriteHandlerConte
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);
Expand Down