vue+element -UI前端Excel 文件导入数据

2023-11-19

完成的效果图如下,会进行数据筛选,根据你上传的物业名称跟数据库的名称对应

在这里我用到了一个插件,需要在在main.js中全局引入:

import { export_excel_to_json, export_json_to_excel } from '@/api/operExcel'

下载地址:https://download.csdn.net/download/qq_36597079/10634033

不多说,上源码

1.页面样式

<div class="filter-container">
					<el-form :inline="true">
						<el-form-item>
							<el-button @click="handleExport" size="medium">导出上传模板</el-button>
						</el-form-item>
						<el-form-item>
							<a class="el-button el-button--medium">选择要上传的文件
								<input id="fileSelect" type="file" @change="handleUpload" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel" class="filecss" />
							</a>
						</el-form-item>
						<el-form-item>
							<el-button @click="handleExportResult">导出校验结果</el-button>
						</el-form-item>
						<el-form-item>
							<el-button type="primary" @click="handleData" size="medium">确认上传</el-button>
						</el-form-item>
					</el-form>
				</div>
				<div>
					<el-table :data="uploadData" stripe show-summary :summary-method="getSummaries" height="475" style="width: 100%" v-loading="loading" :element-loading-text="loadingtxt">
						<el-table-column type="index" label="序号" width="70">
						</el-table-column>
						<el-table-column prop="basic_name" label="物业名称" width="220">
						</el-table-column>
						<!--<el-table-column prop="basic_position" label="位置" width="180">
						</el-table-column>-->
						<el-table-column prop="fees_month" label="月份" width="180">
						</el-table-column>
						<el-table-column prop="pretax" label="税前" width="180">
						</el-table-column>
						<el-table-column prop="Aftertax" label="税后" width="180">
						</el-table-column>
						<el-table-column prop="result" label="检验结果" sortable>
							<template slot-scope="scope">
								<span style="color:red;" v-show="!scope.row.state">{{ scope.row.result }}</span>
								<span v-show="scope.row.state">{{ scope.row.result }}</span>
							</template>
						</el-table-column>
						<el-table-column prop="uploadResult" label="上传结果" width="120" sortable>
							<template slot-scope="scope">
								<span style="color:red;" v-show="!scope.row.uploadState">{{ scope.row.uploadResult }}</span>
								<span v-show="scope.row.uploadState">{{ scope.row.uploadResult }}</span>
							</template>
						</el-table-column>
					</el-table>
				</div>

2,记得加一下方法(核心方法)

import { export_excel_to_json, export_json_to_excel } from '@/api/operExcel'

3.js方法

handleExport() { //导出上传模板
				const tHeader = ['物业名称', '月份', '税前', '税后'];
				const data = [];
				export_json_to_excel(tHeader, data, '用电信息上传模板');
			},
handleExportResult() { //导出校验上传结果文件
				const tHeader = ['物业名称', '月份', '税前', '税后', '校验结果', '上传结果'];
				var Enumerable = require('linq');
				const data = Enumerable.from(this.uploadData)
					.select(function(x) {
						return new Array(x.basic_name, x.fees_month, x.pretax, x.Aftertax, x.result, x.uploadResult)
					})
					.toArray();
				export_json_to_excel(tHeader, data, '用电信息上传数据校验结果');
			},

 

