EasyExcel构建复杂多级表头

EasyExcel构建复杂多级表头

在Java开发中,处理Excel文件时,构建复杂的多级表头是一项常见且具有挑战性的任务。本文将详细介绍如何通过自定义的HeaderBuilder类结合EasyExcel库,轻松实现多级表头的构建,并将数据写入Excel文件。

一、整体思路

我们的目标是创建一个灵活、可扩展的方式来构建多级表头。为此,我们设计了一个HeaderBuilder类,它使用树形结构来表示表头信息。每个表头节点(HeaderNode)可以有多个子节点,从而形成多级结构。最终,通过遍历这个树形结构,生成适用于EasyExcel的嵌套列表形式的表头数据。

二、关键代码实现

(一)HeaderNode类

java 复制代码
package com.xtl.utils;

import lombok.Data;

import java.util.LinkedList;
import java.util.List;

@Data
public class HeaderNode {
    private String title;
    private List<HeaderNode> children;

    public HeaderNode(String title) {
        this.title = title;
        this.children = new LinkedList<>();
    }

    public HeaderNode addChild(HeaderNode child) {
        children.add(child);
        return this;
    }
}

通过addChild方法,可以方便地为当前节点添加子节点,构建树形结构。

(二)HeaderBuilder类

java 复制代码
package com.xtl.utils;

import java.util.*;

public class HeaderBuilder {
    private final HeaderNode root;

    private HeaderBuilder(HeaderNode root) {
        this.root = root;
    }

    public static HeaderBuilder create(HeaderNode... headerNodes) {
        HeaderNode root = new HeaderNode("ROOT"); // 虚拟根节点
        for (HeaderNode node : headerNodes) {
            root.addChild(node);
        }
        return new HeaderBuilder(root);
    }

    /**
     * 生成多级表头结构
     *
     * @return 适用于EasyExcel的嵌套表头结构
     */
    public List<List<String>> build() {
        List<List<String>> result = new ArrayList<>();
        traverse(new LinkedList<>(), root, result);
        return result;
    }


    private void traverse(LinkedList<String> currentPath, HeaderNode node, List<List<String>> result) {
        if (node.getChildren() == null || node.getChildren().isEmpty()) {
            result.add(new ArrayList<>(currentPath));
            return;
        }
        for (HeaderNode child : node.getChildren()) {
            currentPath.add(child.getTitle());
            traverse(currentPath, child, result);
            currentPath.removeLast();
        }
    }
}

HeaderBuilder类负责管理和生成表头结构。它包含一个私有的root属性,指向表头树形结构的根节点。create方法是一个静态工厂方法,用于创建HeaderBuilder实例。它接受多个HeaderNode作为参数,并将这些节点添加到虚拟的ROOT根节点下。

build方法是核心方法,它通过调用私有的traverse方法,对表头树形结构进行深度优先遍历。在遍历过程中,traverse方法将当前路径上的节点名称收集到currentPath中。当遇到叶子节点(没有子节点的节点)时,将currentPath的内容添加到结果列表result中,最终生成适用于EasyExcel的嵌套列表形式的表头数据。

(三)主程序类

java 复制代码
package com.xtl.utils;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 构建表头结构
        HeaderNode user = new HeaderNode("用户")
               .addChild(new HeaderNode("姓名"))
               .addChild(new HeaderNode("年龄"))
               .addChild(new HeaderNode("性别"));
        HeaderNode address = new HeaderNode("地址")
               .addChild(new HeaderNode("省份"))
               .addChild(new HeaderNode("城市"));
        HeaderNode score = new HeaderNode("分数");
        List<List<String>> header = HeaderBuilder.create(user, address, score).build();

        System.out.println(header);
        // 准备数据
        List<List<String>> data = new ArrayList<>();
        data.add(Arrays.asList("张三", "25", "男", "浙江", "杭州", "20"));
        data.add(Arrays.asList("李四", "30", "女", "江苏", "南京", "20"));
        ExcelWriter excelWriter = EasyExcel.write("demo.xlsx").build();
        WriteSheet sheet = EasyExcel.writerSheet()
               .head(header)
               .build();
        excelWriter.write(data, sheet);
        excelWriter.finish();
    }
}

Main类中,首先构建了表头的树形结构。通过创建HeaderNode实例,并调用addChild方法,构建了"用户"、"地址"和"分数"相关的多级表头节点。然后,使用HeaderBuilder.create方法创建HeaderBuilder实例,并调用build方法生成嵌套列表形式的表头数据。

接着,准备了要写入Excel的数据。最后,使用EasyExcel库创建ExcelWriterWriteSheet实例,将生成的表头和数据写入名为demo.xlsx的Excel文件中。

相关推荐
还是鼠鼠27 分钟前
tlias智能学习辅助系统--Maven 高级-私服介绍与资源上传下载
java·spring boot·后端·spring·maven
Xiaokai丶1 小时前
Java 8 新特性深度剖析:核心要点与代码实战
java
灵魂猎手1 小时前
3. MyBatis Executor:SQL 执行的核心引擎
java·后端·源码
Galaxy在掘金1 小时前
从业8年,谈谈我认知的后端架构之路-1
java·架构
努力努力再努力wz2 小时前
【c++深入系列】:万字详解模版(下)
java·c++·redis
瓦特what?3 小时前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘
是乐谷3 小时前
阿里云杭州 AI 产品法务岗位信息分享(2025 年 8 月)
java·人工智能·阿里云·面试·职场和发展·机器人·云计算
Java水解4 小时前
Java中的四种引用类型详解:强引用、软引用、弱引用和虚引用
java·后端
lifallen4 小时前
JCTools 无锁并发队列基础:ConcurrentCircularArrayQueue
java·开发语言·数据结构·算法
一叶飘零_sweeeet4 小时前
IDEA 插件 Trae AI 全攻略
java·人工智能·intellij-idea