EasyExcel的CellWriteHandler注入CellStyle不生效

发布于:2024-05-24 ⋅ 阅读:(195) ⋅ 点赞:(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;
}

网站公告

今日签到

点亮在社区的每一天
去签到