关于excel多层级(树形)数据结构,提取成树形结构数据并导出到数据库

article/2025/8/21 23:15:52

在开发中遇到一个问题,就是有一张excel表中的数据时多层级的,不是普通一行一行的,而是,一行对应多行,多行之中的每一行在对应多行数据。形成树形结构:

如上图所示:我遇到的excel表的结构:

导入到数据库中,是有多个表组成的!我要实现把这些数据提取出来西港城一个树形而机构的List,然后转为json,导入数据库。

献上我的核心代码:

// 获取Excel内容public static List<?> getContent(Sheet sheet) {List<Map> list = new ArrayList<>();List<Map> cbfList = new ArrayList<>();List<Map> dkxxList = new ArrayList<>();List<Map> familyList = new ArrayList<>();List<Map> cbfList98=new ArrayList<>();List<Integer> cbfRowsIndex=new ArrayList<Integer>();Map map=new HashMap();List<String> titles=new ArrayList<>();// Excel数据总行数int rowCount = sheet.getLastRowNum();//getPhysicalNumberOfRows();//int columnCount = sheet.getRow(2).getPhysicalNumberOfCells();获取不为空的总列数 getPhysicalNumberOfCells()int columnCount =sheet.getRow(2).getLastCellNum() - sheet.getRow(2).getFirstCellNum();for(int x=0;x<sheet.getRow(2).getPhysicalNumberOfCells();x++){//titles.add(getValue(sheet.getRow(0).getCell(x)));if (StringUtils.isNotNull(getCellValue(sheet.getRow(2),x) != null)){String value =getCellValue(sheet.getRow(2),x).toString();System.out.println(value);titles.add(value);}else{titles.add(null);}}System.out.println("数据字段列表"+JsonUtil.beanToJson(titles));// 遍历首行前三列为发包方数据信息,固定第五行开始为数据行Row rowFbf =sheet.getRow(5);Map mapFbf=new HashMap();for (int j = 0; j <=2; j++) {Cell cell = rowFbf.getCell(j);if (cell != null && cell.getCellTypeEnum() != CellType.BLANK) {mapFbf.put(titles.get(j), getCellValue(rowFbf, j).toString());}}list.add(mapFbf);//下面开始进行正式的数据提取,嵌套lsit,Map形式展示数据for (int i = 5; i<=rowCount; i++){Row cbfRow=sheet.getRow(i);Map mapCbf=new HashMap();int cbfRowIndex = 0;for(int j=3;j<=8;j++){if(StringUtil.isNotEmpty(getCellValue(cbfRow,j).toString())){cbfRowIndex=i;mapCbf.put(titles.get(j),getCellValue(cbfRow,j).toString());mapCbf.put("cbfRowIndex",cbfRowIndex);//System.out.println(getCellValue(row,3).toString());}}//System.out.println("承包方数据的列数:"+titles.indexOf("gsshr"));for(int j=titles.indexOf("cbfdcrq");j<=titles.indexOf("gsshr");j++){//if(StringUtil.isNotEmpty(getCellValue(cbfRow,j).toString())){mapCbf.put(titles.get(j),getCellValue(cbfRow,j).toString());//}}//System.out.println(cbfids);//下面时提取98年承包方信息数据int cbf98index= titles.indexOf("yhzmc98");Map map98=new HashMap();for(int x=cbf98index;x<=columnCount;x++){if(StringUtil.isNotEmpty(getCellValue(cbfRow,x).toString())){mapCbf.put(titles.get(x),getCellValue(cbfRow,x).toString());}}//cbfList98.add(map98);int columnIndex=titles.indexOf("cbfmc");Map dkMap =new HashMap();for(int n=titles.indexOf("sfkbdk");n<=titles.indexOf("dkbdh");n++){//if(StringUtil.isNotEmpty(getCellValue(cbfRow, n).toString())){dkMap.put(titles.get(n), getCellValue(cbfRow, n).toString());dkMap.put("dkRowIndex",i);//}}dkxxList.add(dkMap);//System.out.println("第" + (i+1) + "条承包方地块数据:"+dkMap);Map familiyMap=new HashMap();for(int z=titles.indexOf("cyxm");z<=titles.indexOf("cybdrq");z++){familiyMap.put(titles.get(z),getCellValue(cbfRow,z));familiyMap.put("familyRowIndex",i);}familyList.add(familiyMap);//System.out.println("第" + (i+1) + "条家庭成员数据:"+familyList);if(mapCbf.get("elcbdkzs")!=null&&mapCbf.get("cbfRowIndex")!="0") {//System.out.println("承包方数据行:"+mapCbf.get("cbfRowIndex"));cbfList.add(mapCbf);//System.out.println("第" + (i+1) + "条承包方数据:" + JsonUtil.beanToJson(cbfList));}}//System.out.println("总行数:"+sheet.getLastRowNum());//System.out.println("承包方所有数据:"+cbfList);List<Map> allCbfList =cbfList;for(int y=0;y<cbfList.size();y++){List dkList=new ArrayList<>();List famList=new ArrayList<>();Map cbfMap=cbfList.get(y);//System.out.println("每个承包方的Map数据:"+cbfMap);int cbfRowNum=Integer.parseInt(String.valueOf(cbfMap.get("cbfRowIndex")));//System.out.println("数据:"+cbfRowNum);if(y==cbfList.size()-1){int allRowCount=sheet.getLastRowNum();for(int m=cbfRowNum-5;m<=allRowCount-5;m++){//System.out.println("承包方每一行的序号:"+m);//System.out.println("总行数"+allRowCount);int dkRowIndex=Integer.parseInt(String.valueOf(dkxxList.get(m).get("dkRowIndex")));if(m==(dkRowIndex-5)){if(StringUtil.isNotEmpty(dkxxList.get(m).get("dklb").toString())) {dkxxList.get(m).remove("dkRowIndex");dkList.add(dkxxList.get(m));}//dkList.addAll(dkxxList);}int familyRowIndex=Integer.parseInt(String.valueOf(familyList.get(m).get("familyRowIndex")));if(m==(familyRowIndex-5)){if(StringUtil.isNotEmpty(familyList.get(m).get("cyxm").toString())) {familyList.get(m).remove("familyRowIndex");famList.add(familyList.get(m));}//famList.addAll(familyList);}}}else{Map cbfMap2=cbfList.get(y+1);//System.out.println("本条数据:"+cbfMap);//System.out.println("下一条数据:"+cbfMap2);int cbfRowNum2=Integer.parseInt(String.valueOf(cbfMap2.get("cbfRowIndex")));for(int m=cbfRowNum-5;m<cbfRowNum2-5;m++){//System.out.println("承包方每一行的详细"+m);//System.out.println("所有地块信息的总数:"+dkxxList.size());int dkRowIndex=Integer.parseInt(String.valueOf(dkxxList.get(m).get("dkRowIndex")));//System.out.println("地块信息的行数:"+dkRowIndex);if(m==(dkRowIndex-5)){if(StringUtil.isNotEmpty(dkxxList.get(m).get("dklb").toString())) {dkxxList.get(m).remove("dkRowIndex");dkList.add(dkxxList.get(m));}//dkList.addAll(dkxxList);//System.out.println("map数据"+dkxxList.get(m));}int familyRowIndex=Integer.parseInt(String.valueOf(familyList.get(m).get("familyRowIndex")));if(m==(familyRowIndex-5)){if(StringUtil.isNotEmpty(familyList.get(m).get("cyxm").toString())){familyList.get(m).remove("familyRowIndex");famList.add(familyList.get(m));}//famList.addAll(familyList);//System.out.println("map数据"+famList);}}}//去除列表中为空的项//famList.removeAll(Collections.singleton(""));//dkList.removeAll(Collections.singleton(""));cbfMap.put("jtcyxx",famList);cbfMap.put("dkxx",dkList);cbfList.get(y).putAll(cbfMap);cbfList.get(y).remove("cbfRowIndex");System.out.println("承包方数据带家庭成员和地块信息:"+cbfMap);}//cbfList =getCbfList(cbfList,sheet,dkxxList,familyList);//去除隶属列表中为空的项cbfList.removeAll(Collections.singleton(null));map.put("allcbf",cbfList);list.add(map);//System.out.println("第" + i + "条承包方数据:" + JsonUtil.beanToJson(list));logger.info("所有数据:"+list);return list;}

