vue表单中批量导入功能_spring boot mybatis+ vue 使用POI实现从Excel中批量导入数据

一、前端vue+element

1.前端使用element的upload组件来实现文件的上传

style="display: inline-flex;margin-right: 8px":show-file-list="false" :before-upload="beforeUpload":on-success="onSuccess":on-error="onError"accept=".xls":disabled="importDataButtonDisabled"action="/employee/basic/import">

{{importDataButtonMsg}}

show-file-list:是否显示已选择文件列表

before-upload:文件上传以前调用的钩子

on-error:文件上传失败后的钩子

on-success:文件上传成功后的钩子

accept:接受的文件类型

action:上传的地址

2.回调函数的处理

//批量导入用户分为两个步骤:1.上传Excel文件 2.将Excel的数据转换后插入数据库

//**注意:这里的上传成功的回调只是指Excel文件上传成功,并不意味着整个批量导入用户的操作是成功的

onSuccess(response, file, fileList){//上传成功后的回调 更改《导入数据》的按钮显示的值以及图标

this.importDataButtonMsg='导入数据';this.importDataButtonIcon='el-icon-upload2';this.importDataButtonDisabled=false;//文件上传成功后,判断员工数据插入数据库的结果(也相当于批量导入用户的操作结果)

if (response.status == 200){

Message.success({message:response.msg})

}else if (response.status == 500){

Message.error({message:response.msg})

}else{

Message.error({message:'未知错误'})

}

},//上传文件失败后的回调 更改《导入数据》的按钮显示的值以及图标

onError(err, file, fileList){this.importDataButtonMsg='导入数据';this.importDataButtonIcon='el-icon-upload2';this.importDataButtonDisabled=false;this.$message.error(err);

},//上传文件之前的回调 更改《导入数据》的按钮显示的值以及图标 以使用户可以区分按钮的状态

beforeUpload(){this.importDataButtonMsg='正在上传';this.importDataButtonIcon='el-icon-loading';this.importDataButtonDisabled=true;

},

批量导入数据分为两个步骤:1.上传Excel文件 2.将Excel的数据转换后插入数据库。

为了防止点击了导入数据后再次重复点击导入按钮以及区分未点击按钮和点击导入数据的感官,设置导入数据的按钮的显示值和图标为动态的,通过钩子更新按钮的显示的值和图标。

注意:这里的上传成功的回调只是指Excel文件上传成功,并不意味着整个批量导入用户的操作是成功的

二、后端spring boot + mybatis

1.controller接受层

@PostMapping("/import")publicRespBean importEmp(MultipartFile file){//拿到 file 对象

List employees =EmpUtils.excelToObj(file,nationService.getAllNations(),departmentService.getAllDepartmentWithoutChild(),jobLevelService.getAllJobLevels(),

politicsstatusService.getAllPoliticsstatuss(),positionService.getAllPositions());if (employeeService.importEmp(employees) ==employees.size()){return RespBean.ok("导入成功!");

}return RespBean.error("导入失败!");

}

controller层接收文件使用MultipartFile类来接收,忽略其他参数。

2.处理MultipartFile类对象

public static List excelToObj(MultipartFile file, List allNations, List allDepartment, List allJobLevels,

List allPoliticsstatuss, ListallPositions) {

List employeeList = new ArrayList<>();

InputStream inputStream= null;try{//1.获取文件的输入流

inputStream =file.getInputStream();//2.获取Excel工作簿对象

HSSFWorkbook workbook = newHSSFWorkbook(inputStream);//3.获取Excel工作表对象 因为此时只有一个工作表对象所以取第一个对象即可//如果是多个工作表对象 可以通过如下方式获取后进行遍历//int numberOfSheets = workbook.getNumberOfSheets();

HSSFSheet sheetAt = workbook.getSheetAt(0);//4.循环读取表格的数据

for(Row row : sheetAt) {//表头(标题) 跳过

if (row.getRowNum() == 0) {continue;

}//空行直接跳过

if (row == null) {continue;

}

Employee employee= newEmployee();//获取列数

int physicalNumberOfCells =row.getPhysicalNumberOfCells();for (int k = 0; k < physicalNumberOfCells; k++) {

Cell cell=row.getCell(k);//先通过表格列的类型进行分类

switch(cell.getCellType()) {//处理string类型

caseSTRING:switch(k) {case 1:

employee.setName(cell.getStringCellValue());break;case 2:

employee.setWorkID(cell.getStringCellValue());break;default: {break;

}

}break;default: {switch(k) {case 4://处理日期类型的列

employee.setBirthday(cell.getDateCellValue());break;case 20:

employee.setBeginDate(cell.getDateCellValue());break;case 22:

employee.setBeginContract(cell.getDateCellValue());break;case 23:

employee.setEndContract(cell.getDateCellValue());break;case 24://处理double类型的列

employee.setContractTerm(cell.getNumericCellValue());break;case 25:

employee.setConversionTime(cell.getDateCellValue());break;default:break;

}break;

}

}

}

employeeList.add(employee);

}

}catch(IOException e) {

e.printStackTrace();

}returnemployeeList;

}

