Vue結(jié)合java后臺(tái)詳解導(dǎo)出Excel亂碼問題(二進(jìn)制文件流)

Vue結(jié)合后臺(tái)詳解導(dǎo)入導(dǎo)出Excel問題

一連十六卦,卦卦皆無(wú)你,罷了,殺了那算命的~

今天講講 前臺(tái)Vue配合后臺(tái)(java)導(dǎo)出Excel 后臺(tái)返回的數(shù)據(jù)是 二進(jìn)制文件流 如何將此變?yōu)?彈框下載

當(dāng)時(shí)開發(fā)呢,我們后臺(tái)是java 有控件 可以直接將數(shù)據(jù)導(dǎo)出并生成Excel文件,但是前后臺(tái)傳輸是不可能直接傳輸文件的,是以二進(jìn)制文件流進(jìn)行傳輸?shù)?此時(shí)呢就會(huì)遇到一個(gè)問題,因?yàn)槭呛笈_(tái),必然會(huì)涉及到權(quán)限,權(quán)限就涉及到token,token傳輸就會(huì)出現(xiàn)限制問題,所以我會(huì)列出三種方法

我的是Vue項(xiàng)目~~

  1. 不需要token的方法
<template>
             <div>
                <el-button @click="downloadFile" type="primary">導(dǎo)出 Excel</el-button> 
                <iframe id="ifile" style="display:none"></iframe>
            </div>
         </template>
         <script>
         methods:{
                // 導(dǎo)出 Excel
                downloadFile() {
                    var dom=document.getElementById('ifile');
                    dom.src= this.downloadFileUrl +`/pay/exportExcel?userId=${this.form.userId}&orderNumber=${this.form.orderNumber}&stime=${this.form.stime}&etime=${this.form.etime}&status=${this.form.status}&payChannel=${this.form.payChannel}`;
                }
            },
        </script>

這個(gè)的意思呢就是寫一個(gè)類似的隱藏域 ifram 標(biāo)簽獨(dú)有的特性 , 不明白的可以去W3cschool 查一查, 后面拼接的參數(shù)就是導(dǎo)出條件,按個(gè)人需要進(jìn)行,這個(gè)親測(cè)有效!

2.第二種就涉及到token了 , 就是使用javascript的內(nèi)置對(duì)象來(lái)解析,方法就是使用axios請(qǐng)求 請(qǐng)求過(guò)來(lái)的二進(jìn)制文件流進(jìn)行解析

    // 導(dǎo)出 Excel
    downloadFile() { // 這是methods中的方法
        downLoadPayListFn({...this.form}).then(res => { // 這個(gè)是我封裝的方法 就是通過(guò)axios請(qǐng)求進(jìn)行攔截 添加token  form是data中的數(shù)據(jù) 也就是篩選條件 
            const fileName = '測(cè)試表格123.xls';
            if ('download' in document.createElement('a')) { // 非IE下載
                const blob = new Blob([res], {type: 'application/ms-excel'});
                const elink = document.createElement('a');
                elink.download = fileName;
                elink.style.display = 'none';
                elink.href = URL.createObjectURL(blob);
                document.body.appendChild(elink);
                elink.click();
                URL.revokeObjectURL(elink.href); // 釋放URL 對(duì)象
                document.body.removeChild(elink);
            }
        })
    },

這個(gè)blob是js的內(nèi)置對(duì)象 就是將其轉(zhuǎn)化為文件 詳情解釋可以去查 blob

import fetch from 'utils/fetch';
import Qs from 'qs';

// 導(dǎo)出數(shù)據(jù)
export function downLoadPayListFn(obj) {
    return fetch({
        url: '/admin/pay/exportExcel',
        method: 'get',
        params: obj,
        responseType: 'blob',
        /* header: {
            'Content-Type': "application/x-www-form-urlencoded; charset=utf-8"
        } */
    });
}

在這里一定要加上  responseType: 'blob',否則不會(huì)生效 切記!!!!

看網(wǎng)上寫的是這個(gè)樣子 當(dāng)然也根據(jù)后臺(tái)返回給你的數(shù)據(jù)進(jìn)行展示 餓哦們后臺(tái)返回的數(shù)據(jù)沒有進(jìn)行包裝 所以直接就是response,搞就完事了.

