vue2 数据导入excel

news/2024/11/29 4:52:11/文章来源:https://www.cnblogs.com/flyShare/p/18570421

1、安装 npm install xlsx

  一、前端

 <el-uploadstyle="display: inline-block"actionaccept=".xlsx, .xls":auto-upload="false":show-file-list="false":on-change="handleUpload"><el-button type="primary" icon="el-icon-upload2" round>导入</el-button></el-upload>

  二、逻辑

 

npm install xlsx
<script>/* eslint-disable */import * as XLSX from "xlsx";// 导入handleUpload(ev){let yearMonth =this.selectForm.yearMonth// 如果有数据则给出提示if(this.tableCount >0){this.$confirm(yearMonth+'有数据,是否进行替换?','提示',{confirmButtonText: '确定',cancelButtonText: '取消',type:'warning'}).then(() =>{const file = ev.rawconst fileReader = new FileReader();fileReader.readAsArrayBuffer(file);fileReader.onload = (ev) =>{const data = new Uint8Array(ev.target.result);const workbook = XLSX.read(data, { type: 'array' });const firstSheetName = workbook.SheetNames[0];const worksheet = workbook.Sheets[firstSheetName];// 转译范围const range = { s: { r: 2, c: 3 }, e: { r: 32, c: 18 } }this.importData =(XLSX.utils.sheet_to_json(worksheet,{ header: 1,defval:'',range: range}));let formData={list: JSON.parse(JSON.stringify(this.importData)),yearMonth: this.selectForm.yearMonth}importData(formData).then((res) =>{if(res.code == 200){this.getDataList()this.$publicmethod.showMessage("导入成功",this.$publicmethod.SuccessType)}else{this.$publicmethod.showMessage("导入失败-选择的模版不正确!",this.$publicmethod.ErrorType)}})}})}else{const file = ev.rawconst fileReader = new FileReader();fileReader.readAsArrayBuffer(file);fileReader.onload = (ev) =>{const data = new Uint8Array(ev.target.result);const workbook = XLSX.read(data, { type: 'array' });const firstSheetName = workbook.SheetNames[0];const worksheet = workbook.Sheets[firstSheetName];// 转译范围const range = { s: { r: 2, c: 3 }, e: { r: 32, c: 18 } }this.importData =(XLSX.utils.sheet_to_json(worksheet,{ header: 1,defval:'',range: range}));let formData={list: JSON.parse(JSON.stringify(this.importData)),yearMonth: this.selectForm.yearMonth}importData(formData).then((res) =>{if(res.code == 200){this.getDataList()this.$publicmethod.showMessage("导入成功",this.$publicmethod.SuccessType)}else{this.$publicmethod.showMessage("导入失败-选择的模版不正确!",this.$publicmethod.ErrorType)}})}}},
</script>

  三、接口

export function importData(data) {return request({url: 'api/operation_report/importData',method: 'post',data})  
}

  四、后端实现

  

  1、控制器类@ApiOperation(value = "导入数据")@PostMapping(value = "/importData")public JsonBean importData(  @RequestBody @Validated ReportQueryDo queryDo) {List<String> list =queryDo.getList();String yearMonth = queryDo.getYearMonth();return operationReportService.importData(list,yearMonth);}2、实现类// 导入@Override@Transactional(value = "MainTransactionManager", rollbackFor = Exception.class)public JsonBean importData(List<String> list,String  yearMonth) {try{List<OperationReport> addList = new ArrayList<>();// 将 excel数据保存在数据库中,传过来的是字符串,将字符串转成对应的对象进行数据的添加list.stream().forEach(data ->{OperationReport report = new OperationReport();report.setId(SnowIdUtil.getId());report.setYearMonth(yearMonth);JSONArray arrayData =JSON.parseArray(data);// 将数据转换成list集合进行操作if(arrayData !=null){// 公司名称String orgName = arrayData.getString(0);int orgId=getOrgId(orgName);// -1 代表没有当前组织if(orgId != -1){report.setOrgId(orgId);}else{String msg="不存在"+orgName+"公司";logger.error(msg);throw new RuntimeException(msg);}report = changeDataEntity(report,arrayData);addList.add(report);}});// 数据批量添加if(CollectionUtils.isNotEmpty(addList)){// 先删除数据再进行添加Map<String,Object> map = new HashMap<>();map.put("yearMonth",yearMonth);operationReportMapper.delete(map);operationReportMapper.batchInsert(addList);}return new JsonBean(ResultCode.SERVICE_OK);}catch (Exception e){logger.error(e.toString());return new JsonBean(ResultCode.SERVICE_ERR);}}// 将excel表格数据转成实体private OperationReport changeDataEntity(OperationReport report,JSONArray arrayData){// 人员总数String personnelTotalCount = arrayData.getString(1);if(StringUtils.isNotEmpty(personnelTotalCount)){report.setPersonnelTotalCount(Integer.parseInt(personnelTotalCount));}else{report.setPersonnelTotalCount(0);}// 机关人员总数String officialCount = arrayData.getString(2);if(StringUtils.isNotEmpty(officialCount)){report.setOfficialCount(Integer.parseInt(officialCount));}else{report.setOfficialCount(0);}//  一线业务人员String frontLineBusinessCount = arrayData.getString(3);if(StringUtils.isNotEmpty(frontLineBusinessCount)){report.setFrontLineBusinessCount(Integer.parseInt(frontLineBusinessCount));}else{report.setFrontLineBusinessCount(0);}//  车辆总数String vehicleCount =  arrayData.getString(4);if(StringUtils.isNotEmpty(vehicleCount)){report.setVehicleCount(Integer.parseInt(vehicleCount));}else{report.setVehicleCount(0);}.....return report;}3、根据公司名称获取对应的公司编号public class ConstantEnum {// 创建HashMap来存储城市公司名称和编号的映射private static HashMap<String,Integer> orgMap = new HashMap<>();// 静态代码块,初始化公司编号数据static{orgMap.put("A",00001);orgMap.put("B",00002);}// 根据公司名称获取公司编号的方法public static int getOrgId(String orgName){return orgMap.containsKey(orgName)?orgMap.get(orgName):-1;}}
