将excel树形结构的数据导入数据库

article/2025/8/21 23:17:10

因为工作需要,用户需要将产品分类通过excel表格导入到数据库中,而产品分类又有一、二、三、四、五级分类。最终通过各种尝试终于实现了数据导入。因此记录下来。


一、excel模板数据结构和数据库表结构介绍

1、 待导入excel模板数据:

这里写图片描述

2、数据库表结构:其中cat_id为主键,grade 为层级,dhh_cat_id为后续手动更新字段,这里不涉及。
这里写图片描述

二、实现过程思路介绍
1、首先通过解析excel,获取表格中的全部数据用一个List<list<String>>的对象保存,具体实现不做介绍,相信大家都会。
如下图所示:
这里写图片描述

下面介绍导入实现思路:
首先excel中的数据是一棵树,只是通过表格表现出来,所以导入的时候不能直接获取一行直接插入,其次表格中的数据除了列出数据内容之外还有保存了数据之间的关联关系,因此在获取数据的时候要保证数据之间的关系不被破坏,这样导入导入数据库中才能形成一棵树,这个是关键!
在实现过程中我用了一个Map<String,Category>来记录导入的每个分类名称,key为分类名称_层级,value为分类对象.遍历List<list<String>>的时候先取第一列数据,再遍历第一列的所有行,然后获取第二列数据,再遍历二行,依次类推,在遍历的时候将遍历过得数据用Map记录下来,这样保证数据不重复,其次这样也可以通过map中的key找到对父亲id,从而保证层级关系正确。
三、代码实现
下面列出代码实现:

public Map<String, Object> insertBatch(List<ArrayList<String>> datas){// 定义方法返回值Map<String, Object> message = new HashMap<String, Object>();// 定义主键id 对应数据库中cat_idShort index = 1;Short parentId = null;String levelName = null;//分类名称// tempMap为临时变量,记录那些已经添加过了 key为CatName+层级 value 为记录对象,例如// <Home_1,category> 表示存储第一级对象Map<String, Category> tempMap = new HashMap<String, Category>();// 记录最终需要插入数据库的数据List<Category> insertDatas = new ArrayList<Category>();Category level = null;int allCols = datas.get(0).size();//获取导入数据的列数for (int column = 0; column < allCols; column++){for (int i = 0; i < datas.size(); i++){List<String> rows = datas.get(i);//设置层级的关联关系if (column == 0){// 如果是第一列,parentid 默认为0parentId = (short) 0;}else{// 如果不是一列,则在tempMap中寻找对应的父类id作为parentid,当前列向后退一列parentId = tempMap.get(rows.get(column - 1) + "_" + String.valueOf(column)).getCatId();}levelName = rows.get(column);if (StringUtils.isEmpty(levelName)){message.put("msg", "导入失败,表格中有空白");message.put("result", false);return message;}//tempMap中没有记录过则表示是要插入的数据if (!tempMap.containsKey(levelName + "_" + (column + 1))){level = new Category();level.setCatId(index++);level.setCatName(levelName);level.setParentId(parentId);level.setGrade(Byte.valueOf(String.valueOf(column + 1)));level.setDhhCatId("0");tempMap.put(levelName + "_" + (column + 1), level);//添加到最终要导入的列表中insertDatas.add(level);}}}//批量插入int count = categoryMapper.insertBatch(insertDatas);if (count == insertDatas.size()){message.put("msg", "导入成功");message.put("result", true);}else{message.put("msg", "导入失败");message.put("result", false);}return message;}

以上就是个人在实际应用中的实现方式,可能还有不足,欢迎大家指正。


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

相关文章

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

在开发中遇到一个问题&#xff0c;就是有一张excel表中的数据时多层级的&#xff0c;不是普通一行一行的&#xff0c;而是&#xff0c;一行对应多行&#xff0c;多行之中的每一行在对应多行数据。形成树形结构&#xff1a; 如上图所示&#xff1a;我遇到的excel表的结构&#x…

使用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如果存…