EasyExcel 动态修改模板 Sheet 名称:自定义 SheetWriteHandler 拦截器

在使用 EasyExcel 通过模板导出时,模板中的 sheet 名称通常是固定的,如果我们希望在导出时根据业务需要 动态修改 sheet 名称 ,可以通过自定义 SheetWriteHandler 完成。

很多同学在钉钉群里提到可以写拦截器,我百度了一下,最终成功用下面的方式解决了 ------ 记录一下方案。


✅ 使用方式

只需要在构建 WriteSheet 时注册我们自定义的 handler:

java 复制代码
WriteSheet writeSheet = EasyExcel.writerSheet(0)
        .registerWriteHandler(new CustomTemplateSheetStrategy("动态命名sheet"))
        .build();

🛠️ 自定义 SheetWriteHandler 拦截器

下面是完整代码:用于在 sheet 创建完成后,动态修改 sheet 名称。

java 复制代码
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;

/**
 * 自定义模板导出sheet拦截器
 */
public class CustomTemplateSheetStrategy implements SheetWriteHandler {

    private Integer sheetNo;

    private String sheetName;

    public CustomTemplateSheetStrategy(String sheetName) {
        this.sheetName = sheetName;
    }

    public CustomTemplateSheetStrategy(Integer sheetNo, String sheetName) {
        this.sheetNo = sheetNo;
        this.sheetName = sheetName;
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    }

    /**
     * 功能:动态修改模板中sheet的名称
     * sheet创建完成后调用
     * @param writeWorkbookHolder
     * @param writeSheetHolder
     */
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        if (sheetName == null) {
            return;
        }
        if (sheetNo == null) {
            sheetNo = 0;
        }
        writeWorkbookHolder.getCachedWorkbook().setSheetName(sheetNo, sheetName);
    }
}

📌 原理说明

EasyExcel 在创建 sheet 时会回调 SheetWriteHandler

  • beforeSheetCreate:Sheet 创建

  • afterSheetCreate:Sheet 创建

我们需要在 创建后 修改名称,因此代码写在 afterSheetCreate 中。

writeWorkbookHolder.getCachedWorkbook() 实际获取的是底层的 POI Workbook,直接改 sheet 名即可。


🎉 结论

通过自定义 SheetWriteHandler,可以优雅地实现动态修改模板 Excel 中的 sheet 名称,适用于:

✔ 模板导出

✔ 多 sheet 模板

✔ sheet 名依赖参数、日期、用户输入等场景

相关推荐
wxin_VXbishe6 小时前
C#(asp.net)学员竞赛信息管理系统-计算机毕业设计源码28790
java·vue.js·spring boot·spring·django·c#·php
一个网络学徒7 小时前
python5
java·服务器·前端
workflower7 小时前
业务需求-假设场景
java·数据库·测试用例·集成测试·需求分析·模块测试·软件需求
Dimpels7 小时前
CANN ops-nn 算子解读:AIGC 批量生成中的 Batch 处理与并行算子
开发语言·aigc·batch
blueSatchel7 小时前
U-Boot载入到DDR过程的代码分析
linux·开发语言·u-boot
专注VB编程开发20年7 小时前
vb.net datatable新增数据时改用数组缓存
java·linux·windows
(>_<)7 小时前
java minio 分片上传工具类与测试demo
java·minio·分片上传
不想打工的码农7 小时前
MyBatis-Plus多数据源实战:被DBA追着改配置后,我肝出这份避坑指南(附动态切换源码)
java·后端
无小道7 小时前
QT——QFIie和QFileInfo文件类
开发语言·qt·命令模式
Coder_Boy_7 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例
java·人工智能·spring boot·后端·spring