当前位置: 首页 > news >正文

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 TypeJDBC Type说明
LocalDateDATE<result property="a" column="a" jdbcType="DATE"/>
LocalTimeTIME

<result property="a" column="a" jdbcType="TIME"/>

LocalDateTimeTIMESTAMP<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

相关文章:

  • Nginx限流优化
  • 洗地机暗战:蓝海到血海,内卷的尽头没有赢家
  • python神经网络编程 豆瓣,用python构建神经网络
  • 2-4.spring源码--BeanPostProcessor
  • Centos8/Rocky9/linuxmint-21/安装docker和docker安装python3.9【亲测有效】
  • 网课答案公众号接口API提供
  • 顺丰2022半年报:成绩单背后的业务韧性
  • 考研算法辅导课【合集】
  • LeetCode---SQL刷题5
  • xilinx ip xdc修改
  • 计算机组成原理_双口RAM和多模块存储器
  • 引用折叠 万能引用 模板参数推导
  • 【原创】基于SSM的医院预约挂号系统(医院预约挂号系统毕设源代码)
  • k8s 1.24 及以后版本如何对接 docker
  • 微信公众号网课答案查题功能接口
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【个人向】《HTTP图解》阅后小结
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • java概述
  • mysql innodb 索引使用指南
  • SpriteKit 技巧之添加背景图片
  • vuex 笔记整理
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 理解在java “”i=i++;”所发生的事情
  • 前端技术周刊 2019-02-11 Serverless
  • 如何实现 font-size 的响应式
  • 什么软件可以剪辑音乐?
  • 说说动画卡顿的解决方案
  • 怎么把视频里的音乐提取出来
  • 主流的CSS水平和垂直居中技术大全
  • 1.Ext JS 建立web开发工程
  • Hibernate主键生成策略及选择
  • #Linux(权限管理)
  • (09)Hive——CTE 公共表达式
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (笔试题)分解质因式
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四) 虚拟摄像头vivi体验
  • (转)菜鸟学数据库(三)——存储过程
  • (转载)Linux 多线程条件变量同步
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • **python多态
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .NET导入Excel数据
  • .net连接oracle数据库
  • .NET设计模式(2):单件模式(Singleton Pattern)