EasyExcel删除模版Sheet页

本文介绍了如何使用EasyExcel动态删除Excel模板中的sheet页。当学习、生活sheet页无数据时,最终只保留工作sheet页。通过实现SheetWriteHandler和WorkbookWriteHandler,注册拦截器并在数据填充时判断内容,标记为空的sheet页并在工作薄完成后删除。该方法需要通过拦截器实现,对开发者有一定挑战。

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相关功能时,一定要评估好工作量,提前进行一些调研。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值