ExcelWriteDataConvertException:Can not find ‘Converter‘ support class Character.

问题

今天使用 EasyExcel 来进行写操作时,出现如下错误:

com.alibaba.excel.exception.ExcelWriteDataConvertException: Can not find 'Converter' support class Character.
	at com.alibaba.excel.write.executor.AbstractExcelWriteExecutor.doConvert(AbstractExcelWriteExecutor.java:323) ~[easyexcel-3.0.5.jar:na]
	at com.alibaba.excel.write.executor.AbstractExcelWriteExecutor.convert(AbstractExcelWriteExecutor.java:277) ~[easyexcel-3.0.5.jar:na]
	at com.alibaba.excel.write.executor.AbstractExcelWriteExecutor.converterAndSet(AbstractExcelWriteExecutor.java:58) ~[easyexcel-3.0.5.jar:na]
	at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addJavaObjectToExcel(ExcelWriteAddExecutor.java:174) ~[easyexcel-3.0.5.jar:na]
	at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addOneRowOfDataToExcel(ExcelWriteAddExecutor.java:82) ~[easyexcel-3.0.5.jar:na]
	at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.add(ExcelWriteAddExecutor.java:58) ~[easyexcel-3.0.5.jar:na]
	at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:59) ~[easyexcel-3.0.5.jar:na]
	at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:73) ~[easyexcel-3.0.5.jar:na]
	at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:50) ~[easyexcel-3.0.5.jar:na]

主要是 Can not find ‘Converter’ support class Character.

解决

出现上面错误的原因是我 pojo 类中的性别字段是 char 类型,而 EasyExcel 目前还不支持 char 类型的转换。EasyExcel 支持的类型在枚举类 CellDataTypeEnum 中有定义。
在这里插入图片描述
可以看到,并不支持 char 类型,因此,需要我们自定义 convert。这里的 convert 不是 SpringBoot 的,是 EasyExcel 的。

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import org.springframework.stereotype.Component;

/**
 * @author zxb 2022/4/12 17:52
 */
@Component
public class CharConverter implements Converter<Character> {

    /**
     * 开启对 Character 类型的支持
     */
    @Override
    public Class<?> supportJavaTypeKey() {
        return Character.class;
    }


    /**
     * 自定义对 Character 类型数据的处理
     * 我这里就拿 String 去包装了下
     */
    @Override
    public WriteCellData<?> convertToExcelData(Character value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        return new WriteCellData<Character>(String.valueOf(value));
    }
}

定义完自定义 convert 后,需要在写操作时,将 convert 注册到 EasyExcel 中去。

    @RequestMapping(path = "/writeStudentToExcel", method = RequestMethod.GET)
    public Result writeStudentToExcel() {
        String fileName = "E:\\" + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        List<Student> studentList = listAllStudent();
        log.info("{}",studentList);
        EasyExcel.write(fileName, Student.class).registerConverter(new CharConverter()).sheet("sheet1").doWrite(studentList);
        return Result.success();
    }

在这里插入图片描述
问题解决!

这个错误是因为 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、付费专栏及课程。

余额充值