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

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这里是一个使用easyexcel导出多个sheetJava示例代码: ``` public void exportExcelWithMultipleSheets(HttpServletResponse response) throws IOException { // 生成 Excel 文件名 String fileName = "example.xlsx"; // 设置响应头信息 response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); response.setContentType("application/vnd.ms-excel"); // 创建 ExcelWriter 对象 ExcelWriter excelWriter = new ExcelWriter(response.getOutputStream(), ExcelTypeEnum.XLSX); // 创建 Sheet1 对象 Sheet sheet1 = new Sheet(1, 0, ExampleData.class); sheet1.setSheetName("Sheet1"); // 写入 Sheet1 数据 List<ExampleData> dataList1 = new ArrayList<>(); dataList1.add(new ExampleData("张三", 20)); dataList1.add(new ExampleData("李四", 25)); excelWriter.write(dataList1, sheet1); // 创建 Sheet2 对象 Sheet sheet2 = new Sheet(2, 0, ExampleData.class); sheet2.setSheetName("Sheet2"); // 写入 Sheet2 数据 List<ExampleData> dataList2 = new ArrayList<>(); dataList2.add(new ExampleData("王五", 30)); dataList2.add(new ExampleData("赵六", 35)); excelWriter.write(dataList2, sheet2); // 关闭 ExcelWriter 对象 excelWriter.finish(); } ``` 在这个示例中,我们使用了easyexcel的ExcelWriter对象来创建Excel文件,并使用Sheet对象来创建多个Sheet。我们可以使用Sheet对象的setSheetName方法来设置Sheet的名称,然后使用ExcelWriter对象的write方法来写入每个Sheet的数据。最后,我们调用ExcelWriter对象的finish方法来关闭Excel文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值