Easyexcel导入导出List类型数据报错:Can not find ‘Converter’ support class Li,的解决方法

问题分析

Easyexcel默认是不支持List类型数据自动转换的,因此当实体类传递数据为List类型时需要手动编写转换类来实现数据转换,否则会报错:Can not find ‘Converter’ support class List

解决方法---手动编写List类型转换类

用于接收参数的实体类对象DTO

/**
* value:对应的excel表头
* converter :自己手动编写的类型转换类
*/
@ExcelProperty(value = "标签",converter = MyConverter.class)
private List<String> label;

和数据库表对应的实体类对象domain,关于List类型数据和String类型数据转换可以参考文章:在MySQL中存取List<String>数据

/**
* 由于数据库不支持List数据类型,因此需要用String类型来存储List类型数据
*/
private String label;

用于输出参数的实体类对象VO,通常用于对从数据库中获取的数据进行加工处理后返回给前端

/**
* value:对应的excel表头
* converter :自己手动编写的类型转换类
*/
@ExcelProperty(value = "标签",converter = MyConverter.class)
private List<String> label;

自定义转换类,需要实现接口Converter<T>

public class MyConverter implements Converter<List> {
    @Override
    public Class<?> supportJavaTypeKey() {
        return List.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    /**
     * 读(导入)数据时调用
     */
    @Override
    public List convertToJavaData(ReadConverterContext<?> context) {
    	//当字段使用@ExcelProperty(converter = MyConverter.class)注解时会调用
    	//context.getReadCellData().getStringValue()会获取excel表格中该字段对应的String数据
    	//这里可以对数据进行额外的加工处理
        String stringValue = context.getReadCellData().getStringValue();
        //将数据转换为List类型然后返回给实体类对象DTO
        return Collections.singletonList(stringValue);
    }

    /**
     * 写(导出)数据时调用
     */
    @Override
    public WriteCellData<?> convertToExcelData(WriteConverterContext<List> context) {
    	//当字段使用@ExcelProperty(converter = MyConverter.class)注解时会调用
    	//context.getValue()会获取对应字段的List类型数据
    	//这里是将List<String>转换为String类型数据,根据自己的数据进行处理
        StringJoiner joiner = new StringJoiner(",");
        for (Object data : context.getValue()) {
            joiner.add((CharSequence) data);
        }
        //然后将转换后的String类型数据写入到Excel表格对应字段当中
        return new WriteCellData<>(joiner.toString());
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误是因为 EasyExcel导出数据时无法找到合适的转换器(Converter)来处理 `Map` 类型数据EasyExcel 默认提供了一些常见数据类型的转换器,但不支持直接导出 `Map` 类型数据。 要解决这个问题,你可以考虑将 `Map` 类型数据转换为其他适合导出数据类型,例如将 `Map` 转换为 `List<List<String>>`,然后再进行导出。下面是一个示例代码: ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ExcelExporter { public static void main(String[] args) { // 创建要导出数据列表 List<Map<String, String>> sheet1Data = new ArrayList<>(); Map<String, String> data1 = new HashMap<>(); data1.put("姓名", "张三"); data1.put("年龄", "20"); sheet1Data.add(data1); List<Map<String, String>> sheet2Data = new ArrayList<>(); Map<String, String> data2 = new HashMap<>(); data2.put("学科", "数学"); data2.put("成绩", "90"); sheet2Data.add(data2); // 创建 ExcelWriter 对象 String fileName = "multi_sheet_example.xlsx"; ExcelWriter excelWriter = EasyExcel.write(fileName).build(); // 导出第一个 sheet 页的数据 WriteSheet sheet1 = EasyExcel.writerSheet(0, "Sheet1").build(); excelWriter.write(convertMapToList(sheet1Data), sheet1); // 导出第二个 sheet 页的数据 WriteSheet sheet2 = EasyExcel.writerSheet(1, "Sheet2").build(); excelWriter.write(convertMapToList(sheet2Data), sheet2); // 关闭 ExcelWriter,释放资源 excelWriter.finish(); } private static List<List<String>> convertMapToList(List<Map<String, String>> mapList) { List<List<String>> dataList = new ArrayList<>(); for (Map<String, String> map : mapList) { List<String> row = new ArrayList<>(); for (String value : map.values()) { row.add(value); } dataList.add(row); } return dataList; } } ``` 在上述示例代码中,我们创建了两个 `Map` 类型数据列表 `sheet1Data` 和 `sheet2Data`,然后通过 `convertMapToList` 方法将 `Map` 类型数据转换为 `List<List<String>>` 类型数据。 最后,我们使用 EasyExcel 导出转换后的数据。 希望这个解决方案对你有帮助!如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值