Spring Boot使用EasyExecl自定义颜色填充指定单元格背景

Spring Boot使用EasyExecl自定义颜色填充指定单元格背景

最近,业务提了一个有意思的需要,要求根据他自定的标识,来给指定单元格填充他指定的颜色,我问他,为何要这般处理?他曰:便于用户识别重要指标值。行吧,那就弄呗。

EasyExecl是基于Apache POI开发的,并没有对颜色进行扩展。如果要新增颜色表,则只能新增XSSFColor对了,另外,目前只支持xlsx格式的自定义颜色。由于不同版本的EasyExecl其提供的方法及API会有差异,在使用的时候一定要注意引用的版本,这里,我用的是EasyExecl 2.2.8。单元格要指定的颜色,在EasyExecl有详细的样例,但是按照逻辑来标识颜色,就只有自己来处理了,这里需要注意两点:

  1. 需要自己创建一个CellWriteHandler实现类;
  2. Apache POI中的颜色索引都是固定的放在IndexedColors这个枚举,他肯定满足不了我们的颜色需求,我们需要通过RBG去实例化一个XSSFColor的颜色对象。

这里,新建一个CustomCellStyleWriteHandler类并继承CellWriteHandler接口,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class CustomCellStyleWriteHandler implements CellWriteHandler {

@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {

}

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

}

@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {

}

@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {

}
}

由于需要按指定的标识来填充单元格,这里,我把单元格索引放在Map中,key的格式为行索引_列索引,然后,并通过构造函数传进来,再在afterCellDispose方法中来判断单元格是否要填充。下面附上CustomCellStyleWriteHandler的完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class CustomCellStyleWriteHandler implements CellWriteHandler {
private Map<String,String> cellTypeFlag=new HashMap<>();
public CustomCellStyleWriteHandler(Map<String,String> cellTypeFlag){
this.cellTypeFlag=cellTypeFlag;
}


@Override
public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {

}

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

}

@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {

}

@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
String key= StrUtil.format("{}_{}",cell.getRowIndex()-1,cell.getColumnIndex());
if(this.cellTypeFlag.containsKey(key)){
Workbook workbook=writeSheetHolder.getSheet().getWorkbook();
CellStyle style=workbook.createCellStyle();

XSSFColor xssfColor=new XSSFColor(new Color(221,235,247));

((XSSFCellStyle)style).setFillForegroundColor(xssfColor);
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell.setCellStyle(style);
}
}
}

这里需要注意的有一下几点:

  1. CellStyle需要通过Workbook来创建,直接通过cell.getCellStyle()无效。
  2. 需要用setFillForegroundColor,而不是setFillBackgroundColor,另外,还需要setFillPattern(FillPatternType.SOLID_FOREGROUND),是否无效;
  3. 自定义颜色目前只支持xlsx,所以,在设置setFillForegroundColor需要把CellStyle对象转为XSSFCellStyle类型。默认是不支持XSSFColor参数的。

最后导出的时候,直接调用registerWriteHandler方法注册即可,示例如下:

1
2
Map<String,String> cellFlags=new HashMap<>();
EasyExcel.write(response.getOutputStream(),LineExeclVo.class).registerWriteHandler(new CustomCellStyleWriteHandler(cellFlags)).sheet("明细导出").doWrite(data);

最终效果如下:

EasyExcel来处理Execl 的导入导出确实很方便,用它提供的方法和API就能快速处理日常所需。针对上面的场景,如果大家有更好的方式,还请告知。

Spring Boot使用EasyExecl自定义颜色填充指定单元格背景

https://blogs.52fx.biz/posts/2911068320.html

作者

eyiadmin

发布于

2023-04-18

更新于

2024-05-31

许可协议

评论