Spring Boot + EasyExcel + SqlServer 进行批量处理数据

前言

在日常开发和工作中,我们可能要根据用户上传的文件做一系列的处理,本篇文章就以Excel表格文件为例,模拟用户上传Excel文件,讲述后端如何高效的进行数据的处理。

一.引入 EasyExcel  依赖

        <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency>

二.在接口中编写代码

(一).使用什么参数接收?

由于用户上传的是一个Excel文件,也就是说前端发来的是一个Excel表格的文件,那么我们后端就需要使用  MultipartFile file  来进行接收

 @PostMapping("/importExcelUpdateFlag")public Map<String,Object> importExcelUpdateFlag(@RequestBody MultipartFile file) {//具体代码......}

(二).如何存储到本地目录中(最后说为什么存储到本地)

既然前端发来了一个Excel文件,后端需要对其进行重命名还有大量的数据处理,那么如何存储到本地是一个问题。我们在三层架构的基础上,这个存储到本地的工作一般放在 Service 层进行处理。

Controller层的代码

下面的 uploadPath(也就是你要存储到本地的目录) 是自己在 yml文件中定义好的,然后进行使用,截图如下:

@PostMapping("/importExcelUpdateFlag")public Map<String,Object> importExcelUpdateFlag(@RequestBody MultipartFile file) {//把前端发来的文件数据,传到本机指定的 uploadPath 目录之下String pathAndFileName = jdCloudService.uploadFile(file,uploadPath);//其他代码....}

注意这里 pathAndFileName 接收的是一个本地路径,后续需要根据这个路径找到指定文件

Service 层的代码

    @Overridepublic String uploadFile(MultipartFile file, String uploadPath) {if(file.isEmpty()){return "上传文件为空";}try {String originalFilename = StringUtils.cleanPath(file.getOriginalFilename());String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));String newFilename = generateFilename() + fileExtension;File targetFile = new File(uploadPath + File.separator + newFilename);file.transferTo(targetFile);return uploadPath + "\\" + newFilename;} catch (Exception e) {return "文件上传失败: " +  e.getMessage();}}private String generateFilename() {// 根据你的需求生成新的文件名,例如使用时间戳或随机字符串等,这里使用时间戳return String.valueOf("更新文件名.." + System.currentTimeMillis());}
代码解读:我们假设前端传来了一个 hello.xlsx 文件
  1. String originalFilename = StringUtils.cleanPath(file.getOriginalFilename());这行代码会将 "hello.xlsx " 赋值给 originalFilename 变量。

  2. String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));

    这行代码会从 "hello.txt" 中提取出文件扩展名 ".txt",并将其赋值给 fileExtension 变量。
  3. String newFilename = generateFilename() + fileExtension;

    这行代码会调用 generateFilename() 方法生成一个新的唯一文件名,例如 "abc123"。
  4. 将生成的文件名 "abc123.xlsx" 与文件扩展名 ".txt" 拼接,赋值给 newFilename 变量。
  5. File targetFile = new File(uploadPath + File.separator + newFilename);

    假设 uploadPath 是 "/path/to/uploads/"。这行代码会创建一个 File 对象,代表文件的保存路径和文件名 "/path/to/uploads/abc123.xlsx"。那么这个就会创建出文件了(但是没有内容)
  6. file.transferTo(targetFile);

    这行代码会将用户上传的 "hello.xlsx" 文件的内容,写入到 "/path/to/uploads/abc123.xlsx" 文件中。

通过这样的处理,原本名为 "hello.xlsx" 的文件会被保存为 "abc123.xlsx",并且保存在 "/path/to/uploads/" 目录下。这样可以避免文件名与现有文件发生冲突,确保文件上传的安全性。

注意这里返回给 Controller 层的是一个本地目录,是根据目录来找到指定的文件!

三.假设需求

现在假设我们本地指定的目录下面已经有用户上传的文件了,那么我们要对这个文件进行一系列的处理。 现在假设我们的需求是根据Excel文件中用户的 工号,更新用户的 Flag 标签(0变为1)

那么应该如何做呢?

继续编写代码

