亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java結(jié)合EasyExcel構(gòu)建復(fù)雜多級表頭

 更新時間:2025年03月03日 09:20:21   作者:codefly-xtl  
在Java開發(fā)中,處理Excel文件時,構(gòu)建復(fù)雜的多級表頭是一項(xiàng)常見且具有挑戰(zhàn)性的任務(wù),下面小編就來和大家聊聊如何通過自定義方法實(shí)現(xiàn)多級表頭的構(gòu)建吧

在Java開發(fā)中,處理Excel文件時,構(gòu)建復(fù)雜的多級表頭是一項(xiàng)常見且具有挑戰(zhàn)性的任務(wù)。本文將詳細(xì)介紹如何通過自定義的HeaderBuilder類結(jié)合EasyExcel庫,輕松實(shí)現(xiàn)多級表頭的構(gòu)建,并將數(shù)據(jù)寫入Excel文件。

一、整體思路

我們的目標(biāo)是創(chuàng)建一個靈活、可擴(kuò)展的方式來構(gòu)建多級表頭。為此,我們設(shè)計了一個HeaderBuilder類,它使用樹形結(jié)構(gòu)來表示表頭信息。每個表頭節(jié)點(diǎn)(HeaderNode)可以有多個子節(jié)點(diǎn),從而形成多級結(jié)構(gòu)。最終,通過遍歷這個樹形結(jié)構(gòu),生成適用于EasyExcel的嵌套列表形式的表頭數(shù)據(jù)。

二、關(guān)鍵代碼實(shí)現(xiàn)

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方法,可以方便地為當(dāng)前節(jié)點(diǎn)添加子節(jié)點(diǎn),構(gòu)建樹形結(jié)構(gòu)。

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"); // 虛擬根節(jié)點(diǎn)
        for (HeaderNode node : headerNodes) {
            root.addChild(node);
        }
        return new HeaderBuilder(root);
    }

    /**
     * 生成多級表頭結(jié)構(gòu)
     *
     * @return 適用于EasyExcel的嵌套表頭結(jié)構(gòu)
     */
    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類負(fù)責(zé)管理和生成表頭結(jié)構(gòu)。它包含一個私有的root屬性,指向表頭樹形結(jié)構(gòu)的根節(jié)點(diǎn)。create方法是一個靜態(tài)工廠方法,用于創(chuàng)建HeaderBuilder實(shí)例。它接受多個HeaderNode作為參數(shù),并將這些節(jié)點(diǎn)添加到虛擬的ROOT根節(jié)點(diǎn)下。

build方法是核心方法,它通過調(diào)用私有的traverse方法,對表頭樹形結(jié)構(gòu)進(jìn)行深度優(yōu)先遍歷。在遍歷過程中,traverse方法將當(dāng)前路徑上的節(jié)點(diǎn)名稱收集到currentPath中。當(dāng)遇到葉子節(jié)點(diǎn)(沒有子節(jié)點(diǎn)的節(jié)點(diǎn))時,將currentPath的內(nèi)容添加到結(jié)果列表result中,最終生成適用于EasyExcel的嵌套列表形式的表頭數(shù)據(jù)。

主程序類

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) {
        // 構(gòu)建表頭結(jié)構(gòu)
        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("分?jǐn)?shù)");
        List<List<String>> header = HeaderBuilder.create(user, address, score).build();

        System.out.println(header);
        // 準(zhǔn)備數(shù)據(jù)
        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類中,首先構(gòu)建了表頭的樹形結(jié)構(gòu)。通過創(chuàng)建HeaderNode實(shí)例,并調(diào)用addChild方法,構(gòu)建了“用戶”、“地址”和“分?jǐn)?shù)”相關(guān)的多級表頭節(jié)點(diǎn)。然后,使用HeaderBuilder.create方法創(chuàng)建HeaderBuilder實(shí)例,并調(diào)用build方法生成嵌套列表形式的表頭數(shù)據(jù)。

接著,準(zhǔn)備了要寫入Excel的數(shù)據(jù)。最后,使用EasyExcel庫創(chuàng)建ExcelWriter和WriteSheet實(shí)例,將生成的表頭和數(shù)據(jù)寫入名為demo.xlsx的Excel文件中。

到此這篇關(guān)于Java結(jié)合EasyExcel構(gòu)建復(fù)雜多級表頭的文章就介紹到這了,更多相關(guān)Java EasyExcel多級表頭內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn)

    Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn)

    這篇文章主要介紹了Java Swing 只關(guān)閉當(dāng)前窗體的實(shí)現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • SpringBoot中使用Servlet三大組件的方法(Servlet、Filter、Listener)

    SpringBoot中使用Servlet三大組件的方法(Servlet、Filter、Listener)

    這篇文章主要介紹了SpringBoot中使用Servlet三大組件的方法(Servlet、Filter、Listener),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • SpringBoot整合JPA的實(shí)例代碼

    SpringBoot整合JPA的實(shí)例代碼

    本篇文章主要介紹了SpringBoot整合JPA的實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java中StringBuilder常用構(gòu)造方法解析

    Java中StringBuilder常用構(gòu)造方法解析

    這篇文章主要介紹了Java中StringBuilder常用構(gòu)造方法解析,StringBuilder是一個可標(biāo)的字符串類,我們可以吧它看成是一個容器這里的可變指的是StringBuilder對象中的內(nèi)容是可變的,需要的朋友可以參考下
    2024-01-01
  • Java springboot探究配置文件優(yōu)先級

    Java springboot探究配置文件優(yōu)先級

    在springboot項(xiàng)目中,我們可以通過在yml文件中設(shè)置變量,再通過@Value注解來獲得這個變量并使用,但如果這個項(xiàng)目已經(jīng)部署到服務(wù)器上,我們想更改這個數(shù)據(jù)了需要怎么做呢,其實(shí)在springboot項(xiàng)目中,配置文件是有優(yōu)先級的
    2023-04-04
  • Java多線程 兩階段終止模式Two-Phase Termination Patter

    Java多線程 兩階段終止模式Two-Phase Termination Patter

    這篇文章主要介紹了Java多線程 兩階段終止模式Two-Phase Termination Patter,該模式有兩個角色,分別是Terminator,終止者,負(fù)責(zé)接收終止請求,執(zhí)行終止處理,處理完成后再終止自己。TerminationRequester終止請求發(fā)出者,用來向Terminator發(fā)出終止請求,需要的朋友可以參考一下
    2021-10-10
  • java泛型中占位符T和?有什么區(qū)別

    java泛型中占位符T和?有什么區(qū)別

    泛型中占位符T和?有什么區(qū)別?有的人可能弄不清楚,本文主要介紹了java泛型中占位符T和?有什么區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2022-05-05
  • Mybatis的Mapper中的方法為什么不能重載

    Mybatis的Mapper中的方法為什么不能重載

    這篇文章主要介紹了Mybatis的Mapper中的方法為什么不能重載,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • struts2過濾器和攔截器的區(qū)別分析

    struts2過濾器和攔截器的區(qū)別分析

    這篇文章主要介紹了struts2過濾器和攔截器的區(qū)別,簡單分析了struts2框架中過濾器和攔截器的概念與相關(guān)使用區(qū)別,需要的朋友可以參考下
    2016-04-04
  • Spring boot 集成 Druid 數(shù)據(jù)源過程詳解

    Spring boot 集成 Druid 數(shù)據(jù)源過程詳解

    這篇文章主要介紹了Spring boot 集成 Druid 數(shù)據(jù)源過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08

最新評論