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

相关推荐
一只会写代码的猫21 小时前
面向高性能计算与网络服务的C++微内核架构设计与多线程优化实践探索与经验分享
java·开发语言·jvm
萤丰信息1 天前
智慧园区能源革命:从“耗电黑洞”到零碳样本的蜕变
java·大数据·人工智能·科技·安全·能源·智慧园区
曹牧1 天前
Eclipse为方法添加注释
java·ide·eclipse
我叫张小白。1 天前
Spring Boot拦截器详解:实现统一的JWT认证
java·spring boot·web·jwt·拦截器·interceptor
Gerardisite1 天前
如何在微信个人号开发中有效管理API接口?
java·开发语言·python·微信·php
闲人编程1 天前
Python的导入系统:模块查找、加载和缓存机制
java·python·缓存·加载器·codecapsule·查找器
故渊ZY1 天前
Java 代理模式:从原理到实战的全方位解析
java·开发语言·架构
匿者 衍1 天前
POI读取 excel 嵌入式图片(支持wps 和 office)
java·excel
一个尚在学习的计算机小白1 天前
java集合
java·开发语言
IUGEI1 天前
synchronized的工作机制是怎样的?深入解析synchronized底层原理
java·开发语言·后端·c#