文章目录
- 一、问题描述
- 二、问题排查
- 三、解决问题
一、问题描述
最近发现原本项目的导出excel功能中,写的那些 CellWriteHandler
去改变样式的代码全都不生效了
二、问题排查
由于代码都是没有改动的,加上最近有升级过 easyExcel
的版本,由原本的 2.2.7
升级到了 3.3.4
,版本跨度比较大,所以怀疑是升级导致的问题
于是去 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
类里发现确实有覆盖样式的操作,如下图:(ps:原本的2.2.7版本里是没有这个类的)
三、解决问题
要解决问题,很简单,只要让我们自定义的 writeHandler
,排序的时候排到 FillStyleCellWriteHandler
后面就可以了
通过类图,我们知道我们自定义的 writeHandler
其实实现了 Order
接口,并且在 Handler
接口里设置了默认值是0
而 FillStyleCellWriteHandler
的 order 是 50000
所以,只需要实现 order()
方法,并且大于50000即可,加上如下代码即可
@Override
public int order() {
return 50001;
}