将树形结构转换行,后续可导出Excel

将树形结构转换行

package com.qingyu.controller;

import java.util.*;

/**
 * @author  xiaoliu
 * @Date 2024-07-31 22:38
 **/
public class testDemo {

    public static void main(String[] args) {

        List<Map<String, Object>> tangzhenchildren = new ArrayList<>();
        Map<String, Object> yulan1 = new HashMap();
        yulan1.put("id", "yulan1");
        yulan1.put("label", "玉兰一");
        Map<String, Object> yulan2 = new HashMap();
        yulan2.put("id", "yulan2");
        yulan2.put("label", "玉兰二");

        tangzhenchildren.add(yulan1);
        tangzhenchildren.add(yulan2);

        List<Map<String, Object>> pudongchildren = new ArrayList<>();

        Map<String, Object> tangzhen = new HashMap();
        tangzhen.put("id", "tangzhen");
        tangzhen.put("label", "唐镇");
        tangzhen.put("children", tangzhenchildren);

        Map<String, Object> zhangjinag = new HashMap();
        zhangjinag.put("id", "zhangjinag");
        zhangjinag.put("label", "张江");

        pudongchildren.add(tangzhen);
        pudongchildren.add(zhangjinag);

        Map<String, Object> pudong = new HashMap();
        pudong.put("id", "pudong");
        pudong.put("label", "浦东新区");
        pudong.put("children", pudongchildren);


        List<Map<String, Object>> xuhuichildren = new ArrayList<>();
        Map<String, Object> huajingzhen = new HashMap();
        huajingzhen.put("id", "huajingzhen");
        huajingzhen.put("label", "华泾镇");



        xuhuichildren.add(huajingzhen);

        Map<String, Object> xuhui = new HashMap();
        xuhui.put("id", "xuhui");
        xuhui.put("label", "徐汇区");
        xuhui.put("children", xuhuichildren);

        List<Map<String, Object>> shanghaigchildren = new ArrayList<>();
        shanghaigchildren.add(pudong);
        shanghaigchildren.add(xuhui);

        Map<String, Object> shanghai = new HashMap();
        shanghai.put("id", "shanghai");
        shanghai.put("label", "上海");
        shanghai.put("children", shanghaigchildren);

        List<List<String>> lists =new ArrayList<>();
        List<String> list= new ArrayList<>();

        // 将数据转化成一行行的数据
        List<List<String>> resultList =  treeToList2(shanghai, lists, list);
        List<Integer> dee = new ArrayList<>();
        for (List<String> strings : resultList) {
            dee.add(strings.size());
        }
        // 获取map的深度
        int deep = Collections.max(dee);
        for (int i = 0; i < resultList.size(); i++) {
            // 内部的list集合
            List<String> list1 = resultList.get(i);
            int size = list1.size();
            if (list1.size() < deep) {
                // 补齐list
                int i1 = deep - list1.size();
                for (int j = 0; j < i1; j++) {
                    if (size == 1) {
                        list1.add("");
                    }
                    else {
                        list1.add("");
//                        list1.add(list1.get(list1.size() - 1));
                    }
                }
            }
        }
        System.out.println(resultList);
    }


    public static List<List<String>> treeToList2(Map<String, Object> map, List<List<String>> list1, List<String> list2) {
        //遍历递归子节点
        List<Map<String, Object>> childrens = (List<Map<String, Object>>) map.get("children");
        if (childrens==null||childrens.size() == 0) {
            list1.add(list2);
        } else {
            for (Map<String, Object> children : childrens) {
                String label = children.get("label").toString();
                String id = children.get("id").toString();
                List<String> strings = new ArrayList<>(list2);
                strings.add(label);
                treeToList2(children, list1, strings);
            }
        }
        return list1;
    }
}

输出

[[浦东新区, 唐镇, 玉兰一],
[浦东新区, 唐镇, 玉兰二], 
[浦东新区, 张江, ],
[徐汇区, 华泾镇, ]]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现树形结构代码导出 Excel 并合并相同父级的单元格,需要使用 Apache POI 库和递归算法来实现。下面是一个 Java 代码示例,用于将树形结构数据导出Excel 中,并将相同父级的单元格合并成一个单元格: ```java public void exportToExcel(List<Node> nodes, int level, int startRow, XSSFSheet sheet) { int rowNum = startRow; for (Node node : nodes) { XSSFRow row = sheet.createRow(rowNum++); // 设置单元格值 XSSFCell cell = row.createCell(level); cell.setCellValue(node.getName()); // 递归处理子节点 if (node.getChildren() != null && !node.getChildren().isEmpty()) { exportToExcel(node.getChildren(), level + 1, rowNum, sheet); // 合并相同父级单元格 int endRow = rowNum + node.getChildren().size() - 1; sheet.addMergedRegion(new CellRangeAddress(rowNum - 1, endRow, level, level)); rowNum = endRow + 1; } } } ``` 该方法接收一个 `List<Node>` 类型的树形结构数据,`level` 表示当前节点在树结构中的层级,`startRow` 表示当前节点在 Excel 表格中的起始。`sheet` 表示要导出到的 Excel 工作表对象。 在方法的主体中,首先创建当前节点对应的,设置单元格的值为节点的名称。然后递归处理子节点,递归时将当前层级 `level` 加 1,传递子节点的起始 `rowNum`。递归完成后,如果当前节点存在子节点,则合并相同父级的单元格,并将 `rowNum` 设置为相应的结束 `endRow + 1`,以便继续处理下一个节点。 注意,在合并单元格时,需要使用 `addMergedRegion` 方法,并传递一个 `CellRangeAddress` 对象作为参数。`CellRangeAddress` 对象的构造方法接收四个参数,分别表示起始、结束、起始列、结束列。在这里,我们将起始设置为当前节点的起始 `rowNum - 1`,结束设置为当前节点的结束 `endRow`,起始列和结束列都设置为当前节点的层级 `level`,这样就能够实现合并相同父级单元格的操作。 希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值