vue导出excel表格-后端返回blob流文件,前端导出

最近项目遇到了导出,记录一下。

我们项目导出有俩种一种后端返回流前端处理,还有就是后端直接处理完成给一个接口(后端处理比较好一点不会造成后端xls越来越多)

流文件导出需要注意

需要加responseType: 'blob',否则文件会损坏

excel流文件一定要在请求的时候加上响应类型字段,也就是:responseType: 'blob'或者,responseType: 'arraybuffer' ,否则下载出来的excel文件就会损坏,就会打不开。损坏文件如下图所示:

vue导出excel表格-后端返回blob流文件,前端导出_第1张图片

怎么加responseType: 'blob' 或者 responseType: 'arraybuffer'

vue导出excel表格-后端返回blob流文件,前端导出_第2张图片

 我们项目有封装的API前缀所以这么加。 没有封装的话就是在axios发请求时候添加 大概是这样的

vue导出excel表格-后端返回blob流文件,前端导出_第3张图片

 前端处理文件名字接收等等

vue导出excel表格-后端返回blob流文件,前端导出_第4张图片

 

必须要声明流文件且得到的结果用流文件转一下,这样的话,就不会出现excel文件损坏、或者乱码的情况。

  // 导出按钮的回调函数中
  async ExcelData() {
      // 准备参数
      let params = xxx
      const res = await this.$api.export(params);
      const blob = new Blob([res]);  // 把得到的结果用流对象转一下
      var downloadElement = document.createElement("a"); //创建一个标签
      downloadElement.href = URL.createObjectURL(blob); // 将流文件写入a标签的href属性值
      downloadElement.download = "文件名.xlsx"; //设置文件名
      downloadElement.style.display = "none";  // 藏起来a标签
      downloadElement.body.appendChild(a); // 将a标签追加到文档对象中
      downloadElement.click(); // 模拟点击了a标签,会触发a标签的href的读取,浏览器就会自动下载了
      downloadElement.remove(); // 一次性的,用完就删除a标签
    },

你可能感兴趣的:(vue.js,前端)