首先,Java对excel的操作用有两种:jxl和poi,这里我用的是poi,所以我准备开始思路:第一行的前三列为第一层数据,然后及接着后面二层数据为承包方户主信息,第三层数据为家庭 成员信息还有地块信息。


http://chatgpt.dhexx.cn/article/nPmWxlmO.shtml

相关文章

使用excel插件treeplan构建决策树

Treeplan是一种构建决策树的很轻巧的excel插件&#xff0c;可以做出比较规范的决策树&#xff0c;并可以自动计算结果。下面以excel2003为例&#xff08;07也可正常使用&#xff09;介绍其使用方法。 一&#xff0e;加载treeplan插件 工具&#xff08;菜单&#xff09;——加载…

EXCEL(VBA)画树程序

看了好多Python写的画树&#xff0c;想看看在Excel里画个树行不行&#xff0c;于是乎花了点时间用VBA写了个&#xff0c;效果还不错&#xff0c;截个图给大家看看。 绿色固定配色版效果&#xff1a; 随机颜色版效果&#xff1a; 附上主代码 Sub test() 画树主程序 作者&#…

Java 树形结构数据生成导出excel文件

效果 用法 String jsonStr "{\"name\":\"aaa\",\"children\":[{\"name\":\"bbb\",\"children\":[{\"name\":\"eee\"},{\"name\":\"fff\",\"children\"…

