EasyExcel多表头导出

698 阅读2分钟

在 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);

关键点说明

  1. 动态表头

    • 用 List<List<String>> 构造表头,每层 List 代表一行。
    • 需手动处理单元格合并(如 AbstractMergeStrategy)。
  2. 实体类注解

    • @ExcelProperty(value = {第一行标题, 第二行标题, ...})
    • 自动合并相同父标题的单元格(如"主标题"会跨子列合并)。
  3. 合并策略

    • 使用 CellRangeAddress 定义合并区域:
      new CellRangeAddress(startRow, endRow, startCol, endCol)

最终效果

生成的 Excel 表头结构如下:

text

|        主标题        | 学科成绩 |
|  姓名   |  年龄   | 语文 | 数学 |
|  张三   |   20   |  90 |  85 |

选择适合业务场景的方式即可高效实现多级表头导出。