maven pom.xml下载poi包

org.apache.poi

poi

3.17

org.apache.poi

poi-ooxml

3.17

org.apache.poi

poi-ooxml-schemas

3.17

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

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;

@TableId

private String id;

private String parentId;

@TableField(exist = false)

private List children;

/**列数*/

@TableField(exist = false)

private Integer colNumber;

}

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

@GetMapping("/test")

public void test(HttpServletResponse response, HttpServletRequest request) throws IOException {

// 查询数据库

List testDomains = testMapper.selectList(null);

// 封装成树形结构

TestTreeHandler testTreeHandler = new TestTreeHandler(testDomains);

List 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 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 nodes = new ArrayList();

public TestTreeHandler(List nodes) {

super();

this.nodes = nodes;

}

/**

*

* @Title: buildTree

* @Description: 构建树形结构

* @return

* List

* @throws

* @Author XX

*/

public List buildTree() {

List TestDomains = new ArrayList();

List 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 children = getChildNodes(node);

if (!children.isEmpty()) {

for (TestDomain child : children) {

buildChildNodes(child);

}

node.setChildren(children);

}

}

/**

*

* @Title: getChildNodes

* @Description: 获取父节点下所有的子节点

* @param pnode 父节点

* @return

* List

* @throws

* @Author XX

*/

public List getChildNodes(TestDomain pnode) {

List childNodes = new ArrayList();

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

* @throws

* @Author XX

*/

public List getRootNodes() {

List rootNodes = new ArrayList();

for (TestDomain n : nodes) {

if (rootNode(n)) {

rootNodes.add(n);

}

}

return rootNodes;

}

}

浏览器敲地址访问就行了

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

本文地址:https://blog.csdn.net/yangzongzhuan/article/details/110875951

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

java生成树形Excel_java poi导出树形结构到excel文件相关推荐

  1. poi导出自定义文字水印excel文件

    直接上代码 注意Workbook和sheet都是XSSF开头的这种,水印效果是整个sheet页铺满自定义文本水印 import javax.imageio.ImageIO; import java.a ...

  2. 通过Java批量导出带有图片的Excel文件数据

    批量导出带有图片的Excel文件 一.思路解析 二.关键源码 三.总结 Java通过POI或者一些常见的Excel工具类能够轻易导出后台的结构化数据,但是最近面临一个新需求,需要将对应记录数据和图片网 ...

  3. 使用poi导出大量数据到excel遇到的问题

    最近在工作遇到利用poi导出大量数据到excel并提供下载的运用场景,并遇到了一个问题,当数据量过大时(几十万),后台在进行数据写入excel中的过程会非常耗时,导致迟迟没有响应前台,结果数据还没导完 ...

  4. POI动态导出多层表头的EXCEL文件

    POI动态导出多层表头的EXCEL文件 表格表头导出 单行表头 多行表头 以前接触过一个很古老的导出Excel,实现的逻辑是先声明一个导出的Excel模板,模板里报表的表头名称和顺序是固定的,这样执行 ...

  5. php mysql生成excel文件,PHP导出MySQL数据到Excel文件简单示例

    这篇文章主要为大家详细介绍了PHP导出MySQL数据到Excel文件简单示例,具有一定的参考价值,可以用来参考一下. 对phpPHP导出MySQL数据到Excel文件简单示例感兴趣的小伙伴,下面一起跟 ...

  6. anki 插入表格_Anki之导出卡牌组到Excel文件

    最近有导出Anki卡牌组到Excel文件的需要,查到了这个教程,Anki插件--导出卡牌到Excel文件-LearnHacks,但结果并不令人满意,所导出的Excel文件只有一列,所选中的卡片字段全部 ...

  7. POI3.8解决导出大数据量excel文件时内存溢出的问题

    POI3.8解决导出大数据量excel文件时内存溢出的问题 参考文章: (1)POI3.8解决导出大数据量excel文件时内存溢出的问题 (2)https://www.cnblogs.com/feng ...

  8. php按列导出excel2010,excel2010官方下载 免费完整版 PHP导出MySQL数据到Excel文件fputcsv...

    这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件. 复制代码 代码如下: // 输出Excel文件头,可把user.csv换成你要的文件名 header('Conten ...

  9. java 生成ppt_POI之PPT导出最简单实例

    开心一笑 有个四岁的小鬼问我:哥哥你怎么长得那么丑啊? 我想了想,到他耳边说:你不要告诉别人哦.其实我就是未来的你. 他哭了... 提出问题 如何实现一个最简单的PPT导出功能呢??? 解决问题 QQ ...

  10. excel导出java.lang.ArrayIndexOutOfBoundsException: 0 POI导出excel报错数组下标越界0

    好久没写博客了,最近是有点懒了... 最近项目遇到个问题,用poi导出excel,本地和测试服务器都没问题,线上所有的导出都不能用,排查过JKD版本和配置文件都没问题,百思不得其解,最终问了朋友考虑到 ...

最新文章

  1. HarmonyOS 查看本地API
  2. web服务器错误配置文件,web服务器http配置文件
  3. 数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。...
  4. mysql触发器对同一张表做操作_MySql 触发器对同表操作
  5. array keys php,php array_keys与array_search的简单使用
  6. Perl 安装及模组安装方法【windows】
  7. 国产杀毒软件连续因“作弊”遭全球权威评测机构指责
  8. 湖南城市学院计算机题库和答案,湖南城市学院 计算机选择题题库
  9. ESP8266在arduino下开启路由转发实现wifi中继的方法小记
  10. APP微信登录后端PHP,PHP开发微信授权登录教程
  11. Win10 如何将40G大文件极致压缩
  12. short转换byte
  13. Jquery中stop()的用法
  14. 上位机串口数据检验方式(二)——奇偶校验
  15. 破解flowplayer
  16. 文献阅读(2):王昊奋:大规模知识图谱技术
  17. 设计模式的六大原则(SOLID)
  18. 乱评赢在中国之蓝天碧水间系列
  19. 前端必备:常用品牌logo图标的官方颜色表示
  20. 《注册测绘师制度暂行规定》有关问题解读

热门文章

  1. win10怎么更新显卡驱动_AMD Radeon 20.5.1 驱动程序更新:新增支持 Win10 版本 2004
  2. linux如何更改主题颜色,修改Ubuntu主题的颜色
  3. word里面搜狗输入法突然不见了
  4. win10怎样将桌面上回收站快捷键图标隐藏或显示
  5. python运行部分代码
  6. 恒生电子:主推2条联盟链,但链上交易至今不到30笔 |追击上市公司
  7. 淦!为什么到处都是广告!
  8. 如何在被保护的工作表(Worksheet)中使用Group Outlining
  9. java jersey使用总结_Java Jersey2使用总结
  10. 大连英语培训百家外语雅思考试词汇量要求与记忆方法是什么