在使用 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 {
// 第一个 Sheet
List<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);
// 第二个 Sheet
List<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 名称、表头和数据直接导出。