Easyexcel 多级横向合并表头

Maven 依赖(推荐 3.3.2)

复制代码
<!-- EasyExcel 核心依赖(多级合并表头首选) -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.3.2</version>
</dependency>

<!-- 若用 Spring Boot 3.x + JDK17/21,需确保 POI 版本兼容(EasyExcel 3.3.2 已内置) -->
<!-- 无需额外引入 POI 依赖,避免版本冲突 -->

代码:

自动合并原理:EasyExcel 会将 head 中同一行连续相同字符串自动横向合并。

复制代码
@GetMapping("/export-multi-head")
    public void exportMultiHead(HttpServletResponse response) throws IOException {
        String fileName = "多级合并表头.xlsx";
        setExcelDownloadHeader(response, fileName);

        // 构建三级表头(连续相同内容 → 自动横向合并)
        List<List<String>> head = new ArrayList<>();

        List<String> head1=new ArrayList<>();
        head1.add("个人信息");
        head1.add("基本资料");
        head1.add("姓名");

        List<String> head2=new ArrayList<>();
        head2.add("个人信息");
        head2.add("基本资料");
        head2.add("性别");

        List<String> head3=new ArrayList<>();
        head3.add("个人信息");
        head3.add("联系信息");
        head3.add("电话");

        List<String> head4=new ArrayList<>();
        head4.add("工作信息");
        head4.add("职位信息");
        head4.add("部门");

        List<String> head5=new ArrayList<>();
        head5.add("工作信息");
        head5.add("项目信息");
        head5.add("基本工资");

        List<String> head6=new ArrayList<>();
        head6.add("薪资信息");
        head6.add("固定薪资");
        head6.add("基本工资");

        List<String> head7=new ArrayList<>();
        head7.add("薪资信息");
        head7.add("浮动薪资");
        head7.add("绩效奖金");

        List<String> head8=new ArrayList<>();
        head8.add("薪资信息");
        head8.add("补贴");
        head8.add("餐补");

        head.add(head1);
        head.add(head2);
        head.add(head3);
        head.add(head4);
        head.add(head5);
        head.add(head6);
        head.add(head7);
        head.add(head8);

        List<List<Object>> data = Arrays.asList(
                Arrays.asList("张三", "男", "13800138000", "技术部", "CRM系统", 8000, 2000, 500),
                Arrays.asList("李四", "女", "13900139000", "产品部", "电商平台", 12000, 3000, 800)
        );

        // 直接写入,无需手动合并!
        EasyExcel.write(response.getOutputStream())
                .head(head)
                .sheet("员工数据")
                .doWrite(data);
    }

    // ========== 辅助方法:设置Excel下载响应头 ==========
    private void setExcelDownloadHeader(HttpServletResponse response, String fileName) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("UTF-8");
        // 处理中文文件名乱码(兼容所有浏览器)
        String encodedFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION,
                "attachment;filename*=utf-8''" + encodedFileName);
    }

要实现 横向合并表头,只需:

构造 List<List<String>> head
每一行代表 Excel 表头的一行
同一行中连续相同内容 → 自动合并
所有行的列数必须一致
只要你按上述方式构建 head,EasyExcel 就会自动完成横向合并,无需额外配置!

最终实现效果:

相关推荐
Mahir082 小时前
Spring 循环依赖深度解密:从问题本质到三级缓存源码级解析
java·后端·spring·缓存·面试·循环依赖·三级缓存
杜子不疼.2 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
加号32 小时前
【C#】 串口通信技术深度解析及实现
开发语言·c#
sycmancia3 小时前
Qt——编辑交互功能的实现
开发语言·qt
RyFit3 小时前
SpringAI 常见问题及解决方案大全
java·ai
石山代码3 小时前
C++ 内存分区 堆区
java·开发语言·c++
绝知此事3 小时前
【算法突围 01】线性结构与哈希表:后端开发的收纳术
java·数据结构·算法·面试·jdk·散列表
无风听海4 小时前
C# 隐式转换深度解析
java·开发语言·c#
一只大袋鼠4 小时前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
LuminousCPP5 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习