在最近的vue项目开发中,有实现一个功能:点击导出按钮,请求后端接口,需要将后端返回的文件流导出为exel格式的。实现这个功能的过程中本来我是用form action实现,但是form action中带的参数是拼接到url上面的,参数过长,请求会报414错误,我大概查了一下是因为参数过长的原因。所以我采用直接axios post请求来实现。
首先在里面声明exportMethod函数,该函数的作用是通过发axios post请求后端导出接口,请求成功后:
1. 在成功函数里面先新建一个a标签:
const link = ('a');
2. 然后new一个Blob对象(是一个可以存储二进制文件的容器)
let blob = new Blob([], {type: 'application/x-excel'});
let blob = new Blob(arr[optional], options[optional])
第一个参数为一个数据序列,可以是任意格式的值
第二个参数用于指定将要放入Blob中的数据的类型,比如:type: 'application/x-excel' 或 type: 'text/plain'
3. 通过()方法通过传入的参数(参数:用于创建url的file对象,Blob对象或者MediaSource对象),创建一个指向该参数对象的URL,绑定到创建a标签的href属性上,
= 'none';
= (blob);
= ;
4. 然后往body上面append这个a标签,并执行a标签的点击事件,进行文件的导出,最后导出成功后,要记得把a标签从body上面移除。
(link);
();
(link);
整个的实现代码如下:
中添加exportMethod函数:
exportMethod(data) {
axios({
method: ,
url: ,
data: ,
responseType: 'blob'
}).then((res) => {
const link = ('a');
let blob = new Blob([], {type: 'application/x-excel'});
= 'none';
= (blob);
= ;
(link);
();
(link);
}).catch(error => {
this.$({
title: '错误',
desc: '网络连接错误'
});
});
}
在调用的组件中引入文件:
import utils from 'utils/';
<div class="statement-detail-exportbtn">
<button class="veui-button"
@click="exportExcel">
<span>导出</span>
</button>
</div>
exportExcel() {
let data = {
method: 'post',
url: ,
fileName: +' 结算单详情.xlsx',
params: {
settlementId:
}
};
(data);
}