@ExcelProperty使用自定义转换器导入的时候ExcelDataConvertException异常

文章讲述了在使用EasyExcelUtil处理文件时,如何自定义转换器处理字段数据字典。作者遇到导入时的转换异常,通过重写Converter接口的方法解决了问题,确保了数据正确导入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用EasyExcelUtil导出导入文件时,因涉及到部分字段数据字典的转换,所以在项目中自定义了转换器,如下:

public class CustomDictionaryConverter implements Converter<String> {
    @Resource
    public DictionaryCacheConfig dictionaryCacheConfig;
    private static DictionaryCacheConfig cacheConfig;
    
    public CustomDictionaryConverter() {
    }
    
    public Class<?> supportJavaTypeKey() {
        return String.class;
    }
    
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }
    
    @PostConstruct
    private void shower() {
        cacheConfig = this.dictionaryCacheConfig;
    }
    
    public WriteCellData<?> convertToExcelData(WriteConverterContext<String> context) {
        
        //就是通过字段名读取字典配置,将key转换成value进行导出
        try {
            String key = "" + context.getValue();
            if (StringUtils.isBlank(key)){
                return new WriteCellData("-");
            }
            String field = context.getContentProperty().getField().getName();
            field = StringUtils.mappingOrToUnderlineCase(field);
            String dictionaryValue = null;
            
            try {
                dictionaryValue = cacheConfig.getDictionaryValue(field, key);
            } catch (Exception var6) {
                dictionaryValue = "-";
            }
            
            return new WriteCellData(dictionaryValue);
        } catch (Throwable var7) {
            throw var7;
        }
    }

}

在实体类字段上加了ExcelProperty注解指定了转换规则

@ExcelProperty(value = "表头字段",converter = CustomDictionaryConverter.class)

导出的时候正常使用。

结果,在导入的时候,报错:

com.alibaba.excel.exception.ExcelDataConvertException: Convert data com.alibaba.excel.metadata.data.ReadCellData@e6bbf3cb to class java.lang.String error 
	at com.alibaba.excel.util.ConverterUtils.doConvertToJavaObject(ConverterUtils.java:183)
	at com.alibaba.excel.util.ConverterUtils.convertToJavaObject(ConverterUtils.java:121)
	at com.alibaba.excel.util.ConverterUtils.convertToJavaObject(ConverterUtils.java:87)
Caused by: java.lang.UnsupportedOperationException: The current operation is not supported by the current converter.
	at com.alibaba.excel.converters.Converter.convertToJavaData(Converter.java:46)
	at com.alibaba.excel.converters.Converter.convertToJavaData(Converter.java:57)
	at com.alibaba.excel.util.ConverterUtils.doConvertToJavaObject(ConverterUtils.java:181)

 但是,断点的时候看,数据确实已经读取到了
 

 又仔细进入代码看异常是哪里抛出来的。

 发现是Converter接口中的抛出异常

既然我的自定义转换类实现了这个接口,那就在类中重写这个方法,让这个方法不抛出异常即可

 根据报错信息提示 ReadCellData 转换异常,所以,果断选择第一个方法进行重写
 

    @Override public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
        GlobalConfiguration globalConfiguration) throws Exception {
        return Converter.super.convertToJavaData(cellData, contentProperty, globalConfiguration);
    }

可以看到,这个方法直接调用了Converter中方法抛出了异常。
所以,只需要改写一下return,返回表格中的字符串即可。!

    @Override public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
        GlobalConfiguration globalConfiguration) throws Exception {
        return cellData.getStringValue();
    }

您可以使用EasyExcel库中的@ExcelProperty注解来实现自定义转换器@ExcelProperty注解用于将Java对象的属性与Excel表格的列进行映射。 首先,您需要创建一个实现了Converter接口的自定义转换器类。Converter接口有两个方法需要实现:convertToExcelData和convertToJavaData。convertToExcelData方法将Java对象属性转换为Excel表格中要写入的数据,而convertToJavaData方法将Excel表格中读取的数据转换为Java对象属性。 以下是一个示例的自定义转换器类: ```java import com.alibaba.excel.converters.Converter; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.GlobalConfiguration; import com.alibaba.excel.metadata.property.ExcelContentProperty; public class CustomConverter implements Converter<Object> { @Override public Class<?> supportJavaTypeKey() { return null; // 返回支持的Java类型 } @Override public CellData<Object> convertToExcelData(Object value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { // 将Java对象属性转换为Excel表格中要写入的数据,返回CellData对象 // 实现转换逻辑 return new CellData<>(value); } @Override public Object convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { // 将Excel表格中读取的数据转换为Java对象属性,返回对应类型的值 // 实现转换逻辑 return cellData.getData(); } } ``` 然后,在您的Java对象的属性上使用@ExcelProperty注解,并指定自定义转换器类: ```java public class YourObject { @ExcelProperty(converter = CustomConverter.class) private Object yourProperty; // 其他属性和方法 } ``` 这样,在使用EasyExcel库读取或写入Excel表格时,会自动应用您定义的转换器来实现自定义的转换逻辑。 希望对您有帮助!如有问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值