vue导入Excel数据以及导出表格数据成Excel

一、从本地Excel中导入已有的数据,以免去手动复制粘贴的麻烦

环境:vue2 + ElementUI

关键代码如下:
先是elementUI的上传控件,设置action, http-request等标签属性。由于不需要直接发请求上传到服务器,还不需要考虑跨域问题。

<el-upload
	class="upload-excel"
	action=""
	:multiple="false"
	:show-file-list="false"
	:http-request="httpRequest"
	accept="csv, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
	<el-button size="small" type="primary">Excel导入数据</el-button>
</el-upload>

“httpRequest”是自定义方法,用来处理文件中的数据
另外,需要安装 file-saver 和 xlsx

npm install -S file-saver xlsx

main.js中引入依赖

import XLSX from 'xlsx'
Vue.use(XLSX)
httpRequest(e) {
	var _this = this;
	var rABS = false; //是否将文件读取为二进制字符串
	let f = e.file // 文件信息
	if(!f) return false;
	else if(!/\.(xls|xlsx)$/.test(f.name.toLowerCase())) {
		this.$message.error('上传格式不正确,请上传xls或者xlsx格式')
		return false
	}

	var reader = new FileReader();
	FileReader.prototype.readAsBinaryString = function(f) {
		var binary = "";
		var rABS = false; //是否将文件读取为二进制字符串
		var wb; //读取完成的数据
		var outdata;
		var reader = new FileReader();
		reader.onload = function(e) {
			var bytes = new Uint8Array(reader.result);
			var length = bytes.byteLength;
			for(var i = 0; i < length; i++) binary += String.fromCharCode(bytes[i]);
			var XLSX = require('xlsx');
			if(rABS) wb = XLSX.read(btoa(fixdata(binary)), {type: 'base64'}); //手动转化
			else wb = XLSX.read(binary, { type: 'binary' });
			outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], {defval: ''}); //outdata的格式可打印了自行查看
			// 以下是对outdata的格式化,可按个人需要自行转换
			outdata.map((p, idx)=> {
				// ...
			})
		}
		reader.readAsArrayBuffer(f);
	}
	if(rABS) reader.readAsArrayBuffer(f);
	else reader.readAsBinaryString(f);
},
  • 表数据、outdata数据如下,可以看到,是按行输出的,每行是一个数据对象,其属性名取自第一行
    在这里插入图片描述
  • 如果Excel格式不标准的话,会像这样:
    在这里插入图片描述
  • 转换成自己想要的格式并显示

在这里插入图片描述

二、导出表格数据成Excel

导出Excel用的多的话,还是封装下吧,封装方案网上很多
在这里插入图片描述
如图所示,实现导出excel功能
(表格可编辑的实现见我的上篇博文:vue + elementUI动态生成表格,并实现内容可编辑

getExcel(tCols, tDatas){
  // 传入列以及数据数组, 例如:['name','gender','age'], [[‘John’,'male',22],['Jolie','female',24]]
  //列标题
     var str = '<tr>';
     tCols.forEach(p => {
     	str += `<td>${p}</td>`;
     })
     str += '</tr>';
     //循环遍历,每行加入tr标签,每个单元格加td标签
     for(let i = 0 ; i < tDatas.length ; i++ ){
       str+='<tr>';
       tDatas[i].forEach(p => {
       	str+=`<td>${p + '\t'}</td>`; //增加\t为了不让表格显示科学计数法或者其他格式
       })
       str+='</tr>';
     }
     //Worksheet名
     var worksheet = 'Sheet1'
     var uri = 'data:application/vnd.ms-excel;base64,';

     //下载的表格模板数据
     var template = `<html xmlns:o="urn:schemas-microsoft-com:office:office" 
     xmlns:x="urn:schemas-microsoft-com:office:excel" 
     xmlns="http://www.w3.org/TR/REC-html40">
     <head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
       <x:Name>${worksheet}</x:Name>
       <x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
       </x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
       </head><body><table>${str}</table></body></html>`;
     //下载模板
     window.location.href = uri + this.base64(template)
},
//输出base64编码
base64 (s) { return window.btoa(unescape(encodeURIComponent(s))) }

在这里插入图片描述
Git地址

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值