java poi导出树形结构到excel文件

article/2025/8/21 21:00:27

maven pom.xml下载poi包

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency>

首先是实体类,也就是我们的数据集合

import java.util.List;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
@TableName("test")
public class TestDomain {private String phone;private String parentPhone;@TableIdprivate String id;private String parentId;@TableField(exist = false)private List<TestDomain> children;/**列数*/@TableField(exist = false)private Integer colNumber;
}

 再写个接口接收前端的导出请求,这里是使用的springboot 框架

@GetMapping("/test")public  void test(HttpServletResponse response, HttpServletRequest request) throws IOException {// 查询数据库List<TestDomain> testDomains = testMapper.selectList(null);// 封装成树形结构TestTreeHandler testTreeHandler = new TestTreeHandler(testDomains);List<TestDomain> treeList = testTreeHandler.buildTree();//创建poi导出数据对象SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();//创建sheet页SXSSFSheet sheet = sxssfWorkbook.createSheet("sheet页名字");//创建表头SXSSFRow headRow = sheet.createRow(0);//设置表头信息headRow.createCell(0).setCellValue("父号码");headRow.createCell(1).setCellValue("子号码");// 遍历上面数据库查到的数据for (TestDomain testDomain : treeList) {//填充数据SXSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);//序号//看你实体类在进行填充dataRow.createCell(0).setCellValue(testDomain.getParentPhone());dataRow.createCell(1).setCellValue(testDomain.getPhone());testDomain.setColNumber(1);if(!CollectionUtils.isEmpty(testDomain.getChildren())) {child(testDomain.getChildren(), sheet,testDomain,dataRow);}}// 下载导出String filename = "导出excel表格名字";// 设置头信息response.setCharacterEncoding("UTF-8");response.setContentType("application/vnd.ms-excel");//一定要设置成xlsx格式response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename + ".xlsx", "UTF-8"));//创建一个输出流ServletOutputStream outputStream = response.getOutputStream();//写入数据sxssfWorkbook.write(outputStream);// 关闭outputStream.close();sxssfWorkbook.close();return null;}

递归子节点,往文件中逐级写入数据

/*** * @Title: child   * @Description: 填充子节点数据 * @param childList 子节点数据* @param sheet 表格对象* @param parentDomain 父节点数据* @param parentRow  父节点行对象* void      * @throws   * @Author XX*/public static void child(List<TestDomain> childList,SXSSFSheet sheet,TestDomain parentDomain,SXSSFRow parentRow) {for (TestDomain testDomain : childList) {// 获取sheet的最后一行SXSSFRow childRow = sheet.createRow(sheet.getLastRowNum()+1);// 合并单元格sheet.addMergedRegion(new CellRangeAddress(childRow.getRowNum(), childRow.getRowNum(), 0, parentDomain.getColNumber()));// 设置子节点表头 parentDomain.getColNumber()+1 和 parentDomain.getColNumber()+2 表示根据父节点最大列数往后挪移1-2列,如果是10个字段就往后挪移1-10列parentRow.createCell(parentDomain.getColNumber()+1).setCellValue("父号码");parentRow.createCell(parentDomain.getColNumber()+2).setCellValue("子号码");// 填充数据childRow.createCell(parentDomain.getColNumber()+1).setCellValue(testDomain.getParentPhone());childRow.createCell(parentDomain.getColNumber()+2).setCellValue(testDomain.getPhone());testDomain.setColNumber(parentDomain.getColNumber()+2);if(!CollectionUtils.isEmpty(testDomain.getChildren())) {child(testDomain.getChildren(), sheet,testDomain,childRow);}}}

将LIST装换成树形结构的处理类

import java.util.ArrayList;
import java.util.List;import com.dadi01.scrm.service.mot.provider.domain.TestDomain;public class TestTreeHandler {/*** 	递归封装树形菜单*/List<TestDomain> nodes = new ArrayList<TestDomain>();public TestTreeHandler(List<TestDomain> nodes) {super();this.nodes = nodes;}/*** * @Title: buildTree   * @Description: 构建树形结构 * @return      * List<TestDomain>      * @throws   * @Author XX*/public List<TestDomain> buildTree() {List<TestDomain> TestDomains = new ArrayList<TestDomain>();List<TestDomain> rootNodes = getRootNodes();for (TestDomain rootNode : rootNodes) {buildChildNodes(rootNode);TestDomains.add(rootNode);}return TestDomains;}/*** * @Title: buildChildNodes   * @Description: 递归子节点 找出父节点下所有的层级 * @param node 上级节点      * void      * @throws   * @Author XX*/public void buildChildNodes(TestDomain node) {List<TestDomain> children = getChildNodes(node);if (!children.isEmpty()) {for (TestDomain child : children) {buildChildNodes(child);}node.setChildren(children);}}/*** * @Title: getChildNodes   * @Description:  获取父节点下所有的子节点 * @param pnode 父节点* @return      * List<TestDomain>      * @throws   * @Author XX*/public List<TestDomain> getChildNodes(TestDomain pnode) {List<TestDomain> childNodes = new ArrayList<TestDomain>();for (TestDomain n : nodes) {if (pnode.getId().equals(n.getParentId())) {childNodes.add(n);}}return childNodes;}/*** * @Title: rootNode   * @Description: 判断是否为根节点 * @param node 当前节点* @return      * boolean      * @throws   * @Author XX*/public boolean rootNode(TestDomain node) {return "0".equals(node.getParentId());}/*** * @Title: getRootNodes   * @Description: 获取集合中所有的根节点 * @return      * List<TestDomain>      * @throws   * @Author XX*/public List<TestDomain> getRootNodes() {List<TestDomain> rootNodes = new ArrayList<TestDomain>();for (TestDomain n : nodes) {if (rootNode(n)) {rootNodes.add(n);}}return rootNodes;}
}

浏览器敲地址访问就行了

http://localhost:8182/v1/excel/test

导出的文件内容 0为根节点

 

 


http://chatgpt.dhexx.cn/article/Sqc0vrHI.shtml

相关文章

Python 自动化操作 Excel 绘制条形图!

作者 | 黄伟呢 来源 | 数据分析与统计学之美 今天&#xff0c;有位朋友在群里面咨询了一个问题。 大致意思如图所示&#xff1a; 有人提议用vba&#xff0c;但是不得不说&#xff0c;没有学过vba的朋友&#xff0c;会觉得vba用起来很困难。那还不容易&#xff0c;直接上Python&…

python实现,excel随机抽取特定行到新表中(附上源码和桌面软件)

引言 最近&#xff0c;经常抽查excel表中的一些行&#xff0c;到一个新表中&#xff1b;于是想着写一个程序&#xff0c;自动完成。 功能 基础功能 从原表中随机抽取n行&#xff0c;到一个新表中&#xff08;可用于老师抽查学生作业&#xff0c;领导抽查核酸&#xff08;坏…

Python自动化操作Excel绘制条形图!

公众号后台回复“图书“&#xff0c;了解更多号主新书内容 作者&#xff1a;黄伟呢 来源&#xff1a;数据分析与统计学之美 大家好&#xff0c;我是黄伟&#xff0c;统计学硕士&#xff0c;CSDN博客专家&#x1f680; 今天&#xff0c;有位朋友在群里面咨询了一个问题。 大致意…

树形数据展示 - 嵌套子表格

一、目标样式 父表格嵌套子表格&#xff0c;子表格默认折叠&#xff0c;点击父表格左侧加号可以展开父表格显示对应的子表格&#xff0c;展示每行数据更详细的信息 目标效果 二、问题样式 &#xff08;一&#xff09;问题说明 父表格展开后&#xff0c;子表格展示成功&#xff…

如何利用Python程序读取Excel创建折线图

如何利用Python程序读取Excel创建折线图 如何利用Python程序读取Excel创建折线图首先第一步&#xff1a;打开命令提示符第二步&#xff1a;通过pip命令安装所需要的工具库 其次打开IDLE开始编程 附录常用的工具库安装pip常用命令常用的工具库常用的marker常用的颜色 如何利用Py…

poi实现对树形结构数据导出excel并合并表格

poi实现对树形结构数据导出excel并合并表格 1.主要逻辑&#xff01;2.完整代码 最近好像得罪了poi&#xff0c;遇到的都是导出word、Excel、pdf的问题。下面我记录一下poi对树形结构的处理&#xff0c;前面先梳理整体思路&#xff0c;文章末尾会贴上完整代码。 首先我们看一下模…

【JAVA】读取excel导入数据库,形成树状结构

最近需要导入一个excel表格&#xff0c;存到数据库并以树状结构读取出来 下面两张图片是需要导入的excel Transactional(rollbackFor Exception.class)public String import(MultipartFile file, Integer projectId) throws Exception {//poi解析excelInputStream inputStrea…

html 树 excel,用Excel实现简易树状关系

引子 - Excel训练营 - 写在前面 树状图对大家来说并不陌生。 树状图&#xff0c;亦称树枝状图&#xff0c;其文绉绉的定义如下&#xff1a; 树形图是数据树的图形表示形式&#xff0c;以父子层次结构来组织对象。是枚举法的一种表达方式。 而excel能够在一定程度上实现比较简单…

JAVA对树状结构数据导出Excel自动合并同级内容代码

针对树形结构数据进行Excel导出并进行合并处理 针对树形结构数据的Excel导出的1 需求1 对象结构2 对数据进行树形结构数据组合并且进行计算工具类3 对数据库的数据进行处理(全文最重要的数据处理方法思路逻辑)4 递归查询 父节点信息5 对数据写入Excel,6 自动合并代码参考我的上…

1、简单的Excel地址导入与树状结构生成

2019独角兽企业重金招聘Python工程师标准>>> 一、地区表结构 DROP TABLE IF EXISTS pro_area; /*!40101 SET saved_cs_client character_set_client */; /*!40101 SET character_set_client utf8 */; CREATE TABLE pro_area (area_id bigint(30) NOT NULL AUT…

树状结构导出到excel表格

/**获取导出实例 */async getAllInstances(SlotId) {//SlotId 数据库词槽idlet result:any [] //导出的数据模块const allData await this.getSimpleInstance(SlotId)//allData根据数据库词槽ID查询到的树状结构数据let count 1//fn 是递归的函数let fn (data, objc,count)…

Excel树状数据绘制导出

//存放数据的二维集合&#xff0c;twoDimensional 中每个List是树状结构的一个分支的所有数据List<List<JSONObject>> twoDimensional new ArrayList<>();//创建对象XSSFWorkbook xwb new XSSFWorkbook();//创建工作表Sheet sheet xwb.createSheet("…

将excel树形结构的数据导入数据库

因为工作需要&#xff0c;用户需要将产品分类通过excel表格导入到数据库中&#xff0c;而产品分类又有一、二、三、四、五级分类。最终通过各种尝试终于实现了数据导入。因此记录下来。 一、excel模板数据结构和数据库表结构介绍 1、 待导入excel模板数据&#xff1a; 2、数据…

关于excel多层级(树形)数据结构,提取成树形结构数据并导出到数据库

在开发中遇到一个问题&#xff0c;就是有一张excel表中的数据时多层级的&#xff0c;不是普通一行一行的&#xff0c;而是&#xff0c;一行对应多行&#xff0c;多行之中的每一行在对应多行数据。形成树形结构&#xff1a; 如上图所示&#xff1a;我遇到的excel表的结构&#x…

使用excel插件treeplan构建决策树

Treeplan是一种构建决策树的很轻巧的excel插件&#xff0c;可以做出比较规范的决策树&#xff0c;并可以自动计算结果。下面以excel2003为例&#xff08;07也可正常使用&#xff09;介绍其使用方法。 一&#xff0e;加载treeplan插件 工具&#xff08;菜单&#xff09;——加载…

EXCEL(VBA)画树程序

看了好多Python写的画树&#xff0c;想看看在Excel里画个树行不行&#xff0c;于是乎花了点时间用VBA写了个&#xff0c;效果还不错&#xff0c;截个图给大家看看。 绿色固定配色版效果&#xff1a; 随机颜色版效果&#xff1a; 附上主代码 Sub test() 画树主程序 作者&#…

Java 树形结构数据生成导出excel文件

效果 用法 String jsonStr "{\"name\":\"aaa\",\"children\":[{\"name\":\"bbb\",\"children\":[{\"name\":\"eee\"},{\"name\":\"fff\",\"children\"…

python 根据树型结构生成指定格式的excel数据

数据 tree {a: {a1: [(a1a, 1)],a2: [(a2a, 1),(a2b, 2),]},b: {b1: [(b1b, 1)],b2: [(b2b, 1)]} }excel 数据格式 代码实现 import xlrd from xlutils.copy import copyold_excel xlrd.open_workbook(1.xls) new_excel copy(old_excel) ws new_excel.get_sheet(0)def wr…

人工智能-高等数学之导数篇

高等数学之导数篇 线性代数的学习基本就先告一个段落了&#xff0c;接着学最重要的微积分&#xff0c;高等数学里的重中之重&#xff0c;也是近代科学的发展利器&#xff0c;微积分主要包括包括极限、微分学、积分学及其应用&#xff0c;而微分学包括求导数的运算&#xff0c;…

机器学习之数学基础 一 .导数

简单的说,导数是曲线的斜率,是曲线变化快慢的反应. 2阶导数是斜率变化快慢的反应,反应曲线的凸凹性 例如:加速度的方向总是指向轨迹曲线凹的一侧. 导数(Derivative)是微积分学中重要的基础概念.一个函数在某一点的导数描述了这个函数在这一点附近的变化率.导数的本质是通过极…