handleData() { //数据上传(上传导数据库了)
				if(this.result.rightCount > 0) {
					var Enumerable = require('linq');
					var uploadData = Enumerable.from(this.uploadData)
						.where(function(x) {
							return x.state == true
						})
						.select(function(x) {
							return JSON.parse('{"basic_Id":"' + x.basic_Id + '","fees_month":"' +  x.fees_month  + '","pretax":"' + x.pretax + '","Aftertax":' + x.Aftertax + '}')
						})
						.toArray();
					var uploadsize = 500; //每次上传最多记录数
					var times = Math.ceil(uploadData.length / uploadsize); //上传次数
					var execcount = 0;
					for(var i = 0; i < times; i++) {
						var patchData = Enumerable.from(uploadData)
							.skip(i * uploadsize).take(uploadsize)
							.toArray();
						let params = patchData;
						console.log(JSON.stringify(uploadData));
						var dbres = [];
						operData('property_electr_fees', params, 'add').then((res) => {
							dbres = dbres.concat(res.data);
							execcount += 1;
							if(execcount == times) {
								this.uploadResult(dbres);
							}
						}).catch(error => {
							console.log(error);
							execcount += 1;
							if(execcount == times) {
								this.uploadResult(dbres);
							}
						});
					}
				} else {
					this.$notify({
						title: '提示',
						message: '没有符合上传条件的数据!',
						type: 'warning'
					});
				}
			},
//记录上传返回结果
			uploadResult(dbres) {
				var mydata = this.uploadData;
				dbres.forEach(function(dbitem) {
					mydata.forEach(function(item) {
						if(dbitem.basic_name && item.basic_name == dbitem.basic_name) {
							item.uploadResult = '上传成功!';
							item.uploadState = true;
						}
					});
				});
				this.$notify({
					title: '信息',
					message: '上传数据完成,结果请参考数据校验表格的上传结果栏!',
					type: 'success'
				});
			},

 

getSummaries(param) { //底部验证显示
				const sums = [];
				if(this.uploadData) {
					sums[1] = '校验结果:';
					var Enumerable = require('linq');
					//记录数
					this.result.rightCount = Enumerable.from(this.uploadData).where(function($) {
						return $.state == true
					}).count();
					sums[2] = '符合要求记录数:' + this.result.rightCount;
					this.result.errCount = Enumerable.from(this.uploadData).where(function($) {
						return $.state == false
					}).count();
					sums[3] = '不符合记录数:' + this.result.errCount;
				}

				return sums;
			},

 

handleUpload(evt) { //选择上传文件并校验
				export_excel_to_json(evt).then((res) => {
					//var jsondata=res;
					const filterName = ['物业名称', '月份', '税前', '税后'];
					const filterValue = ['basic_name', 'fees_month', 'pretax', 'Aftertax'];
					const filterElse = ['"result":""', '"state":true', '"basic_Id":""', '"uploadResult":"未上传"', '"uploadState":false']

					var mydata = getFormatData(res, filterName, filterValue, filterElse);
					let orgpar = {
//						filter: {
//							where: 'id='+basic_Id,
//						}
					};
					operData('property_basics', orgpar, 'getdata').then((res) => {
						var basicsdata = res.data;
					
						var Enumerable = require('linq');
						mydata.forEach(function(item) {
							
							if(item.basic_name == null) {
							
								item.result += '物业名称不允许为空!';
								item.state = false;
							}
							if(item.fees_month == null) {
								
								item.result += '月份不允许为空!';
								item.state = false;
							}
							if(item.basic_name) {
								item.basic_Id = Enumerable.from(basicsdata)
									.where(function(x) {
										return x.basic_name == item.basic_name
									})
									.select(function(x) {
										return x.id
									})
									.toJoinedString();
									
								if(!item.basic_Id) {
									item.result += '物业名称不存在!';
									item.state = false;
								}
							} else {
								item.basic_Id = item.basic_Id
							}
						});
						
//						
						var arrEmail = Enumerable.from(mydata).where(function(x) {
							return x.state == true && x.basic_name != null
						}).select(function(x) {
							return x.basic_name
						}).toArray();
						
						var arrPhone = Enumerable.from(mydata).where(function(x) {
							return x.state == true && x.fees_month != null
						}).select(function(x) {
							return x.fees_month
						}).toArray();
						
						var chksize = 500; //每次最多记录数
						var times = Math.max(Math.ceil((arrEmail.length) / chksize), Math.ceil((arrPhone.length) / chksize)); //次数
						var execcount = 0;
						for(var i = 0; i < times; i++) {
							var patchEmail = Enumerable.from(arrEmail)
								.skip(i * chksize).take(chksize)
								.toArray();
							var patchPhone = Enumerable.from(arrPhone)
								.skip(i * chksize).take(chksize)
								.toArray();
							let params = {};
							if(patchEmail.length > 0 && patchPhone.length > 0) {
								params = {
									filter: {
										"where": {
											"or": [{
												"basic_name": {
													"inq": patchEmail
												}
											}, {
												"fees_month": {
													"inq": patchPhone
												}
											}]
										},
										"fields": ["basic_name", "fees_month"]
									}
								};
							} else if(patchEmail.length > 0) {
								params = {
									filter: {
										"where": {
											"basic_name": {
												"inq": patchEmail
											}
										},
										"fields": ["basic_name"]
									}
								};
							} else if(patchPhone.length > 0) {
								params = {
									filter: {
										"where": {
											"fees_month": {
												"inq": personPhone
											}
										},
										"fields": ["fees_month"]
									}
								};
							}
							console.log("这回"+JSON.stringify(params));

							var dbres = [];
							operData('v_property_elect_fees', params,"getdata").then((res) => {
								dbres = dbres.concat(res.data);
								console.log("这回是+"+JSON.stringify(dbres));
								execcount += 1;
								if(execcount == times) {
									//检查手机和email是否已存在于数据库中
									dbres.forEach(function(dbitem) {
										mydata.forEach(function(item) {
											if(dbitem.basic_name && item.basic_name == dbitem.basic_name&&dbitem.fees_month && item.fees_month == dbitem.fees_month) {
												item.result += '系统中已存在该物业的月份!';
												item.state = false;
											}
											
										});
									});
								}
							});
						}
						
						this.uploadData = mydata;
						console.log(JSON.stringify(this.uploadData));
						
					});
				});
			}

 

