easyexcel 使用拦截器(cellwritehandler

2023-03-21  本文已影响0人  jhon_11

问题描述

使用easyexcel想要实现根据内容动态设置单元格颜色,但是设置了之后,下载下来的文件并不生效

/*
单元格颜色自定义处理器
 */
public class CellColorDefinedHandler implements CellWriteHandler {

    private static final String NOT_EMPTY = "NotEmpty";

    private final Map<String, JSONObject> colorCustomMap;

    public CellColorDefinedHandler(Map<String, JSONObject> colorCustomMap) {
        this.colorCustomMap = colorCustomMap;
    }


    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder,
                                 WriteTableHolder writeTableHolder,
                                 List<WriteCellData<?>> cellDataList,
                                 Cell cell, Head head,
                                 Integer relativeRowIndex,
                                 Boolean isHead) {
        //跳过表头
        if (isHead) {
            return;
        }

        //获取到当前索引下是否存在自定义颜色
        JSONObject map = colorCustomMap.get(String.valueOf(cell.getColumnIndex()));
        if(Objects.isNull(map)) {
            return;
        }
        String validate = map.get("validate").toString();
        String dependIndex = Objects.requireNonNullElse(map.get("depend_index"), Strings.EMPTY).toString();
        String colorIndex = map.get("color_index").toString();
        String dependValue = Objects.requireNonNullElse(map.get("depend_value"), Strings.EMPTY).toString();
        boolean check = true;
        if (NOT_EMPTY.equals(validate)) {
            if (!StringUtils.isBlank(dependIndex)) {
                Cell dependCell = cell.getRow().getCell(cell.getColumnIndex() - 1);
                if (dependValue.equals(dependCell.getStringCellValue())
                        && StringUtils.isBlank(cell.getStringCellValue())) {
                    check = false;

                }
            } else if (StringUtils.isBlank(cell.getStringCellValue())) {
                check = false;
            }
        }
        if (!check) {
            //将校验不通过的设置背景色
            Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
            CellStyle cellStyle = workbook.createCellStyle();
            // 将原始单元格样式克隆至新建的空的单元格样式对象
            cellStyle.cloneStyleFrom(cell.getCellStyle());
            // 设置背景色, 也可以设置其他样式
            cellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
           // cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            // 样式设置到当前单元格
            //cell.setCellValue("不合格");
            cell.setCellStyle(cellStyle);
        }


    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

    }
}

发现为空的这列需要标黄,结果却不生效


image.png

问题解决

查阅官网,发现要加这一行代码


                        // 由于这里没有指定dataformat 最后展示的数据 格式可能会不太正确

                        // 这里要把 WriteCellData的样式清空, 不然后面还有一个拦截器 FillStyleCellWriteHandler 默认会将 WriteCellStyle 设置到
                        // cell里面去 会导致自己设置的不一样
                        context.getFirstCellData().setWriteCellStyle(null);

至此问题得到解决

上一篇下一篇

猜你喜欢

热点阅读