EasyExcel的AbstractColumnWidthStyleStrategy注入CellStyle不生效

Easyexcel(5-自定义列宽) Easyexcel注解调整列宽,类方法调整列宽,自定义列宽工具类,列宽策略类源码查看 阅读详情
AI摘要

博客围绕项目中EasyExcel导出Excel功能里,自定义CellWriteHandler改变样式代码不生效的问题展开。通过调试EasyExcel源码,发现自定义handler经排序清理后样式被默认handler覆盖。最终提出解决办法,让自定义handler排序时排在FillStyleCellWriteHandler后面。

设置背景色

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();
EasyExcel表头宽度根据数据内容自适应+自动换行 我的版本EasyExcel为3.x,如果使用2.x可能有些字段不一样。 阅读详情

相关推荐

数电实验,如何安装Quartus II软件?

数电实验第一步,安装软件Quartus II! 安装这个软件可以说是很折磨我了,依然是failed很多次之后终于可以了! 能成功安装,多亏了网络上的各路大神!!!不胜感激 现在分享经验如下: ps:我分享的是Quartus II 14.0版本的软件及破解器安装使用方法 注意!想要在电脑上顺利安装,前提条件是电脑有10G以上内存!!! 友情提示:建议整个下载过程中,提前关掉所有杀毒、电脑

一个程序媛的成长记录❤ 3652

EasyExcel 非注解方式设置列宽

在官方文档中并没有找到对应的操作,经过一番查看源码,最终在WriteHandler 接口的实现中找到了抽象类AbstractColumnWidthStyleStrategy 的子类 SimpleColumnWidthStyleStrategy EasyExcel.write(response.getOutputStream()) .registerWriteHandler(new SimpleColumnWidthStyleSt

qq_43458533的博客 3410

在 Ubuntu 上安装和配置 PostgreSQL 实录

本文介绍了在Ubuntu系统上安装和配置PostgreSQL数据库的完整步骤。主要内容包括:1)通过官方源或PPA源安装最新版本;2)修改配置文件(postgresql.conf和pg_hba.conf)以允许远程访问;3)设置postgres用户密码;4)创建新用户并配置权限;5)防火墙设置和重启服务;6)验证安装和远程连接方法。文章提供了详细的命令行操作指导,帮助用户完成从安装到远程访问的全部配置过程。

qq_58168857的博客 1203

EasyExcel自动设置列宽

一、编写一个类继承AbstractColumnWidthStyleStrategy public class ExcelWidthStyleStrategy extends AbstractColumnWidthStyleStrategy { @Override protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> list, Cell cell, Head head, In

cristianoxm的博客 4441

envi5.3处理高分二号影像数据详细过程记录

全文根据此篇文章进行数据处理: tm影像辐射定标_高分二号影像数据预处理及裁剪过程 其他参考: 学习笔记---遥感影像辐射定标与大气校正 利用ENVI自带全球DEM数据计算区域平均高程 高分二号数据处理流程(有高分二号的数据信息) GF2有多光谱和全色两个数据,MSS是多光谱的,PAN是全色的,多光谱的分辨率低,全色的高,需要把这两个数据融合,融合之前需要做定标等处理,获取经纬度。 一、多光谱影像处理 1. 辐射定标 以这个为例: 其他路径\2022.4.2...

ligous的博客 5万+

【SWAT水文模型】SWAT-CUP参数率定与模型验证实战指南

本文提供了SWAT水文模型参数率定与模型验证的完整实战指南。详细介绍了如何使用SWAT-CUP工具,特别是SUFI-2算法,进行自动化参数校准,并阐述了模型验证的关键步骤以避免过度拟合。内容涵盖从工程搭建、核心参数选择、迭代优化到结果分析与常见问题排查的全流程,旨在帮助用户提升SWAT模型模拟的准确性与可靠性。

weixin_29072299的博客 498

EasyExcel导入导出样式、自适应列宽、自适应行高

EasyExcel导入导出样式、自适应列宽、自适应行高,监听器,

m0_73900214的博客 1万+

差分运放电路输出电压偏置设计解析

差分运算放大电路是信号处理中的基础模块,通过差分对管结构实现共模抑制与差模放大。其核心原理基于运放的虚短虚断特性,当电阻网络满足对称条件时,输出电压与输入差分成正比。在工业测量系统中,由于ADC通常仅支持正电压输入,需要通过偏置电路将双极性信号平移至正电压范围。典型设计采用精密基准电压源和匹配电阻网络,既保持信号完整性又满足系统接口要求。本文以-100V高压测量为例,详细解析了分压网络设计、参考电压选取以及电阻匹配等关键技术要点,为传感器接口电路设计提供实践参考。

weixin_35750747的博客 468

【EasyExcel】根据单元格内容自动调整列宽

1.自定义Excel列宽样式策略类。

Chuk 1646

AI+医疗:多模态模型让肺结节诊断准确率突破95%+的实战方案

多模态融合是必由之路:单一影像模型难以突破95%准确率,必须整合临床、生物标志物等多维数据跨模态注意力机制是核心:简单拼接效果差,注意力机制能自动学习各模态权重,提升融合效果临床适配比技术先进更重要:模型输出必须符合医生诊断习惯,提供可解释的决策依据持续学习是长期成功的关键:医疗数据分布不断变化,模型必须具备自适应能力多学科协作是保障:放射科、胸外科、病理科、AI工程师共同参与模型设计与优化。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1022

光学传播仿真软件:ASAP_(1).ASAP软件介绍与安装

ASAP(Advanced System for Analysis and Propagation)是一款强大的光学传播仿真软件,广泛应用于光学系统的设计、分析和优化。它提供了丰富的建模工具和仿真功能,可以帮助用户从简单的光学元件到复杂的光学系统进行仿真。:支持光学、机械、热学等多物理场的联合仿真。:采用高精度的算法,确保仿真结果的准确性。:内置了大量的光学元件,如透镜、反射镜、棱镜、光栅等。:提供直观的用户界面,支持多种建模和仿真方式。:支持使用脚本语言进行二次开发,增强软件的定制能力。

kkchenjj的博客 1590

EasyExcel自适应列宽、行高、自动换行

java EasyExcel自定义模版导出excel自适应列宽、行高、自动换行,自定义样式

Lucky boy的博客 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

easyExcel 导出文件时,设置单元格样式,自适应列宽

easyExcel 导出时设置样式、列宽策略。

Saltwater_leo的专栏 3万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

EasyExcel动态跨行合并和自定义列宽的策略

第一个参数写入需要合并的列的字符串列表,会根据相同自动合并。第二个参数写入要合并单元格是第几列(索引从0开始)new 出合并单元格的对象。2.自定义跨行合并的策略。下载Excel的代码。下载Excel的代码。3.自定义列宽的策略。

YouReplaceSun的博客 3062

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

EasyExcel 非注解方式设置列宽行高的几种实现方式

前言 最近做项目需要做导出,导出使用EasyExcel这个工具,快捷实现功能。简单的导出表,使用注解的方式完全满足需求,但是如果是动态头,实时生成头写入的方式,就不能使用注解的方式去设置列宽行高,所以我们需要会用非注解方式设置列宽行高。 代码 第一种:直接使用简单的列宽行高的style策略 简单的列宽策略,列宽20 :new SimpleColumnWidthStyleStrategy(20)) 简单的行高策略:头行高30,内容行高20 :new SimpleRowHeightStyleStrat.

