easyexcel
easyexcel copied to clipboard
使用模版导出,拦截器afterCellDispose指定cell,最终却对全局cell生效
建议先去看文档
触发场景描述
使用excel模版导出,需要使用拦截器afterCellDispose,根据业务逻辑判定,对指定的cell修改。最终需要修改的样式对全局cell生效。
触发Bug的代码
public class MyCellWriterHandler implements CellWriteHandler {
@Override
public void afterCellDispose(CellWriteHandlerContext context) {
Cell cell = context.getCell();
CellStyle cellStyle = cell.getCellStyle();
if (cellStyle == null) {
cellStyle = cell.getSheet().getWorkbook().createCellStyle(); // 创建新的样式
}
String sheetName = cell.getRow().getSheet().getSheetName();
// 这里的代码已经简化了,就是对指定sheet页的指定单元格上背景色
if (sheetName.equals("基础信息") && cell.getColumnIndex() == 0) {
cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
}
cell.setCellStyle(cellStyle);
}
}
这是我的写入代码:
public void write(ExcelWriter writer, W data) {
init();
for (Map.Entry<String, ExcelSheetAdapter<?>> entry : excelSheetMetaDataMap.entrySet()) {
String sheetName = entry.getKey();
WriteSheet writeSheet = EasyExcel.writerSheet(sheetName)
.needHead(true)
.registerWriteHandler(new MyCellWriterHandler())
.build();
writer.write(getData(data, classExcelSheetAdapterMap.getKey(entry.getValue())), writeSheet);
}
writer.finish();
}
提示的异常或者没有达到的效果
所有的单元格都被渲染了灰色背景色
我也有这样的问题,无解
根据官网文档自定义样式, 可以使用WriteCellStyle,也适用于根据模板填充导出。
可以参考这个样例,亲测有效
@Slf4j
public class IssueWriteHandler implements CellWriteHandler {
@Override
public void afterCellDispose(CellWriteHandlerContext context) {
if (BooleanUtils.isNotTrue(context.getHead())) {
log.info("正在处理: 行 {}, 列 {}", context.getRowIndex(), context.getColumnIndex());
WriteCellData<?> cellData = context.getFirstCellData();
WriteCellStyle writeCellStyle = cellData.getOrCreateStyle();
if (context.getColumnIndex() == 0) {
writeCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
writeCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
}
}
}
}