Rumah  >  Artikel  >  Java  >  Bagaimana untuk menukar data Excel ke dalam struktur pokok di Jawa?

Bagaimana untuk menukar data Excel ke dalam struktur pokok di Jawa?

WBOY
WBOYke hadapan
2023-05-08 08:49:072262semak imbas

Kata Pengantar

Saya menerima tugas import hari ini, yang memerlukan penyimpanan data excel ke dalam pangkalan data Berbeza daripada import biasa, data yang diimport ialah struktur pokok, seperti yang ditunjukkan di bawah:

<.>Bagaimana untuk menukar data Excel ke dalam struktur pokok di Jawa?

Dengan memerhati lajur hierarki dalam data, kita dapati data jadual terdiri daripada 2 pokok iaitu ke-3, ke-4, ke-5, ke-6, ke-7, ke-8, ke-9, ke-10, ke-11 dan ke-12 ,13 ,14,15,16,17,18, mereka menggunakan 0 sebagai nod akar pokok, 1 sebagai nod anak 0, dan 2 sebagai nod anak bersebelahan 1. Daripada ini, struktur pokok pertama ialah :

Bagaimana untuk menukar data Excel ke dalam struktur pokok di Jawa?

Pisah data mentah

1 Cipta kelas entiti

Buat vo untuk menerima data yang dihuraikan di sini, kami hanya mementingkan hierarki atribut

	@Excel(name = "层级")
    private String hierarchy;
    @Excel(name = "物料编码")
    private String materialCode;
    @Excel(name = "物料名称")
    private String materialName;
    @Excel(name = "基础数量")
    private BigDecimal materialNum;
    @Excel(name = "使用数量")
    private BigDecimal useAmount;
    @Excel(name = "BOM版本")
    private String version;
    @Excel(name = "默认BOM")
    private String isDefaults;

2. Memproses data

Pisah sumber data kepada beberapa set data pokok

Kodnya adalah seperti berikut (contoh):

/**
     * 将集合对象按指定元素分割存储
     *
     * @param materialVos 原始集合
     * @param s 分割元素(这里是当集合对象层级为0时则分割,也就是树的根节点为0)
     * @return 每棵树的结果集
     */
    private List<List<MatMaterialBomImportVo>> subsection(List<MatMaterialBomImportVo> materialVos, String s) {
        List<List<MatMaterialBomImportVo>> segmentedData = new ArrayList<>();
        if (materialVos != null) {
            //获取指定元素的数量,判断出最终将拆分为多少段
            List<MatMaterialBomImportVo> collect = materialVos.stream().filter(bom -> s.equals(bom.getHierarchy())).collect(Collectors.toList());
            int count = 0;
            for (int i = 0; i < collect.size(); i++) {
                List<MatMaterialBomImportVo> bomImportVo = new ArrayList<>();
                boolean num = false;
                //遍历数据源
                for (; count < materialVos.size(); count++) {
                    //第一个必然为树的根节点,直接获取并跳过
                    if (count == 0) {
                        bomImportVo.add(materialVos.get(count));
                        continue;
                    }
                    //当数据源第n个等于根节点并且已经成功添加过数据时判断为一段数据的结束,跳出循环,
                    if (s.equals(materialVos.get(count).getHierarchy()) && num) {
                        break;
                    }
                    bomImportVo.add(materialVos.get(count));
                    num = true;
                }
                segmentedData.add(bomImportVo);
            }
        }
        return segmentedData;
    }

Manual tetapan Id setiap nod setiap pokok dan id induk

kod adalah seperti berikut (contoh):

for (List<MatMaterialBomImportVo> segmentedDatum : subsection(materialVos, "0")) {
                //设置id以及父id
                int i = 0;
                for (MatMaterialBomImportVo vo : segmentedDatum) {
                    BeanTrim.beanAttributeValueTrim(vo);
                    vo.setPrimaryKey(i);
                    getParentId(vo, segmentedDatum);
                    i++;
                }
}
/**
     * 设置父id
     *
     * @param vo
     * @param segmentedDatum
     */
    private void getParentId(MatMaterialBomImportVo vo, List<MatMaterialBomImportVo> segmentedDatum) {
        for (int j = vo.getPrimaryKey(); j >= 0; j--) {
            if (Integer.parseInt(segmentedDatum.get(j).getHierarchy()) == Integer.parseInt(vo.getHierarchy()) - 1) {
                vo.setForeignKey(segmentedDatum.get(j).getPrimaryKey());
                break;
            }
            if (j == 0) {
                vo.setForeignKey(-1);
            }
        }
    }

Penerangan: Selepas berpecah kepada beberapa pokok, tetapkan id maya setiap bahagian data sebagai indeksnya sendiri, ID setiap pokok diasingkan antara satu sama lain

Mengikut peraturan data jadual, dapat disimpulkan bahawa nod anak hanya boleh wujud di bawah nod mereka sendiri dan di atas nod seterusnya. nod yang sama. Menurut peraturan ini, tetapkan ID induk setiap nod

Rekursi dirangkumkan ke dalam struktur pepohon

Kodnya adalah seperti berikut (contoh):

/**
     * 递归遍历为树形结构
     *
     * @param vo 当前处理的元素
     * @param segmentedDatum 每棵树的数据集
     */
    private void treeData(MatMaterialBomImportVo vo, List<MatMaterialBomImportVo> segmentedDatum) {
        for (int i = vo.getPrimaryKey(); i < segmentedDatum.size(); i++) {
            if (i + 1 == segmentedDatum.size()) {
                if (vo.getForeignKey() == null) {
                    getParentId(vo, segmentedDatum);
                }
                break;
            }
            int v = Integer.parseInt(vo.getHierarchy());
            int vs = Integer.parseInt(segmentedDatum.get(i + 1).getHierarchy());
            if (vs == v + 1) {
                if (v > 1) {
                    vo.setForeignKey(segmentedDatum.get(i).getPrimaryKey());
                    for (int j = vo.getPrimaryKey(); j > 0; j--) {
                        if (Integer.parseInt(segmentedDatum.get(j).getHierarchy()) == Integer.parseInt(vo.getHierarchy()) - 1) {
                            vo.setForeignKey(segmentedDatum.get(j).getPrimaryKey());
                        }
                    }
                }
                vo.getImportVoList().add(segmentedDatum.get(i + 1));
            }
            if (vs <= v) {
                if (vo.getForeignKey() == null) {
                    for (int j = vo.getPrimaryKey(); j > 0; j--) {
                        if (Integer.parseInt(segmentedDatum.get(j).getHierarchy()) == Integer.parseInt(vo.getHierarchy()) - 1) {
                            vo.setForeignKey(segmentedDatum.get(j).getPrimaryKey());
                            break;
                        }
                    }
                }
                break;
            }
        }
        if (vo.getImportVoList() != null && vo.getImportVoList().size() > 0) {
            for (MatMaterialBomImportVo matMaterialBomImportVo : vo.getImportVoList()) {
                treeData(matMaterialBomImportVo, segmentedDatum);
            }
        }
    }

Penjelasan: Vo yang saya luluskan di sini tidak mempunyai id dan id induk yang ditetapkan, hanya sumber data Proses pemisahan pokok telah dilakukan Disebabkan keperluan perniagaan, kaedah rekursif ini tidak digunakan untuk memasang pokok itu kemudian, jadi kod rekursif mungkin terdapat beberapa ralat, untuk rujukan sahaja

Atas ialah kandungan terperinci Bagaimana untuk menukar data Excel ke dalam struktur pokok di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam