vue導(dǎo)出excel的兩種實(shí)現(xiàn)方式代碼
目前使用
handleExport () { this.exportName = `通訊錄` let params = tools.deepClone(this.searchParams) params.search.size = this.total 接口請(qǐng)求地址(params).then(res => { const href = window.URL.createObjectURL(new Blob([res])) const link = document.createElement('a') link.style.display = 'none' link.href = href link.setAttribute('download', this.exportName + '.xls') document.body.appendChild(link) link.click() document.body.removeChild(link) // 下載完成移除元素 window.URL.revokeObjectURL(href) // 釋放掉blob對(duì)象 }).catch(err => { this.$message.error(err) }) },
需求說(shuō)明
通過(guò)vue實(shí)現(xiàn)導(dǎo)出有兩種方式:
(1)后端返回的是一個(gè)地址,直接拼接打開(kāi)下載就行
(2)后端返回的是文件流的形式,這個(gè)時(shí)候就需要在請(qǐng)求頭還有返回值的地方設(shè)置一下
一、后端返回的是地址
// 頁(yè)面代碼 <el-button type="primary" size="mini" class="filter-item" icon="el-icon-download" style="margin: 12px 20px 0 0; float: right" @click="onExportClick" > 導(dǎo)出 </el-button> onExportClick() {//導(dǎo)出方法 exportDevices(this.listQuery) //導(dǎo)出接口 .then(result => { const url = result.data window.open(url) //通過(guò)這個(gè)打開(kāi)網(wǎng)頁(yè)就可下載導(dǎo)出 }) .catch(err => console.log(err)) }
二、后端返回的是文件流
(1)設(shè)置請(qǐng)求頭
/** * 按照部門(mén)人員導(dǎo)出(包括事件類型) * @param {*} pType * @returns */ export function exportDetailOrder(pType) { return request({ url: '/exportEventDetailByDepart', method: 'get', responseType: 'blob', //需要在此處設(shè)置請(qǐng)求頭,設(shè)置請(qǐng)求的類型為blob文件流的形式 params: { pType } }) }
(2)設(shè)置返回結(jié)果,處理返回我文件流
onExportClick() { //導(dǎo)出的方法 exportDetailOrder(this.pType) //導(dǎo)出的接口 .then(result => { console.log(result) const link = document.createElement('a') //創(chuàng)建a標(biāo)簽 const blob = new Blob([result], { type: 'application/vnd.ms-excel' }) //設(shè)置文件流 link.style.display = 'none' // 設(shè)置連接 link.href = URL.createObjectURL(blob) //將文件流轉(zhuǎn)化為blob地址 link.download = '處理人員維修工單統(tǒng)計(jì)報(bào)表' document.body.appendChild(link) // 模擬點(diǎn)擊事件 link.click() //設(shè)置點(diǎn)擊事件 }) .catch(err => { console.log(err) }) }
(3)附加說(shuō)明
有的時(shí)候做到上述幾步還是不能導(dǎo)出,debugger之后,發(fā)現(xiàn)接口調(diào)用的時(shí)候直接走的.catch,沒(méi)走.then,所以需要我們?cè)谌猪憫?yīng)攔截做一些判斷。
//一般在utils下面的requext.js文件里面 export function validResponse(res, errorMessage) { if (res instanceof Blob) { //如果返回的是文件流的形式,直接return res return res } else if (res.code !== 200 && res.code !== 201 && res.code !== 204) { return Promise.reject(new Error(res.message || '發(fā)生錯(cuò)誤!')) } else { return res } }
目前用的:
handleExport() { let me = this let url = '/fcst/gpcprevention/exportGpcSummary' let filename = me.reportname let exportparams = { taskyear: utils.formatDate(me.searchParams.taskyear, 'yyyy'), reportid: me.searchParams.reportid, char1:me.searchParams.char1, } utils.onDownload(me, url, filename, exportparams); }
utils.onDownload方法:
utils.onDownload = function (vm,url,filename,searchParams) { let params = utils.addFormData(searchParams); vm.$axios( { method: 'post', url: url, data: params, responseType: 'blob' } ).then(function(res) { let href = window.URL.createObjectURL(new Blob([res])); let link = document.createElement('a'); link.style.display = 'none'; link.href = href; link.setAttribute('download', filename + '.xls'); document.body.appendChild(link); link.click(); document.body.removeChild(link); // 下載完成移除元素 window.URL.revokeObjectURL(href); // 釋放掉blob對(duì)象 }); };
總結(jié)
到此這篇關(guān)于vue導(dǎo)出excel的兩種實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)vue導(dǎo)出excel內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于el-scrollbar滾動(dòng)條初始化不顯示的問(wèn)題及解決
這篇文章主要介紹了關(guān)于el-scrollbar滾動(dòng)條初始化不顯示的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08使用Element的InfiniteScroll 無(wú)限滾動(dòng)組件報(bào)錯(cuò)的解決
這篇文章主要介紹了使用Element的InfiniteScroll 無(wú)限滾動(dòng)組件報(bào)錯(cuò)的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07基于vue2實(shí)現(xiàn)簡(jiǎn)單的答題組件
這篇文章主要為大家詳細(xì)介紹了如何基于vue2實(shí)現(xiàn)簡(jiǎn)單的答題組件,點(diǎn)擊正確的選項(xiàng),該選項(xiàng)背景變綠色;點(diǎn)擊錯(cuò)誤的選項(xiàng),該選項(xiàng)背景變紅色,有需要的可以參考下2024-12-12Vue ElementUi同時(shí)校驗(yàn)多個(gè)表單(巧用new promise)
這篇文章主要介紹了巧用new promise實(shí)現(xiàn)Vue ElementUi同時(shí)校驗(yàn)多個(gè)表單功能,實(shí)現(xiàn)的方法有很多種,本文給大家?guī)?lái)的是一種比較完美的方案,需要的朋友可以參考下2018-06-06解決vue項(xiàng)目打包后提示圖片文件路徑錯(cuò)誤的問(wèn)題
這篇文章主要介紹了解決vue項(xiàng)目打包后提示圖片文件路徑錯(cuò)誤的問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07Vue3中實(shí)現(xiàn)發(fā)送網(wǎng)絡(luò)請(qǐng)求功能(最新推薦)
Axios是一個(gè)基于Promise的HTTP客戶端,可以在瀏覽器和Node.js中用于發(fā)送HTTP請(qǐng)求,本文主要介紹在Vue3中實(shí)現(xiàn)發(fā)送網(wǎng)絡(luò)請(qǐng)求功能,感興趣的朋友一起看看吧2023-12-12Vue3+TypeScript實(shí)現(xiàn)二維碼生成組件
在?Web?應(yīng)用中,生成二維碼是常見(jiàn)的需求,本文介紹如何用?Vue3?和?TypeScript?開(kāi)發(fā)一個(gè)二維碼生成組件,支持生成圖片或?canvas?形式的二維碼,并提供豐富的配置選項(xiàng),感興趣的小伙伴跟著小編一起來(lái)看看吧2024-04-04