当前位置: 首页 > article >正文

EasyExcel的AbstractColumnWidthStyleStrategy注入CellStyle不生效

设置背景色

CellStyle style = workbook.createCellStyle();
        style.setFillForegroundColor(IndexedColors.RED.getIndex()); // 是设置前景色不是背景色
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND)
 EasyExcel.writerTable(0).head(Head1.class).registerWriteHandler(new AbstractColumnWidthStyleStrategy() {
              
                
                @Override
                public void afterCellDispose(CellWriteHandlerContext context) {
                    if(context.getHead()){
                        System.out.println("表头");
                        Cell cell = context.getCell();
                        System.out.println(cell.getStringCellValue());
                        CellStyle cellStyle  = cell.getSheet().getWorkbook().createCellStyle();
                        //cell.setCellStyle(cell.getSheet().getWorkbook().createCellStyle());
                        cellStyle.setFillForegroundColor(IndexedColors.RED1.getIndex());
                        //cell.getCellStyle().setFillBackgroundColor(IndexedColors.RED.getIndex());
                        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                        cell.setCellStyle(cellStyle);
                       
                    }else{
                        System.out.println("表体");
                        Cell cell = context.getCell();
                        System.out.println(cell.getStringCellValue());
                        WriteCellStyle lastRowCellStyle = new WriteCellStyle();
                        
                        CellStyle cellStyle  = cell.getSheet().getWorkbook().createCellStyle();
                        //cell.setCellStyle(cell.getSheet().getWorkbook().createCellStyle());
                        cellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
                        cell.getCellStyle().setFillBackgroundColor(IndexedColors.RED.getIndex());
                        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                        cell.setCellStyle(cellStyle);
                    }
                }
            }).needHead(Boolean.TRUE).build();

一、问题描述
最近发现原本项目的导出excel功能中,写的那些 CellWriteHandler 去改变样式的代码全都不生效了
二、问题排查
由于代码都是没有改动的, easyExcel 的版本 3.1.5,

于是去 debug跟了下 easyExcel 的源码,我们注册自定义的 CellWriteHandler ,调用的是com.alibaba.excel.write.builder.AbstractExcelWriterParameterBuilder#registerWriteHandler 方法,从这里开始 debug
在这里插入图片描述

继续跟进 parameter().getCustomWriteHandlerList().add(writeHandler);

发现是添加到了 WriteBasicParameter 类的成员变量 customWriteHandlerList 里
在这里插入图片描述

点一下 customWriteHandlerList,看看哪些地方用到了这个成员变量的 get 方法

在这里插入图片描述

在 AbstractWriteHolder 里有用到

在这里插入图片描述

可以看到,把所有自定义的 handler 全部加到了 handlerList 里,然后调用了 sortAndClearUpHandler 方法,看这个方法名就能看出来,还要对 handler 进行排序和清理,再看下面
在这里插入图片描述

还会再加入默认的 writeHandler, 再排序清理一次,看到这里大概可以猜到了,估计我们自定义的 writeHandler,经过排序清理之后,并不在最后,样式估计被后面的 writeHandler 覆盖了,我们看下排序清理后的结果
在这里插入图片描述

其中5和6是我们自定义的 writeHandler,下面7,8,9应该是默认的 writeHandler,这3个逐个看了下源码,最终在 FillStyleCellWriteHandler 类里发现确实有覆盖样式的操作,
在这里插入图片描述
三、解决问题
要解决问题,很简单,只要让我们自定义的 writeHandler,排序的时候排到 FillStyleCellWriteHandler 后面就可以了

 EasyExcel.writerTable(0).head(Head1.class).registerWriteHandler(new AbstractColumnWidthStyleStrategy() {
                @Override
                public int order() {
                    return 50001;
                }
                
                @Override
                public void afterCellDispose(CellWriteHandlerContext context) {
                    if(context.getHead()){
                        System.out.println("表头");
                        Cell cell = context.getCell();
                        System.out.println(cell.getStringCellValue());
                        CellStyle cellStyle  = cell.getSheet().getWorkbook().createCellStyle();
                        //cell.setCellStyle(cell.getSheet().getWorkbook().createCellStyle());
                        cellStyle.setFillForegroundColor(IndexedColors.RED1.getIndex());
                        //cell.getCellStyle().setFillBackgroundColor(IndexedColors.RED.getIndex());
                        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                        cell.setCellStyle(cellStyle);
                       
                    }else{
                        System.out.println("表体");
                        Cell cell = context.getCell();
                        System.out.println(cell.getStringCellValue());
                        WriteCellStyle lastRowCellStyle = new WriteCellStyle();
                        
                        CellStyle cellStyle  = cell.getSheet().getWorkbook().createCellStyle();
                        //cell.setCellStyle(cell.getSheet().getWorkbook().createCellStyle());
                        cellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
                        cell.getCellStyle().setFillBackgroundColor(IndexedColors.RED.getIndex());
                        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                        cell.setCellStyle(cellStyle);
                    }
                }
            }).needHead(Boolean.TRUE).build();
原文地址:https://blog.csdn.net/codeSmart/article/details/143630166
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/387420.html

相关文章:

  • java常量池
  • 使用KNN实现对鸢尾花数据集或者自定义数据集的的预测
  • Formality:不可读(unread)的概念
  • 怎样使用树莓派自己搭建一套ADS-B信号接收系统
  • vector的使用,以及部分功能的模拟实现(C++)
  • k8s的CICD实施项目
  • 网页版五子棋—— WebSocket 协议
  • IntelliJ IDEA 中创建目录时 `.` 和 `/` 的区别
  • 【Hadoop和Hbase集群配置】3台虚拟机、jdk+hadoop+hbase下载和安装、环境配置和集群测试
  • go中的类型断言详解
  • 学习笔记:黑马程序员JavaWeb开发教程(2024.11.9)
  • 使用成熟的框架做量化剪枝蒸馏
  • 机器学习系列----梯度下降算法
  • MVDR:最小方差无失真响应技术解析
  • 通过 Nacos 服务发现进行服务调用时的 500 错误排查与解决
  • C++类和对象 (下)
  • Linux数据管理初探
  • PG COPY 与 INSERT方式导入数据时, 表默认值表现的不同
  • 使用k8s RBAC和ValidatingAdmissionPolicy 配合来校验用户权限
  • Kafka 的一些问题,夺命15连问
  • 简单记录某云创建云主机部署docker,能ping通外网而curl不通的问题
  • 【go从零单排】初探goroutine
  • C# 项目中配置并使用 `log4net` 来输出日志
  • ChatGPT的多面手:日常办公、论文写作与深度学习的结合
  • OpenCV视觉分析之目标跟踪(11)计算两个图像之间的最佳变换矩阵函数findTransformECC的使用
  • MySQL基础-单表查询