SpringBoot3整合EasyExcel動(dòng)態(tài)實(shí)現(xiàn)表頭重命名
方案簡(jiǎn)介
為了通過(guò) EasyExcel 實(shí)現(xiàn)動(dòng)態(tài)表頭重命名,可以封裝一個(gè)方法,傳入動(dòng)態(tài)的新表頭名稱列表(List<String>),并結(jié)合 WriteHandler 接口來(lái)重命名表頭。同時(shí),通過(guò) EasyExcel 將數(shù)據(jù)直接寫(xiě)入到輸出流。

核心實(shí)現(xiàn)說(shuō)明
動(dòng)態(tài)表頭處理器:通過(guò) DynamicHeaderWriteHandler 的構(gòu)造方法接收表頭列表,并在寫(xiě)入表頭之前動(dòng)態(tài)設(shè)置表頭內(nèi)容。
封裝寫(xiě)入方法:ExcelExportUtil 提供通用的導(dǎo)出方法,可以根據(jù)表頭和數(shù)據(jù)生成 Excel 文件并寫(xiě)入到輸出流。
直接寫(xiě)入輸出流:通過(guò) HttpServletResponse 將文件直接導(dǎo)出為響應(yīng)內(nèi)容,方便前端下載。
具體實(shí)現(xiàn)
1. 自定義動(dòng)態(tài)表頭處理器
我們實(shí)現(xiàn)一個(gè)動(dòng)態(tài)表頭處理器,將新表頭通過(guò)構(gòu)造方法傳入。
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.AbstractCellWriteHandler;
import org.apache.poi.ss.usermodel.Cell;
import java.util.List;
public class DynamicHeaderWriteHandler extends AbstractCellWriteHandler {
private final List<String> newHeaders;
// 構(gòu)造方法傳入動(dòng)態(tài)表頭列表
public DynamicHeaderWriteHandler(List<String> newHeaders) {
this.newHeaders = newHeaders;
}
@Override
public void beforeCellCreate(org.apache.poi.ss.usermodel.Workbook workbook,
org.apache.poi.ss.usermodel.Sheet sheet,
org.apache.poi.ss.usermodel.Row row,
Head head,
Integer columnIndex,
Boolean isHead) {
?
//Powered by Moshow@https://zhengkai.blog.csdn.net/
?
if (Boolean.TRUE.equals(isHead) && columnIndex < newHeaders.size()) {
// 動(dòng)態(tài)設(shè)置表頭名稱
head.setHeadNameList(List.of(newHeaders.get(columnIndex)));
}
}
}
2. 封裝寫(xiě)入方法
創(chuàng)建一個(gè)封裝的方法,支持通過(guò)傳入表頭和數(shù)據(jù),將結(jié)果直接輸出到流中。
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.WriteSheet;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public class ExcelExportUtil {
/**
* 導(dǎo)出 Excel 表格
*
* @param response HttpServletResponse 響應(yīng)
* @param data 數(shù)據(jù)列表
* @param headers 動(dòng)態(tài)表頭
* @param fileName 文件名
* @author ?Powered by Moshow@https://zhengkai.blog.csdn.net/
*/
public static void exportExcel(HttpServletResponse response, List<?> data, List<String> headers, String fileName) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// 創(chuàng)建動(dòng)態(tài)表頭處理器
DynamicHeaderWriteHandler headerHandler = new DynamicHeaderWriteHandler(headers);
// 寫(xiě)入數(shù)據(jù)到輸出流
EasyExcel.write(response.getOutputStream())
.registerWriteHandler(headerHandler)
.head((Class<?>) data.get(0).getClass()) // 假設(shè)數(shù)據(jù)類已經(jīng)標(biāo)注了 @ExcelProperty
.sheet("Sheet1")
.doWrite(data);
}
}
3. 使用方法示例
在 Controller 中調(diào)用封裝好的方法,傳入動(dòng)態(tài)表頭和數(shù)據(jù)。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@RestController
public class ExcelExportController {
@GetMapping("/export")
public void export(HttpServletResponse response) throws IOException {
//?Powered by Moshow@https://zhengkai.blog.csdn.net/
?
// 模擬數(shù)據(jù)
List<SampleData> data = new ArrayList<>();
data.add(new SampleData("張三", 25, "北京"));
data.add(new SampleData("李四", 30, "上海"));
// 動(dòng)態(tài)表頭
List<String> headers = List.of("姓名(新)", "年齡(新)", "地址(新)");
// 導(dǎo)出 Excel
ExcelExportUtil.exportExcel(response, data, headers, "示例文件");
}
// 數(shù)據(jù)類
public static class SampleData {
private String name;
private Integer age;
private String address;
public SampleData(String name, Integer age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
// Getters 和 Setters 省略
}
}
通過(guò)這種方式,你可以靈活設(shè)置動(dòng)態(tài)表頭,并實(shí)現(xiàn)直接導(dǎo)出到客戶端的功能。
到此這篇關(guān)于SpringBoot3整合EasyExcel動(dòng)態(tài)實(shí)現(xiàn)表頭重命名的文章就介紹到這了,更多相關(guān)SpringBoot EasyExcel表頭重命名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過(guò)程
- Java如何利用Easyexcel動(dòng)態(tài)導(dǎo)出表頭列
- Java使用EasyExcel生成動(dòng)態(tài)表頭和多Sheet數(shù)據(jù)的Excel實(shí)例
- EasyExcel如何導(dǎo)出多級(jí)且動(dòng)態(tài)的表頭
- springboot結(jié)合easyexcel實(shí)現(xiàn)動(dòng)態(tài)表頭的實(shí)踐
- EasyExcel動(dòng)態(tài)表頭基礎(chǔ)用法及最佳實(shí)踐詳解
相關(guān)文章
JUC中的wait與notify方法實(shí)現(xiàn)原理詳解
這篇文章主要介紹了JUC中的wait與notify方法實(shí)現(xiàn)原理,在進(jìn)行wait()之前,就代表著需要爭(zhēng)奪Synchorized,而Synchronized代碼塊通過(guò)javap生成的字節(jié)碼中包含monitor?enter和monitor?exit兩個(gè)指令2023-03-03
30分鐘入門Java8之lambda表達(dá)式學(xué)習(xí)
本篇文章主要介紹了30分鐘入門Java8之lambda表達(dá)式學(xué)習(xí),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Spring IOC推導(dǎo)與DI構(gòu)造器注入超詳細(xì)講解
這篇文章主要介紹了Spring IOC推導(dǎo)與DI構(gòu)造器注入,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-02-02
Mapper類中存在名稱相同的方法重載報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了Mapper類中存在名稱相同的方法重載報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Java使用正則表達(dá)式驗(yàn)證用戶名和密碼的方法
這篇文章主要介紹了Java使用正則表達(dá)式驗(yàn)證用戶名和密碼的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
如何將二進(jìn)制文件流轉(zhuǎn)化為MockMultipartFile文件
文章主要介紹了如何使用Spring框架中的MockMultipartFile類來(lái)模擬文件上傳,并處理上傳邏輯,包括獲取二進(jìn)制文件流、創(chuàng)建MockMultipartFile對(duì)象、處理上傳邏輯和返回響應(yīng),還解釋了MockMultipartFile的功能和二進(jìn)制文件流的定義2025-02-02

