文件流方式导出 Excel 表格
之前做的项目都是在不调用后台接口的情况下,将 json 数据导出到 excel 表格,纯前端去实现导出 Excel,最近做的项目,需要向后台传递不同的参数值,后台查询出符合条件的数据,以文档流的格式返回前端,前端再导出为 Excel,经查阅资料,用了两种方法实现,亲测有效。有什么写的不好的地方,望指出,大家一起进步!

第一种方法
getExcel() {
const url = 'URL地址';
this.$http.post(url, this.filter, {
responseType: 'blob'// *注意设置responseType!!!
}).then(res => {
let blob = new Blob([res.data], {
type: "application/vnd.ms-excel",
});
let objectUrl = URL.createObjectURL(blob);
window.location.href = objectUrl;
}).catch(err => {
console.warn(err);
});
},
Blob() 构造函数返回一个新的 Blob 对象。 blob 的内容由参数数组中给出的值的串联组成。
语法:var aBlob = new Blob( array, options );
Blob.type:一个字符串,表明该 Blob 对象所包含数据的 MIME 类型。如果类型未知,则该值为空字符串。
此方法的缺陷:
- 下载的 excel 文档的名字是创建的 blob 的 url,且无法使创建的 url 为固定值,在每次调用 createObjectURL() 方法时,都会创建一个新的 URL 对象
第二种(推荐)
//导出Excel
getExcel() {
const url = '你的URL';
this.$http.post(url, params, {
responseType: 'blob'
}).then(res => {
let blob = new Blob([res.data], {
type: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
})
if (window.navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob);
} else {
let elink = document.createElement('a');
elink.download = "报表.xls";
elink.style.display = 'none';
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
document.body.removeChild(elink);// 移除
}
}).catch(err => {
console.warn(err);
});
}
let element = document.createElement(tagName[, options]);在一个 HTML 文档中, Document.createElement() 方法创建由 tagName 指定的 HTML 元素
// 对创建对象进行操作
elink.download = "报表.xls";
elink.style.display = "none";
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
第二种方法可以自己设置导出 excel 的名称。利用 a 链接,最后记得对 a 链接进行移除。