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

在实现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查到数据后,将其映射到实体上构建对应实体类时,是否保留了两位小数

4、最后使用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);

 

posted @ 2022-08-23 16:08  charler。  阅读(3878)  评论(0编辑  收藏  举报