Spring Boot使用EasyExecl自定义颜色填充指定单元格背景
最近,业务提了一个有意思的需要,要求根据他自定的标识,来给指定单元格填充他指定的颜色,我问他,为何要这般处理?他曰:便于用户识别重要指标值。行吧,那就弄呗。
EasyExecl
是基于Apache POI
开发的,并没有对颜色进行扩展。如果要新增颜色表,则只能新增XSSFColor
对了,另外,目前只支持xlsx
格式的自定义颜色。由于不同版本的EasyExecl
其提供的方法及API会有差异,在使用的时候一定要注意引用的版本,这里,我用的是EasyExecl 2.2.8
。单元格要指定的颜色,在EasyExecl
有详细的样例,但是按照逻辑来标识颜色,就只有自己来处理了,这里需要注意两点:
- 需要自己创建一个
CellWriteHandler
实现类; Apache POI
中的颜色索引都是固定的放在IndexedColors
这个枚举,他肯定满足不了我们的颜色需求,我们需要通过RBG
去实例化一个XSSFColor
的颜色对象。
这里,新建一个CustomCellStyleWriteHandler
类并继承CellWriteHandler
接口,
1 | public class CustomCellStyleWriteHandler implements CellWriteHandler { |
由于需要按指定的标识来填充单元格,这里,我把单元格索引放在Map
中,key的格式为行索引_列索引
,然后,并通过构造函数传进来,再在afterCellDispose
方法中来判断单元格是否要填充。下面附上CustomCellStyleWriteHandler
的完整代码
1 | public class CustomCellStyleWriteHandler implements CellWriteHandler { |
这里需要注意的有一下几点:
CellStyle
需要通过Workbook
来创建,直接通过cell.getCellStyle()
无效。- 需要用
setFillForegroundColor
,而不是setFillBackgroundColor
,另外,还需要setFillPattern(FillPatternType.SOLID_FOREGROUND)
,是否无效; - 自定义颜色目前只支持
xlsx
,所以,在设置setFillForegroundColor
需要把CellStyle
对象转为XSSFCellStyle
类型。默认是不支持XSSFColor
参数的。
最后导出的时候,直接调用registerWriteHandler
方法注册即可,示例如下:
1 | Map<String,String> cellFlags=new HashMap<>(); |
最终效果如下:
用EasyExcel
来处理Execl
的导入导出确实很方便,用它提供的方法和API就能快速处理日常所需。针对上面的场景,如果大家有更好的方式,还请告知。
Spring Boot使用EasyExecl自定义颜色填充指定单元格背景