Vue無后端配合實現(xiàn)導(dǎo)出功能的示例代碼
正常導(dǎo)出是后端來做,我們?nèi)フ{(diào)用后端接口,會返回給我們文件(前端即:axios請求,設(shè)置responseType: 'blob',然后創(chuàng)建一個a標(biāo)簽,通過window.URL.createObjectURL將blob轉(zhuǎn)為一個路徑,為a標(biāo)簽增加download屬性,給其一個文件名稱,執(zhí)行click事件即可下載);但是沒有后端的情況下怎么做呢?下面來簡單介紹一下:
首先安裝兩個插件
npm i file-saver -S npm i xlsx -S
封裝一下
method.js
import * as XLSX from 'xlsx' import FileSaver from 'file-saver' // 導(dǎo)出Excel(根據(jù)表格當(dāng)前的數(shù)據(jù)進(jìn)行導(dǎo)出) export function exportExcel1(dom, fileName) { // 前面這五行代碼作用就是去掉導(dǎo)出重復(fù)的表 就是導(dǎo)出的時候我這邊會導(dǎo)出兩個一樣的表格,可能是因為右側(cè)的fixed導(dǎo)致的,所以在導(dǎo)出的時候要刪除掉 let tableDom = dom.cloneNode(true) let elTableFixedRight = tableDom.querySelector(".el-table__fixed-right") let elTableFixed = tableDom.querySelector(".el-table__fixed") if(elTableFixedRight) tableDom.removeChild(elTableFixedRight); if(elTableFixed) tableDom.removeChild(elTableFixed); let wb = XLSX.utils.table_to_book(tableDom, { raw: true }) let wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' }) try { FileSaver.saveAs( new Blob([wbout], { type: "application/octet-stream" }), fileName); } catch(e) { console.error(e, wbout, '----->>>') } } // 導(dǎo)出Excel (根據(jù)數(shù)據(jù) 自定義導(dǎo)出 一般表格會分頁展示數(shù)據(jù),如果按照上面的方式 只會導(dǎo)出當(dāng)前頁的,如果想導(dǎo)出所有數(shù)據(jù) 就使用該方法) export function exportExcel(tableList, fileName) { let tableData = [['故障報警', '設(shè)備名稱', '故障內(nèi)容', '系統(tǒng)', '狀態(tài)', '開始時間', '結(jié)束時間']] tableList.forEach(item => { tableData.push([ item.alarm, item.equipname, item.point, item.system, item.status, item.starttime, item.endtime ]) }) let ws = XLSX.utils.aoa_to_sheet(tableData) let wb = XLSX.utils.book_new() XLSX.utils.book_append_sheet(wb, ws) let wbout = XLSX.write(wb, { bookType: 'xlsx', bookSST: true, type: 'array' }) try { FileSaver.saveAs( new Blob([wbout], { type: "application/octet-stream" }), fileName); } catch(e) { console.error(e, wbout, '----->>>') } } // 暫時沒用下面這兩個方法(也是可以的) // 將一個sheet轉(zhuǎn)成最終的excel文件的blob對象,然后利用URL.createObjectURL下載 export function sheet2blob(dom, sheetName) { // 前面五行代碼作用就是去掉導(dǎo)出重復(fù)的表 就是導(dǎo)出的時候我這邊會導(dǎo)出兩個一樣的表格,可能是因為右側(cè)的fixed導(dǎo)致的,所以在導(dǎo)出的時候要刪除掉 let tableDom = dom.cloneNode(true) let elTableFixedRight = tableDom.querySelector(".el-table__fixed-right") let elTableFixed = tableDom.querySelector(".el-table__fixed") if(elTableFixedRight) tableDom.removeChild(elTableFixedRight); if(elTableFixed) tableDom.removeChild(elTableFixed); const sheet = XLSX.utils.table_to_sheet(tableDom);//將一個table對象轉(zhuǎn)換成一個sheet對象 sheetName = sheetName || 'sheet1'; var workbook = { SheetNames: [sheetName], Sheets: {} }; workbook.Sheets[sheetName] = sheet; // 生成excel的配置項 var wopts = { bookType: 'xlsx', // 要生成的文件類型 bookSST: false, // 是否生成Shared String Table,官方解釋是,如果開啟生成速度會下降,但在低版本IOS設(shè)備上有更好的兼容性 type: 'binary' }; var wbout = XLSX.write(workbook, wopts); var blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" }); // 字符串轉(zhuǎn)ArrayBuffer function s2ab(s) { var buf = new ArrayBuffer(s.length); var view = new Uint8Array(buf); for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; return buf; } return blob; } export function openDownloadDialog(url, saveName) { if (typeof url == 'object' && url instanceof Blob) { url = URL.createObjectURL(url); // 創(chuàng)建blob地址 } var aLink = document.createElement('a'); aLink.href = url; aLink.download = saveName || ''; // HTML5新增的屬性,指定保存文件名,可以不要后綴,注意,file:///模式下不會生效 var event; if (window.MouseEvent) event = new MouseEvent('click'); else { event = document.createEvent('MouseEvents'); event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); } aLink.dispatchEvent(event); }
組件中使用(按需引入)
<el-button icon="el-icon-download" @click="downloadTpl()" size="small">導(dǎo)出</el-button> <el-table id="myTable" :data="dataList" size="medium" border @selection-change="selectionChangeHandle" v-loading="loading" class="table" > <!-- ... --> </el-table>
import { exportExcel, sheet2blob, openDownloadDialog } from './method' export default { methods: { // 導(dǎo)出 exportExcel() { exportExcel(document.getElementById('myTable'), '故障及報警.xlsx') //這個只需要 XLSX 庫 應(yīng)該也是可以的,我這邊暫時沒用 // openDownloadDialog(sheet2blob(document.getElementById('myTable')), '故障及警.xlsx') } } }
以上就是Vue無后端配合實現(xiàn)導(dǎo)出功能的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Vue導(dǎo)出功能的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue3?Error:Unknown?variable?dynamic?import:?../views/的解
這篇文章主要給大家介紹了關(guān)于vue3?Error:Unknown?variable?dynamic?import:?../views/的解決方案,文中通過圖文以及實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Vue調(diào)試工具vue-devtools的安裝與使用
vue-devtools是專門調(diào)試vue項目的調(diào)試工具,安裝成功之后,右邊會出現(xiàn)一個vue,就可以在線可以調(diào)試vue了,下面這篇文章主要給大家介紹了關(guān)于Vue調(diào)試工具vue-devtools的安裝與使用的相關(guān)資料,需要的朋友可以參考下2022-07-07對Vue beforeRouteEnter 的next執(zhí)行時機(jī)詳解
今天小編就為大家分享一篇對Vue beforeRouteEnter 的next執(zhí)行時機(jī)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08