Vue+Element前端導(dǎo)入導(dǎo)出Excel
(給前端大學(xué)加星標(biāo),提升前端技能.)
1、 前言作者:xrkffgg
https://segmentfault.com/a/1190000018993619
1.1 業(yè)務(wù)場(chǎng)景
由前臺(tái)導(dǎo)入Excel表格,獲取批量數(shù)據(jù)。根據(jù)一個(gè)數(shù)組導(dǎo)出Excel表格。2、 實(shí)現(xiàn)原理
2.1 引入工具庫(kù)
file-saver、xlsx、script-loadernpm install -S file-saver xlsxnpm install -D script-loader
2.2 導(dǎo)入Excel
2.2.1 Element 上傳控件

class="upload-demo"action="":on-change="handleChange":on-exceed="handleExceed":on-remove="handleRemove":file-list="fileListUpload":limit="limitUpload"accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel":auto-upload="false">點(diǎn)擊上傳 只 能 上 傳 xlsx / xls 文 件
limitUpload = 1限制只能上傳1個(gè)文件accept為默認(rèn)打開的可上傳的文件格式handleChange(file, fileList){this.fileTemp = file.raw},handleRemove(file,fileList){this.fileTemp = null},
fileTemp這里定義了一下變量,指向最新上傳的附件,起始定義為null。這里發(fā)現(xiàn)控件
file.raw是我們要用的File類型。2.2.2 導(dǎo)入判斷
if(this.fileTemp){if((this.fileTemp.type == 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') || (this.fileTemp.type == 'application/vnd.ms-excel')){this.importfxx(this.fileTemp)} else {this.$message({type:'warning',message:'附件格式錯(cuò)誤,請(qǐng)刪除后重新上傳!'})}} else {this.$message({type:'warning',message:'請(qǐng)上傳附件!'})}
2.2.3 導(dǎo)入函數(shù)
importfxx(obj) {let _this = this;// 通過(guò)DOM取文件數(shù)據(jù)this.file = objvar rABS = false; //是否將文件讀取為二進(jìn)制字符串var f = this.file;var reader = new FileReader();//if (!FileReader.prototype.readAsBinaryString) {FileReader.prototype.readAsBinaryString = function(f) {var binary = "";var rABS = false; //是否將文件讀取為二進(jìn)制字符串var pt = this;var wb; //讀取完成的數(shù)據(jù)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)), { //手動(dòng)轉(zhuǎn)化type: 'base64'});} else {wb = XLSX.read(binary, {type: 'binary'});}outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);//outdata就是你想要的東西this.da = [...outdata]let arr = []this.da.map(v => {let obj = {}obj.code = v['設(shè)備ID']obj.type = v['設(shè)備型號(hào)']arr.push(obj)})return arr}reader.readAsArrayBuffer(f);}if(rABS) {reader.readAsArrayBuffer(f);} else {reader.readAsBinaryString(f);}},
arr就是我們要的結(jié)果,是一個(gè)數(shù)組。每一個(gè)值是個(gè)對(duì)象,包含了code?type兩個(gè)屬性。excel中格式為橫向 設(shè)備ID 和 設(shè)備型號(hào)。
2.3 導(dǎo)出Excel
2.3.1 引入JS文件
可參考下載地址-?github:https://github.com/xrkffgg/Ktools/tree/master/JS/002.Excel將其中的2個(gè)JS文件放入到自己的工程中。2.3.2 修改JS文件中地址

打開
Export2Excel.js,會(huì)出現(xiàn)如上圖所示。由于本人將Blob.js和Export2Excel.js放到了同一級(jí),這里引入是這樣的。這幾個(gè)文件不支持import引入,所以需要script-loader來(lái)將他們掛載到全局環(huán)境下。2.3.3 導(dǎo)出函數(shù)
這里的引用請(qǐng)根據(jù)自己的層級(jí)關(guān)系和文件夾命名getExcel(res) {require.ensure([], () => {const { export_json_to_excel } = require('../../introduce/Export2Excel.js')const tHeader = ['姓名', '年齡']const filterVal = ['name', 'age']const list = resconst data = this.formatJson(filterVal, list)export_json_to_excel(tHeader, data, '導(dǎo)出列表名稱')})},formatJson(filterVal, jsonData) {return jsonData.map(v => filterVal.map(j => v[j]))},
require('../../introduce/Export2Excel.js')res為傳入的數(shù)組,格式如:res =[{name:'小白',age:'18'},{name:'小黑',age:'16'}]tHeader為導(dǎo)出Excel表頭名稱,導(dǎo)出列表名稱即為導(dǎo)出Excel名稱。下載的Excel位置根據(jù)瀏覽器設(shè)置的下載位置而定。3、 后記感謝支持。若不足之處,歡迎大家指出,共勉。如果覺(jué)得不錯(cuò),記得 點(diǎn)贊 ,謝謝大家??分享前端好文,點(diǎn)亮?在看?
評(píng)論
圖片
表情
