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:
<.>
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 : Pisah data mentah1 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 dataPisah sumber data kepada beberapa set data pokokKodnya 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 nodRekursi dirangkumkan ke dalam struktur pepohonKodnya 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!