批量添加:vue+easyexcel 上传excel文件解析为Java对象并保存到数据库

对于像数据库中批量添加数据,我们一般会选择通过Excel文件先按照固定的格式将数据保存,然后再通过系统上传进而保存到数据库中。

阿里的excel解析工具EasyExcel和Apach的POI都能进行Excel文件的解析,但是EasyExcel操作起来要相对更简单一些,这里我们选用VUE+EasyExcel的方式来进行数据的上传和解析。

POI解析Excel文件:https://blog.csdn.net/weixin_45890113/article/details/115742939

前端:上传Excel文件,在前端进行校验,只能上传excel文件

<div>批量上传员工信息:<label for="file-upload" class="button">选择文件</label><inputtype="file"id="file-upload"accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"@change="handleFileUpload"style="display: none"/>
</div>......methods: {handleFileUpload (event) {const file = event.target.files[0];if (file.type !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' &&file.type !== 'application/vnd.ms-excel') {alert('只能上传 Excel 文件');return;}const formData = new FormData();formData.append('file', file);fetch(this.'上传文件的URL地址', {method: 'POST',body: formData}).then(response => {insertBatch().then(rst => {let { code, page, msg } = rst.data;if (code === '0000') {this.loading = false;this.data = rst.data.data;this.page.total = page.sum;this.page.current = page.currentPage;this.findByPage(this.page);this.page.currentSize = this.$isEmpty(this.data) ? 0 : this.data.length;} else {this.$Message.error(msg);}});}).catch(error => {console.error(error);});},
......
}......
<style>.button {display: inline-block;background-color: #42b983;color: #fff;padding: 8px 16px;border-radius: 4px;cursor: pointer;}</style>

后端:接收到前端传输的文件后,将其读取到内存中,再通过EasyExcel对其进行解析

Controller层代码

    @PostMapping("/uploadFile")public void uploadFile(MultipartFile file) {csEquipmentWbbList = csEquipmentWbbService.uploadFile(file) ;}

Service层代码

// 接口
List<CsEquipmentWbb> uploadFile(MultipartFile file);
-------------------------------------------------------------------------------------
// 实现
@Override
public List<CsEquipmentWbb> uploadFile(MultipartFile file) {EquipmentDeviceListener listener = new EquipmentDeviceListener();try {InputStream inputStream = file.getInputStream();EasyExcel.read(inputStream , EquipmentDevice.class , listener).sheet().doRead();List<CsEquipmentWbb> csEquipmentWbbList = new ArrayList<>() ;List<EquipmentDevice> equipmentDeviceList = listener.getEquipmentDeviceList() ;for (EquipmentDevice equipmentDevice : equipmentDeviceList) {CsEquipmentWbb csEquipmentWbb = beanCopyUtils.convertTo(equipmentDevice, CsEquipmentWbb.class);csEquipmentWbbList.add(csEquipmentWbb) ;}return csEquipmentWbbList ;} catch (Exception e) {log.error(e.getMessage() , e);}return null;
}

这里我们需要去创建一个listener监听器,通过继承AnalysisEventListener类并重写其中的方法来达到对Excel文件的解析。

AnalysisEventListener类的介绍:

AnalysisEventListener 是 EasyExcel 中提供的一种事件监听器,用于处理 Excel 文件的读取和写入等操作。通常情况下,我们可以通过继承 AnalysisEventListener 并重写其中的回调方法来实现对 Excel 文件的读取和写入操作。在读取 Excel 文件时,我们可以使用 AnalysisEventListener 的 invoke() 方法来获取每行数据并进行处理。同时,doAfterAllAnalysed() 方法会在 Excel 文件解析完成后被调用,我们可以在该方法中对读取到的数据进行统一处理或保存等操作。

对于EquipmentDevice类,我们需要根据自身情况去具体的设置,如果说excel文件中的数据就是刚好能符合后端接收数据的对象的属性,那么我们无需再定义一个类去接收。如果excel文件中只是包含了个别字段,那么我们最好再去定义一个新的类先将数据接收并保存,再将数据copy给指定的类的集合。

public class EquipmentDeviceListener extends AnalysisEventListener<EquipmentDevice> {List<EquipmentDevice> equipmentDeviceList = new ArrayList<>() ;public List<EquipmentDevice> getEquipmentDeviceList() {return  equipmentDeviceList;}@Overridepublic void invoke(EquipmentDevice equipmentDevice, AnalysisContext analysisContext) {equipmentDeviceList.add(equipmentDevice) ;}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 我们解析得到的数据也可以直接在该方法中进行进一步的处理,我是写到了service层去处理的}
}

通过上面的代码我们就能实现前端传输Excel文件到后端进行解析的操作了,最终得到一个集合,再进一步对集合中数据进行相应的操作即可

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

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

相关文章

cancal报错 config dir not found

替换classpath中间封号两边的值

1186. 删除一次得到子数组最大和;1711. 大餐计数;1834. 单线程 CPU

1186. 删除一次得到子数组最大和 解题思路&#xff1a;如果没做过还不是很好想&#xff0c;当时自己第一反应是双指针&#xff0c;结果是个动态规划的题。 核心就是dp的定义&#xff0c;dp[i][k]表示以arr[i]结尾删除k次的最大和。看到这里其实就有一点思路了 dp[i][0]表示以…

K8S pod 均匀调度分配 —— 筑梦之路

pod调度简介 在 k8s 中 通过 kube-scheduler 组件来实现 pod 的调度&#xff0c;所谓调度&#xff0c;即把需要创建的 pod 放到 合适的 node 上&#xff0c;大概流程为&#xff0c;通过对应的 调度算法 和 调度策略&#xff0c;为待调度的 pod 列表中的 pod 选择一个最合适的 N…

JVM理论(五)执行引擎--解释器/JIT编译器

概述 首先执行引擎是java虚拟机核心的组成部分之一;而JVM的主要任务是装载字节码到内存,但不能够直接运行在操作系统之上.因为字节码指令并非等价于本地机器指令,它仅仅包含能够被JVM所识别的指令、符号表、以及其他信息;而此时执行引擎就华丽登场,它的任务就是将字节码指令解…

rust学习-泛型和trait

泛型 Option&#xff0c;Vec&#xff0c;HashMap<K, V>&#xff0c;Result<T, E>等&#xff0c;取函数以减少代码重复的机制 背景 两个函数&#xff0c;不同点只是名称和签名类型 fn largest_i32(list: &[i32]) -> i32 {let mut largest list[0];for &…

【python】动态规划:牛客网HJ24 合唱队

描述 N 位同学站成一排&#xff0c;音乐老师要请最少的同学出列&#xff0c;使得剩下的 K 位同学排成合唱队形。 设KK位同学从左到右依次编号为 1&#xff0c;2…&#xff0c;K &#xff0c;他们的身高分别为T1,T2,…,TKT1​,T2​,…,TK​ &#xff0c;若存在i(1≤i≤K)i(1≤i…

【数字IC前端笔试真题精刷(2021)】大疆——数字芯片开发工程师A/B卷

声明:本专栏所收集的数字IC笔试题目均来源于互联网,仅供学习交流使用。如有侵犯您的知识产权,请及时与博主联系,博主将会立即删除相关内容。 笔试时间:2021年A/B卷 题目类型:(只列了选择题) 大疆芯片开发岗A卷 文章目录 一、单选题 / 多选题1.(单选)关于流水线设计的…

C++并发编程(6):单例模式、once_flag与call_once、call_once实现单例

单例模式 参考博客 【C】单例模式&#xff08;饿汉模式、懒汉模式&#xff09; C单例模式总结与剖析 饿汉单例模式 C实现 C单例模式(饿汉式) 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结 &#xff0c;一共…

行为型模式 - 策略模式

概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然可以进行代码开发的工具有很多&#xff0c;可以选择Idea进行开发&…

Web 3.0时代,重塑教育与学习方式的可能性

随着科技的快速发展和互联网的普及&#xff0c;教育领域也面临着巨大的机遇和挑战。Web 3.0时代的到来为教育与学习方式带来了全新的可能性。在这个数字化时代&#xff0c;我们可以探索和利用Web 3.0技术&#xff0c;重塑教育的方式&#xff0c;提供更个性化、互动性和灵活性的…

在Illustrator中创建 3D 冰淇淋模型对象

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 一旦你学会了如何在Illustrator中制作一个对象3D&#xff0c;你可以前往Envato Elements&#xff0c;在那里你可以找到大量的3D设计来激发你的灵感。这个基于订阅的市场拥有超过 2&#xff0c;000 个 Illus…

php实现站群软件权限管理功能示例

1.管理员页面RBAC.php <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>权限管理</title> <script src"bootstrap/js/jquery-1.11.2.min.js"></script> </head>…

项目名称:智能家居边缘网关项目

一&#xff0c;项目介绍 软件环境: C语言 硬件环境: STM32G030C8TX单片机开发板 开发工具: Linux平台GCC交叉编译环境以及ukeil (1)边缘网关概念 边缘网关是部署在网络边缘侧的网关&#xff0c;通过网络联接、协议转换等功能联接物理和数字世界&#xff0c;提供轻量化的联接管…

通过new FormData提交简单数据

通过new FormData提交简单数据 效果示例图代码 效果示例图 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css">* {padding: 0px;margin: 0px;box-sizing: border-…

SpringBoot整合PostgreSQL教程

主要描述如何优雅的整合postgresql。本文略去如何安装pgsql的过程&#xff0c;详情可参考其他文章。 文章目录 postgresql简介整合postgresql整合mybatis整合mybatis-plus postgresql简介 与mysql一样也是开源的关系型数据库&#xff0c;同时还支持NoSql的文档型存储。在某些方…

费尔法克斯水务通过使用 Liquid UI 移动化和定制 SAP PM 来提高收入和数据完整性

背景 费尔法克斯水务是北弗吉尼亚州地区领先的水县。它是华盛顿特区大都会区的三大供水商之一。它每天为近171万居民提供2.<>亿加仑的水。它渴望坚持其愿景&#xff0c;即保持以客户为中心&#xff0c;同时帮助维持该地区的高质量生活和经济状况。 挑战 由于桌面系统&…

【Ceph的部署】

目录 一、基于 ceph-deploy 部署 Ceph 集群1、Ceph 生产环境推荐&#xff1a;2、Ceph 环境规划3、环境准备1、关闭 selinux 与防火墙2、根据规划设置主机名3、配置 hosts 解析4、安装常用软件和依赖包5、在 admin 管理节点配置 ssh 免密登录所有节点6、为每一个服务器配置时间同…

写给后端开发的『vue3』请求后端接口

本文分享一下在vue3前端项目中请求后端接口获取数据。比较简单&#xff0c;内容如下&#xff1a; 1、使用axios请求后端接口 首先npm install axios&#xff0c;添加axios依赖&#xff0c;就靠它来请求后端接口了&#xff0c;基本等同于使用jquery发ajax。 # src/main.js i…

每天一点Python——day58

#第五十八天 集合间的关系&#xff1a; 类似于数学中学到的集合一样&#xff0c;关系差不多&#xff0c;譬如相等&#xff0c;子集&#xff0c;交集 如图所示&#xff1a;#①两个集合是否相等&#xff1a;运用运算符【等号】或者运算符&#xff01;【不等号】进行判断 #例&…

【面试问题11】

1.Filter 和interceptor区别 filter是tomcat的规范,在请求前对request对象进行拦截,执行相关的过滤dofilter,例如url拦截请求静态文件,添加请求参数,权限检查,敏感字符检查等,请求后会再执行一次dofilter。区别,1. filter只tomcat规范,interceptor是spring规范。2.执行…