您的位置:首页 > 房产 > 建筑 > 网页样式与布局_广告设计与制作专业描述_谷歌ads广告投放_网店推广策划书

网页样式与布局_广告设计与制作专业描述_谷歌ads广告投放_网店推广策划书

2025/3/10 9:49:34 来源:https://blog.csdn.net/codeSmart/article/details/143630166  浏览:    关键词:网页样式与布局_广告设计与制作专业描述_谷歌ads广告投放_网店推广策划书
网页样式与布局_广告设计与制作专业描述_谷歌ads广告投放_网店推广策划书

设置背景色

CellStyle style = workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.RED.getIndex()); // 是设置前景色不是背景色style.setFillPattern(FillPatternType.SOLID_FOREGROUND)
 EasyExcel.writerTable(0).head(Head1.class).registerWriteHandler(new AbstractColumnWidthStyleStrategy() {@Overridepublic 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() {@Overridepublic int order() {return 50001;}@Overridepublic 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();

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com