python 根据树型结构生成指定格式的excel数据

数据 tree {a: {a1: [(a1a, 1)],a2: [(a2a, 1),(a2b, 2),]},b: {b1: [(b1b, 1)],b2: [(b2b, 1)]} }excel 数据格式 代码实现 import xlrd from xlutils.copy import copyold_excel xlrd.open_workbook(1.xls) new_excel copy(old_excel) ws new_excel.get_sheet(0)def wr…

人工智能-高等数学之导数篇

高等数学之导数篇 线性代数的学习基本就先告一个段落了&#xff0c;接着学最重要的微积分&#xff0c;高等数学里的重中之重&#xff0c;也是近代科学的发展利器&#xff0c;微积分主要包括包括极限、微分学、积分学及其应用&#xff0c;而微分学包括求导数的运算&#xff0c;…

机器学习之数学基础 一 .导数

简单的说,导数是曲线的斜率,是曲线变化快慢的反应. 2阶导数是斜率变化快慢的反应,反应曲线的凸凹性 例如:加速度的方向总是指向轨迹曲线凹的一侧. 导数(Derivative)是微积分学中重要的基础概念.一个函数在某一点的导数描述了这个函数在这一点附近的变化率.导数的本质是通过极…

【数值优化之范数与导数】

本文参考书籍《最优化计算方法》 这一部分会介绍一些最优化需要用到的基本数学概念。 目录 1 范数 1.1 向量范数 1.2 矩阵范数 1.3 矩阵内积 2 导数 2.1 梯度与海瑟矩阵 2.2 矩阵变量函数的导数 1 范数 1.1 向量范数 范数相当于是从向量空间到实数域的映射&#xff…

微积分——什么是导数

目录 1. “导数(derivative)”名称的由来 1.1 “derivative”的词源 1.2 “derivative”的数学意义来源 1.3 “derivative”中文翻译为“导数” 2. “导数(derivative)”的数学意义 1. “导数(derivative)”名称的由来 1.1 “derivative”的词源 作为名词&#xff0c;始于…

一阶导数

本文引用与百度百科。 简介 导数&#xff08;英语&#xff1a;Derivative&#xff09;是微积分学中重要的基础概念。一个函数在某一点的导数描述了这个函数在这一点附近的变化率。导数的本质是通过极限的概念对函数进行局部的线性逼近。当函数 f 的自变量在一点 x0 上产生一个…

AI笔记: 数学基础之方向导数的计算和梯度

