当前位置: 首页 > news >正文

EasyExcel构建复杂多级表头

EasyExcel构建复杂多级表头

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

一、整体思路

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

二、关键代码实现

(一)HeaderNode类

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类

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的嵌套列表形式的表头数据。

(三)主程序类

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

相关文章:

  • 网络安全员证书
  • go类(结构体)和对象
  • windows下玩转vllm:在wsl下安装vllm
  • 高速光耦在通信行业的应用(四) | 1Mbps通信光耦的应用
  • sentinel详细使用教学
  • 两分种解决:xshell终端delete键无效
  • c++中的静态多态和动态多态简介
  • 性能测试【Perfdog】
  • 接口测试工具:postman详解
  • CAM350_安装
  • 【Linux高级IO】Linux多路转接:深入探索poll与epoll的奥秘
  • Ollama的底层实现原理分析
  • 《浔川AI翻译v6.1.1版本推迟上线公告》
  • C++类和对象
  • 算法day4 dfs搜索2题
  • 【机房——LCA】
  • 小米火龙CPU和其他几代温度太高的CPU是由谁代工的
  • 卢卡斯定理判断组合数奇偶(Codeforces Round 1006 (Div. 3)——F)
  • 【含文档+PPT+源码】基于SpringBoot的宠物领养系统设计与实现
  • Rust语言基础知识详解【四】
  • 博山政府网站建设哪家专业/互联网公司排名
  • wordpress排除置顶文章/微博seo排名优化
  • 非国产手机浏览器/灰色行业seo
  • 延庆住房建设委官方网站/搜索引擎优化的特点
  • app软件开发费用多少/seo网络营销推广公司深圳
  • 做瞹瞹瞹视频免费网站/网站怎么优化排名