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 名依赖参数、日期、用户输入等场景

相关推荐
一只笨菜鸟4 小时前
IDEA如何让多个项目同时显示
java·ide·intellij-idea
程序猿乐锅4 小时前
【从0-1学习Python | 第六篇】 Python 函数:定义、参数与返回值
开发语言·python·学习
G018_star sky♬4 小时前
java中的字符串常见方法
java·开发语言
熊猫钓鱼>_>4 小时前
Kotlin Multiplatform for OpenHarmony 实战:kotlinx-serialization JSON 适配
开发语言·华为·kotlin·华为云·json·harmonyos·code
.Bryce.5 小时前
你了解 Blackboard(黑板系统)吗?听说过基于黑板系统实现的智能体吗?
java·网络·gpt·php·agent·codex·黑板系统
银河技术5 小时前
从脚本到 Operator:用 Go 构建可靠的微服务自动扩缩容控制器
开发语言·微服务·golang
GIS数据转换器7 小时前
地下空间综合管廊运营管理平台
大数据·开发语言·人工智能·经验分享·perl
猿究院_夏燊11 小时前
Spring Bean 生命周期
java·后端·spring
Wang's Blog12 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
信誓旦旦的程序猿12 小时前
【Python量化实战宝典 #08】可转债与债券接口手册:转股价·溢价率·纯债价值(Python 可跑)
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口