最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue如何實現(xiàn)二進(jìn)制流文件導(dǎo)出excel

 更新時間:2022年06月02日 11:19:31   作者:甜仔是只貓  
這篇文章主要介紹了vue如何實現(xiàn)二進(jìn)制流文件導(dǎo)出excel,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

vue二進(jìn)制流文件導(dǎo)出excel

問了一下其他的后端,他們公司前端是a標(biāo)簽,后端是給了一個地址,a標(biāo)簽或者window.open()都可以實現(xiàn)。

我們公司是后端返回的二進(jìn)制流文件,實現(xiàn)了一下,親測可以,沒有問題

前端代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="btn">下載</button>
    <!-- yarn add axios -->
    <script src="node_modules/axios/dist/axios.min.js"></script>
    <script>
        const btn = document.getElementById("btn");
        btn.onclick = function () {
            axios({
                method: "post",
                url: "http://localhost:3000/download",
                data: {
                    // test: "test data",
                },
                responseType: 'blob' //返回類型
            }).then((res) => {
                let name = '合格率' //注意這里不可以再加.xlsx了,函數(shù)中已經(jīng)封裝了
                createExcel(res.data, name) //這里就直接這樣調(diào)用方法就行了
            });
        }
        // vue中可以寫方法 然后再暴露出去
        function createExcel(res, name) {
            let blob = new Blob([res], {
                type: 'application/vnd.ms-excel'
            })
            let fileName = name + '.xlsx'
            // 允許用戶在客戶端上保存文件
            if (window.navigator.msSaveOrOpenBlob) { 
                navigator.msSaveBlob(blob, fileName)
            } else {
                var link = document.createElement('a')
                link.href = window.URL.createObjectURL(blob)
                link.download = fileName
                link.click()
                //釋放內(nèi)存
                window.URL.revokeObjectURL(link.href)
            }
        }
        // 1.msSaveBlob:只提供一個保存按鈕
        //window.navigator.msSaveBlob(blobObject, 'msSaveBlob_testFile.txt');
        // 2.msSaveOrOpenBlob:提供保存和打開按鈕
        // window.navigator.msSaveOrOpenBlob(blobObject, 'msSaveBlobOrOpenBlob_testFile.txt');
    </script>
</html>

后端node

const http = require("http");
const fs = require("fs");
const server = http.createServer((req, res) => {
  if (req.url === "/download") {
    res.writeHead(200, {
      "Content-type": "application/vnd.ms-excel", // 返回 excel
      // 跨域設(shè)置
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Headers": "content-type",
    });
    // 異步讀取文件內(nèi)容  這里新建了一個test.xlsx的excel
    fs.readFile("test.xlsx", (err, data) => {
      // 返回二進(jìn)制文件流
      res.end(data);
    });
  }
});
server.listen(3000, () => {
  console.log("好厲害,3000的服務(wù)器起來了");
});

關(guān)于二進(jìn)制文件流導(dǎo)出Excel文件的一些坑

實現(xiàn)下載效果

<el-button type="warning" icon="el-icon-download" size="mini" @click="download()">導(dǎo)出</el-button>
 //下載操作
        download() {
            return axios({
                url: '/download/sms',
                method: 'post',
                data: this.queryForm,
                responseType: 'blob',
                headers: {
                    'Content-Type': 'application/json'
                }
            })
                .then(res => {
                    console.log(res, '返回數(shù)據(jù)列');
                    const blob = new Blob([res.data], {
                        type: 'application/vnd.ms-excel'
                    });
                    console.log(blob, '----------0990');
                    const fileName = '短信列表.xls';
                    const linkNode = document.createElement('a');
                    linkNode.download = fileName; //a標(biāo)簽的download屬性規(guī)定下載文件的名稱
                    linkNode.style.display = 'none';
                    linkNode.href = URL.createObjectURL(blob); //生成一個Blob URL
                    document.body.appendChild(linkNode);
                    linkNode.click(); //模擬在按鈕上的一次鼠標(biāo)單擊
                    URL.revokeObjectURL(linkNode.href); // 釋放URL 對象
                    document.body.removeChild(linkNode);
                })
                .catch((err) => {
                    console.log(err);
                });
                return res;
        },

