目录

一:自定义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遇到大坑!!!相关推荐

  1. EasyExcel 自定义LocalDate类型转换器Converter

    1 Maven依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel< ...

  2. EasyExcel自定义表头导出模板并封装数据下拉选择

    EasyExcel自定义表头导出模板 首先查询可变数据 动态数据Controller 表头封装 定义导出模板时的下拉数据 最终结果 首先查询可变数据 动态数据Controller @ApiOperat ...

  3. Java开发日志 - EasyExcel自定义类型转换、Excel表头字段问题

    1. EasyExcel自定义数据转换 EasyExcel 是阿里的一个用来读取和写入excel的库, 因为项目需要, 所以我需要从前端上传excel文件, 然后导入到数据库中 1.1 自定义转换类 ...

  4. EasyExcel 自定义Excel模版数据填充

    1.自定义模版如下: 销量校验异常数据 序号 spu编码 sku编码 商品名称 销量 mysql redis mongodb {.rowIndex} {.productCode} {.skuCode} ...

  5. easyexcel 列头合并_2020-05-19:EasyExcel自定义合并单元格

    public static void writeExcelWithHeadAndData(OutputStream outputStream, List> head, List> body ...

  6. EasyExcel自定义复杂的表头并在同sheet中实现分页

    文章目录 前言 一.EasyExcel导出 1.关键代码 2.测试 3.导出结果展示 总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 自定义表头导出excel,并在同sheet中进行分页 ...

  7. easyExcel自定义格式转换

    使用easyExcel工具处理导入导出字段时,可能会涉及某些字段特殊处理,比如日期格式处理.字段加解密.枚举处理等,可以使用自定义格式转换来实现,具体实现方式: 参考官网:写Excel | Easy ...

  8. 集成easyexcel自定义封装,全局通用导出excel功能

    1.说明:导出功能(支持全部字段导出和用户自定义字段导出) 1 使用方式:导出接口类上添加注解 @EasyExcelExport,返回值必须以分页形式接收,一般场景与列表接口同时使用即可 2 注意事项 ...

  9. easyExcel自定义表头导出

    当页面列表数据过多,而我们真实需要导出Excel表格的列没有那么多时,则需要支持,仅导出用户选定的列,老样子直接上图上代码. 如:页面全量数据如图,有9列 但实际上,业务有时只需要三列,每次下载后,还 ...

最新文章

  1. 瑞士军刀——Pandoc
  2. python入门练习题-python入门-简单基础题练习
  3. 非存储过程分页- 前台分页样式和控件
  4. docker新建Linux虚拟机,RHEL/CentOS 7下创建你的第一个Docker容器
  5. Java堆和栈的区别
  6. siesta在Linux运行,siesta-3.0-b
  7. mac pycharm安装设置_入门python,这样操作,简单易学(安装教程)
  8. ActiveMQ 即时通讯服务 入門指南及淺析
  9. java validate校验_自定义工具类实现validate参数校验
  10. Python基础 —— dict
  11. Android新增usb Audio(mic)设备
  12. 用友u8cloud使用教程_用友财务软件还不会操作?看完这些操作,工作得心应手...
  13. Hadoop1.0.0 eclipse插件下载
  14. 2021年中国互联网安全行业发展状况及发展趋势展望分析[图]
  15. 焊接好的CH340G芯片不工作
  16. 《卓有成效的管理者》读书笔记(一)——推荐序四
  17. Kettle报错:Driver class org.gjt.mm.mysql.Driver could not be found
  18. 汇编指令CLI/STI
  19. mysql records_MySQL 安装配置 · LYF_Records
  20. truncate table 用法

热门文章

  1. echars 图表过渡动画设置
  2. app、h5自定义取景框,调用摄像头内嵌到网页或app
  3. Visual Studio - 修改代码编辑背景颜色
  4. CV界的chatgpt出现——Segment Anything能分割万物
  5. CTF-UPX脱壳加壳讲解;(详细版)
  6. java编码规范(阿里巴巴2017年正式版)
  7. 私有云 VS 公有云
  8. rcp(插件开发) 如果强制关闭对话框向导(Wizard)-貌似是第一个贴出解决办法的!
  9. Java 每半年就会更新一次新特性,再不掌握就要落伍了:Java11 的新特性
  10. 对父母履行较多赡养义务后,能向弟弟追偿吗?