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

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

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

1. 无效的解决方案:

在afterCellDispose中通过重新设置 cell 的 CellStyle 来设置 DataFormat,此时可以打印 cell的值和 DataFormat 发现与我们设置的一样,但是导出时就是没有生效。

注意:由于我使用了 easyexcel 中的横向填充数据,所以我将数据全部设置为 String 对应 Excel 中的 String,在下面代码中我删除了部分定制化的逻辑,仅仅只展示如何为本质是 Number的String数据加上DataFormat。

java 复制代码
@Slf4j
public class SignAmtCustTypeMergeStrategy implements CellWriteHandler {


    @Override
    public 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",格式。
java 复制代码
@Slf4j
public class SignAmtCustTypeMergeStrategy implements CellWriteHandler {


    @Override
    public 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设置会失败。(有懂得友友可以评论下~~~)

相关推荐
liliangcsdn35 分钟前
结合prompt分析NodeRAG的build过程
java·服务器·人工智能·数据分析·知识图谱
黑色的山岗在沉睡1 小时前
LeetCode 189. 轮转数组
java·算法·leetcode
会飞的小蛮猪1 小时前
Jenkins运维之路(权限分配&忘记admin密码)
java·运维·经验分享·jenkins·prometheus
slim~1 小时前
Java基础第9天总结(可变参数、Collections、斗地主)
java·开发语言
豆沙沙包?2 小时前
2025年- H118-Lc86. 分隔链表(链表)--Java版
java·数据结构·链表
A尘埃2 小时前
智能工单路由系统(Java)
java·开发语言·智能工单
失散133 小时前
分布式专题——1.1 Redis单机、主从、哨兵、集群部署
java·数据库·redis·分布式·架构
刘一说3 小时前
Linux调试命令速查:Java/微服务必备
java·linux·微服务
IT·陈寒3 小时前
怎么这么多 StringUtils —— Apache、Spring、Hutool 全面对比
java·spring·apache