EasyExcel简介
git地址:https://github.com/alibaba/easyexcel
文档:https://easyexcel.opensource.alibaba.com/docs/current/
场景
在使用模版填充功能时,需要根据业务数据删除excel模版中某些sheet页,或者删除某个sheet页中部分行数据,是一种动态方式生成结果。
excel示例文件:
规则:工作、学习、生活3个sheet页中,如果学习、生活没有数据,则结果文件只有工作一个sheet页面。
实现思路
EasyExcel官方文档中并没有删除sheet页的示例和文档,根据之前使用easyexcel插件的经验,这类处理一般都是通过easyexcel的拦截器实现的。
此外,从git的issues问题中,可以看到之前有人提过这个问题。
https://github.com/alibaba/easyexcel/issues/2345
那么我们就根据这个思路进行功能实现。
大致思路:
(1)整个工作薄workbook注册拦截器
(2)工作、学习、生活分别为三个数据对象
(2)每个sheet页注册拦截器
(3)每个sheet页填充的时候判断对应的数据对象是否为空
(4)如果为空,sheet拦截器给当前sheet页名称打标
(5)整个工作薄完成后,workbook拦截器对打标的sheet删除
SheetWriteHandler
1、实现AbstractSheetWriteHandler的抽象类,重写afterSheetCreate方法
WorkbookWriteHandler
1、实现WorkbookWriteHandle的抽象类,重写afterWorkbookDispose方法
public class CustomWorkbookWriteHandler extends AbstractWorkbookWriteHandler {
@Override
public void afterWorkbookDispose(WriteWorkbookHolder writeWorkbookHolder) {
Workbook workbook = writeWorkbookHolder.getWorkbook();
int numberOfSheets = workbook.getNumberOfSheets();
List<String> removeList = Lists.newArrayList();
for (int i=0; i<numberOfSheets; i++) {
Sheet sheetAt = workbook.getSheetAt(i);
String sheetName = sheetAt.getSheetName();
if (sheetName.endsWith("删除")) {
removeList.add(sheetName);
}
}
if (CollectionUtils.isNotEmpty(removeList)) {
removeList.forEach(e -> {
int sheetIndex = workbook.getSheetIndex(e);
workbook.removeSheetAt(sheetIndex);
});
}
}
}
业务逻辑中注册拦截器
总结
EasyExcel中对excel文件特殊操作一般都是通过拦截器实现的,需要自己去不断测试,需要花费一定的时间去实现。所以,在日常开发与easyexcel相关功能时,一定要评估好工作量,提前进行一些调研。