美文网首页
easyexcel 使用拦截器(cellwritehandler

easyexcel 使用拦截器(cellwritehandler

作者: jhon_11 | 来源:发表于2023-03-21 11:46 被阅读0次

    问题描述

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

    至此问题得到解决

    相关文章

      网友评论

          本文标题:easyexcel 使用拦截器(cellwritehandler

          本文链接:https://www.haomeiwen.com/subject/iglmrdtx.html