踩坑

1、剛開始看網(wǎng)上說需要axios原生才能請求,然后就引入了axios之后但是一直報錯,導(dǎo)致download的then代碼無法執(zhí)行,直接走catch,輸出錯誤

研究了半天才發(fā)現(xiàn)是blob返回沒有code,也沒有message,而我在攔截器中直接設(shè)置了code的判斷攔截,所以導(dǎo)致請求一直報錯

2、在發(fā)送請求時必須要加上responseType: ‘blob’,不然導(dǎo)出的文件是亂碼格式的

3、在then里面定義的blob new出來的數(shù)據(jù)需要再走一層,而不是直接輸出

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue3.2?中新出的Expose用法一覽

    Vue3.2?中新出的Expose用法一覽

    這篇文章主要介紹了Vue3.2?中新出的?Expose?是做啥用的,新的expose方法是非常直觀的,而且很容易在我們的組件中實現(xiàn),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • elementui實現(xiàn)表格自定義排序的示例代碼

    elementui實現(xiàn)表格自定義排序的示例代碼

    本文主要介紹了elementui實現(xiàn)表格自定義排序的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Vue編程格式化代碼屬性自動換行問題

    Vue編程格式化代碼屬性自動換行問題

    這篇文章主要為大家介紹了Vue編程格式化代碼屬性及自動換行問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 解決ant Design中this.props.form.validateFields未執(zhí)行的問題

    解決ant Design中this.props.form.validateFields未執(zhí)行的問題

    這篇文章主要介紹了解決ant Design中this.props.form.validateFields未執(zhí)行的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • 簡單了解vue中的v-if和v-show的區(qū)別

    簡單了解vue中的v-if和v-show的區(qū)別

    這篇文章主要介紹了簡單了解vue中的v-if和v-show的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • vue結(jié)合leaflet實現(xiàn)熱力圖

    vue結(jié)合leaflet實現(xiàn)熱力圖

    本文主要介紹了vue實現(xiàn)熱力圖,結(jié)合leaflet.heat插件可以很容易的做出熱力圖,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 使用Vue 實現(xiàn)滑動驗證碼功能

    使用Vue 實現(xiàn)滑動驗證碼功能

    本文章主要來介紹一下第一個階段,也就是前端校驗的驗證碼的實現(xiàn),下面來介紹一下拖動驗證碼的具體實現(xiàn)。這篇文章主要介紹了利用 Vue 實現(xiàn)滑動驗證碼,需要的朋友可以參考下
    2019-06-06
  • Vue項目之學(xué)生管理系統(tǒng)實例詳解

    Vue項目之學(xué)生管理系統(tǒng)實例詳解

    這篇文章主要為大家詳細(xì)介紹了Vue項目之學(xué)生管理系統(tǒng)實例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Vue Getters和mapGetters的原理及使用示例詳解

    Vue Getters和mapGetters的原理及使用示例詳解

    Vuex的核心概念包括state、mutations、actions、getters和modules,今天,我們要深入探討其中一個關(guān)鍵部分:getters,以及它的相關(guān)輔助函數(shù)mapGetters,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • vue3?父子組件間相互傳值方式

    vue3?父子組件間相互傳值方式

    這篇文章主要介紹了vue3?父子組件間相互傳值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06

最新評論

琼结县| 金山区| 石家庄市| 阿拉尔市| 灵丘县| 福安市| 桂平市| 西畴县| 乌拉特后旗| 博爱县| 东兴市| 剑河县| 鄱阳县| 西平县| 太白县| 和龙市| 永安市| 德清县| 潍坊市| 盘山县| 福建省| 灵璧县| 伊金霍洛旗| 湘阴县| 余江县| 西华县| 澄迈县| 石门县| 竹溪县| 隆昌县| 鄂伦春自治旗| 曲麻莱县| 大荔县| 澄城县| 定襄县| 灵川县| 涿州市| 永胜县| 女性| 宁南县| 磴口县|