前端导出后台Excel的方式
场景
前端导出按钮点击,下载从后端返回的Excel文件
方案
- 后端返回的是二进制文件的话,Window.open(
req.url?param=x
)可以直接下载
这种方式的缺点是,不能针对后端返回情况做处理。
- 使用blob对象处理后端返回数据,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31this.$ajax({
url:'reqUrl',
method:'get', //post
responseType: 'blob' //这里必须指明响应类型
}).then(ret=>{
if(ret.data.type == 'application/json'){
//todo
}else{
let filename = ret.headers['content-disposition']
.split(';')[1]
.split('filename=')[1]
.split('.xlsx')[0]
//后端给的文件名可能带有中文,到前端会自动编码(URI),这里解码一下
this.exportExcel(ret.data, decodeURI(filename))
}
})
// 模仿自动下载
exportExcel(blobData, filename) {
const link = document.createElement('a')
let blob = new Blob([blobData], {
type:
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
})
link.style.display = 'none'
link.href = URL.createObjectURL(blob)
console.log(link.href)
link.download = filename
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
}