不同的專案有不同的匯出需求,有些只匯出當前所顯示結果頁面的表格進入excel,這個時候就有很多插件,比如vue-json-excel或者是Blob.js+Export2Excel.js來實作匯出Excel功能,但是有些需求因為資料量太大,成千上萬條資料,所以是需要后端拼接,然后輸出二進制流檔案,然后前端直接下載,這次我們談談后者的做法,
Blob物件表示一個不可變、原始資料的類檔案物件,通常我也叫它二進制流物件,我們可以通過Blob物件實作匯出Excel功能,先放上代碼:
<el-button @click="exportExcel()">匯出</el-button> <script> methods: { exportExcel(){ var params={ XX:xx//額外需要攜帶的請求體 } this.$axios.get('/XX/XX',{ params: params, responseType: 'blob' //首先設定responseType欄位格式為 blob }).then(res => { console.log(res); let blob = new Blob([res], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"}); // 為blob設定檔案型別,這里以.xlsx為例 let url = window.URL.createObjectURL(blob); // 創建一個臨時的url指向blob物件 let a = document.createElement("a"); a.href = url; a.click(); // 釋放這個臨時的物件url window.URL.revokeObjectURL(url); }); }, } </script>
'responseType'表示的是服務器回應的資料型別,可以是'arrayBuffer'、'blob'、'document'、'json'、'txt'、'stream',默認為json,axios官方檔案地址:https://www.kancloud.cn/yunye/axios/234845(axios請求配置章節),
所以我們接收后臺傳給前端的二進制流之前需要先設定responseType為blob,否則默認會以json獲取,下載下來的檔案打開會提示檔案已損壞,控制臺輸出的可以看到是個正確的Blob物件,這就說明我們的配置是對的,如圖1所示,

圖1 控制臺輸出的Blob物件
后端最好也要配置response頭的content-type為對應的型別,所圖2所示,

圖2 后端設定了回應頭相對應的content-type
然后,需要給這個Blob物件設定一個type,這個type表明改Blob物件所包含資料的MIME型別,如果型別未知,則該值為空字串,這里給出幾個常用檔案格式的MIME型別:(詳細的可參考WebAPI官方檔案:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)
擴展名----------MIME型別
.csv--------------text/csv
.jpeg/.jpg-------image/jpeg
.png-------------image/png
.rar--------------application/x-rar-compressed
.doc-------------application/msword
.docx-----------application/vnd.openxmlformats-officedocument.wordprocessingml.document
.xls--------------application/vnd.ms-excel
.xlsx------------application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.zip--------------application/zip
在正常的匯出請求之后可以看到又發了一個新的blob請求,其本質是到這個地址下載檔案,如圖3所示:

圖3 創建一個臨時的url指向blob物件
一般來說,這樣就可以實作下載的功能了,
這里提點題外話,谷歌瀏覽器下載設定默認為瀏覽器下載默認路徑,也就不會彈出檔案框,谷歌瀏覽器下載檔案框如圖4所示,也就沒有了所謂的自定義保存路徑和自定義檔案名,如圖5所示,在瀏覽器底部會有下載提示,

圖4 谷歌瀏覽器下載檔案框

圖5 谷歌瀏覽器下載會在螢屏底部顯示
如果想要有下載檔案框,請在設定->高級->下載內容->下載前詢問每個檔案的保存位置中設定為啟用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/21681.html
標籤:JavaScript
上一篇:uni app使用mobx | uni app狀態管理mobx
下一篇:JS回圈寫法匯總
