前言:
用到的庫參考鏈接:
FileReader:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader 這個在之前的下載excel的隨筆中有用到
xlsx: https://www.npmjs.com/package/xlsx 本次用到讀取excel數據插件,功能很強大,文檔太大了,需要多琢磨
前端上傳excel文件,讀取Excel數據並展示成表格
通常情況下上傳文件調用后台接口,接口返回改文件的數據,前端處理展示成表格,有些需求,例如,后台只需要表格需要的數據,上傳過程后台不落庫,並不提供接口,這是就需要我們自己上傳文件讀取到改文件的數據展示,並提交給后台
1.安裝 file-saver 和 xlsx
1 npm install file-saver xlsx
2.main.js中引入依賴
1 import XLSX from 'xlsx' 2 Vue.use(XLSX)
3.用到elementUI的upload上傳控件,設置action, http-request等標簽屬性,由於不需要直接發請求上傳到服務器,暫不這是action屬性,不需要考慮跨域問題
“httpRequest”是自定義上傳方法,用來處理文件中的數據,上傳過程會觸發改方法
1 <el-upload 2 class="upload-excel" 3 action="" 4 drag 5 :http-request="httpRequest" 6 accept="csv, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"> 7 <i class="el-icon-upload"></i> 8 <div class="el-upload__text">將文件拖到此處,或<em>點擊上傳</em></div> 9 </el-upload>
4.上傳方法
1 httpRequest(e) { 2 var _this = this; 3 var rABS = false; //是否將文件讀取為二進制字符串 4 let f = e.file // 文件信息 5 if(!f) return false; 6 else if(!/\.(xls|xlsx)$/.test(f.name.toLowerCase())) { 7 this.$message.error('上傳格式不正確,請上傳xls或者xlsx格式') 8 return false 9 } 10 11 var reader = new FileReader(); 12 FileReader.prototype.readAsBinaryString = function(f) { 13 var binary = ""; 14 var rABS = false; //是否將文件讀取為二進制字符串 15 var wb; //讀取完成的數據 16 var outdata; 17 var reader = new FileReader(); 18 reader.onload = function(e) { 19 var bytes = new Uint8Array(reader.result); 20 var length = bytes.byteLength; 21 for(var i = 0; i < length; i++) binary += String.fromCharCode(bytes[i]); 22 var XLSX = require('xlsx'); 23 if(rABS) wb = XLSX.read(btoa(fixdata(binary)), {type: 'base64'}); //手動轉化 24 else wb = XLSX.read(binary, { type: 'binary' }); // 這里能獲取到所有的數據 25 outdata = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], {defval: ''}); //outdata的格式可打印了自行查看,注意這里只取到了第一個sheet的數據 26 // 以下是對outdata的格式化,可按個人需要自行轉換 27 outdata.map((p, idx)=> { 28 // ... 29 }) 30 } 31 reader.readAsArrayBuffer(f); 32 } 33 if(rABS) reader.readAsArrayBuffer(f); 34 else reader.readAsBinaryString(f); 35 },
代碼第24行中,變量wb的數據是所有的數據