首页 > 其他分享 >使用Converter解决EasyExcel写入时格式不满足预期的问题

使用Converter解决EasyExcel写入时格式不满足预期的问题

时间:2022-08-23 16:26:25浏览次数:117  
标签:return Converter EasyExcel 写入 Override CellData public BigDecimal

在实现web下载excel时,遇到了一个看似简单的问题,让我头痛了两天(毕竟刚入职,比较菜,有些简单需求也要搞好久),需求中的excel下载已经实现了,但是因为财务使用这个功能的原因,需要强制保留两位小数,多了四舍五入,少了则自动补全0,直到两位。

1、本来可以直接使用注释实现保留两位小数,可能是项目中的easyexcel版本是2.x 的原因,注释无效

如果遇到相同问题的,版本为3.x 可以尝试在字段上加上

1     @ContentStyle(dataFormat = 2)

就可以实现保留两位小数,具体分析请看:https://blog.csdn.net/u013658328/article/details/115005676

2、首先排查从数据库中查询的数据格式是否有多位小数

3、再检查mybatis查到数据后,将其映射到实体上构建对应实体类时,是否保留了两位小数

3、最后使用converter将其强制保留两位小数,最后解决了这个问题

使用的Converter代码如下:

 1 public class BigDecimalConverter implements Converter<BigDecimal> {
 2     @Override
 3     public Class supportJavaTypeKey() {
 4         return BigDecimal.class;
 5     }
 6 
 7     @Override
 8     public CellDataTypeEnum supportExcelTypeKey() {
 9         return CellDataTypeEnum.NUMBER;
10     }
11     // 将excel转化为java 数据时,需要执行的转化操作
12     @Override
13     public BigDecimal convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
14         String str = cellData.getStringValue();
15         return new BigDecimal(str).setScale(2, BigDecimal.ROUND_DOWN);
16     }
17     // java 数据写入excel时,需要执行的转化操作
18     @Override
19     public CellData convertToExcelData(BigDecimal value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
20         BigDecimal cur = value.setScale(2, RoundingMode.DOWN);
21         return new CellData<>(cur.toString());
22     }
23 }

实现Converter接口,<xxx>里面写需要转化的数据类型,再重写 ConvertToJavaData 以及ConvertToExcelData 两个方法即可。

注:EasyExcel的版本不同,可能重写的方法名字会有所不同,但整体逻辑是一样的。

后续同样利用Converter 解决了写入时,需要将yyyy-MM-dd hh:mm:ss 转化为 yyyy-MM-dd 的问题。

 1 public class LocalDateConverter implements Converter<LocalDate> {
 2 
 3     @Override
 4     public Class<LocalDate> supportJavaTypeKey() {
 5         return LocalDate.class;
 6     }
 7 
 8     @Override
 9     public CellDataTypeEnum supportExcelTypeKey() {
10         return CellDataTypeEnum.STRING;
11     }
12 
13     @Override
14     public LocalDate convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
15         return LocalDate.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
16     }
17 
18     @Override
19     public CellData<LocalDate> convertToExcelData(LocalDate value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
20         return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
21     }
22 }

写好的converter直接注册即可生效,但会对所有对应的数据类型生效,也可以使用注释在指定字段上生效(我版本比较低,注释了不起作用)具体请自行百度。注册代码如下所示:

1     EasyExcel.write(response.getOutputStream(), DownloadData.class)
2                 .sheet("模板")
3                 .registerConverter(new LocalDateConverter())
4                 .registerConverter(new BigDecimalConverter())
5                 .doWrite(list);

 

标签:return,Converter,EasyExcel,写入,Override,CellData,public,BigDecimal
From: https://www.cnblogs.com/charler/p/16616652.html

相关文章

  • 使用EasyExcel实现web的excel下载
    Excel下载算是比较基础常见的需求了,一般有两种实现,一种使用Poi,第二种就是本文的EasyExcel实现下载,与前者相对比,EasyExcel做了进一步的封装,更容易实现了,贴上EasyExcel的官......
  • WPF Type Converter和 IValueConverter
    初学者。博客仅做个人的理解整理,不到位的地方欢迎大佬们指出,感谢。 1.类型转换器 TypeConverter1.1类型转换器是用来干什么的?在xaml中给控件的属性赋值,后台代码解析......
  • 过滤>符号,Linux下写入Webshell
    最近的学习生活中,看到了好兄弟写出的这么一句话让我陷入沉思,是否>被过滤,就意味着写入不了Webshell了?于是有了下面的Payload只要|没被过滤,就有可能写入成功!echo3c3f706......
  • 文件系统格式化,挂载目录及写入数据
    硬盘       分区 ..........格式化..................挂载目录-----------写入数据。毛坯       分主卧、次卧、厨房、客厅............ ......
  • python 日志写入文件
    importloggingfmt="%(asctime)s%(filename)s[line:%(lineno)d]%(levelname)s:%(message)s"logging.basicConfig(level=logging.DEBUG,format=fmt,......
  • python写入txt 和python写入csv 202208
     ##写入csvdic=[1,2,3,4,5]# # file = open('21.txt', mode='w',encoding='UTF-8')# # file.write(dic)# # # 关闭文件,不关闭文件可能会出问题# # fil......
  • 基于EasyExcel实现的分页数据下载封装
    功能概述主要实现的功能:1.分页查询,避免一次性查询全部数据加载到内存引起频繁FULLGC甚至OOM2.当数据量超过单个工作簿最大行数(1048575)时,自动将数据写入新的工作簿3.支......