在使用 EasyExcel 實現“多個 Sheet 且每個 Sheet 表頭是動態的”需求時,思路如下:
? 實現思路概述
EasyExcel 的 ExcelWriter
支持多個 Sheet 寫入。每個 Sheet:
- 使用
WriteSheet
創建; - 可以綁定一個動態生成的表頭
List<List<String>>
; - 使用
write()
方法寫入 List 數據行(List<List<Object>>
)或 Java Bean。
? 示例代碼:多個 Sheet + 動態表頭
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class MultiSheetDynamicHeaderExample {public static void main(String[] args) {String fileName = "easyexcel-multi-sheet-dynamic-header.xlsx";ExcelWriter excelWriter = EasyExcel.write(fileName).build();try {// 第一個 SheetList<List<String>> header1 = Arrays.asList(Arrays.asList("姓名"),Arrays.asList("年齡"));List<List<Object>> data1 = Arrays.asList(Arrays.asList("張三", 20),Arrays.asList("李四", 22));WriteSheet sheet1 = EasyExcel.writerSheet(0, "學生信息").head(header1).build();excelWriter.write(data1, sheet1);// 第二個 SheetList<List<String>> header2 = Arrays.asList(Arrays.asList("課程"),Arrays.asList("成績"));List<List<Object>> data2 = Arrays.asList(Arrays.asList("語文", 90),Arrays.asList("數學", 95));WriteSheet sheet2 = EasyExcel.writerSheet(1, "成績信息").head(header2).build();excelWriter.write(data2, sheet2);} finally {if (excelWriter != null) {excelWriter.finish();}}}
}
? 動態生成表頭的關鍵點
1. 動態表頭結構
List<List<String>> headers = new ArrayList<>();
headers.add(Arrays.asList("列名1"));
headers.add(Arrays.asList("列名2"));
每個 List<String>
是一列的標題,支持多行表頭(即合并表頭結構),你可以這樣構建:
headers.add(Arrays.asList("用戶信息", "姓名")); // 一級:用戶信息,二級:姓名
headers.add(Arrays.asList("用戶信息", "年齡"));
2. 動態數據結構
List<List<Object>> data = new ArrayList<>();
data.add(Arrays.asList("張三", 18));
data.add(Arrays.asList("李四", 20));
? 封裝建議(可選)
你可以封裝一個通用方法:
public void writeSheet(ExcelWriter writer, int index, String name, List<String> headerNames, List<List<Object>> rows) {List<List<String>> headers = headerNames.stream().map(title -> Arrays.asList(title)).collect(Collectors.toList());WriteSheet sheet = EasyExcel.writerSheet(index, name).head(headers).build();writer.write(rows, sheet);
}
? 總結對比 EasyPOI 與 EasyExcel
特性 | EasyPOI | EasyExcel |
---|---|---|
依賴 Apache POI | 是 | 否(基于阿里優化后的 POI) |
性能 | 中等(適用于小型數據) | 優(適合大量數據寫入) |
多 Sheet 支持 | 支持,基于 Workbook 操作 | 支持,基于 ExcelWriter + WriteSheet |
動態表頭 | ExcelExportEntity 定義 | List<List<String>> 定義 |
數據結構 | JavaBean 或 Map | JavaBean 或 List<List<Object>> |
需要我封裝一個完整的 MultiSheetExcelUtil
工具類用于 EasyExcel 嗎?支持傳入 sheet 名稱、表頭和數據直接導出。