在实现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