Java结合EasyExcel构建复杂多级表头
作者:codefly-xtl
在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库创建ExcelWriter和WriteSheet实例,将生成的表头和数据写入名为demo.xlsx的Excel文件中。
到此这篇关于Java结合EasyExcel构建复杂多级表头的文章就介绍到这了,更多相关Java EasyExcel多级表头内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!