Java使用EasyExcel動態(tài)修改模板Sheet名稱的具體方案
引言
在使用 EasyExcel 通過模板導出時,模板中的 sheet 名稱通常是固定的,如果我們希望在導出時根據(jù)業(yè)務需要 動態(tài)修改 sheet 名稱,可以通過自定義 SheetWriteHandler 完成。
很多同學在釘釘群里提到可以寫攔截器,我百度了一下,最終成功用下面的方式解決了 —— 記錄一下方案。
使用方式
只需要在構(gòu)建 WriteSheet 時注冊我們自定義的 handler:
WriteSheet writeSheet = EasyExcel.writerSheet(0)
.registerWriteHandler(new CustomTemplateSheetStrategy("動態(tài)命名sheet"))
.build();
自定義 SheetWriteHandler 攔截器
下面是完整代碼:用于在 sheet 創(chuàng)建完成后,動態(tài)修改 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) {
}
/**
* 功能:動態(tài)修改模板中sheet的名稱
* sheet創(chuàng)建完成后調(diào)用
* @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 在創(chuàng)建 sheet 時會回調(diào) SheetWriteHandler:
beforeSheetCreate:Sheet 創(chuàng)建 前afterSheetCreate:Sheet 創(chuàng)建 后
我們需要在 創(chuàng)建后 修改名稱,因此代碼寫在 afterSheetCreate 中。
writeWorkbookHolder.getCachedWorkbook() 實際獲取的是底層的 POI Workbook,直接改 sheet 名即可。
結(jié)論
通過自定義 SheetWriteHandler,可以優(yōu)雅地實現(xiàn)動態(tài)修改模板 Excel 中的 sheet 名稱,適用于:
? 模板導出
? 多 sheet 模板
? sheet 名依賴參數(shù)、日期、用戶輸入等場景
到此這篇關于Java使用EasyExcel動態(tài)修改模板Sheet名稱的具體方案的文章就介紹到這了,更多相關Java EasyExcel修改Sheet名稱內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java匿名內(nèi)部類和Lambda(->) 的多種寫法總結(jié)
這篇文章主要和大家分享一下Java匿名內(nèi)部類和Lambda(->) 的多種寫法,文中的示例代碼講解詳細,對我們學習Java有一定幫助,需要的可以先看一下2022-07-07
springboot系統(tǒng)首頁自動跳轉(zhuǎn)拼接到index的實現(xiàn)
文章介紹了通過訪問http://localhost:8091時,服務器會動態(tài)跳轉(zhuǎn)到系統(tǒng)的歡迎頁面,實現(xiàn)原理是在程序啟動時自動加載默認的請求路徑,并動態(tài)拼接前綴和后綴,最終指向./WEB-INF/views/index.jsp,作者分享了這一經(jīng)驗,并希望得到大家的支持2025-11-11
MyBatis Plus整合Redis實現(xiàn)分布式二級緩存的問題
Mybatis內(nèi)置的二級緩存在分布式環(huán)境下存在分布式問題,無法使用,但是我們可以整合Redis來實現(xiàn)分布式的二級緩存,這篇文章給大家介紹MyBatis Plus整合Redis實現(xiàn)分布式二級緩存,感興趣的朋友跟隨小編一起看看吧2023-11-11
MyBatis 數(shù)據(jù)封裝全攻略(告別空值與映射混亂問題)
本文系統(tǒng)介紹MyBatis數(shù)據(jù)封裝的常見問題及解決方案,涵蓋resultType、resultMap、駝峰轉(zhuǎn)換、嵌套處理、懶加載等核心機制,并推薦MyBatis-Plus簡化開發(fā),提升效率與可維護性,感興趣的朋友跟隨小編一起看看吧2025-09-09

