起因:在业务需求上需要将Excel表中的日期导入,存储到数据库中,但是entity中的日期类型使用Date来接收,这样导致时间精确到秒。这时,即使使用@DateTimeFormat("yyyy-MM-dd")也无法成功转换,会报如下错误:
Convert data com.alibaba.excel.metadata.data.ReadCellData@a8b42f88 to class java.util.Date error
如果使用LocalDate也会报类型转换异常
解决方案:
步骤一:自定义转换器
package com.wedu.modules.dossier.common;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.WriteConverterContext;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Date转换类
* @author Hou
* @create 2023/8/23 10:15
*/
public class DateConverter implements Converter<Date> {
private static final String PATTERN_YYYY_MM_DD = "yyyy-MM-dd HH:mm:ss";
@Override
public Class<Date> supportJavaTypeKey() {
return Date.class;
}
/**
* easyExcel导出数据类型转换
* @param cellData
* @param contentProperty
* @param globalConfiguration
* @return
* @throws Exception
*/
@Override
public Date convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
String value = cellData.getStringValue();
SimpleDateFormat sdf = new SimpleDateFormat(PATTERN_YYYY_MM_DD);
Date parse = sdf.parse(value);
return parse;
}
/**
* easyExcel导入Date数据类型转换
* @param context
* @return
* @throws Exception
*/
@Override
public WriteCellData<String> convertToExcelData(WriteConverterContext<Date> context) throws Exception {
Date date = context.getValue();
if (date == null) {
return null;
}
SimpleDateFormat sdf = new SimpleDateFormat(PATTERN_YYYY_MM_DD);
return new WriteCellData<>(sdf.format(date));
}
}
进行数据转换后就可以对easyExcel进行导入导出操作了。
如果需要多个其他的日期转换格式,那么按需求定义另外的类就行。
步骤二:在entity中对应的属性上添加@ExcelProperty注解,并在注解的converter属性中加入所写的转换器类,如下图所示: