在使用easyExcel导出csv时用.registerConverter(new TimestampStringConverter())一直报无法转换,报Can not find 'Converter' support class Timestamp
com.alibaba.excel.exception.ExcelWriteDataConvertException: Can not find 'Converter' support class Timestamp.
at com.alibaba.excel.write.executor.AbstractExcelWriteExecutor.doConvert(AbstractExcelWriteExecutor.java:323)
at com.alibaba.excel.write.executor.AbstractExcelWriteExecutor.convert(AbstractExcelWriteExecutor.java:277)
at com.alibaba.excel.write.executor.AbstractExcelWriteExecutor.converterAndSet(AbstractExcelWriteExecutor.java:58)
at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.doAddBasicTypeToExcel(ExcelWriteAddExecutor.java:136)
at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addBasicTypeToExcel(ExcelWriteAddExecutor.java:114)
at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.addOneRowOfDataToExcel(ExcelWriteAddExecutor.java:78)
at com.alibaba.excel.write.executor.ExcelWriteAddExecutor.add(ExcelWriteAddExecutor.java:58)
at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:59)
at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:70)
at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:47)
通过源码查看
当为csv时,默认指定CellDataTypeEnum.STRING,但是我们自定义的TimestampStringConverter在注册到Map中的CellDataType却为空。
根据这个情况通过以下方式解决数据类型为Timestamp时导出csv和excel转换问题
1、自定义Converter
public class TimestampStringConverter implements Converter<Timestamp> {
@Override
public Class<?> supportJavaTypeKey() {
return Timestamp.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public WriteCellData<?> convertToExcelData(Timestamp value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
WriteCellData cellData = new WriteCellData();
String cellValue;
if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {
cellValue = DateUtils.format(value.toLocalDateTime(), null, globalConfiguration.getLocale());
} else {
cellValue = DateUtils.format(value.toLocalDateTime(), contentProperty.getDateTimeFormatProperty().getFormat(),
globalConfiguration.getLocale());
}
cellData.setType(CellDataTypeEnum.STRING);
cellData.setStringValue(cellValue);
cellData.setData(cellValue);
return cellData;
}
}
2、将TimestampStringConverter添加到转换器集合中Map<ConverterKey, Converter<?>> converterMap(),
ExcelWriter excelWriter = EasyExcel.write(path)
.excelType(ExcelTypeEnum.CSV)
// .excelType(ExcelTypeEnum.XLSX)
.charset(StandardCharsets.UTF_8)
.build();
//添加TimestampStringConverter到Map中
TimestampStringConverter converter = new TimestampStringConverter();
excelWriter.writeContext().currentWriteHolder().converterMap().put(ConverterKeyBuild.buildKey(converter.supportJavaTypeKey()),converter);
excelWriter.writeContext().currentWriteHolder().converterMap().put(ConverterKeyBuild.buildKey(converter.supportJavaTypeKey(), converter.supportExcelTypeKey()),converter);
WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.write(dataList(), writeSheet);
excelWriter.finish();