自学内容网 自学内容网

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

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!