3.第三種方法 使用form 表單提交 隱藏域使用

    <template>
        <div id="rechargeRecord">
            <!-- 支付管理 -->
            <div class="title">
                <el-form  label-width="100px">
                    <form class="form" :action="downloadFileUrl+`/pay/exportExcel`" method="post">
                        <input type="hidden" name="userId"      :value="form.userId">      <!-- 用戶id -->
                        <input type="hidden" name="orderNumber" :value="form.orderNumber"> <!-- 訂單單號(hào) -->
                        <input type="hidden" name="stime"       :value="form.stime">       <!-- 時(shí)間 -->
                        <input type="hidden" name="etime"       :value="form.etime">       <!-- 時(shí)間 -->
                        <input type="hidden" name="status"      :value="form.status">      <!-- 交易狀態(tài)(1開始,2進(jìn)行中融欧,3失敗霎苗,4成功) -->
                        <input type="hidden" name="type"        :value="form.type">        <!-- 支付類型(1.扣除  2.返還 3.轉(zhuǎn)換 4.贈(zèng)送) -->
                        <input type="hidden" name="ctimeState"  :value="form.ctimeState">  <!-- 創(chuàng)建時(shí)間狀態(tài)(1:正序、2:倒序) -->
                        <input type="hidden" name="payChannel"  :value="form.payChannel">  <!-- 支付渠道 -->
                        <input type="hidden" name="token"  :value="token">  <!-- 支付渠道 -->
                        <input type="submit" value="導(dǎo)出 Excel"  @click="submitBtn(event)" class="submit" >
                    </form>
                </el-form>
            </div>
        </div>
    </template>
    <script>
        import { getPayListFn, downLoadPayListFn } from 'api/game/money/rechargeRecord';
        import { mapGetters } from "vuex";
        import { getToken } from "utils/auth.js"; // 這是我自己封裝的方法 獲取token的方法
        export default {
            data(){
                return{
                    form: {
                        pageIndex: 1, // 當(dāng)前頁(yè)數(shù)
                        pageSize: 10, //請(qǐng)求行數(shù)
                        userId: '',   // 用戶id
                        orderNumber: '', // 訂單單號(hào)
                        stime: '', // 創(chuàng)建時(shí)間(開始)
                        etime: '', // 創(chuàng)建時(shí)間(結(jié)束)
                        status: '', // 交易狀態(tài)(1開始窟社,2進(jìn)行中,3失敗绪钥,4成功)
                        type:   '', // 支付類型(1.扣除  2.返還 3.轉(zhuǎn)換 4.贈(zèng)送)
                        ctimeState: '', // 創(chuàng)建時(shí)間狀態(tài)(1:正序灿里、2:倒序)
                        payChannel: '', // 支付渠道
                    },
                    token: getToken() , // 這里獲取token
                }
            },
            // 頁(yè)面一加載的時(shí)候
            created() {
                this.getdata();
            },
            methods:{
                submitBtn(e) {
                    e.preventDefault(); // 這個(gè)必須要有, 不然不生效
                    return false; // 這個(gè)必須要有, 不然不生效
                }
            },
        }
    </script>
    <style rel="stylesheet/scss" scoped>
        .form {
            display: inline-block;
            border-color: #20a0ff;
            margin-left: 0.6rem;
        }
        .submit {
            line-height: 1;
            white-space: nowrap;
            cursor: pointer;
            background: #fff;
            border: 1px solid #c4c4c4;
            color: #1f2d3d;
            margin: 0;
            padding: 10px 15px;
            border-radius: 4px;
            border-color: #20a0ff;
        }
    </style>

這個(gè)就需要后臺(tái)配合配置一下網(wǎng)關(guān),如果有header中有token的話就去header中取 沒有的話就去參數(shù)中取,這個(gè)親測(cè)好使,
這里附上我的qq : 2489757828 有問題可以咨詢我
我的私人博客 李大玄

一見鐘情太膚淺
日久生情太蒼白
別人眉來(lái)眼去
我呀 只偷看你一眼!

在這里插入圖片描述

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末程腹,一起剝皮案震驚了整個(gè)濱河市匣吊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖色鸳,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件社痛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡命雀,警方通過(guò)查閱死者的電腦和手機(jī)蒜哀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咏雌,“玉大人凡怎,你說(shuō)我怎么就攤上這事∩薅叮” “怎么了统倒?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)氛雪。 經(jīng)常有香客問我房匆,道長(zhǎng),這世上最難降的妖魔是什么报亩? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任浴鸿,我火速辦了婚禮,結(jié)果婚禮上弦追,老公的妹妹穿的比我還像新娘岳链。我一直安慰自己,他們只是感情好劲件,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布掸哑。 她就那樣靜靜地躺著,像睡著了一般零远。 火紅的嫁衣襯著肌膚如雪苗分。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天牵辣,我揣著相機(jī)與錄音摔癣,去河邊找鬼。 笑死纬向,一個(gè)胖子當(dāng)著我的面吹牛择浊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逾条,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼琢岩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了膳帕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎危彩,沒想到半個(gè)月后攒磨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汤徽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年娩缰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谒府。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拼坎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出完疫,到底是詐尸還是另有隱情泰鸡,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布壳鹤,位于F島的核電站盛龄,受9級(jí)特大地震影響丑念,放射性物質(zhì)發(fā)生泄漏窗宦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一发绢、第九天 我趴在偏房一處隱蔽的房頂上張望锹淌。 院中可真熱鬧匿值,春花似錦、人聲如沸赂摆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)库正。三九已至曲楚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間褥符,已是汗流浹背龙誊。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喷楣,地道東北人趟大。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像铣焊,于是被迫代替她去往敵國(guó)和親逊朽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容