报错:alibaba.excel.exception.ExcelDataConvertException: Can not find ‘Converter‘ support class ZoneDateTime
主要原因是 Converter接口的convertToExcelData没有对 ZoneDateTime的时间类型进行转换。需要手动转换一下。
导出Excel文件的需要在实体类属性上添加@ExcelProperty注解,当实体类属性存在 ZonedDateTime 的类型时,会导出失败。
添加一个ZoneDateTimeConverter类,实现Converter<>接口
package com.geekbang.source_spring.config;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
/**
* alibaba-EasyExcel导出excel的时候,当时间类型为ZoneDateTime的时候,导出失败.
* 主要原因是因为 Converter接口的convertToExcelData没有对 ZoneDateTime的时间类型进行转换. 这里进行一个手动转换.
*/
public class ZoneDateTimeConverter implements Converter<ZonedDateTime> {
@Override
public Class<ZonedDateTime> supportJavaTypeKey() {
return ZonedDateTime.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public ZonedDateTime convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) {
return ZonedDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
/**
* CellData 对象报错. 这里需要降低jar包依赖,此处使用了 2.2.7版本的 com.alibaba-easyexcel 依赖
*
* @param zonedDateTime ZonedDateTime
* @param excelContentProperty ExcelContentProperty
* @param globalConfiguration GlobalConfiguration
* @return CellData
*/
@Override
public CellData<?> convertToExcelData(ZonedDateTime zonedDateTime, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) {
String format = zonedDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
return new CellData<>(format);
}
}
这里同时还要注意使用 2.2.7 版本的com.alibaba-easyexcel 依赖,否则CellData对象会报错。
在 ZonedDateTime 类型的属性上配置的@ExcelProperty 注解中添加属性 converter = ZoneDateTimeConverter.class
@ExcelProperty(value = "createTime", index = 9, converter = ZoneDateTimeConverter.class)
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT-8")
private ZonedDateTime createTime;