//1.获取文件的输入流

inputStream =file.getInputStream();

//2.获取Excel工作簿对象

HSSFWorkbook workbook = newHSSFWorkbook(inputStream);

//3.获取Excel工作表对象 因为此时只有一个工作表对象所以取第一个对象即可

//如果是多个工作表对象 可以通过如下方式获取后进行遍历

//int numberOfSheets = workbook.getNumberOfSheets();

HSSFSheet sheetAt = workbook.getSheetAt(0);

//4.循环读取表格行的数据进行处理

3.在mybatis的mapper.xml中使用foreach批量插入数据

insert into employee (name, gender,

birthday, idCard, wedlock, nationId

)

values(#{emp.name,jdbcType=VARCHAR}, #{emp.gender,jdbcType=CHAR},

#{emp.birthday,jdbcType=DATE}, #{emp.idCard,jdbcType=CHAR}, #{emp.wedlock,jdbcType=CHAR}, #{emp.nationId,jdbcType=INTEGER}

)

批量插入的返回值为插入数据库的记录数,批量插入要么全部成功,要么全部失败。

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

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

相关文章

如何专业化监控一个Kubernetes集群?

简介&#xff1a; 本文会介绍 Kubernetes 可观测性系统的构建&#xff0c;以及基于阿里云云产品实现 Kubernetes 可观测系统构建的最佳实践。 作者&#xff1a;佳旭 阿里云容器服务技术专家 引言 Kubernetes 在生产环境应用的普及度越来越广、复杂度越来越高&#xff0c;随之而…

如何构建一个拖垮整个公司的备份系统

简介&#xff1a; 在如今“数据即资产”的时代&#xff0c;有备才能无患。备份就像备胎&#xff0c;虽然大多人都知道备胎很重要&#xff0c;却很少有人检查。不发生点什么&#xff0c;你永远不知道TA对你有多重要。 原文链接 本文为阿里云原创内容&#xff0c;未经允许不得转…

6.7K Star 的知名开源项目源码,该怎么看?

作者 | 一只图雀来源 | 程序员巴士心理认知要到位首先要认识到&#xff0c;看源码是一个开始比较枯燥、同时时间跨度相对比较长的一个过程。所以看源码的第一步是找到自己想要了解领域、或者自己所在业务领域高度相关的项目&#xff0c;并且在这个领域比较出名&#xff0c;且维…

网站建设中 模板_网站建设之模板网站的缺点

随着网站建设市场的日益成熟&#xff0c;许多的自助建站平台纷纷涌入建站市场&#xff0c;甚至许多主机供应商也与一些自助建站平台达成了战略合作&#xff0c;买服务器赠送模板网站。那么我们进行网站建设时是选择专业建站公司的定制网站还是模板站呢&#xff1f;看完模板网站…

github private链接访问_如何将Jenkins链接到私有Github存储库?

我的目标是将私有Github存储库拉到Jenkins .以下是一些背景&#xff1a;MacOSJenkins在本地托管&#xff0c; localhost:8080在Jenkins中安装了Git插件和Github插件 .如果我将存储库转为Public&#xff0c;Jenkins的一切都很好 .从命令行&#xff0c;我可以使用我在Jenkins中使…

c语言角谷猜想多实例测试,郑轻OJ 1099: 角谷猜想(多实例测试)

1099: 角谷猜想(多实例测试)Time Limit:1 Sec Memory Limit:128 MBSubmit:2762 Solved:1852SubmitStatusWebBoardDescription任何一个自然数&#xff0c;如果是偶数&#xff0c;就除以2&#xff0c;如果是奇数&#xff0c;就乘以3再加1。最后&#xff0c;经过若干次迭代得到1…

如何让在线协同更顺畅?钉钉宜搭有了新的解法

简介&#xff1a; 随着企业组织规模、业务模式不断发展&#xff0c;单一组织内的协同已"HOLD”不住了&#xff01;钉钉宜搭推出跨组织协同新功能。 过去&#xff0c;钉钉宜搭的应用搭建能力已经帮助很多企业改变办公模式。比如&#xff1a;线下一张张纸质表单逐级人肉审批…

阿里云李飞飞:什么是云原生数据库

简介&#xff1a; 云原生是一种新型技术体系&#xff0c;是云计算未来的发展方向。今天&#xff0c;阿里云李飞飞将和我们分享何为云原生、云原生如何与分布式有机结合&#xff0c;以及云原生技术如何帮助客户迈入数字原生时代。 作者 | 飞刀 来源 | 阿里技术公众号 云原生是一…

kvmweb管理工具_KVM的web管理界面

安装好KVM之后&#xff0c;就可以安装kimchi和wok了。一、KVM的web管理界面什么是Wok&#xff1f;Wok基于cherrypy的web框架&#xff0c;可以通过一些插件来进行扩展&#xff0c;例如&#xff1a;虚拟化管理、主机管理、系统管理。它可以在任何支持HTML5的网页浏览器中运行。什…

