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

相关推荐
2601_962885721 分钟前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
滕州市燕猫虎计算机科技工作室个体工商户9 分钟前
Java锁
java·开发语言
shehuiyuelaiyuehao2 小时前
1计算机是如何工作的
java·计算机网络
letisgo53 小时前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理
水域安全老周3 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
三8443 小时前
Java 模板注入(FreeMarker) · 02 · 模板引擎与 FreeMarker 语法
java·开发语言·web安全·freemarker
暮雨哀尘3 小时前
Java 基础练习(一):创建类并调用对象
java·开发语言
想要入门的程序猿4 小时前
回调函数学习
java·网络·学习
泡海椒4 小时前
动态代理核心原理:JQuick-Java接口规则自动生成机制解析
java·开发语言·python
步行cgn4 小时前
Spring 启动报错:BeanFactory not initialized 的原因与解决
java·python·spring