使用easyExcel导入导出Date类型的转换问题

Excel中日期的导入导出,关联数据库时,实体类中的日期类型使用Date接收,导致时间精确到秒,使用@DateTimeFormat("yyyy-MM-dd")也会出现问题。

转载:使用easyExcel导入导出Date类型的转换问题_easyexcel 导入日期格式-CSDN博客

解决方案:

一、自定义转换器

public class DatetimeConverter implements Converter<Date> {


    @Override
    public Class<Date> supportJavaTypeKey() {
        return Date.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    /**
     * 这里读的时候会调用
     *
     * @param cellData            excel数据 (NotNull)
     * @param contentProperty     excel属性 (Nullable)
     * @param globalConfiguration 全局配置 (NotNull)
     * @return 读取到内存中的数据
     */
    @Override
    public Date convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        DateTimeFormat annotation = contentProperty.getField().getAnnotation(DateTimeFormat.class);
        String format = Objects.nonNull(annotation) ? annotation.value() : "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(format,Locale.getDefault());
		sdf.setTimeZone(TimeZone.getDefault());
		Date result = sdf.parse(cellData.getStringValue);
		return result;
    }

    /**
     * 写的时候会调用
     *
     * @param value               java value (NotNull)
     * @param contentProperty     excel属性 (Nullable)
     * @param globalConfiguration 全局配置 (NotNull)
     * @return 写出到excel文件的数据
     */
    @Override
    public WriteCellData<Date> convertToExcelData(Date value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        DateTimeFormat annotation = contentProperty.getField().getAnnotation(DateTimeFormat.class);
		String format = Objects.nonNull(annotation) ? annotation.value() : "yyyy-MM-dd HH:mm:ss";
		SimpleDateFormat sdf = new SimpleDateFormat(format,Locale.getDefault());
        sdf.setTimeZone(TimeZone.getDefault());
		String result = sdf.format(value);
		return new WriteCellData<>(result);
    }
}

二、entity实体类对应的属性添加@ExcelProperty注解,在注解的converter属性中加入自定义的转换器类

@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "上传时间", converter = DatetimeConverter.class)
private Date dateTime;

### 易于理解的 `LocalDateTime` 转换器配置 为了在 EasyExcel 中正确处理 `LocalDateTime` 数据类型,需自定义转换逻辑。具体方法是在实体类的时间属性上添加特定注解并指定转换器。 #### 实体类中的时间属性设置 通过使用 `@ExcelProperty` 注解来标记需要特殊处理的时间字段,并指明所使用转换器: ```java @ExcelProperty(value = "创建时间", index = 0, converter = LocalDateTimeConverter.class) private LocalDateTime date; ``` 此代码片段展示了如何为名为 “创建时间” 的列关联一个 `LocalDateTime` 类型变量及其对应的转换器[^1]。 #### 自定义日期时间转换器实现 继承 `Convert<T>` 接口(T 表示目标 Java 类型),重写其抽象方法完成字符串到对象以及反向操作的功能。下面是一个简单的例子展示怎样构建这样一个适配器用于支持 ISO8601 时间格式解析与序列化: ```java public class LocalDateTimeConverter implements Convert<LocalDateTime> { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @Override public Class<?> supportJavaTypeKey() { return LocalDateTime.class; } @Override public CellDataTypeEnum supportExcelTypeKey() { return CellDataTypeEnum.STRING; } /** * 将单元格内容转化为 LocalDateTime 对象. */ @Override public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { String value = cellData.getStringValue(); return LocalDateTime.parse(value, FORMATTER); } /** * 把 LocalDateTime 对象转成适合存储在 Excel 文件里的形式. */ @Override public CellData<String> convertToExcelData(LocalDateTime localDateTime, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) { return new CellData<>(localDateTime.format(FORMATTER)); } } ``` 这段程序实现了从 Excel 单元格读取文本表示的时间戳并将其解释为 `LocalDateTime` 值的过程;同时也能够把内存中的 `LocalDateTime` 变量格式化回可被保存至电子表格文件内的字符串表达方式[^2]。 #### 异常处理机制 当遇到无法成功执行的数据转换时,可以通过捕获特定类型的异常来进行错误管理。例如,在尝试将不兼容格式的数据赋给 `LocalDateTime` 字段时可能会抛出 `ExcelDataConvertException`: ```java try { // 正常业务逻辑... } catch (ExcelDataConvertException e) { log.error("数据转换失败:{}", e.getMessage()); throw new RuntimeException(e); // 或者其他合适的响应措施 } ``` 上述代码演示了针对可能出现的问题采取适当行动的方式[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值