js 導(dǎo)出excel文件(含json格式的失敗數(shù)據(jù)處理)

一般來說,導(dǎo)出有2種實現(xiàn)方式:

  1. 直接放a標簽里,通過href屬性向后端發(fā)送請求導(dǎo)出
<a href="url">導(dǎo)出</a>

很明顯的缺點:文件名不正確,是一串字符串。所以需要使用第二種方法。

  1. 需要進行數(shù)據(jù)處理的情況:手動 coding 發(fā)送請求的代碼,將返回的 blob 對象導(dǎo)出。
    問題來了:如何導(dǎo)出呢?好像沒有思路-_-
    好好思考:
    • 由方法一知:a標簽可以直接導(dǎo)出。
      那么js應(yīng)該可以模擬一個a標簽。
    • url哪里來呢?
      createObjectURL可以將blob對象轉(zhuǎn)換為url,可以像普通的 url 一樣使用。
    • 最后一個問題:如何導(dǎo)出excel格式呢?
      MDN告訴我:用Blob 構(gòu)造函數(shù)聲明MIME類型就好。

思路整理好了,一步步實現(xiàn)唄:

this.$axios.get("XXX", {
      params,
      responseType: "blob",
})
.then((res) => {
      let blob = new Blob([res.data], {
           type: "application/vnd.ms-excel",
      });
      let fileName = "導(dǎo)出.xls";
      let link = document.createElement("a");
      link.href = window.URL.createObjectURL(blob);
      link.download = fileName;
      link.click();
      // 移除url
      window.URL.revokeObjectURL(link.href);
      //移除標簽
      document.body.removeChild(link)
})

ps:一個編碼好習慣:及時清除已執(zhí)行完的變量,釋放內(nèi)存。

試了下,可以正確導(dǎo)出了。

正暗自歡喜已解決導(dǎo)出問題時,打開導(dǎo)出的excel一看:

excel

快樂沒了

這啥???401?這不是接口給的登錄提示信息么?而且是json 類型呀?o~o,忘記錯誤處理了。。。

看了下此刻接口的返回情況:

401

type 已然變?yōu)?code>json類型,但是data 還是blob類型,怎么從blob中提取json數(shù)據(jù)呢?

FileReader

MDN 給了答案:使用FileReader。

那就試一下,完善下上面的代碼:

this.$axios.get("XXX", {
       params,
       responseType: "blob",
}).then((res) => {
       if (res.data.type === "application/json") {
          // 返回的格式是json類型,轉(zhuǎn)換為json
          const reader = new FileReader();
          const self = this;
          // 讀取操作完成時觸發(fā)
          reader.onload = function () {
               const resData = this.result && JSON.parse(this.result);
               self.$message.error({
                   showClose: true,
                   message: (resData && resData.msg) || "導(dǎo)出失敗"
               });
          };
          reader.onerror = (event) => {
                self.$message.error({
                      showClose: true,
                      message: reader.error
                });
          };
          reader.readAsText(res.data); //a text string
       } else {
          let blob = new Blob([res.data], {
              type: "application/vnd.ms-excel",
          });
          let fileName = "導(dǎo)出.xls";
          let link = document.createElement("a");
          link.href = window.URL.createObjectURL(blob);
          link.download = fileName;
          link.click();
          // 移除url
          window.URL.revokeObjectURL(link.href);
          //移除標簽
          document.body.removeChild(link);
       }
});

完美收官!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 管理平臺經(jīng)常會遇到導(dǎo)出報表的功能,總結(jié)下實現(xiàn)方式。 平臺返回下載鏈接 最簡單的處理方式: window.open(...
    baxiamali閱讀 500評論 0 0
  • 1.用axios做接口請求。2.URL.createObjectURL() 靜態(tài)方法會創(chuàng)建一個 DOMString...
    冰雪_666閱讀 1,158評論 0 2
  • 一般情況下,想要實現(xiàn)文件下載/導(dǎo)出功能,需要在前端把數(shù)據(jù)發(fā)到服務(wù)端或者發(fā)送下載請求到服務(wù)端,然后由服務(wù)端通過獲取數(shù)...
    xlaoyu閱讀 5,851評論 2 50
  • 前言 現(xiàn)在許多視頻在線觀看網(wǎng)站,你如果打開chrome查看其video標簽,會發(fā)現(xiàn)它的src是一個以blob:開頭...
    ITgecko閱讀 21,395評論 2 10
  • 窗口相關(guān)API alert 彈窗,要注意的是其在彈窗中展示內(nèi)容是會隱式調(diào)用內(nèi)容的toString()方法,因此像對...
    dawsonenjoy閱讀 505評論 0 0

友情鏈接更多精彩內(nèi)容