vue 导出excel表格

1,863 阅读1分钟

文件流方式导出 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 - Web API 接口 | MDN

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 链接进行移除。