Java、SpringBoot实现对Excel内容的读取并将Excel内容导入到数据库中(后端篇)

一、需要读取的Excel表格格式相对完整工整,且只需要写入一张表中

    在读取Excel表格的需求中,有像下图的这么一种表格,它的格式工整,且表格中的列名和数据库表中的列名一一对应,如下图:

Excel表:

数据库表:

    此时就需要用到下面的方法。

1、引入依赖

        <!--解析excel--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>RELEASE</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.13.0</version> <!-- 请根据你的需求使用合适的版本 --></dependency>

2、创建实体类

@Data
@TableName("test")
public class TestDto {@ExcelImport("id")private String id;@ExcelImport("username")private String username;@ExcelImport("password")private String password;}

3、导入Excel相关的工具类

      创建exceIUtil包,并导入ExcelClassField、ExcelExport、ExcelImport和ExcelUtils工具类。

4、创建Mapper接口

public interface TestMapper extends BaseMapper<TestDto> {
}

5、创建Service接口及它的实现类

public interface TestService extends IService<TestDto> {void add(TestDto testDto);}
public class TestServiceImpl extends ServiceImpl<TestMapper, TestDto> implements TestService {public void add(TestDto testDto) {super.save(testDto);//加入数据库中}}

6、编写Controller类

@PostMapping("/GetExcel")
public Result GetExcel(@RequestParam("file") MultipartFile file) throws Exception {List<TestDto> testDtos = ExcelUtils.readMultipartFile(file, TestDto.class);for (TestDto testDto : testDtos) {testService.add(testDto);}return Result.success(testDtos, "导入成功");}

7、具体实现

二、需要读取的Excel表格格式固定有规律,且需要写入多张表中

    在读取Excel表格的需求中,有一种表格它的格式固定且有规律,一张表格中有写入多张数据库表格的需求,如下图:

    在上图的表格中,我们需要在数据库中写入站点配置、车道配置、枪机配置等三张表的数据,且车道配置、枪机配置表的行数随着站点配置中的车道数量的变化而变化,此时就需要用到下面的方法。

1、引入依赖

    详见第一种方法。

2、创建实体类

    因为需要写入多张表中,所以需要创建多个实体类。且这些属于重复性操作,所以以下我就以写入两张表作为示例。

实体类1:

@Data
@TableName("tri_zd_stationinfo")
public class stationinfo {@ExcelImport("站点id")private Integer id;@ExcelImport("站点名称")private String station_name;@ExcelImport("业务类型")private String business_type;@ExcelImport("站点位置")private String station_position;@ExcelImport("安装日期")private Date install_date;@ExcelImport("摄像枪品牌类型")private Integer capture_brand;@ExcelImport("车道数量")private Integer lane_count;
}

实体类2:

@Data
@TableName("tri_zd_laneinfo")
public class laneinfo {private Integer station_id;@ExcelImport("车道号")private Integer laneid;@ExcelImport("仪表ip")private String ip;
}

3、导入Excel相关的工具类

    详见第一种方法。

4、创建Mapper接口

Mapper接口1:

public interface ExcelStationMapper extends BaseMapper<stationinfo> {
}

Mapper接口2:

public interface ExcelLaneMapper extends BaseMapper<laneinfo> {//根据你的业务需求写代码,这里有删除旧数据/重复数据的需求@Delete("delete from tri_zd_laneinfo where station_id = #{station_id};")int delByStation_id (int station_id);
}

5、创建Service接口及它的实现类

Service接口及其实现类1:

public interface ExcelStationService extends IService<stationinfo> {void delByStation_id(stationinfo stationinfo);void add(stationinfo stationinfo);
}
@Service
public class ExcelStationImpl extends ServiceImpl<ExcelStationMapper, stationinfo> implements ExcelStationService {@AutowiredExcelStationMapper excelStationMapper;public void delByStation_id(stationinfo stationinfo){excelStationMapper.deleteById(stationinfo.getId());}@Overridepublic void add(stationinfo stationinfo) {super.save(stationinfo);}
}

Service接口及其实现类2:

public interface ExcelLaneService extends IService<laneinfo> {void delByStation_id(stationinfo stationinfo);void add (laneinfo laneinfo);
}
@Service
public class ExcelLaneImpl extends ServiceImpl<ExcelLaneMapper, laneinfo> implements ExcelLaneService {@AutowiredExcelLaneMapper excelLaneMapper;public void delByStation_id(stationinfo stationinfo){excelLaneMapper.delByStation_id(stationinfo.getId());}@Overridepublic void add(laneinfo laneinfo) {super.save(laneinfo);}
}

6、编写Controller类

