vue文件导出(excel)

173 阅读1分钟
utils/request.js
post: function (url, data,responseType) {
    return new Promise((resolve, reject) => {
      axios.post(url, data,{responseType}).then(response => {
        resolve(response)
      }).catch(error => {
        reject(error)
      })
    })
}


api/index.js
export const recordExport = (data) => {
  return request.post(`${apiYJH}api/applyRecord/recordExport`, data,'arraybuffer')
}


实际使用:
recordExport({
    ids:this.selectionIds
  }).then(res=>{
      console.log(1111,res);
      var blob = new Blob([res.data || res],{type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'})
      var downloadElement = document.createElement('a');
      var href = window.URL.createObjectURL(blob); //创建下载的链接
      downloadElement.href = href;
      downloadElement.download = '导出xlsl数据.xlsx'; // 下载后文件名
      document.body.appendChild(downloadElement);
      downloadElement.click(); // 点击下载
      document.body.removeChild(downloadElement); // 下载完成移除元素
      window.URL.revokeObjectURL(href); // 释放掉blob对象
      
      
         /*如果返回为图片时候
          let url= arrayBufferToBase64(res);//res为后台返回的ArrayBuffer
          document.getElementById('img').src='data:image/jpeg;base64,'+url;
         */
      
  }).catch(err=>{
    console.log(err ,'[[[')
  })
  • 可能会出现的问题: 请求返回的全局拦截器进行了拦截,因此可以对返回的内容进行判断来处理

    axios.interceptors.response.use((res) => {
       if (res.data.code == 200 || res.data.status_code == 200) {
           return Promise.resolve(res.data)
       } else if(res.data.code == 401) {
       ...
       } else {
           //当返回的为流文件,并且为[object Blob]的时候
           if(res.status ==200 && Object.prototype.toString.call(res.data) == '[object Blob]' ||&& Object.prototype.toString.call(res.data) == '[object ArrayBuffer]'){//解决头像html2canvas会出现的问题外联无法下载问题,解决为后台直接返回流会被这个返回拦截器拦截到错误
               return Promise.resolve(res.data)
           }
           Message.error(res.data.status_desc || 'Error');
           return Promise.reject(res.data);
       }
       }, (err) => {
           // tryHideFullScreenLoading();
           // Message({ message: err.message, type: 'error' })
           return Promise.reject(err)
    })