坐等夕阳落time的博客 1万+

EasyExcel——采用自定义拦截器设置单元格列宽

在EasyExcel的官方文档中,有一个自定义拦截器的配置与使用讲解。自定义拦截器(上面几点都不符合但是要对单元格进行操作的参照这个)官方案例只给出了简单的栗子,本篇博客将采用自定义拦截器实现设置单元格列宽的功能效果。官方给出的案例,是实现 SheetWriteHandler 接口,但从源码树状图接口来看,还能自定义其他的类实现。

专注写bug 2588

EasyExcel 自适应行宽、行高 写入处理器

最后发现是同一行cell中HeightInPoints被覆盖了的问题。。。@Override// 设置单元格类型// 数据总长度// 换行数// 默认一行高为20// 这边要特别注意一下/*** 计算长度* @return*/} else {return -1;} else {// 换行符(数据需要提前解析好)= -1?

weixin_47026857的博客 2308

easyexcel自定义样式策略

package com.sto.kms.fin.common.excel; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.util.StyleUtil; import com.alibaba.excel.write.handler.WriteHandler; import com.alibaba.excel.write..

Roc的博客 4016

easyExcel自定义样式

文章目录自定义行宽动态设置列宽设置固定列宽自定义样式标题样式内容样式使用样式 实际使用中,多数情况是使用Map读和写 自定义行宽 用easyExcel中的自动列宽很不好看,最后的导出单元格会非常宽,所以 可以读取标题宽度,然后去动态设置每一列的宽度,并设置一个最大值保证不会太长 或者根据导出的数据,设置一个固定的宽度,然后让数据自动换行(推荐这样) 动态设置列宽 需要自定义一个拦截器,继承AbstractColumnWidthStyleStrategy 通过单元格数据计算宽度并缓存起来 packag

qq_39030696的博客 9032

easyexcel 解决自适应宽度无效问题+空白列默认文本格式

调整单元格字符字节宽度,easyExcel默认直接用的UTF-8的byte长度,导致一旦三字节的字符过多就会变得很宽,一字节的字符过多就会不够宽。// 设置列的格式为文本格式。//设置数据格式索引。easyexcel2.2.8 版本。

PeiNiYiQiNao的博客 1735

java使用EasyExcel读写及校验Excel文件

EasyExcel是阿里巴巴开源的 Excel 读取框架,其最大的特点是极低的内存消耗和极高的文件读取速度。在本文中使用 EasyExcel,实现了读取 Excel 文件并对文件表头进行校验写入 Excel文件并根据写入内容自适应调整单元格宽高。EasyExcel官方文档。

♥公众号♥:打代码的苏比特 6697

SpringBoot集成阿里easyexcel(三)自定义EXCEL样式

多种方式设置Excel头样式、内容样式、单元格样式

her_he的博客 1550

android Adb 发广播、查包名、切换输入法等指令

己查看列表的输入法内容 adb shell ime list -s 设置输入法(如搜狗) adb shell ime set com.sohu.inputmethod.sogou.xiaomi/.SogouIME 查看app版本(如com.android.google) adb shell pm dump com.android.google | grep "versionName" 发广播 adb shell am broadcast -a com.android.test --es test_

forget_zhx的博客 1055

EasyExcel 自定义标题样式

EasyExcel 动态标题设置样式

weixin_42559785的博客 3857
上一篇: easyexce时区国际化处理
下一篇: Spring Boot 非常实用的内置功能减少内部开发
狂野弘仁
博客等级 码龄8年 34粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值