使用 EasyExcel 转换器自定义时间类型转换

每一句话都有后果

请原谅,近期由于生活变故导致文章很少再更新,虽然也没多少粉丝。

我们在使用 EasyExcel 进行导出时,可能需要对数据库查询出来的时间做个处理。
比如:我们从数据库查询出来的时间为 2021-11-27T10:00:00,而我们需要写入 Excel 中的数据则是 2021-11-27 10:00:00 或者是 2021-10-27 或者是 2021-10 这些格式的时候,我们就需要对查询出来的时间字段做个处理,这里不考虑在 sql 中格式化时间,因为太影响性能。

每一次沉默也是如此

  • EasyExcel 中自定义类型转换都需要实现 Converter 这个接口;在实现之前,我们先了解下 EasyExcel 的 converter 加载流程。

  • 首先来看 EasyExcel 全局 Converter 加载器类:DefaultConverterLoader:

这里可以看到 EasyExcel 有两个私有的静态属性 defaultWriteConverter 与 allConverter,接着通过静态代码块对其进行了赋值。

详细可查看 com.alibaba.excel.converters 包下的 DefaultConverterLoader 类。

其实就是调用 putWriteConverter()、putAllConverter()方法放入转换器,初始化默认的加载器之后反射调用方法就好了。

长话短说,接下来我们进入实际操作阶段:

年月日时分秒类型的处理

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** 自定义时间格式转换器** 格式:yyyy-MM-dd HH:mm:ss 可任意修改** @author Greenarrow**/
public class LocalDateTimeConverter implements Converter<LocalDateTime> {@Overridepublic Class supportJavaTypeKey() {return LocalDateTime.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}@Overridepublic CellData convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {return new CellData(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));}
}

年月日类型的处理

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;/*** 自定义时间格式转换器** 格式:yyyy-MM-dd** @author Greenarrow*/
public class LocalDateConverter implements Converter<LocalDate> {@Overridepublic Class supportJavaTypeKey() {return LocalDate.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic LocalDate convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {return LocalDate.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));}@Overridepublic CellData convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {return new CellData(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));}
}

年月类型的处理

import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;/*** 自定义月消费时间格式转换器** 格式:yyyy-MM** @author Greenarrow*/
public class LocalMonthConverter implements Converter<LocalDate> {@Overridepublic Class supportJavaTypeKey() {return LocalDate.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic LocalDate convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {return LocalDate.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));}@Overridepublic CellData convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {return new CellData(value.format(DateTimeFormatter.ofPattern("yyyy-MM")));}
}

我们可以看到大体都一致,无非就是格式不一样的问题。

就算不受神的眷顾

接下来我们只需要在导出实体数据模型相应字段添加如下内容:

    @ExcelProperty(value = "创建时间",converter = LocalDateTimeConverter.class)private LocalDateTime createTime;@ExcelProperty(value = "支付时间",converter = LocalDateTimeConverter.class)private LocalDateTime payTime;

OK,到了这里已经结束了。

还是可以选择热爱

该方法的优缺点如下:

  • 优点:只需在每个需要转换的字段上添加自定义 converter 即可

  • 缺点:如果有很多类,每个类中有很多需要单独转换的字段我们就要写很多个,比较繁琐

  • 适用场景:任何场景

