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