4、批量添加xml<!--批量添加 --><insert id="batchInsert"  parameterType="java.util.List">insert into operation_report (id,org_id,yearMonth,personnel_total_count) values<foreach collection="list" item="item" index="index" separator=",">(#{item.id},#{item.orgId},#{item.yearMonth},#{item.personnelTotalCount})</foreach></insert>

  五、导入的文件模版(行、列数据,只是转译内容,前面的数据不需要)

 

 

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

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

相关文章

小迪安全第10天HTTP数据包

请求包:request 回显包:response (1)请求方式:post get get:提交请求 post:向指定资源提交内容,登录/上传文件 •get:向特定资源发出请求(请求指定页面信息,并返回实体主体); •post:向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的…

《安富莱嵌入式周报》第346期:开源2GHz带宽,12bit分辨率,3.2Gsps采样率示波,开源固件安全分析器, 开源口袋电源,开源健康测量,FreeCAD

周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频: https://www.bilibili.com/video/BV1TYBhYKECK/目录: 1、开源2GHz带宽,12bit分辨率,3.2Gsps采样率示波器 2、开源嵌入式固件安全分析器 3、TI分享的8…

【前端】vue引入tinymce富文本编辑器上传视频自动转img问题

近期遇到了一个问题,前端项目引入tinymce富文本编辑器后有一个上传视频的需求,可是放入了视频以后,在预览时发现,视频标签未能正确展示,被替换为了img标签找了很多解决办法,都没有解决这个问题,最后找到了一个办法, 特此记录。 解决办法: 1. 找到node_modules下tinymc…

【操作系统】2.3_11_ 哲学家进餐问题

https://www.bilibili.com/video/BV1YE411D7nH?spm_id_from=333.788.videopod.episodes&vd_source=6c2daed6731190bb7d70296d6b9746bb&p=36方法1 n个哲学家,n个筷子 创建一个初值为n-1的信号量,保证最多只有n-1个进程并发争抢资源,必有1个筷子资源余留,可以1个进程…

PhpWebStudy运行Laravel

创建Laravel项目​ 如果你想使用已存在的项目. 你可以跳过此步骤. 继续 创建站点 你可以使用Composer创建Laravel项目 shell composer create-project laravel/laravel example-app当然,FlyEnv也提供了快速创建laravel项目的方法。在站点面板中. 点击 新建项目选择项目保存位置…

Docker/DockerHub 国内镜像源/加速列表(11月26日更新-长期维护)

此文维护一个列表收录无需限定条件的Docker Hub镜像源,感谢这些公益服务者。6月6日,上海交大的 Docker Hub 镜像加速宣布因监管要求被下架,Docker hub 被封无法访问。前言本列表为科研工作者提供 docker 镜像网站,网络不好的同学可以使用镜像,或者推荐给身边有需要的朋友使…

Jenkin window bat批处理脚本如何 获取json对象返回值数据

前两天有这么个小需求: 在cmd中运行某测试工具后/请求某个api后,会返回一个json结果,其中有一个参数的值每次都变且经常要用,正常情况复制粘贴就好了,但这个值非常长,配上cmd的标记+粘贴的行为,就很酸爽了。然后就想快速提取这个值,顺着cmd的这个思路,就走上了批处理的…

jndi注入

jndi注入 jndi简单来说是提供一个查找服务,你可以通过字符串找到对应的对象。而jndi需要有服务的提供者,也就是是谁来提供这些对象。jndi只是负责名字->对象的查找,而不提供对象。 可以作为服务提供者的: Lightweight Directory Access Protocol (LDAP) 轻量级目录访问协…

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-6- 元素基础定位方式-上篇 (详细教程)

1.简介 从这篇文章开始,就开始要介绍UI自动化核心的内容,也是最困难的部分了,就是:定位元素,并去对定位到的元素进行一系列相关的操作。想要对元素进行操作,第一步,也是最重要的一步,就是要找到这个元素,如果连元素都定位不到,后续什么操作都是无用功,都是扯淡,因此…

【类的默认成员函数】构造函数析构函数【C++】

【类的默认成员函数】构造函数&&析构函数【C++】 任何一个类在我们不写的情况下,都会自动生成6个默认成员函数构造函数:初始化(不是开空间!) 日常实操中最好自己写一个!!!!!!!! Date() {_year = 1;_month = 1;_day = 1; }特点 (1)函数名和类名相同 (2)…

Notepad++汉化教程

Notepad++系统只带了中文语言包,不需要像其他软件一样破解 1、打开Notepad++(通过文本文件右键选择以Notepad++打开或者找到Notepad++的快捷方式打开)。 2、菜单栏找到settings–>Preferences(首选项)。 3、找到General 右侧Localization选择简体中文,可以看到语言直接变…