当前位置: 首页 > news >正文

EasyExcel使用导出模版后设置 CellStyle失效问题解决

EasyExcel使用导出模版后在CellWriteHandler的afterCellDispose方法设置 CellStyle失效问题解决方法

问题描述:excel 模版塞入数据后,需要设置单元格的个性化设置时失效,本文以设置数据格式为例(设置列的数据展示时需要加上千分位分隔符)
在这里插入图片描述

1. 无效的解决方案:

在afterCellDispose中通过重新设置 cell 的 CellStyle 来设置 DataFormat,此时可以打印 cell的值和 DataFormat 发现与我们设置的一样,但是导出时就是没有生效。
注意:由于我使用了 easyexcel 中的横向填充数据,所以我将数据全部设置为 String 对应 Excel 中的 String,在下面代码中我删除了部分定制化的逻辑,仅仅只展示如何为本质是 Number的String数据加上DataFormat。

@Slf4j
public class SignAmtCustTypeMergeStrategy implements CellWriteHandler {@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {if (cellType == CellType.STRING) {String stringCellValue = cell.getStringCellValue();if (StringUtils.isNotEmpty(stringCellValue)) {try {Workbook workbook = writeSheetHolder.getSheet().getWorkbook();CellStyle newStyle = workbook.createCellStyle();CellStyle originalStyle = cell.getCellStyle();if (originalStyle != null) {newStyle.cloneStyleFrom(originalStyle);}newStyle.setDataFormat(IntegerEnum.FOUR.getValue().shortValue());cell.setCellStyle(newStyle);BigDecimal bigDecimal = new BigDecimal(stringCellValue);cell.setCellValue(bigDecimal.doubleValue());} catch (Exception e){}}}}
}

2. 解决方案:

在执行writeCellData.setWriteCellStyle(writeCellStyle);前后可以对比下面的区别writeCellStyle
在这里插入图片描述

  • 具体的区别见下图:index=4代表的是BuiltinFormats的 "#,##0.00",格式。
    在这里插入图片描述在这里插入图片描述
@Slf4j
public class SignAmtCustTypeMergeStrategy implements CellWriteHandler {@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {if (cellType == CellType.STRING) {String stringCellValue = cell.getStringCellValue();if (StringUtils.isNotEmpty(stringCellValue)) {try {BigDecimal bigDecimal = new BigDecimal(stringCellValue);cell.setCellValue(bigDecimal.doubleValue());if (!cellDataList.isEmpty()) {WriteCellData<?> writeCellData = cellDataList.get(0);WriteCellStyle writeCellStyle = new WriteCellStyle();DataFormatData dataFormatData = new DataFormatData();dataFormatData.setIndex(IntegerEnum.FOUR.getValue().shortValue());writeCellStyle.setDataFormatData(dataFormatData);writeCellData.setWriteCellStyle(writeCellStyle);}} catch (Exception e){}}}}
}

注意:如果你在执行前你的 cell 数据就是 Number 则不需要执行BigDecimal bigDecimal = new BigDecimal(stringCellValue); cell.setCellValue(bigDecimal.doubleValue());这两行逻辑,如果你想让 String 转 Number并设置DataFormat 则需要设置这段,具体原因还不太清楚,但是不设置DataFormat设置会失败。(有懂得友友可以评论下~~~)

http://www.xdnf.cn/news/685009.html

相关文章:

  • python完成批量复制Excel文件并根据另一个Excel文件中的名称重命名
  • C++之string题目练习
  • jQuery和CSS3卡片列表布局特效
  • tauri2项目打开某个文件夹,类似于mac系统中的 open ./
  • mybatis的mapper对应的xml写法
  • 【技术测评】黑龙江亿林网络「启强 Plus」服务器实测:56 核 32G 配置下的性能表现与应用场景解析
  • BEVDepth- Acquisition of Reliable Depth for Multi-view 3D Object Detection
  • [蓝桥杯C++ 2024 国 B ] 立定跳远(二分)
  • [Hackers and Painters] 读书笔记 | 设计模式思想 | LISP
  • 设计模式-装饰模式
  • 机器学习中无监督学习方法的聚类:划分式聚类、层次聚类、密度聚类
  • Python爬虫第22节- 结合Selenium识别滑动验证码实战
  • Java设计模式之设计原则
  • 莫毅明和钟家庆数学命题证明使用的预期理由和或然推理的错误
  • 使用JAVA 语言中 JNA 和 PDU 的区别
  • 深兰科技陈海波率队考察南京,加速AI医诊大模型区域落地应用
  • Python爬虫(40)基于Selenium与ScrapyRT构建高并发动态网页爬虫架构:原理、实现与性能优化
  • vscode 配置 QtCreat Cmake项目
  • 文件上传绕过方法总结
  • Deep Evidential Regression
  • 【AUTOSAR】时间保护(Timing Protection)概念、应用与实现源代码解析(上篇)
  • 大模型三大缺陷与RAG破解之道
  • vue3基本类型和对象类型的响应式数据
  • Disruptor—核心源码实现分析(三)
  • 解决开机必须联网的问题并关闭windows搜索页面的推荐
  • MES生产管理系统:Java+Vue,含源码与文档,集成生产信息,实现计划、执行与监控高效协同
  • Foupk3systemX5OSNTXPro引擎
  • 一键重装Windows/Linux系统,支持虚拟服务器
  • Java并发编程中的锁分类
  • AD-PCB--AD20软件安装及中英文切换 DAY 2