方向导数 定理 若函数f(x,y,z)在点P(x,y,z)处可微&#xff0c;沿任意方向l的方向导数 ∂ f ∂ l ∂ f ∂ x c o s α ∂ f ∂ y c o s β ∂ f ∂ z c o s γ \frac{\partial f}{\partial l} \frac{\partial f}{\partial x} cos \alpha \frac{\partial f}{\partial y} c…

图像处理之_导数微分

1. 一阶导数应用&#xff1a;图像的梯度 1) 用途: 在图像处理中, 常用梯度求取图像的边缘, 这是一个很基础的应用. 下图为在OpenCV中使用cvSobel()函数的具体效果. 四张图分别为: 原图, 在x方向上的梯度, y方向上的梯度, xy方向上的梯度. 2) 二元函数 这里我们只讨论二元…

如何理解微分、差分、导数

先说差分和微分 自变量x的差分就是微分 即&#xff1a; Δxdx 因变量y的差分是函数y的变化量 即 Δyy(xΔx)-y(x) 因变量y的微分是指函数图像在某一点处的切线在横坐标取得增量Δx以后&#xff0c;纵坐标取得的增量dy。 dyf(x)dx 总结&#xff1a; 微分是差分的线…

神经网络学习之导数

在神经网络中&#xff0c;有一个常用的激活函数sigmoid函数&#xff0c;这个函数在高等数学中应该是有的&#xff0c;只是当时没有理会。函数图像如下&#xff0c;本文主要主要梳理下相应的数学知识&#xff0c;具体的应用在后续的文章中会涉及。 本文涉及到数学公式&#xff…

Matlat计算符号导数

MATLAB提供用于计算符号导数的diff命令。 如下&#xff1b;指定t为变量&#xff0c;输入一个函数表达式&#xff0c;使用diff(f)求其导数&#xff1b; 再计算一个&#xff1b; 输入一些常用函数&#xff0c;查看其导数&#xff1b;例如sin(x)的导数是cos(x)&#xff0c;cos(x…

R语言数值导数

文章目录 3 数值导数 3 数值导数 根据导数的定义&#xff0c;当函数的定义域不连续时&#xff0c;其不连续处显然是不存在导数的&#xff0c;但图形可以“欺骗”我们的眼睛。 > x seq(-1,1,0.1) > y sin(x) > y1 cos(x) > xEnd x0.1 > yEnd yy1*0.1 >…

MATLAB之怎样利用MATLAB中值差分法求一阶二阶导数

** MATLAB初学之怎么利用中值差分法求一阶二阶导数 ** 我们最近在学习MATLAB。在MATLAB中怎么求导数? MATLAB中有专门求导的函数 针对f(x)类的函数: diff(f,x) :求f关于x的导数 diff(diff(f,x),x):求f二阶导数 针对f(x,y)类的函数求偏导: diff(f,x) :求f关于x…

C语言之自然对数ln(x)的导数

设计要求&#xff1a;求自然对数ln(x)的导数&#xff0c;输入双精度实数x>1&#xff0c;输出自然实数ln(x)的导数&#xff08;精确到小数点后2位有效数&#xff0c;小数点后第2位四舍五入所得&#xff09;。 详细设计&#xff1a; lnx的导数的设计主要是利用到高等数学的导…

python实现之导数

导数&#xff08;Derivative&#xff09;&#xff0c;也叫导函数值。又名微商&#xff0c;是微积分中的重要基础概念。当函数yf&#xff08;x&#xff09;的自变量x在一点x0上产生一个增量Δx时&#xff0c;函数输出值的增量Δy与自变量增量Δx的比值在Δx趋于0时的极限a如果存…

python实现之一阶二阶导数

函数的和、差、积、商的求导法则 uu(x),vv(x) (uv)uv (u-v)u-v (Cu)Cu (uv)uvuv (u/v)(uv-uv)/v^2 复合函数求导法则 yf(u)&#xff0c;uφ(v) 复合函数yf[φ(v)]的导数为 dy/dxdy/du*du/dxf(u)*φ(v) (u-vz)u-vz&#xff0c;且(Cu)Cu exam1: y 2*x*^3 -5*x^23*x-7 y6*x^2-10x3…