Vue導入excel表,導入失敗的數(shù)據(jù)自動下載
有這么一個需求:一個導入按鈕,點擊按鈕導入excel表,如果excel表中部分數(shù)據(jù)導入失敗,則自動下載該部分導入失敗數(shù)據(jù)的excel表,如果全部導入成功,則提示“導入成功”。
首先附上ElementUI的上傳文件組件
Element - The world's most popular Vue UI framework
Element,一套為開發(fā)者、設計師和產(chǎn)品經(jīng)理準備的基于 Vue 2.0 的桌面端組件庫
官網(wǎng)詳細介紹upload
組件的屬性和使用方法,就不展開了,這里主要通過使用它實現(xiàn)開篇的導入excel表的需求。(在vue項目中需要引入ElementUI
庫,詳細步驟請查閱官網(wǎng))
1、引入ElementUI上傳組件upload
<el-upload class="upload-demo" action="https://jsonplaceholder.typicode.com/posts/" multiple :auto-upload="false" :file-list="fileList" :on-change="fileChange"> <el-button type="primary">導入</el-button> </el-upload>
頁面效果
屬性介紹
屬性 | 說明 | 類型 |
---|---|---|
action | 必選參數(shù),上傳的地址 | string |
multiple | 是否支持多選文件 | boolean |
auto-upload | 是否在選取文件后立即進行上傳 | boolean |
auto-upload我們設置為false,避免自動上傳,以便使用自定義上傳方式。 | ||
file-list | 上傳的文件列表, 例如: [{name: 'food.jpg', url: 'https://xxx.cdn.com/xxx.jpg'}] | array |
on-change | 文件狀態(tài)改變時的鉤子,添加文件、上傳成功和上傳失敗時都會被調用 | function(file, fileList) |
2、點擊導入按鈕,選擇文件(點擊“打開”觸發(fā)on-change)
此時可以通過fileChange
方法在控制臺打印查看文件結構
fileChange(file,fileList){ console.log(file,'file') console.log(fileList,'fileList') }
3、此時我們已經(jīng)拿到選擇的文件,可以自定義上傳方式,將其發(fā)送至后端服務器
fileChange(file,fileList){ console.log(file,'file') console.log(fileList,'fileList') let url = 'xxx' //后端服務器API let headers = { 'Content-Type':'multipart/form-data' //自定義上傳時,該請求頭參數(shù)必填 } let formData = '' for(let i = 0;i < fileList.length;i++){ //遍歷文件數(shù)組,fileList有可能存在多個文件 formData = new FormData() formData.append('name',fileList[i].name) formData.append('type','.xlsx') formData.append('file',fileList[i].raw) } this.$axios({ headers: headers, method: 'post', data: formData, url: url, responseType:'blob' //該參數(shù)必填,不然下載下來的excel表會提示文件損壞,無法打開 }).then(res=>{ if(res && res.data.size == 0){ //若后臺不返回流,說明全部數(shù)據(jù)導入成功,提示“導入成功”,不自動下載 return } //如果后臺返回流,說明部分數(shù)據(jù)導入失敗,則自動下載導入失敗數(shù)據(jù)的excel表 let name = '導入失敗數(shù)據(jù).xlsx' //自定義下載excel表名 let blob = new Blob([res.data]) let url = window.URL.createObjectURL(blob) let aLink = document.createElement('a') aLink.style.display = 'none' aLink.href = url //download 屬性定義了下載鏈接的地址。href 屬性必須在 <a> 標簽中指定。 aLink.setAttribute('download',name) document.body.appendChild(aLink) aLink.click() document.body.removeChild(aLink) window.URL.revokeObjectURL(url) //下載結束之后可以執(zhí)行其他操作,如刷新列表、友好提示等 }) }
方法解析
formData
是ajax2.0(XMLHttpRequest Level2)新提出的接口,利用FormData
對象可以將form
表單元素的name
與value
進行組合,實現(xiàn)表單數(shù)據(jù)的序列化,從而進行表單元素的拼接,提高工作效率。append
向FormData
中添加新的屬性值,如果FormData
對應的屬性值存在則覆蓋原值,否則新增一項屬性值。
Blob
對象表示一個不可變、原始數(shù)據(jù)的類文件對象。它的數(shù)據(jù)可以按文本或二進制的格式進行讀取,也可以轉換成 ReadableStream
來用于數(shù)據(jù)操作。?
URL.createObjectURL()
靜態(tài)方法會創(chuàng)建一個 DOMString
,其中包含一個表示參數(shù)中給出的對象的URL。這個 URL 的生命周期和創(chuàng)建它的窗口中的 document
綁定。這個新的URL 對象表示指定的 File
對象或 Blob
對象。
URL.revokeObjectURL()
靜態(tài)方法用來釋放一個之前已經(jīng)存在的、通過調用 URL.createObjectURL()
創(chuàng)建的 URL 對象。當你結束使用某個 URL 對象之后,應該通過調用這個方法來讓瀏覽器知道不用在內存中繼續(xù)保留對這個文件的引用了。
總結:以上實現(xiàn)了自定義導入excel表,且自動下載接口返回的流,代碼可以直接使用,但是請注意返回的數(shù)據(jù)response
不一定與我的相同,具體看聯(lián)調接口的返回數(shù)據(jù)。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Vuerouter的beforeEach與afterEach鉤子函數(shù)的區(qū)別
本文詳細的介紹了Vuerouter的beforeEach與afterEach鉤子函數(shù)的區(qū)別和使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12