vue+js+xlsx实现纯前端导出到入excel表格

vue+js+xlsx实现纯前端导出到入excel表格

1、js-xlsx安装

       1. npm: npm install xlsx

       2. bower: bower install js-xlsx

       3. 下载相关js,页面中直接引用(点击下载

2、到入excel,解析excel文件成为json格式,调用数据上传接口保存数据。

        直接上代码

        1.html导入按钮及input

<el-button plain size="small" class="drExcel" @click="uploadFile()">
    导入工资Excel表
</el-button>
<span id="fileInput" style="display: none">
   <input type="file" ref="inputer" @change="importFile(this)" id="imFile" style="display: 
   none" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, 
   application/vnd.ms-excel" />
</span>

         2.在data中声明要导入的文件变量,在mounted中获取到input的dom元素并赋值给data中的变量。

data: function() {
	return {
        imFile: '', // 导入文件
	}
}, 
mounted: function() {
	this.imFile = document.getElementById('imFile');
},

        3.点击导入按钮,利用input事件获取到excel文件并转换为json数据。


uploadFile: function () { // 按钮导入
	this.imFile.click()
},
importFile:function(obj) {//input事件
		let thas = this;
		// 通过DOM取文件数据
		this.file = event.currentTarget.files[0];
		var rABS = false; //是否将文件读取为二进制字符串
		var f = this.file;
		var reader = new FileReader();
		//if (!FileReader.prototype.readAsBinaryString) {
		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]);
				}
				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]]);
				this.da = [...outdata]
				let arr = []
				this.da.map(v => {
						let obj = {}
						obj.index = v.编号
						obj.nx = v.工作年限
						obj.ly = v.理由
						obj.nl = v.年龄
						obj.ifno = v.是否通过
						obj.xb = v.性别
						obj.name = v.姓名
						obj.xueli = v.学历
						obj.fs = v.总体分数
						arr.push(obj)
				 })
				 thas.tableData = arr
			}
			reader.readAsArrayBuffer(f);
		}
		if(rABS) {
			reader.readAsArrayBuffer(f);
		} else {
			reader.readAsBinaryString(f);
		}
		this.$refs.inputer.value = '';
},
fixdata: function (data) {  // 文件流转BinaryString
		var o = ''
		var l = 0
		var w = 10240
		for (; l < data.byteLength / w; ++l) {
			o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)))
		}
		o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)))
		return o
	}
},

3、导出到excel

       

downloadExl: function () {  // 导出到excel
		var arr = []
		this.tableData.map(v => {
			let obj = {}
			obj.姓名 = v.name;
			obj.编号 = v.index;
			obj.金额 = v.monthlyWages;
			obj.印花税 = v.dues;
			arr.push(obj)
		})
		var header = {header:["姓名","编号","金额","印花税"]}
		const ws = XLSX.utils.json_to_sheet(arr, header)
	  const wb = XLSX.utils.book_new()
	  XLSX.utils.book_append_sheet(wb, ws, "json数据")
	  XLSX.writeFile(wb,"json数据.xlsx")
},

4.小茗同学关于js-xlsx详解

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值