stm32 adc 连续和扫描_技术分享 | STM32多个ADC模块同时采样转换的应用示例

在STM32家族里&#xff0c;多数系列芯片内含2到3个ADC模块&#xff0c;有的甚至更多&#xff0c;比方G4系列可以有5个ADC模块。其中&#xff0c;通道数因不同的系列或型号多少不等&#xff0c;几个到几十个的都有。有时&#xff0c;我们可能需要多个ADC模块同时工作&#xff0c…

云原生/低代码/数据科学/计算等方向内容整理志愿者招募了!

持续招募内容整理志愿者&#xff01;云原生、数据科学、AI、低代码、计算等方向&#xff0c;有意愿的小伙伴&#xff0c;欢迎识别二维码提前报名哦。我们将持续为爱学习、有时间的小伙伴&#xff0c;提供多重福利&#xff01;要求&#xff1a;1. 你需要具备一定学术背景&#x…

sin级数展开c语言,三角函数sin的泰勒级数展开

denodeno*(2*(i-1))*(2*i-1);这里可能导致double越界。你可以在每次递进时&#xff0c;根据上次的值乘以x*x再除以(2*(i-1))*(2*i-1)。因为xn/n! x(n-2)/(n-2) * (x*x / (n * (n-1))但是由于用了除法&#xff0c;所以得到的结果是近似值。另外main函数必须有返回值&#xff0c…

Maxcompute造数据-方法详解

简介&#xff1a; 造一点模拟数据的方法 概述 造数据在一些奇怪的场合会被用到。一般我们是先有数据才有基于数据的应用场合&#xff0c;但是反过来如果应用拿到另外一个场景&#xff0c;没有数据功能是没有方法演示的。 一般较为真实的数据&#xff0c;脱敏后就可以应用在功…

python计算运动会某个参赛选手的得分。数据保存在文件中_成绩计算电脑程序的使用说明...

成绩计算电脑程序的使用说明为了计算成绩&#xff0c;特制作这个电脑程序&#xff0c;说明如下&#xff1a;一、开发软件&#xff1a;Python二、使用说明&#xff1a;在电脑D盘根目录下建立两个excel文件&#xff0c;一个是1.xlsx&#xff0c;另一个是2.xlsx其中&#xff0c;1.…

android 创建文件夹_Android 动画小记

精简介绍Android中的动画&#xff0c;主要介绍用法。动画种类包括了&#xff1a;补间动画、逐帧动画、属性动画&#xff0c;前两者统称为视图动画。补间动画包括了平移、旋转、缩放和透明度四种&#xff0c;每种动画支持xml和代码设置。另外还有一种组合动画&#xff0c;就是将…

命题公式的主合取范式C语言,命题公式主范式的自动生成与形式输出.pdf

收稿日期 2006 04 19 作者简介 张会凌 1954 男 甘肃成县人 甘肃联合大学数学与信息学院副教授 主要从事微分几何与计算机方面 的研究 文章编号 1672 691X 2006 05 0049 04 命题公式主范式的自动生成与形式输出 张会凌 甘肃联合大学 数学与信息学院 甘肃 兰州 730000 摘 要 在文…

2021金蝶全球创见者大会成功举办, 500强企业共话EBC数字战斗力

11月27日&#xff0c;由金蝶主办的“2021全球创见者大会”成功举办。大会以“用数字战斗力&#xff0c;向管理要效益”为主题&#xff0c;求索不确定时代&#xff0c;EBC如何帮助500强及中小企业拥抱数字战斗力&#xff0c;构建企业韧性。 据了解&#xff0c;金蝶全球创见者大…

使用管控策略,设定多账号组织全局访问边界

简介&#xff1a; 企业上云多账号架构中&#xff0c;如何做到从上到下管理的同时&#xff0c;处理好员工的权限边界问题&#xff1f; 由多账号上云模式说起 多账号上云模式的产生 我们的企业客户上云&#xff0c;一般都是从尝试部署少量业务开始&#xff0c;然后逐步将更多业…

使用MaxCompute LOAD命令批量导入OSS数据最佳实践—STS方式LOAD开启KMS加密OSS数据

简介&#xff1a; MaxCompute使用load overwrite或load into命令将外部存储的数据&#xff08;如&#xff1a;oss&#xff09;导入到MaxCompute前的授权操作。 MaxCompute使用load overwrite或load into命令将外部存储的数据&#xff08;如&#xff1a;oss&#xff09;导入到M…

mamcache登录、_gomemcache首页、文档和下载 - memcache客户端库 - Go语言中文网 - Golang中文社区...

**安装**使用 go get$ go get github.com/bradfitz/gomemcache/memcache此命令后gomemcache即可使用。它的来源将是&#xff1a;$GOPATH/src/github.com/bradfitz/gomemcache/memcache**示例**import ("github.com/bradfitz/gomemcache/memcache")func main() {mc : …