以上基本上就是全代码了

几个重要点:由于是JS,所以我的数据传递基本上是JSON格式

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue+element -UI前端Excel 文件导入数据 的相关文章

随机推荐

  • Android JNI1--C语言基础

    1 include 相当于java的导包操作 例如 include
  • vue中computed的属性对data中的属性赋值为undefined的原因

    场景 我在computed中return了一个值 然后在data中直接将它复制给另一个属性 结果data中的属性值为undefined 代码示例 timer为undefined 原因 在这里很容易想到是执行顺序的问题 computed中的属
  • sql server 中的日期计算,如当天周的第一天,当前月的第一天

    根据给定的日期 计算该日期在本月所在周数 每周的第一天为周日 但是在月末需要与下个月进行衔接 如 图2012年2月份 3月份的1 2 3号为2月份的第4周 而2月份的1 2 3 4为1月份的最后一周 第五周 declare datetime
  • linux线程间通讯----管道、信号

    进程间通讯机制 unix继承 管道 信号 system V IPC对象 共享内存 消息队列 信号灯集 1 管道 管道分为无名管道和有名管道 区别在于创建的管道是否在文件系统中不可见 无名不可见 有名可见 1 无名管道 特点 1 在创建之后再
  • 系统调用详解

    1 系统调用 1 系统调用就是为了让应用程序可以访问系统资源 每个操作系统都会提供一套接口供应用程序使用 这些接口通常通过中断来实现 例如在windows中是0x2E号中断作为系统调用入口 linux使用0x80号中断作为系统的调用的入口
  • IC数字后端

    在 innovus 里面 有时候我们需要控制 tie cell 的 fanout 和 net length 来避免 tie cell 可能出现 max transition 或者 max fanout 的违例 一般来说 只要 fanout
  • typeScritp的高级函数

    1 交叉类型 交叉类型是将多个类型合并为一个类型 这让我们可以把现有的多种类型叠加到一起成为一种类型 它包含了所需的所有类型的特性 例如 Person Serializable Loggable同时是 Person 和 Serializab
  • BSN唐斯斯:区块链是“新基建中的基建”

    5月16日 19 00 陀螺财经特别邀请到国家信息中心智慧城市发展研究中心副主任 区块链服务网络发展联盟常务副秘书长唐斯斯 为大家带来关于新基建下的区块链新机遇的思考 直播主题 新基建下的区块链新机遇 嘉宾 国家信息中心智慧城市发展研究中心
  • 智慧城管项目可行性研究报告

    后台回复 230915 可获得下载资料的方法 点击文后阅读原文 可获得下载资料的方法 欢迎加入智能交通技术群 联系方式 微信号18515441838
  • C语言中volatile关键字详解以及常见的面试问题

    编译器的优化 程序运行的优化可以分为硬件和软件 硬件上是在CPU和内存中间增加cache 来解决CPU和内存之间运行速率差异过大的问题 软件上则分为编译器优化和程序员优化 程序员优化是程序员在编写代码时 对代码的逻辑顺序进行合理安排 提升效
  • WIN10 修改用户下文件夹的名称

    转载note 我是为了解决正当防卫3不能存档 我的用户名当初设置的数字 转载的原因是 走了很多百度知道和经验的弯路 如果有人看到就别走了 我因为走了弯路前弄后弄导致原先的个人数据文件还丢失 只得跳出步骤新建用户 在PE下复制还有的数据 所以
  • 在windows系统安装linux

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 说明 二 步骤 1 利用WindowsADK安装windows 1 Windows 评估和部署工具包 ADK 包括 CopyPE 和 MakeWinPEM
  • no matching host key type found. Their offer: ssh-rsa 问题解决

    最近升级了Mac OS Ventura 13 0 1后发现ssh指定密钥登录服务器失败 no matching host key type found Their offer ssh rsa 进入当前用户的 ssh目录发现比之前系统多了一个
  • Ubuntu20.04安装qemu错误解决方法

    1 如果运行 configure显示没有找到pip sudo apt get install phthon3 pip 2 如果运行 configure显示 ninja error opening build log Permission d
  • com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别

    com mysql jdbc Driver 是 mysql connector java 5中的 com mysql cj jdbc Driver 是 mysql connector java 6中的 1 JDBC连接Mysql5 com
  • [共同学习] 平衡二叉树浅见

    平衡二叉树 平衡二叉树的概念 AVL树结点的定义 AVL树的插入 左左 右单旋 右右 左单旋 左右 先左旋 再右旋 右左 先右旋 再左旋 AVL树的验证 验证其为二叉搜索树 验证其为平衡树 AVL树的性能 AVL树的实现 感悟 以上 二叉搜
  • 三分钟实现一个react-router-dom5.0的路由拦截(导航守卫)

    不同于vue 通过在路由里设置meta元字符实现路由拦截 在使用 Vue 框架提供了路由守卫功能 用来在进入某个路有前进行一些校验工作 如果校验失败 就跳转到 404 或者登陆页面 比如 Vue 中的 beforeEnter 函数 rout
  • element upload上传视频,获取本地url地址和时长

    获取视频的时长参考了文章 https www cnblogs com 65Seeker p 11466824 html 1 URL createObjectURL 静态方法会创建一个 DOMString 其中包含一个表示参数中给出的对象的U
  • SpringBoot项目中ModelMapper配置以及使用

    项目中对象与对象赋值转换使用的频率非常的高 比如数据库表实体对象 Entity 与业务类对象 Model 之间的赋值传递 或者模型对象 Model 与视图对象 ViewModel 之间的赋值传递 如果我们一个一个字段的赋值 将是非常繁琐并且
  • vue+element -UI前端Excel 文件导入数据

    完成的效果图如下 会进行数据筛选 根据你上传的物业名称跟数据库的名称对应 在这里我用到了一个插件 需要在在main js中全局引入 import export excel to json export json to excel from