在使用 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 名称、表头和数据直接导出。