使用EasyExcel根據(jù)模板導(dǎo)出文件方式
概要
在企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中,Excel數(shù)據(jù)導(dǎo)出是一個(gè)常見(jiàn)的需求。
本文實(shí)現(xiàn)一個(gè)基于阿里巴巴EasyExcel庫(kù)實(shí)現(xiàn)的根據(jù)模板導(dǎo)出文件的工具類(lèi),它通過(guò)預(yù)定義的Excel模板來(lái)生成結(jié)構(gòu)化的數(shù)據(jù)報(bào)表,提高了導(dǎo)出功能的開(kāi)發(fā)效率和靈活性。
工具類(lèi)核心功能
該ExportUtil工具類(lèi)主要提供以下功能:
- 模板化導(dǎo)出:基于預(yù)定義的Excel模板填充數(shù)據(jù)
- 靈活數(shù)據(jù)支持:支持列表數(shù)據(jù)和離散對(duì)象數(shù)據(jù)的填充
- 自動(dòng)響應(yīng)設(shè)置:自動(dòng)處理HTTP響應(yīng)頭,實(shí)現(xiàn)文件下載
- 異常處理:統(tǒng)一的異常處理機(jī)制,確保導(dǎo)出過(guò)程穩(wěn)定性
核心代碼解析
類(lèi)結(jié)構(gòu)與常量定義
@Slf4j
@Component
public class ExportUtil {
public static final String TEMPLATE_ROOT_PATH = "template";
public static final String EXCEL_POSTFIX = "." + CommonConst.EXCEL_TYPE_XLSX;
// ...
}
使用Lombok注解簡(jiǎn)化日志管理。定義了模板根路徑和Excel文件后綴常量(可自行定義)。
模板導(dǎo)出核心方法
public static void downloadExcelByTemplate(String templatePath, String fileName,
List<?> list, Object obj) {
String templateFileName = TEMPLATE_ROOT_PATH + File.separator + templatePath;
download(fileName + EXCEL_POSTFIX, outputStream -> {
try (ExcelWriter excelWriter = EasyExcel.write(outputStream)
.withTemplate(ExportUtil.class.getClassLoader()
.getResourceAsStream(templateFileName)).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(list, fillConfig, writeSheet);
excelWriter.fill(obj, fillConfig, writeSheet);
} catch (Exception e) {
log.error("Writing template failed:{}", e.getMessage());
throw new BusinessException(BusinessExceptionEnum.EXPORT_FAILED);
}
});
}
該方法接收四個(gè)參數(shù):
- templatePath: 模板文件路徑
- fileName: 導(dǎo)出文件名(不含后綴)
- list: 列表數(shù)據(jù)(用于填充模板中的表格區(qū)域)
- obj: 離散數(shù)據(jù)(用于填充模板中的單個(gè)字段)
文件下載處理
public static void download(String fileName, Consumer<ServletOutputStream> write) {
HttpServletResponse response = getHttpServletResponse(fileName);
ServletOutputStream outputStream;
try {
outputStream = response.getOutputStream();
} catch (IOException e) {
log.error("Failed to read response and write stream:{}", e.getMessage());
throw new BusinessException(BusinessExceptionEnum.EXPORT_FAILED);
}
write.accept(outputStream);
}
封裝了文件下載的通用邏輯,接收一個(gè)文件名和一個(gè)用于寫(xiě)入輸出流的Consumer函數(shù)式接口。
HTTP響應(yīng)設(shè)置
@SneakyThrows
public static HttpServletResponse getHttpServletResponse(String fileName) {
ServletRequestAttributes servletRequestAttributes =
(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (servletRequestAttributes == null || servletRequestAttributes.getResponse() == null) {
log.error("Unable to obtain HttpServletResponse.");
throw new BusinessException(BusinessExceptionEnum.EXPORT_FAILED);
}
HttpServletResponse res = servletRequestAttributes.getResponse();
res.setContentType("application/octet-stream; charset=" + StandardCharsets.UTF_8);
res.setHeader("Content-disposition", "attachment;filename=" +
URLEncoder.encode(fileName, StandardCharsets.UTF_8) + ";" +
"filename*=utf-8''" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));
return res;
}
負(fù)責(zé)設(shè)置HTTP響應(yīng)頭,包括內(nèi)容類(lèi)型和內(nèi)容處置頭,確保瀏覽器正確處理文件下載。使用URLEncoder對(duì)文件名進(jìn)行編碼,解決中文文件名亂碼問(wèn)題。
文件下載處理
使用示例
1. 準(zhǔn)備Excel模板
- 在resources/template目錄下創(chuàng)建模板文件,例如user_template.xlsx。
- 在模板中使用{}占位符表示離散數(shù)據(jù),使用{.}表示列表數(shù)據(jù)。
2. 調(diào)用導(dǎo)出方法
// 準(zhǔn)備數(shù)據(jù)
UserInfo userInfo = new UserInfo("張三", "技術(shù)部");
List<Order> orders = Arrays.asList(
new Order("訂單001", new Date(), 2999.0),
new Order("訂單002", new Date(), 3999.0)
);
// 執(zhí)行導(dǎo)出
ExportUtil.downloadExcelByTemplate("user_template.xlsx", "用戶訂單", orders, userInfo);
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Springboot+Easyexcel將數(shù)據(jù)寫(xiě)入模板文件并導(dǎo)出Excel的操作代碼
- SpringBoot中使用EasyExcel并行導(dǎo)出多個(gè)excel文件并壓縮zip后下載的代碼詳解
- SpringBoot整合easyExcel實(shí)現(xiàn)CSV格式文件的導(dǎo)入導(dǎo)出
- 使用easyexcel導(dǎo)出的excel文件,使用poi讀取時(shí)異常處理方案
- 如何解決EasyExcel導(dǎo)出文件LocalDateTime報(bào)錯(cuò)問(wèn)題
- Java+EasyExcel實(shí)現(xiàn)文件的導(dǎo)入導(dǎo)出
- SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出
- SpringBoot中EasyExcel實(shí)現(xiàn)Excel文件的導(dǎo)入導(dǎo)出
相關(guān)文章
SpringBoot線程池ThreadPoolTaskExecutor異步處理百萬(wàn)級(jí)數(shù)據(jù)
本文主要介紹了SpringBoot線程池ThreadPoolTaskExecutor異步處理百萬(wàn)級(jí)數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法
這篇文章主要介紹了使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
Java設(shè)計(jì)模式之狀態(tài)模式(State模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之狀態(tài)模式(State模式)介紹,本文講解了何時(shí)使用狀態(tài)模式、如何使用狀態(tài)模式等內(nèi)容,需要的朋友可以參考下2015-03-03
實(shí)例分析Java Class的文件結(jié)構(gòu)
今天把之前在Evernote中的筆記重新整理了一下,發(fā)上來(lái)供對(duì)java class 文件結(jié)構(gòu)的有興趣的同學(xué)參考一下2013-04-04
IDEA連接MySQL后管理數(shù)據(jù)庫(kù)的操作指南
本節(jié)就來(lái)教大家如何在IDEA連接MySQL后管理數(shù)據(jù)庫(kù)(創(chuàng)建/修改/刪除數(shù)據(jù)庫(kù)、創(chuàng)建/修改/刪除表、插入/更新/刪除/查詢表記錄),文中通過(guò)圖文結(jié)合的方式給大家講解的非常詳細(xì),需要的朋友可以參考下2024-05-05

