EasyExcel自定义Converter解决LocalDateTime系列时间日期转换的问题
一、前言
LocalDateTime系列是jdk8针对日期、时间处理提供的全新的操作类,相较于Date类有很大的提升,具体参考末尾的链接。
所以,在项目对时间、日期的处理也逐渐用LocalDateTime取代。EasyExcel中自带了DateStringConverter用于Date的数据类型转换,但LocalDateTime系列没有,故写此自定义数据格式转换器。
二、自定义Converter
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
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.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* @Author gmd
* @Description EasyExcel自定义LocalDateTime系列时间日期转换器
* 用法:
* 1、@ExcelProperty(value = {"添加时间"}, converter = BaseDateConverter.LocalDateTimeConverter.class)
* 2、ExcelWriter writer = EasyExcel.write(response.getOutputStream()).registerConverter(new BaseDateConverter.LocalDateConverter()).build();
* @Date 2022-08-31 19:23:08
*/
public class BaseDateConverter {
/**
* 核心抽象类,负责不同类的数据类型装换
* @param <T> LocalXXX类泛型
*/
private static abstract class CoreConverter<T> implements Converter<T> {
private Class<T> clazz;
/**
* 指定Class类型,接收LocalDate.class,LocalTime.class,LocalDateTime.class
*/
public CoreConverter(Class<T> clazz) {
this.clazz = clazz;
}
/**
* 导入支持的数据类型
*/
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
/**
* 导出支持的数据类型
*/
@Override
public Class supportJavaTypeKey() {
return clazz;
}
/**
* 导入时,数据类型转换
* @param cellData excel单元格数据
* @param property 单元格样式
* @param config 全局配置
* @return
*/
@Override
public T convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty property, GlobalConfiguration config) throws Exception {
// LocalDate日期转换
if (cellData.getData() instanceof LocalDate) {
return (T) LocalDate.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
// LocalTime时间转换
} else if (cellData.getData() instanceof LocalTime) {
return (T) LocalTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("HH:mm:ss"));
// LocalDateTime时间日期转换
} else if (cellData.getData() instanceof LocalDateTime) {
return (T) LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
return null;
}
/**
* 导出时,数据类型转换
* @param obj 当前数据
* @param property 单元格样式
* @param config 全局配置
* @return
*/
@Override
public WriteCellData<?> convertToExcelData(T obj, ExcelContentProperty property, GlobalConfiguration config) throws Exception {
// LocalDate日期转换
if (obj instanceof LocalDate) {
return new WriteCellData<>(((LocalDate) obj).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// LocalTime时间转换
} else if (obj instanceof LocalTime) {
return new WriteCellData<>(((LocalTime) obj).format(DateTimeFormatter.ofPattern("HH:mm:ss")));
// LocalDateTime时间日期转换
} else if (obj instanceof LocalDateTime) {
return new WriteCellData<>(((LocalDateTime) obj).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
return new WriteCellData<>(obj.toString());
}
}
/**
* LocalDate数据类型转换器
*/
public static class LocalDateConverter extends CoreConverter<LocalDate> {
public LocalDateConverter() {
super(LocalDate.class);
}
}
/**
* LocalTime数据类型转换器
*/
public static class LocalTimeConverter extends CoreConverter<LocalTime> {
public LocalTimeConverter() {
super(LocalTime.class);
}
}
/**
* LocalDateTime数据类型转换器
*/
public static class LocalDateTimeConverter extends CoreConverter<LocalDateTime> {
public LocalDateTimeConverter() {
super(LocalDateTime.class);
}
}
}
三、用法
用法一:
public class ReserveExcelVO {
@ExcelProperty(value = {"添加日期"}, converter = BaseDateConverter.LocalDateTimeConverter.class)
private LocalDate createTime;
}
用法二:
// 设置excel表格样式
ExcelWriter writer = EasyExcel.write(response.getOutputStream()).needHead(true).excelType(ExcelTypeEnum.XLSX)
.registerConverter(new BaseDateConverter.LocalDateConverter())
.build();
四、后记
这里也给出JDBC时间日期数据类型与Java时间日期数据类型映射关系
Java Type | JDBC Type | 说明 |
---|---|---|
LocalDate | DATE | <result property="a" column="a" jdbcType="DATE"/> |
LocalTime | TIME | <result property="a" column="a" jdbcType="TIME"/> |
LocalDateTime | TIMESTAMP | <result property="a" column="a" jdbcType="TIMESTAMP"/> |
Date | DATE 或 TIME 或 TIMESTAMP | / |
参考文档:
java8 LocalDate、LocalTime、LocalDateTime和Date对比_LETIAN_Z的博客-CSDN博客_localdate和date的区别一.LocalDate、LocalTime、LocalDateTime介绍LocalDate、LocalTime、LocalDateTime是java8对日期、时间提供的新接口。实际使用中,计算日期就用LocalDate,计算日期加时刻用LocalDateTime,如果只有时刻就是LocalTime1获取当前时间的对象LocalDateTime localDateTime = Local...https://blog.csdn.net/LETIAN_Z/article/details/101522476jdbctype有哪些类型_IT问答中心_中公优就业 (ujiuye.com)http://www.ujiuye.com/wenda/2021/71003.html