表格数据转化树形列表

当遇到这么一份漂亮的execl时 心情都是舒畅的,是不是心里想着一定要把这个表格弄成树形数据 才觉得过瘾(末尾附送java 源码)
先给大家伙看一下这份漂亮的execl 这份数据出自于某位大师之手
在这里插入图片描述

很美观对吧, 现在开始把这份数据转换成树形结构
在人类眼中 这份数据的父子关系非常明确 但是拿到这样的数据要怎么才能教会计算机将其变成一个树形结构的数据呢
下面我把数据的样子转变一下,这样就显得很清晰明了
在这里插入图片描述

有了这样的图做出一份树形结构分分钟的事情可以做出一份树形列表呀
在这里插入图片描述

做出这样的结构需首先要考虑的是节点,每一颗树都有1-N个节点,每个节点下也可以有多个小节点,就像树一样
在这里插入图片描述

把刚刚的表格文件画成树,每个树都有自己的属性
在这里插入图片描述

节点深度 可以理解为层级 树有多深层级就有多高
那么怎么将其转化成代码呢 这个节点深度非常重要,可以说是一个家族开枝散叶的基石,给每个节点定义好属性之后,请看下图
如何判断节点信息从而进行存储
在这里插入图片描述

接下来开始上手怎么用这样的数据创建一份树形数据
偷个懒 直接看源码吧

链接:https://pan.baidu.com/s/1BLpqG6VZzF-kFfNWj0woMQ 提取码:96zw --来自百度网盘超级会员V5的分享 没错我就是那个超级V5

在这里插入图片描述
在这里插入图片描述

源码

import com.ruoyi.common.utils.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.jupiter.api.Test;

import java.io.*;
import java.util.*;

public class Execl01Demo {
    @Test
    public void testExcel() {
        String path = "C:\\Users\\16146\\Desktop\\数据.xlsx";
        // String path = "D:\\temp\\temp\\test.xlsx";
        File file = new File(path);
        InputStream is = null;
        Workbook workbook = null;
        List<Demo01> listss = new ArrayList<>();
        try {
            is = new FileInputStream(file);
            if (path.endsWith(".xls")) {
                workbook = new HSSFWorkbook(is);
            } else if (path.endsWith(".xlsx")) {
                workbook = new XSSFWorkbook(is);
            }
            if (workbook != null) {
                //获取sheet
                int sheetCount = workbook.getNumberOfSheets();
                //节点
                Map<String, Object> nodeMap = new HashMap<>();

                if (sheetCount > 0) {
                    // 文本内容
                    int id = 0;
                    for (int i = 0; i < sheetCount; i++) {
                        Sheet sheet = workbook.getSheetAt(i);
                        for (int rownum = sheet.getFirstRowNum(); rownum <= sheet.getLastRowNum(); rownum++) {
                            Row row = sheet.getRow(rownum);
                            if (row == null || row.getFirstCellNum() < 0) {
                                break;
                            }


                            for (int columnnum = row.getFirstCellNum(); columnnum <= row
                                    .getLastCellNum(); columnnum++) {
                                String cellValue = getCellValue(row.getCell(columnnum));
                                Demo01 demo01 = new Demo01();
                                //第一级
                                if (StringUtils.isNotEmpty(cellValue)) {

                                    if(columnnum==0) {
                                        nodeMap.clear();
                                    }
                                    demo01.setName(cellValue);
                                    demo01.setNode(columnnum);
                                    demo01.setNodeId(id + "");
                                    String ancestors = "";
                                    String s = String.valueOf(nodeMap.get(String.valueOf(columnnum)));
                                    if (StringUtils.isNotEmpty(s) && s != "null") {
                                        demo01.setParent(String.valueOf(nodeMap.get(String.valueOf(columnnum - 1))));
                                        for (int j = 0; j < columnnum; j++) {
                                            String s1 = String.valueOf(nodeMap.get(String.valueOf(j)));
                                            if (s1!="null") {
                                                ancestors+= s1+"、";
                                            }

                                        }
                                        demo01.setAncestors(ancestors+id+"、");
                                        nodeMap.put(String.valueOf(columnnum), id);
                                    }
                                    else {
                                        nodeMap.put(String.valueOf(columnnum), id);
                                        demo01.setParent(String.valueOf(nodeMap.get(String.valueOf(columnnum - 1))));
                                        for (int j = 0; j < nodeMap.size(); j++) {
                                            String s1 = String.valueOf(nodeMap.get(String.valueOf(j - 1)));
                                            if (s1!="null") {
                                                ancestors+= s1+"、";
                                            }

                                        }
                                        demo01.setAncestors(ancestors);
                                    }
                                    id++;
                                    listss.add(demo01);
                                }

                            }
                        }
                    }

                }
                System.out.println();
            }
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        } finally {
            try {
                if (workbook != null) {
                    workbook.close();
                }
                if (is != null) {
                    is.close();
                }
            } catch (IOException e) {
            }
        }
    }

    /**
     * 获取单元格内容
     *
     * @param cell
     * @return
     */
    private String getCellValue(Cell cell) {
        if (cell == null) {
            return "";
        }
        // 都按文本格式读取
        cell.setCellType(CellType.STRING);
        return cell.getStringCellValue();
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设后端返回的数据格式如下: ```json { "id": 1, "name": "Parent Node", "children": [ { "id": 2, "name": "Child Node 1", "children": [] }, { "id": 3, "name": "Child Node 2", "children": [ { "id": 4, "name": "Grandchild Node 1", "children": [] } ] } ] } ``` 可以先定义一个递归函数,将数据转化为 element-plus 树形表格所需的格式: ```javascript function transformData(data) { return data.map(item => { const { id, name, children } = item const node = { id, name, children: [] } if (children && children.length > 0) { node.children = transformData(children) } return node }) } ``` 然后在 Vue 组件中调用该函数,并将结果赋值给 treeData 属性: ```vue <template> <el-table-tree-column :props="treeProps" :data="treeData" border> <el-table-column label="ID" prop="id"></el-table-column> <el-table-column label="Name" prop="name"></el-table-column> </el-table-tree-column> </template> <script> export default { data() { return { treeData: [] } }, computed: { treeProps() { return { children: 'children', hasChildren: node => node.children && node.children.length > 0 } } }, methods: { fetchData() { // 发起 API 请求,获取数据 // 假设数据存储在 response.data 中 const response = await fetch('/api/tree') const data = await response.json() // 转化数据格式 this.treeData = transformData(data) } }, mounted() { this.fetchData() } } </script> ``` 注意:需要引入 `el-table-tree-column` 组件,并在 `treeProps` 中指定树形结构的属性名称。在上面的例子中,我们指定了 `children` 作为树形结构的属性。同时,在 `el-table-column` 组件中,需要指定展示的列。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值