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

相关推荐
小白学大数据17 小时前
Java 异步爬虫高效获取小红书短视频内容
java·开发语言·爬虫·python·音视频
我命由我1234517 小时前
Android Jetpack Compose - Compose 重组、AlertDialog、LazyColumn、Column 与 Row
android·java·java-ee·kotlin·android studio·android jetpack·android-studio
愤怒的代码18 小时前
在 Android 中执行 View.invalidate() 方法后经历了什么
android·java·kotlin
memgLIFE18 小时前
SQL 优化方法详解(1)
java·数据库·sql
2201_7578308718 小时前
Bean原理篇
java·开发语言
小宇的天下18 小时前
Calibre 3Dstack--每日一个命令day 6 [process和export layout](3-6)
java·前端·数据库
牛奔18 小时前
docker compose up 命令,默认配置文件自动查找规则
java·spring cloud·docker·容器·eureka
工具罗某人18 小时前
docker快速部署jenkins
java·docker·jenkins
华如锦18 小时前
四:从零搭建一个RAG
java·开发语言·人工智能·python·机器学习·spring cloud·计算机视觉
Tony_yitao18 小时前
22.华为OD机试真题:数组拼接(Java实现,100分通关)
java·算法·华为od·algorithm