使用 EasyExcel 转换器自定义时间类型转换相关推荐

  1. EasyExcel导出自定义合并单元格文件

    目标 需要使用阿里的EasyExcel库来导出excel,并要自定义合并单元格. 思路 这里自定义的CellWriteHandler需要将数据进行如下处理: 1.Excel每一行数据必须对应一个对象: ...

  2. Django中的日期处理注意事项和自定义时间格式转换

    我们在用Django创建models时,常常会涉及时间日期字段的处理,Django里日期相关Field有DateTimeField.DateField和TimeField三种类型,看似简单,但其中有一 ...

  3. php时间日期函数转字符串,php自定义时间转换函数示例

    本文实例讲述了php自定义时间转换函数.分享给大家供大家参考,具体如下: 我们可以把经常用到的函数封装起来,在抽象类中,然后继承来使用. /** * 时间转时间戳 * @param object $s ...

  4. python筛选时间段_django admin管理工具自定义时间区间筛选器DateRangeFilter介绍

    django admin管理工具有很多好用的功能,例如搜索框.筛选器等,编码简单,功能强大. 但是常规的时间筛选有一定局限性,只能显示一定时间节点到当前时间这一段时间段内的筛选结果,做不到自由定义时间 ...

  5. android自定义横向时间轴,Android自定义时间轴的实现过程

    本文讲述Android自定义时间轴的实现过程,供大家参考,具体内容如下 时间轴效果,实际上非常简单,就是listView中一个又一个的条目而已-.大家可以只关注一个条目. 首先展示一个条目的布局效果 ...

  6. Apache DolphinScheduler 海豚调度器自定义时间参数

    在Apache DolphinScheduler 海豚调度器(本文简称:小海豚) 官网中,我们看到其自定义时间的参数是这样介绍的 1.支持代码中自定义变量名,声明方式:${变量名}.可以是引用 &qu ...

  7. QVariant类及QVariant与自定义数据类型转换的方法

    这个类型相当于是Java里面的Object,它把绝大多数Qt提供的数据类型都封装起来,起到一个数据类型"擦除"的作用.比如我们的 table单元格可以是string,也可以是int ...

  8. k3s证书过期的处理 以及 修改k3s证书有效期为10年(或自定义时间)

    1.常规操作 由于k3s证书的默认过期时间是12个月,因此到期之前或不小心到期,需要轮换 其实官网有明确的说明以及处理办法--但是你会发现按照官方处理办法,基本上无法生效 这里给一个一定可行的办法 # ...

  9. 时间类型转换的问题“2021-01-20T10:09:11Z”

    关于新手碰到时间类型转换的问题: 拿到的时间为字符串,格式为:"2021-01-20T10:09:11Z". 容易理解的解决方法: 先将该字符串转换为Date类型: SimpleD ...

最新文章

  1. 深度学习加速器堆栈Deep Learning Accelerator Stack
  2. 1-编程的基本条件和起步
  3. 【渝粤题库】广东开放大学 标准的研制与编制 形成性考核
  4. Win32ASM学习[3]:局部变量
  5. 机器学习算法--协同过滤算法
  6. java addlast_Java中的LinkedList addLast()方法: java.util.LinkedList.addLast() - Break易站
  7. Tipard Video Converter Ultimate如何旋转视频?
  8. 红橙Darren视频笔记 贝塞尔曲线实现消息拖拽粘性效果 画笔练习
  9. oracle11g设置开机自启动,oracle11g在linux系统下开机自启动设置
  10. 知识图谱java实现_知识图谱:neo4j(四)Java API
  11. Android【报错】This class should be public (android.support.v7.internal.widget.ActionBarView.HomeView)
  12. 用c#转换word或excel文档为html文件,C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例...
  13. 如何用matlab画圆的图像,matlab在图像上画圆
  14. 使用CSS动画实现 时钟转动效果
  15. C# 如何批量删除Excel单元格中的公式只保留数据
  16. python qq机器人 2019_QQ机器人开发
  17. ftp服务器上目录文件是否存在,在 Java 中如何检查 FTP 服务器上的文件或目录是否存在...
  18. opencv python教程简书_OpenCV-Python教程:57.图像修复
  19. 轮播图图片大小不统一
  20. percona toolkit系列(gh-ost)

热门文章

  1. 2021北京交通大学计算机专硕初试经验分享
  2. 如何有效清除页面缓存
  3. C++ warning: comparison is always false due to limited range of data type [-Wtype-limits]
  4. 光环国际PMP—3分钟解读:什么是项目经理
  5. 【EL】【JSTL】【文件上传下载】【学习笔记】寒假javaweb学习之旅1.5
  6. win7 命令行工具_7个很棒的命令行工具
  7. Kubernetes作为云原生应用的基石数据加密算法
  8. NOIP2021 游记
  9. Discuz! X3 数据字典_discuz教程
  10. STM32L431功耗参考表