    //读取excel表格内容@Autowiredprivate ExcelStationService excelStationService;@Autowiredprivate ExcelLaneService excelLaneService;@PostMapping("/GetExcel")public Result GetExcel(@RequestParam("file") MultipartFile file) throws Exception{List<stationinfo> stationinfos = new ArrayList<>();List<laneinfo> laneinfos = new ArrayList<>();try {InputStream inputStream = file.getInputStream();Workbook workbook = new HSSFWorkbook(inputStream);// 假设 Excel 表格的第一个工作表是要读取的工作表Sheet sheet = workbook.getSheetAt(0);stationinfo stationinfo = new stationinfo();for (int i = 2; i<3;i++){Row row = sheet.getRow(i);String cellValue = row.getCell(1).toString(); // 获取单元格的字符串值int intValue;try {// 尝试将字符串转换为整数intValue = (int) Double.parseDouble(cellValue);} catch (NumberFormatException e) {// 转换失败时的处理,赋予默认值intValue = 0; // 默认值为0}stationinfo.setId(intValue);stationinfo.setStation_name(row.getCell(2).toString());stationinfo.setBusiness_type(row.getCell(3).toString());stationinfo.setStation_position(row.getCell(4).toString());stationinfo.setInstall_date(row.getCell(5).getDateCellValue());String cellValue2 = row.getCell(6).toString(); // 获取单元格的字符串值int intValue2;try {// 尝试将字符串转换为整数intValue2 = (int) Double.parseDouble(cellValue2);} catch (NumberFormatException e) {// 转换失败时的处理,赋予默认值intValue2 = 0; // 默认值为0}stationinfo.setCapture_brand(intValue2);String cellValue3 = row.getCell(7).toString(); // 获取单元格的字符串值int intValue3;try {// 尝试将字符串转换为整数intValue3 = (int) Double.parseDouble(cellValue3);} catch (NumberFormatException e) {// 转换失败时的处理,赋予默认值intValue3 = 0; // 默认值为0}stationinfo.setLane_count(intValue3);stationinfos.add(stationinfo);}int y = stationinfo.getLane_count();for (int i = 5;  i < y + 5; i++){Row row = sheet.getRow(i);laneinfo laneinfo = new laneinfo();laneinfo.setStation_id(stationinfo.getId());String cellValue = row.getCell(1).toString(); // 获取单元格的字符串值int intValue;try {// 尝试将字符串转换为整数intValue = (int) Double.parseDouble(cellValue);} catch (NumberFormatException e) {// 转换失败时的处理,赋予默认值intValue = 0; // 默认值为0}laneinfo.setLaneid(intValue);laneinfo.setIp(row.getCell(2).toString());laneinfos.add(laneinfo);}//删除旧数据/重复数据excelStationService.delByStation_id(stationinfo);System.out.println(stationinfos);for (stationinfo stationinfo1 : stationinfos){excelStationService.add(stationinfo1);}//删除旧数据/重复数据excelLaneService.delByStation_id(stationinfo);System.out.println(laneinfos);for (laneinfo laneinfo : laneinfos){excelLaneService.add(laneinfo);}}catch (IOException e) {e.printStackTrace();}return Result.success("导入成功","导入成功");}

7、具体实现

三、常见错误

1、"MultipartFile resource [file] cannot be resolved to URL"错误

    这个错误貌似很多人也遇到过,是SpringBoot中关于打印MultipartFile类型参数的log问题,而且大家也都没有具体的问题原因和解决方案,大多数人都是把有关的日志注解给注释掉来解决问题,虽然这种方法不能从根本上解决问题,但胜在方便,所以我也修改了项目中用AOP(面向切面编程)实现的日志处理切面的代码。

