引言
在使用 easyexcel 通过模板导出时,模板中的 sheet 名称通常是固定的,如果我们希望在导出时根据业务需要 动态修改 sheet 名称,可以通过自定义 sheetwritehandler 完成。
很多同学在钉钉群里提到可以写拦截器,我百度了一下,最终成功用下面的方式解决了 —— 记录一下方案。
使用方式
只需要在构建 writesheet 时注册我们自定义的 handler:
writesheet writesheet = easyexcel.writersheet(0)
.registerwritehandler(new customtemplatesheetstrategy("动态命名sheet"))
.build();
自定义 sheetwritehandler 拦截器
下面是完整代码:用于在 sheet 创建完成后,动态修改 sheet 名称。
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 名依赖参数、日期、用户输入等场景
到此这篇关于java使用easyexcel动态修改模板sheet名称的具体方案的文章就介绍到这了,更多相关java easyexcel修改sheet名称内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论