Controller层

    @PostMapping("/importExcelUpdateFlag")public Map<String,Object> importExcelUpdateFlag(@RequestBody MultipartFile file) {Map<String,Object> response = new HashMap<>();response.put("code",0);response.put("data",":");//把前端发来的文件数据,传到本机指定的 uploadPath 目录之下String pathAndFileName = jdCloudService.uploadFile(file,uploadPath);if(pathAndFileName.equals("上传文件为空") || pathAndFileName.equals("文件上传失败")) {response.put("msg",pathAndFileName);return response;}String feedBackMsg = jdCloudService.enableFlagUpdate(pathAndFileName);response.put("msg",feedBackMsg);return response;}

这里主要是 feedBackMsg,这个调用的 Service 层的代码是处理表格数据的主要内容,我们来看

Service层

    @Overridepublic String enableFlagUpdate(String filename) {//获取 PersonSynData 类的 Class 对象。Class<PersonSynData> head = PersonSynData.class;List<PersonSynData> updateList = new ArrayList<>();ExcelReader excelReader = EasyExcel.read(filename, head, new AnalysisEventListener<PersonSynData>() {@Overridepublic void invoke(PersonSynData personSynData, AnalysisContext analysisContext) {updateList.add(personSynData);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("Excel解析完成......");}}).build();//创建 sheet 对象,并且读取Excel的第一个sheet(下表从0开始),也可以根据 sheet 名称获取ReadSheet readSheet = EasyExcel.readSheet(0).build();//读取 sheet 表格数据,参数是可变参数,也可以读取多个sheet//这个操作会读取 excel 表格的数据excelReader.read(readSheet);//需要自己关闭流操作,在读取文件的时候会创建临时文件,如果不关闭的话,会损耗磁盘excelReader.finish();}

代码解读:

1.首先获取到实体类的 class 对象,后续需要进行使用

2.updateList 是要存储 Excel 表格中的每一行,每一行都是一个 实体类对象

3. ExcelReader excelReader = EasyExcel.read(filename, head, new AnalysisEventListener<PersonSynData>() {...});是Alibaba提供的一个工厂方法,用于创建一个 ExcelReader 对象。
filename 是要解析的 Excel 文件的路径。
head 是前面获取的 PersonSynData 类的 Class 对象,用于告诉 EasyExcel 应该如何解析 Excel 数据。
new AnalysisEventListener<PersonSynData>() {...} 是一个匿名内部类,实现了 AnalysisEventListener 接口。这个监听器用于处理 Excel 数据的解析过程

4. invoke 是必须重写的方法

  • 每解析到一行 Excel 数据,就会调用这个方法,并将解析后的 PersonSynData 实例作为参数传递进来。
  • 在这个方法中,我们将解析出的 PersonSynData 实例添加到 updateList 中。

5. doAfterAllAnalysed也是必须重写的方法

  • 这个方法是 AnalysisEventListener 接口的 doAfterAllAnalysed 方法的实现。
  • 当 Excel 文件的所有数据都解析完成后,就会调用这个方法。
  • 在这个方法中,我们打印了一条消息,表示 Excel 解析完成。

6.当代码执行到  excelReader.read(readSheet); 此时 updateList 中就有我们需要的数据了

注意!更新操作在下一篇博客: http://t.csdnimg.cn/RUZvM

四.为什么要缓存到本地?

缓存到本地和在内存中进行处理是两种不同的解决方案

在处理前端传来的Excel文件时,后端是否需要将其存储到本地再进行解析,确实存在几种不同的处理方式。

  1. 存储到本地后再解析:这种方式的优点是可以避免在内存中一次性加载整个Excel文件,从而减轻内存压力。同时,如果需要对文件进行多次处理,存储到本地后可以直接读取而无需重新上传,提高效率。缺点是需要占用服务器硬盘空间,并且需要额外的IO操作。

  2. 直接在内存中解析:这种方式可以省略存储到本地的步骤,直接从前端传来的数据流中进行解析。优点是减少了IO操作,提高了处理速度。缺点是需要一次性加载整个Excel文件到内存中,如果文件很大可能会造成内存溢出的风险。

综合来看,两种方式各有优缺点。具体采用哪种方式,需要根据实际业务需求、文件大小、服务器资源等因素进行权衡。如果Excel文件较小,且只需要处理一次,直接在内存中解析可能是更好的选择。而对于较大的Excel文件,或需要多次处理的场景,将其存储到本地可能会更合适。总之,在设计后端处理逻辑时,需要充分考虑各种因素,选择最佳的解决方案。

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

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

相关文章

centos7.6使用飞鱼FlyFish的docker镜像

参考教程&#xff1a; 飞鱼的docker镜像使用教程&#xff1a; doc/FlyFish_docker镜像使用指南.md 云智慧/FlyFish - Gitee.com centos的docker安装教程&#xff1a; CentOS下 Docker、Docker Compose 的安装教程_centos安装docker-compose_centos 安装docker-compose-CSDN…

深度学习(四)——torchvision中数据集的使用

1. 参数详解 torchvision中每个数据集的参数都是大同小异的&#xff0c;这里只介绍CIFAR10数据集 该数据集的数据格式为PIL格式 class torchvision.datasets.CIFAR10(root:str,train:boolTrue,transform:Optional[Callable]None,target_transform:Optional[Callable]None,do…

服务器数据恢复—EMC Isilon存储中被误删的虚拟机数据恢复案例

服务器存储数据恢复环境&#xff1a; EMC Isilon S200集群存储&#xff0c;共三个节点&#xff0c;每节点配置12块SATA硬盘。 服务器存储故障&#xff1a; 工作人员误操作删除虚拟机&#xff0c;虚拟机中数据包括数据库、MP4、AS、TS类型的视频文件等。需要恢复数据的虚拟机通…

大众点评全国美食POI采集780万家-2024年5月底

大众点评全国美食POI采集780万家-2024年5月底 店铺POI点位示例&#xff1a; 店铺id H8kTSRz3kLUQ2WtU 店铺名称 幸福西饼生日蛋糕(布心店) 十分制服务评分 8.2 十分制环境评分 8.4 十分制划算评分 8.3 人均价格 75 评价数量 119033 店铺地址 金稻田路1068号边防布心住…

如何察觉自己或者家人是否出现了听力问题?

如何察觉自己或者家人是否出现了听力问题呢&#xff1f;可以从以下两个方面观察&#xff1a; 一&#xff0e;社交方面 • 是不是经常需要别人重复刚说的话才能理解&#xff1f; • 多人对话中是否感到吃力&#xff1f; • 觉得别人讲话含糊不清&#xff1f; • 在人多嘈杂…

【APP移动端自动化测试】第二节.Appium介绍和常用命令代码实现

文章目录 前言一、Appium介绍和安装二、python代码功能实现 2.1 hello appium 参数详解 2.2 在脚本内启动其他app 2.3 获取app的包名和界面名 2.4 关闭app和驱动对象 2.5 安装和卸载以及是否安装app 2.6 将应用置于后台总结 前言 一、Appium介绍…

【perl】基本语法 /备忘录/

分享 perl 语言学习资源 Perl 教程|极客教程 (geek-docs.com) Perl [zh] (runebook.dev) Perl 运算符 | 菜鸟教程 (runoob.com) Perl Documentation - Perldoc Browser Search the CPAN - metacpan.org 当然还有一些经典书籍&#xff0c;不再列举。 1、数字 1.1、数字表…

火车头采集怎么使用GPT等AI原创文章

火车头采集官方并没有GPT、百度文心一言AI、阿里通义千问AI、Kimi大模型等AI功能&#xff0c;但支持接入插件&#xff0c;可以编写相应人工智能AI原创文章插件&#xff08;火车头采集支持PHP和c#这2种语言的插件编写&#xff09;&#xff0c;或者导入第三方封装好的GPT等AI原创…

大文件word生成的处理与解决策略

前言 对于简单word文档的生成导出&#xff0c;java已经有着很多技术来进行处理&#xff0c;在有着相对固定的格式样板下&#xff0c;采用word模板导出相对会是比较好的选择。但是当数据量且包含大量图片后&#xff0c;采用模板导出就显得无力了&#xff0c;模板的缺点是无法应…

[ROS 系列学习教程] 建模与仿真 - 使用 Arbotix 控制机器人

ROS 系列学习教程(总目录) 本文目录 一、Arbotix 简介二、安装Arbotix三、配置Arbotix控制器四、配置launch启动文件五、数据交互接口六、在rviz中仿真控制机器人6.1 直接发topic控制6.2 使用键盘控制6.3 编写代码控制机器人移动 前面讲了机器人的建模&#xff0c;是静态的&…

Mysql查询分析工具Explain的使用

一、前言 作为一名合格的开发人员&#xff0c;与数据库打交道是必不可少的&#xff0c;尤其是在业务规模和数据体量大规模增长的条件下&#xff0c;应用系统大部分请求读写比例在10:1左右&#xff0c;而且插入操作和一般的更新操作很少出现性能问题&#xff0c;遇到最多的&…

遇到Windows无法启动时不要担心,这里有解决办法

序言 如果有一天你打开电脑,Windows拒绝启动,你该怎么办?其实“Windows无法启动”是一种常见症状,原因多种多样,因此你需要进行一些故障排除。 现代版本的Windows更善于从这种情况中自动恢复,而Windows XP遇到此问题时可能会停止在运行的地方,现代版本的Windows将尝试…

论文解读——《I2EDL: Interactive Instruction Error Detection and Localization》

一、研究背景 视觉与语言导航&#xff08;VLN&#xff09;是一个AI领域的研究任务&#xff0c;旨在开发能够按照自然语言指令在三维空间中导航到指定位置的智能体。这项任务与人类的日常活动——如按照口头指示到达某个地点——十分相似&#xff0c;对于推动人机交互的自然性和…

为什么总选不到合适的安全数据交换系统?解决问题重点在这

安全数据交换系统对于企业而言&#xff0c;重要性不言而喻。企业业务开展离不开数据交换&#xff0c;只有数据流动起来&#xff0c;才能真正发挥价值&#xff0c;但数据流动的过程&#xff0c;涉及多个系统、多种环境、多个人员角色&#xff0c;因此&#xff0c;有较大的风险。…

Gi标签管理

文章目录 前言理解标签创建标签操作标签总结 前言 理解标签 标签&#xff0c;可以理解为对某次commit的一次标识&#xff0c;相当于起起了一个别名。 例如&#xff0c;在项目发布某个版本时候&#xff0c;针对最后一次commit起一个v1.0这样的标签来标识里程碑的意义。 这有什…

【Linux】线程(一)

谈论之前需要先谈论一些线程的背景知识 其中就有进程地址空间&#xff0c;又是这个让我们又爱又恨的东西 目录 背景知识&#xff1a;地址空间&#xff1a; 背景知识&#xff1a; 地址空间&#xff1a; 说在前边&#xff0c;OS通常分为4个核心模块&#xff1a;执行流管理&…

Flutter项目开发模版,开箱即用

前言 当前案例 Flutter SDK版本&#xff1a;3.22.2 每当我们开始一个新项目&#xff0c;都会 引入常用库、封装工具类&#xff0c;配置环境等等&#xff0c;我参考了一些文档&#xff0c;将这些内容整合、简单修改、二次封装&#xff0c;得到了一个开箱即用的Flutter开发模版…

喜讯!云起无垠入选《2024中国AI大模型产业图谱1.0版》

近日&#xff0c;数据猿与上海大数据联盟联合策划并启动了“2024全年度三大策划活动”&#xff0c;经过数月的精心筹备和严格筛选&#xff0c;通过直接申报交流、深入访谈调研、外部咨询评价以及匿名访谈等多维度交叉验证的方式&#xff0c;最终完成了《2024中国AI大模型产业图…

鸿蒙开发文件管理:【@ohos.securityLabel (数据标签)】

数据标签 该模块提供文件数据安全等级的相关功能&#xff1a;向应用程序提供查询、设置文件数据安全等级的JS接口。 说明&#xff1a; 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import security…