easyExcel生成多个sheet的动态表头的实现

发布于:2025-08-03 ⋅ 阅读:(12) ⋅ 点赞:(0)

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