    /*** 定义切面*/@Pointcut("execution(public * com.hs.server.controller..*.*(..)) " +"&& !execution(public * com.hs.server.controller.WebApiController.DownloadLocal(..))" +"&& !execution(public * com.hs.server.controller.TriStationController.GetExcel(..))")//GetExcel接口不能应用这个切面,不然会有"MultipartFile resource [file] cannot be resolved to URL"错误

2、"org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile cannot be cast to com.hs.server.common.ReqParams"错误

    因为我的项目中有使用 Spring AOP 来实现在指定的 Controller 方法执行前和执行后进行处理的切面,且GetExcel接口不能应用这个切面,所以要添加不应用切面的接口。

    /*** 定义切面*/@Pointcut("execution(public * com.hs.server.controller..*.*(..))" +" && !execution(public * com.hs.server.controller.LoginController.postAccessToken(..))" +" && !execution(public * com.hs.server.controller.ValidateCodeController.createCode(..))" +/*" && !execution(public * com.hs.server.controller.VehicleDriverMedicalController.*(com.hs.server.dto.paramsDto.UploadFileDto))" +" && !execution(public * com.hs.server.controller.VehicleDriverMedicalController.aliPayCallback(..))" +*/" && !execution(public * com.hs.server.controller.WebApiController.download(..))" +" && !execution(public * com.hs.server.controller.WebApiController.DownloadLocal(..))" +" && !execution(public * com.hs.server.controller.WebApiController.AddVehThjl(..))" +" && !execution(public * com.hs.server.controller.TriStationController.Upload(..))" +" && !execution(public * com.hs.server.controller.TriStationController.GetExcel(..))")//GetExcel接口不能应用这个切面,不然会有"org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile cannot be cast to com.hs.server.common.ReqParams"错误

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/624744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四大攻击类型并存,NIST 警告人工智能系统带来的安全和隐私风险

美国国家标准与技术研究院 (NIST) 近日发布了有关对抗性机器学习 (AML) 攻击和缓解措施指南&#xff0c; 呼吁人们再度关注近年来人工智能 (AI) 系统部署增加所带来的隐私和安全挑战&#xff0c;并表示这类系统目前没有万无一失的方法进行保护。 NIST指出&#xff0c;这些安全…

力扣日记1.14-【二叉树篇】108. 将有序数组转换为二叉搜索树

力扣日记&#xff1a;【二叉树篇】108. 将有序数组转换为二叉搜索树 日期&#xff1a;2023.1.14 参考&#xff1a;代码随想录、力扣 108. 将有序数组转换为二叉搜索树 题目描述 难度&#xff1a;简单 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;…

开源ERP系统Odoo安装部署并结合内网穿透实现公网访问本地系统

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

Elasticsearch添加7.17.10IK分词器

Elasticsearch添加7.17.10IK分词器 在https://github.com/medcl/elasticsearch-analysis-ik/tree/7.x中未找到7.17.10版本的发布版本&#xff0c;如歌ik版本和Elasticsearch版本不同安装后无法启动。所以下载git上的源代码&#xff0c;并手动编译指定版本IK分词器。 &#xff…

ucloud轻量云(wordpress)配置ssl

ucloud 轻量云(wordpress)配置ssl 1、上传ssl证书到/usr/local/software/apache/conf&#xff0c;这里的文件名和内容与ucloud控制台下载下来的文件名和内容保持一致 2、修改httpd.conf文件 vim /usr/local/software/apache/conf/httpd.conf 找到下面两行&#xff0c;去掉注…

TDA4 Linux BSP ,SD卡制作

1 进入官网&#xff1a; Processor SDK Linux Software Developer’s Guide — Processor SDK Linux for J721e Documentation 这个版本需要 Ubuntu 22.04 支持 ~/ti-processor-sdk-linux-adas-j721e-evm-09_01_00_06/board-support/ti-linux-kernel-6.1.46gitAUTOINC5892b80…

如何实现无公网ip固定TCP端口地址远程连接Oracle数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

三种引入CSS的方式

文章目录 CSS基础知识概述CSS的注释CSS的格式 三种引入CSS的方式内嵌式外链式行内式优先级 CSS基础知识 概述 Cascading Style Sheet 层叠样式表 前端三大基础之一(Html结构 CSS样式 JS动作) 最早由网景公司&#xff08;Netscape&#xff09;提出&#xff0c;在1996年受到w…

【HarmonyOS4.0】第十篇-ArkUI布局容器组件(二)

三、层叠布局容器&#xff08;Stack&#xff09; 堆叠容器组件 Stack的布局方式是把子组件按照设置的对齐方式顺序依次堆叠&#xff0c;后一个子组件覆盖在前一个子组件上边。 注意&#xff1a;Stack 组件层叠式布局&#xff0c;尺寸较小的布局会有被遮挡的风险&#xff0c; …

1.15 作业

使用计数型信号量设计 2&#xff0c;相关函数的API 一、队列&#xff1a; 1&#xff0c;创建队列函数 osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr); msg_count : 队列中消息的最大数量&#xff0c;即…

并发编程之阻塞队列

目录 什么是队列&#xff1f; Queue接口 阻塞队列 应用场景 ArrayBlockingQueue ArrayBlockingQueue使用 ArrayBlockingQueue的原理 数据结构 入队put方法 出队take方法 LinkedBlockingQueue LinkedBlockingQueue使用 LinkedBlockingQueue原理 数据结构 入队put方…

vtk qt切割stl模型

一直想实现对stl模型的某个方向进行平面切割 通过滑动slider然后对模型进行某一个方向的面切割。同时可以用鼠标对模型进行移动缩放&#xff0c;旋转等操作。然后可以加一些颜色点云显示等操作。 stl加载&#xff1a; QString selectFilePath QFileDialog::getOpenFileName…

JS遍历对象的方法及特点

1、定义一个对象 let obj {name: Tom,age: 20,sex: 男,};obj.weight 70kg;// obj的原型上定义属性Object.prototype.height 180cm;Object.prototype.major function() {console.log(专业&#xff1a;计算机应用技术);};console.log(obj, obj); 控制台输出的obj中&#xff…

Java_线程安全

一、多线程常用方法 下面我们演示一下getName()、setName(String name)、currentThread()、sleep(long time)这些方法的使用效果。 public class MyThread extends Thread{public MyThread(String name){super(name); //1.执行父类Thread(String name)构造器&#xff0c;为当前…

通过DTS实现PG14迁移到人大金仓V8R6

迁移需求 xxx项目适配人大金仓&#xff0c;测试环境195pgsql数据库需要进行迁移至192.168.3.29 人大金仓数据库&#xff1b; 数据库信息 ip os登录账号密码 数据库类型 数据库端口 数据库 数据库用户密码 源库 192.168.3.15 root/123456 PG14.2 5432 ahtjtestnew …

【数据结构】排序之归并排序与计数排序

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 目录 1. 前言2. 归并排序2.1 递归实现2.1.1 分析2.1.2 代码实现 2.2 非递归实现2.2.1 分析2.2.2 代码实现 3. 计数排序3.1 分析3.2 代码实现 4. 附代码4.1 Sort.h4.2 Sort.c4.3…

centos7系统 gdb调试jdk11源码

centos7 gdb调试jdk11源码 ##首先你得编译一个debug版本的jdk11。教程centos7下openjdk11源码下载编译安装_openjdk11下载-CSDN博客 ##gdb 启动java进程 设置运行参数、设置断点 运行、调试进入main断点 gdb /home/yym/code/jdk11u-master/build/linux-x86_64-normal-serve…

Batch Normalization、Layer Normalization代码实现

目录 前言批量正则化-BN层正则化-LN 前言 BN(Batch Normalization)首次提出与论文&#xff0c;主要目的是为了解决训练深层神经网络慢的问题。我们可以神经网络整体可以看成一个高阶的复杂函数&#xff0c;通过训练优化它的参数&#xff0c;可以用于拟合各种复杂的数据分布。一…

营销与经营一体,巨量引擎如何激发生意新未来?

12月6日&#xff0c;在第九届GDMS全球数字营销峰会上&#xff0c;巨量引擎发表了《营销经营一体&#xff0c;激发生意新未来》为主题的演讲&#xff0c;分享了巨量引擎如何在营销与经营一体化的背景下&#xff0c;通过极致的产品技术创新&#xff0c;激发生意新未来。 激发全渠…