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);
至此问题得到解决