15.EasyExcel自定义Convert遇到大坑!!!
目录
一:自定义convert
二:注册使用convert
三:遇到问题
四:最终解决
在最近的项目开发中,遇到一个需求:用excel导出大量数据(这些数据导出到excel时需要都除以1万)。能想到的解决办法肯定是自定义一个convert将数值都除以10000。
代码如下:
一:自定义convert
/**
单位转换为万
**/
public class TenThousandDecimalConverter implements Converter<BigDecimal> {private static final BigDecimal TEN_THOUSAND = new BigDecimal("10000");@Overridepublic Class<BigDecimal> supportJavaTypeKey() {return BigDecimal.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.NUMBER;}@Overridepublic BigDecimal convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {switch (cellData.getType()) {case NUMBER:BigDecimal numberValue = cellData.getNumberValue();return Objects.nonNull(numberValue) ? numberValue.multiply(TEN_THOUSAND) : null;case STRING:String stringValue = cellData.getStringValue();if (StringUtils.isBlank(stringValue) || "NA".equals(stringValue)) {return null;}try {return new BigDecimal(stringValue).multiply(TEN_THOUSAND);} catch (NumberFormatException e){return null;}default:return null;}}@Overridepublic CellData<?> convertToExcelData(BigDecimal decimal, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) {return Objects.nonNull(decimal) ? new CellData<>(decimal.divide(TEN_THOUSAND, RoundingMode.HALF_UP)) : null;}
}
二:注册使用convert
ExcelWriter writer = EasyExcel.write(monthlyExportPath).registerConverter(new
TenThousandDecimalConverter()).build();
WriteSheet sheet0 = EasyExcel.writerSheet("sheet0").build();
writer.fill(dataList,sheet0);
WriteSheet sheet1 = EasyExcel.writerSheet("sheet1").build();
writer.fill(dataList,sheet1);
可以看到将TenThousandDecimalConverter注册到EasyExcel了。
三:遇到问题
那么问题来了,在代码上线之后出现了一种情况:此需求是已经实现了,将所有数值都除以了1万。但是出现了一种状况:其他功能模块导出的excel文件中所有数值也都除以了1万。。。
关键这个bug有前提条件,在导出需要除以1万的这个excel之后,再导出其他功能模块的excel就会遇到也除以了一万的情况;如果在项目启动后,没有导出过需要除以1万的excel,导出的其他excel又是正常的,bug又不会复现了。开发大半天都没有找到原因所在,在本地怎么都复现不出来bug,而上线后用户一使用就又复现了......
四:最终解决
在仔细研读”注册使用convert代码“后,发现这里的注册方式和之前其他模块写的注册方式有一点不一样,改成如下代码:
WriteSheet sheet0 = EasyExcel.writerSheet("sheet0").registerConverter(new TenThousandDecimalConverter()).build();
WriteSheet sheet1 = EasyExcel.writerSheet("sheet1").registerConverter(new TenThousandDecimalConverter()).build();
再经过测试验证,最后的这种写法才是convert正确的使用方式。将convert注册到sheet上,就是临时生效的,不会影响到其他地方对EasyExcel的使用。
15.EasyExcel自定义Convert遇到大坑!!!相关推荐
- EasyExcel 自定义LocalDate类型转换器Converter
1 Maven依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel< ...
- EasyExcel自定义表头导出模板并封装数据下拉选择
EasyExcel自定义表头导出模板 首先查询可变数据 动态数据Controller 表头封装 定义导出模板时的下拉数据 最终结果 首先查询可变数据 动态数据Controller @ApiOperat ...
- Java开发日志 - EasyExcel自定义类型转换、Excel表头字段问题
1. EasyExcel自定义数据转换 EasyExcel 是阿里的一个用来读取和写入excel的库, 因为项目需要, 所以我需要从前端上传excel文件, 然后导入到数据库中 1.1 自定义转换类 ...
- EasyExcel 自定义Excel模版数据填充
1.自定义模版如下: 销量校验异常数据 序号 spu编码 sku编码 商品名称 销量 mysql redis mongodb {.rowIndex} {.productCode} {.skuCode} ...
- easyexcel 列头合并_2020-05-19:EasyExcel自定义合并单元格
public static void writeExcelWithHeadAndData(OutputStream outputStream, List> head, List> body ...
- EasyExcel自定义复杂的表头并在同sheet中实现分页
文章目录 前言 一.EasyExcel导出 1.关键代码 2.测试 3.导出结果展示 总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 自定义表头导出excel,并在同sheet中进行分页 ...
- easyExcel自定义格式转换
使用easyExcel工具处理导入导出字段时,可能会涉及某些字段特殊处理,比如日期格式处理.字段加解密.枚举处理等,可以使用自定义格式转换来实现,具体实现方式: 参考官网:写Excel | Easy ...
- 集成easyexcel自定义封装,全局通用导出excel功能
1.说明:导出功能(支持全部字段导出和用户自定义字段导出) 1 使用方式:导出接口类上添加注解 @EasyExcelExport,返回值必须以分页形式接收,一般场景与列表接口同时使用即可 2 注意事项 ...
- easyExcel自定义表头导出
当页面列表数据过多,而我们真实需要导出Excel表格的列没有那么多时,则需要支持,仅导出用户选定的列,老样子直接上图上代码. 如:页面全量数据如图,有9列 但实际上,业务有时只需要三列,每次下载后,还 ...
最新文章
- 瑞士军刀——Pandoc
- python入门练习题-python入门-简单基础题练习
- 非存储过程分页- 前台分页样式和控件
- docker新建Linux虚拟机,RHEL/CentOS 7下创建你的第一个Docker容器
- Java堆和栈的区别
- siesta在Linux运行,siesta-3.0-b
- mac pycharm安装设置_入门python,这样操作,简单易学(安装教程)
- ActiveMQ 即时通讯服务 入門指南及淺析
- java validate校验_自定义工具类实现validate参数校验
- Python基础 —— dict
- Android新增usb Audio(mic)设备
- 用友u8cloud使用教程_用友财务软件还不会操作?看完这些操作,工作得心应手...
- Hadoop1.0.0 eclipse插件下载
- 2021年中国互联网安全行业发展状况及发展趋势展望分析[图]
- 焊接好的CH340G芯片不工作
- 《卓有成效的管理者》读书笔记(一)——推荐序四
- Kettle报错:Driver class org.gjt.mm.mysql.Driver could not be found
- 汇编指令CLI/STI
- mysql records_MySQL 安装配置 · LYF_Records
- truncate table 用法