设置背景色
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();