在 EasyExcel 中导出多行表头(多级表头)可以通过以下两种常用方式实现,核心思路是 动态构建表头结构 或 使用注解定义实体类:
方法一:动态构建表头(推荐,灵活性强)
通过 List<List<String>> 构造多行表头数据,结合 WriteHandler 实现单元格合并。
java
// 1. 定义表头数据(每行一个List,每个元素是单元格值)
List<List<String>> head = new ArrayList<>();
// 第一行表头(跨两列)
head.add(Arrays.asList("主标题", "主标题", "学科成绩"));
// 第二行表头
head.add(Arrays.asList("姓名", "年龄", "语文", "数学"));
// 2. 数据内容(每行一个List<Object>)
List<List<Object>> data = new ArrayList<>();
data.add(Arrays.asList("张三", 20, 90, 85));
data.add(Arrays.asList("李四", 22, 95, 78));
// 3. 自定义合并策略(合并第一行的前两列)
WriteHandler mergeStrategy = new AbstractMergeStrategy() {
@Override
protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
if (cell.getRowIndex() == 0 && cell.getColumnIndex() < 2) {
// 合并第一行的 [0,0] 到 [0,1] 单元格
sheet.addMergedRegionUnsafe(new CellRangeAddress(0, 0, 0, 1));
}
}
};
// 4. 导出文件
String fileName = "multi_header.xlsx";
EasyExcel.write(fileName)
.head(head) // 设置动态表头
.registerWriteHandler(mergeStrategy) // 注册合并策略
.sheet("学生表")
.doWrite(data);
方法二:使用实体类注解(适合固定表头)
通过 @ExcelProperty 注解的 value 数组定义多级表头。
java
// 实体类定义
public class Student {
@ExcelProperty(value = {"主标题", "姓名"}, index = 0)
private String name;
@ExcelProperty(value = {"主标题", "年龄"}, index = 1)
private Integer age;
@ExcelProperty(value = {"学科成绩", "语文"}, index = 2)
private Integer chinese;
@ExcelProperty(value = {"学科成绩", "数学"}, index = 3)
private Integer math;
// 省略getter/setter
}
// 导出代码
List<Student> data = Arrays.asList(
new Student("张三", 20, 90, 85),
new Student("李四", 22, 95, 78)
);
EasyExcel.write("multi_header.xlsx", Student.class)
.sheet("学生表")
.doWrite(data);
关键点说明
-
动态表头:
- 用
List<List<String>>构造表头,每层List代表一行。 - 需手动处理单元格合并(如
AbstractMergeStrategy)。
- 用
-
实体类注解:
@ExcelProperty(value = {第一行标题, 第二行标题, ...})- 自动合并相同父标题的单元格(如"主标题"会跨子列合并)。
-
合并策略:
- 使用
CellRangeAddress定义合并区域:
new CellRangeAddress(startRow, endRow, startCol, endCol)
- 使用
最终效果
生成的 Excel 表头结构如下:
text
| 主标题 | 学科成绩 |
| 姓名 | 年龄 | 语文 | 数学 |
| 张三 | 20 | 90 | 85 |
选择适合业务场景的方式即可高效实现多级表头导出。