EasyExcel的CellWriteHandler注入CellStyle不生效

35 篇文章 1 订阅
11 篇文章 0 订阅

一、问题描述

最近发现原本项目的导出excel功能中,写的那些 CellWriteHandler 去改变样式的代码全都不生效了

二、问题排查

由于代码都是没有改动的,加上最近有升级过 easyExcel 的版本,由原本的 2.2.7 升级到了 3.3.4,版本跨度比较大,所以怀疑是升级导致的问题

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

image-20240517151715797

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

发现是添加到了 WriteBasicParameter 类的成员变量 customWriteHandlerList

image-20240517151842566

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

image-20240517152026906

AbstractWriteHolder 里有用到

image-20240517152110049

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

image-20240517153206536

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

image-20240517153733567

其中5和6是我们自定义的 writeHandler,下面7,8,9应该是默认的 writeHandler,这3个逐个看了下源码,最终在 FillStyleCellWriteHandler 类里发现确实有覆盖样式的操作,如下图:(ps:原本的2.2.7版本里是没有这个类的)

image-20240517153936295

三、解决问题

要解决问题,很简单,只要让我们自定义的 writeHandler,排序的时候排到 FillStyleCellWriteHandler 后面就可以了

image-20240517154131986

通过类图,我们知道我们自定义的 writeHandler 其实实现了 Order 接口,并且在 Handler 接口里设置了默认值是0

image-20240517154250488

FillStyleCellWriteHandler 的 order 是 50000

image-20240517154308585

所以,只需要实现 order() 方法,并且大于50000即可,加上如下代码即可

@Override
public int order() {
    return 50001;
}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步亿点点的小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值