java poi导出树形结构到excel文件
程序员文章站
2022-03-10 18:04:08
maven pom.xml下载poi包 org.apache.poi poi 3.17
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;
@TableId
private 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为根节点
本文地址:https://blog.csdn.net/yangzongzhuan/article/details/110875951
推荐阅读
-
java使用POI实现excel文件的导入和导出(通用方法)
-
JAVA使用POI导出图片到Excel
-
java POI导出Excel文件数据库的数据
-
java poi导出树形结构到excel文件
-
利用 Java 的 Jakarta POI HSSF API 组件实现多表数据导出为 Excel 文件
-
Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...
-
java使用POI实现excel文件的导入和导出(通用方法)
-
JAVA使用POI导出图片到Excel
-
java POI导出Excel文件数据库的数据
-
java poi导出树形结构到excel文件