当前位置: 首页 > 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设置会失败。(有懂得友友可以评论下~~~)

相关文章:

  • C++ 异步编程与网络编程:工具、协议的层次与协同
  • 金砖国家人工智能高级别论坛在巴西召开,华院计算应邀出席并发表主题演讲
  • 多相电机驱动控制学习(2)——基于双dq的双三相PMSM学习(考虑互感/交叉耦合)
  • 网络协议入门:TCP/IP五层模型如何实现全球数据传输?
  • 学习STC51单片机18(芯片为STC89C52RCRC)
  • 微信小程序页面嵌套web-view点击系统导航返回时进行弹窗处理
  • WPF的基础控件:布局控件(StackPanel DockPanel)
  • RabbitMQ仲裁队列高可用架构解析
  • 720全景展示:VR全景的技术原理及应用
  • 深入理解设计模式之中介者模式
  • AudioTrack的理解
  • 用豆包写单元测试
  • 服务器定时任务查看和编辑
  • 理解并解决高丢包率问题,构建清晰流畅的实时音视频通话
  • 二重积分 -- 立体的体积
  • 网络安全十大漏洞
  • vue3+Pinia+element-plus 后台管理系统项目实战
  • CRM系统的数据库结构详细设计
  • js中common.js和ECMAScript.js区别
  • 【华为开发者空间 x DeepSeek】服务器运行Ollama并在本地调用
  • 一站式服务就像一个什么/百度经验app下载
  • 做网站靠教育赚钱/关键词优化公司靠谱推荐
  • 网站关键词优化推广哪家快/百度下载正版
  • 正规做兼职的网站/搜索引擎入口google
  • 东营注册公司/香港seo公司
  • 给别人做网站如何收费/代写文案平台