业务场景
将一些对象数据导出到excel文件中,其中字符串列表类型的字段要以json字符串的形式导出。例如
public class MyData {
@ExcelProperty(value = "a")
private Integer a;
@ExcelProperty(value = "b")
private List<String> b;
}
MyData
类对象的List<String> b
属性要以json字符串的形式输出到excel里:["xxxx","xxxx","xxxx"]
在使用EasyExcel导出时,报错如下:
com.alibaba.excel.exception.ExcelDataConvertException: Can not find 'Converter' support class List.
原因及解决方式
EasyExcel自身实现了一些常用类型的Converter
来支持excel数据到对象的转换,例如 BigDecimal、Bolean、Byte[]、btye[]、Byte、Date、Double、File、Float、InputStream、Integer、Long、Short、Url。若使用了其他数据类型 或 想定制化数据转换方式,需要实现自己的Converter
,并在使用EasyExcel时注册。
这个业务场景,需要实现将List类型数据与String的转换。实现方式:
第一步,实现Converter
接口
public class ListStringConverter implements Converter<List> {
@Override
public Class<List> supportJavaTypeKey() {
return List.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public List convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty
, GlobalConfiguration globalConfiguration) throws Exception {
//从excel中读数据时被EasyExcel调用
String stringValue = cellData.getStringValue();
//用json转换工具将excel单元格中数据转换为java List<String>对象
List<String> list = JSONUtil.toList(stringValue, String.class);
return list;
}
@Override
public CellData convertToExcelData(List list, ExcelContentProperty excelContentProperty
, GlobalConfiguration globalConfiguration) throws Exception {
//写excel文件时被EasyExcel调用
//用json转换工具将List对象转换为json字符串
String json = JSONUtil.toJsonStr(list);
return new CellData(json);
}
}
第二步,在导出时,将ListStringConverter
注册
//这里为全局注册,后面会讲到
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), MyData.class)
.registerConverter(new ListStringConverter()).build();
到此,导出成功
小延伸
-
LocalDateTime
类型数据比较常用,但EasyExcel自身也不支持。浅实现一下LocalDateTime
的Converter
。public class LocalDateTimeConverter implements Converter<LocalDateTime> { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Override public Class<LocalDateTime> supportJavaTypeKey() { return LocalDateTime.class; } @Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; } @Override public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { return LocalDateTime.parse(cellData.getStringValue(), DATE_TIME_FORMATTER); } @Override public CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) { return new CellData<>(value.format(DATE_TIME_FORMATTER)); } }
-
Converter
注册到EasyExcel的方式-
针对对象的特定字段指定转换器,其他字段不受影响:在字段上使用@ExcelProperty注解,通过设置converter参数的方式注册
public class MyData { @ExcelProperty(value = "b", converter = ListStringConverter.class) private List<String> b; @ExcelProperty(value = "c") private List<String> c; //字段c未配置converter,不会按ListStringConverter指定方式转换 }
-
全局注册,影响所有相同类型数据的转换
//写excel时注册 ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), MyData.class) .registerConverter(new ListStringConverter()).build(); //读excel时注册 EasyExcel.read(fileName, MyData.class) .registerConverter(new ListStringConverter()).sheet().doRead();
-
完结撒花✿✿ヽ(°▽°)ノ✿