easyexcel icon indicating copy to clipboard operation
easyexcel copied to clipboard

使用模版导出,拦截器afterCellDispose指定cell,最终却对全局cell生效

Open ryan-sgy opened this issue 1 year ago • 2 comments

建议先去看文档

快速开始常见问题

触发场景描述

使用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();
    }

提示的异常或者没有达到的效果

所有的单元格都被渲染了灰色背景色

EXPORT_OFFERING_INSTANCE20241117021055_2471.xlsx

ryan-sgy avatar Nov 17 '24 04:11 ryan-sgy

我也有这样的问题,无解

golangscott avatar Mar 07 '25 08:03 golangscott

根据官网文档自定义样式, 可以使用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);
            }
        }
    }
}

delei avatar Jul 23 '25 13:07 delei