【JAVA】读取excel导入数据库,形成树状结构

article/2025/8/21 21:48:53

最近需要导入一个excel表格,存到数据库并以树状结构读取出来
下面两张图片是需要导入的excel
在这里插入图片描述

@Transactional(rollbackFor = Exception.class)public String import(MultipartFile file, Integer projectId) throws Exception {//poi解析excelInputStream inputStream = file.getInputStream();// 读取工作薄Workbook workbook = new XSSFWorkbook(inputStream);Sheet sheet = workbook.getSheetAt(0);//定义一个cellId,此为每一次循环前一列的idlong cellId = 0;//根据项目id查询项目名称ProjectManager one = projectManagerService.lambdaQuery().select(ProjectManager::getProjectName).eq(ProjectManager::getId, projectId).one();int rows = sheet.getPhysicalNumberOfRows();if (rows > 1) {//按照行进行循环,读取当前行的列for (int k = 1; k < rows; k++) {// 读取行Row row = sheet.getRow(k);//查询当前行有多少列int physical = sheet.getRow(k).getPhysicalNumberOfCells();if (row != null && physical > 3) {//获取第一列的单元格Cell cell1 = row.getCell(0);//判断单元格是否为空if (!(cell1 == null || "".equals(cell1.toString().trim()))) {//根据单元格的数据查询数据库是否存在记录IndexInfo one1 = indexInfoService.lambdaQuery().select(IndexInfo::getIndexPname, IndexInfo::getId).eq(IndexInfo::getIndexPname, cell1.getStringCellValue()).eq(IndexInfo::getProjectId, projectId).one();//数据库不存在,添加记录if (one1 == null) {IndexInfo indexInfo = new IndexInfo();indexInfo.setIndexPid(0L);indexInfo.setIndexPname(cell1.getStringCellValue());indexInfo.setProjectName(one.getProjectName());indexInfo.setProjectId(projectId);indexInfo.setIndexClass(2);boolean save = indexInfoService.save(indexInfo);if (save) {//添加成功,将添加的id作为父idcellId = indexInfo.getId();}//数据库存在记录,将这条记录的id作为父id} else {cellId = one1.getId();}}}for (int j = 1; j < physical - 2; j++) {//取单元格Cell cell = row.getCell(j);//判断单元格是否为空if (!(cell == null || "".equals(cell.toString().trim()))) {//查询数据库有无此记录IndexInfo one1 = indexInfoService.lambdaQuery().select(IndexInfo::getIndexPname, IndexInfo::getId).eq(IndexInfo::getIndexPname, cell.getStringCellValue()).eq(IndexInfo::getProjectId, projectId).one();if (one1 == null) {//这里保存自己需要的信息IndexInfo indexInfo = new IndexInfo();indexInfo.setIndexPid(cellId);indexInfo.setIndexPname(cell.getStringCellValue());indexInfo.setProjectName(one.getProjectName());indexInfo.setProjectId(projectId);indexInfo.setIndexClass(2);//最后两列为描述和分数if (j == physical - 3) {int score = 0;String description = null;//循环最后两列单元格for (int i = 0; i < 2; i++) {//取单元格的值Cell cell1 = row.getCell(j + i + 1);//判断单元格是否为空if (!(cell == null || "".equals(cell.toString().trim()))) {try {//因为分数是int类型,如果报错就是取了分数单元格的值description = cell1.getStringCellValue();} catch (Exception e) {score = (int) cell1.getNumericCellValue();}indexInfo.setIndexScore(score);indexInfo.setIndexDescription(description);}}}boolean save = indexInfoService.save(indexInfo);if (save) {cellId = indexInfo.getId();}} else {cellId = one1.getId();}}}}return "文件导入成功";} else {return "导入失败";}}

还有一个这种的表格,多读一列就可以了
在这里插入图片描述

@Transactional(rollbackFor = Exception.class)public String import(MultipartFile file, Integer projectId) throws Exception {//poi解析excelInputStream inputStream = file.getInputStream();// 读取工作薄Workbook workbook = new XSSFWorkbook(inputStream);Sheet sheet = workbook.getSheetAt(0);//定义一个cellId,此为每一次循环前一列的idlong cellId = 0;//根据项目id查询项目名称ProjectManager one = projectManagerService.lambdaQuery().select(ProjectManager::getProjectName).eq(ProjectManager::getId, projectId).one();int rows = sheet.getPhysicalNumberOfRows();if (rows > 1) {//按照行进行循环,读取当前行的列for (int k = 1; k < rows; k++) {// 读取行Row row = sheet.getRow(k);//查询当前行有多少列int physical = sheet.getRow(k).getPhysicalNumberOfCells();if (row != null && physical > 3) {//获取第一列的单元格Cell cell = row.getCell(0);//判断单元格是否为空if (!(cell == null || "".equals(cell.toString().trim()))) {//根据单元格的数据查询数据库是否存在记录IndexInfo one1 = indexInfoService.lambdaQuery().select(IndexInfo::getIndexPname, IndexInfo::getId).eq(IndexInfo::getIndexPname, cell.getStringCellValue()).eq(IndexInfo::getProjectId, projectId).one();//数据库不存在,添加记录if (one1 == null) {IndexInfo indexInfo = new IndexInfo();indexInfo.setIndexPid(0L);indexInfo.setIndexPname(cell.getStringCellValue());indexInfo.setProjectName(one.getProjectName());indexInfo.setProjectId(projectId);indexInfo.setIndexClass(2);indexInfo.setIndexWeight(row.getCell(1).getNumericCellValue());boolean save = indexInfoService.save(indexInfo);if (save) {//添加成功,将添加的id作为父idcellId = indexInfo.getId();}//数据库存在记录,将这条记录的id作为父id} else {cellId = one1.getId();}}}for (int i = 2; i < physical-1; i += 2) {//取单元格Cell cell = row.getCell(i);//判断单元格是否为空if (!(cell == null || "".equals(cell.toString().trim()))) {//查询数据库有无此记录IndexInfo one1 = indexInfoService.lambdaQuery().select(IndexInfo::getIndexPname, IndexInfo::getId).eq(IndexInfo::getIndexPname, cell.getStringCellValue()).eq(IndexInfo::getProjectId, projectId).one();if (one1 == null) {IndexInfo indexInfo = new IndexInfo();indexInfo.setIndexPid(cellId);indexInfo.setProjectName(one.getProjectName());indexInfo.setProjectId(projectId);indexInfo.setIndexPname(cell.getStringCellValue());indexInfo.setIndexClass(2);indexInfo.setIndexWeight(row.getCell(i +1).getNumericCellValue());//最后两列为描述和分数if (i == physical - 3) {//循环最后两列单元格indexInfo.setIndexDescription(row.getCell(i +2).getStringCellValue());}boolean save = indexInfoService.save(indexInfo);if (save) {cellId = indexInfo.getId();}} else {cellId = one1.getId();}}}}return "导入成功";} elsereturn "导入失败";}

读取完成保存到数据库后,形成树状结构具体步骤可以看我上一篇帖子


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

相关文章

html 树 excel,用Excel实现简易树状关系

引子 - Excel训练营 - 写在前面 树状图对大家来说并不陌生。 树状图&#xff0c;亦称树枝状图&#xff0c;其文绉绉的定义如下&#xff1a; 树形图是数据树的图形表示形式&#xff0c;以父子层次结构来组织对象。是枚举法的一种表达方式。 而excel能够在一定程度上实现比较简单…

JAVA对树状结构数据导出Excel自动合并同级内容代码

针对树形结构数据进行Excel导出并进行合并处理 针对树形结构数据的Excel导出的1 需求1 对象结构2 对数据进行树形结构数据组合并且进行计算工具类3 对数据库的数据进行处理(全文最重要的数据处理方法思路逻辑)4 递归查询 父节点信息5 对数据写入Excel,6 自动合并代码参考我的上…

1、简单的Excel地址导入与树状结构生成

2019独角兽企业重金招聘Python工程师标准>>> 一、地区表结构 DROP TABLE IF EXISTS pro_area; /*!40101 SET saved_cs_client character_set_client */; /*!40101 SET character_set_client utf8 */; CREATE TABLE pro_area (area_id bigint(30) NOT NULL AUT…

树状结构导出到excel表格

/**获取导出实例 */async getAllInstances(SlotId) {//SlotId 数据库词槽idlet result:any [] //导出的数据模块const allData await this.getSimpleInstance(SlotId)//allData根据数据库词槽ID查询到的树状结构数据let count 1//fn 是递归的函数let fn (data, objc,count)…

Excel树状数据绘制导出

//存放数据的二维集合&#xff0c;twoDimensional 中每个List是树状结构的一个分支的所有数据List<List<JSONObject>> twoDimensional new ArrayList<>();//创建对象XSSFWorkbook xwb new XSSFWorkbook();//创建工作表Sheet sheet xwb.createSheet("…

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

因为工作需要&#xff0c;用户需要将产品分类通过excel表格导入到数据库中&#xff0c;而产品分类又有一、二、三、四、五级分类。最终通过各种尝试终于实现了数据导入。因此记录下来。 一、excel模板数据结构和数据库表结构介绍 1、 待导入excel模板数据&#xff1a; 2、数据…

关于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…