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文件中。

相关推荐
风象南1 分钟前
SpringBoot中3种内容协商策略实现
java·spring boot·后端
IT瘾君3 分钟前
JavaWeb:Web介绍
java·web
不秃的开发媛12 分钟前
前端技术Ajax入门
java·开发语言·前端
大家都说我身材好21 分钟前
如何优化字符串替换:四种实现方案对比与性能分析
java·字符串
xixixin_24 分钟前
【uniapp】vue2 搜索文字高亮显示
java·服务器·前端·uni-app·交互·文字高亮
左灯右行的爱情27 分钟前
深入理解 G1 GC:已记忆集合(RSet)与收集集合(CSet)详解
java·jvm·后端·juc
珹洺38 分钟前
Jsp技术入门指南【十】IDEA 开发环境下实现 MySQL 数据在 JSP 页面的可视化展示,实现前后端交互
java·运维·前端·mysql·intellij-idea·jsp
爱的叹息1 小时前
mybatis-plus里的com.baomidou.mybatisplus.core.override.MybatisMapperProxy 类的详细解析
java·tomcat·mybatis
Mr Aokey3 小时前
手写Java线程池与定时器:彻底掌握多线程任务调度
java·开发语言
西瓜本瓜@6 小时前
在Android中如何使用Protobuf上传协议
android·java·开发语言·git·学习·android-studio