前提:在我的項目中我使用的是ElementUi前端UI框架,用到的是里面的Upload上傳組件。
第一步:需要安裝三個依賴
npm install -S file-saver xlsx (這里其實安裝了2個依賴)
npm install -D script-loader
第二步:在main.js文件中全局導入掛載xlsx插件
// 導入excel插件
import XLSX from 'xlsx'
Vue.prototype.XLSX = XLSX
第三步:在src目錄新建一個文件夾(名字隨意),在這個文件夾里面放入2個JS文件分別是:Blob.js和Export2Excel.js,網上可百度下載。
第四步,需要的頁面的template標簽中開始寫代碼(我先寫導入的代碼)
<!-- 導入Excel --> <el-upload action="/上傳文件的接口" :on-change="onChange" :auto-upload="false" :show-file-list="false" accept=".xls, .xlsx" > <el-button type="warning" icon="el-icon-folder-add">批量導入</el-button> </el-upload>
第五步:然后在 methods: {}中配置方法,代碼如下:
1 // ----------以下為導入Excel數據功能-------------- 2 // 文件選擇回調 3 onChange(file, fileList) { 4 console.log(fileList); 5 this.fileData = file; // 保存當前選擇文件 6 this.readExcel(); // 調用讀取數據的方法 7 }, 8 // 讀取數據 9 readExcel(e) { 10 console.log(e); 11 let that = this; 12 const files = that.fileData; 13 console.log(files); 14 if (!files) { 15 //如果沒有文件 16 return false; 17 } else if (!/\.(xls|xlsx)$/.test(files.name.toLowerCase())) { 18 this.$message.error("上傳格式不正確,請上傳xls或者xlsx格式"); 19 return false; 20 } 21 const fileReader = new FileReader(); 22 fileReader.onload = ev => { 23 try { 24 const data = ev.target.result; 25 // console.log(data) 26 const workbook = this.XLSX.read(data, { 27 type: "binary" 28 }); 29 console.log(workbook.SheetNames); 30 if (workbook.SheetNames.length >= 1) { 31 this.$message({ 32 message: "導入數據表格成功", 33 showClose: true, 34 type: "success" 35 }); 36 } 37 const wsname = workbook.SheetNames[0]; //取第一張表 38 const ws = this.XLSX.utils.sheet_to_json(workbook.Sheets[wsname]); //生成json表格內容 39 console.log(ws); 40 that.outputs = []; //清空接收數據 41 for (var i = 0; i < ws.length; i++) { 42 var sheetData = { 43 // 鍵名為綁定 el 表格的關鍵字,值則是 ws[i][對應表頭名] 44 id: ws[i]["id"], 45 stuNumber: ws[i]["學號"], 46 stuName: ws[i]["姓名"], 47 sex: ws[i]["性別"], 48 tel: ws[i]["電話"], 49 xueyuan: ws[i]["學院"], 50 banji: ws[i]["班級"], 51 lyNumber: ws[i]["樓宇號"], 52 sushe: ws[i]["宿舍號"] 53 }; 54 that.studentlist.unshift(sheetData); 55 } 56 this.$refs.upload.value = ""; 57 } catch (e) { 58 return false; 59 } 60 }; 61 // 如果為原生 input 則應是 files[0] 62 fileReader.readAsBinaryString(files.raw); 63 },
此時導入的功能就結束了,下面開始實現導出的功能
第一步,在template標簽中寫入導出的按鈕,並綁定單擊事件,代碼如下:
<el-button type="warning" icon="el-icon-download" @click="exportToExcel">批量導出</el-button>
第二步:在methods{}方法中寫對應的方法
1 // ----------以下為導出Excel數據功能-------------- 2 exportToExcel() { 3 //excel數據導出 4 require.ensure([], () => { 5 const { export_json_to_excel } = require("../../excel/Export2Excel"); 6 const tHeader = [ 7 "id", 8 "學號", 9 "姓名", 10 "性別", 11 "聯系電話", 12 "宿舍號", 13 "學院", 14 "班級", 15 "樓宇號" 16 ]; 17 const filterVal = [ 18 "id", 19 "stuNumber", 20 "stuName", 21 "sex", 22 "tel", 23 "sushe", 24 "xueyuan", 25 "banji", 26 "lyNumber" 27 ]; 28 const list = this.studentlist; 29 const data = this.formatJson(filterVal, list); 30 export_json_to_excel(tHeader, data, "學生列表excel"); 31 }); 32 }, 33 formatJson(filterVal, jsonData) { 34 return jsonData.map(v => filterVal.map(j => v[j])); 35 },
https://www.bilibili.com/video/BV1H7411N7Qq/?spm_id_from=333.788.videocard.0