Vue结合java后台详解导出Excel乱码问题(二进制文件流)

Vue结合后台详解导入导出Excel问题

一连十六卦,卦卦皆无你,罢了,杀了那算命的~

今天讲讲 前台Vue配合后台(java)导出Excel 后台返回的数据是 二进制文件流 如何将此变为 弹框下载

当时开发呢,我们后台是java 有控件 可以直接将数据导出并生成Excel文件,但是前后台传输是不可能直接传输文件的,是以二进制文件流进行传输的,此时呢就会遇到一个问题,因为是后台,必然会涉及到权限,权限就涉及到token,token传输就会出现限制问题,所以我会列出三种方法

我的是Vue项目~~

  1. 不需要token的方法
<template>
             <div>
                <el-button @click="downloadFile" type="primary">导出 Excel</el-button> 
                <iframe id="ifile" style="display:none"></iframe>
            </div>
         </template>
         <script>
         methods:{
                // 导出 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>

这个的意思呢就是写一个类似的隐藏域 ifram 标签独有的特性 , 不明白的可以去W3cschool 查一查, 后面拼接的参数就是导出条件,按个人需要进行,这个亲测有效!

2.第二种就涉及到token了 , 就是使用javascript的内置对象来解析,方法就是使用axios请求 请求过来的二进制文件流进行解析

    // 导出 Excel
    downloadFile() { // 这是methods中的方法
        downLoadPayListFn({...this.form}).then(res => { // 这个是我封装的方法 就是通过axios请求进行拦截 添加token  form是data中的数据 也就是筛选条件 
            const fileName = '测试表格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 对象
                document.body.removeChild(elink);
            }
        })
    },

这个blob是js的内置对象 就是将其转化为文件 详情解释可以去查 blob

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

// 导出数据
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',否则不会生效 切记!!!!

看网上写的是这个样子 当然也根据后台返回给你的数据进行展示 饿哦们后台返回的数据没有进行包装 所以直接就是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"> <!-- 订单单号 -->
                        <input type="hidden" name="stime"       :value="form.stime">       <!-- 时间 -->
                        <input type="hidden" name="etime"       :value="form.etime">       <!-- 时间 -->
                        <input type="hidden" name="status"      :value="form.status">      <!-- 交易状态(1开始,2进行中,3失败,4成功) -->
                        <input type="hidden" name="type"        :value="form.type">        <!-- 支付类型(1.扣除  2.返还 3.转换 4.赠送) -->
                        <input type="hidden" name="ctimeState"  :value="form.ctimeState">  <!-- 创建时间状态(1:正序、2:倒序) -->
                        <input type="hidden" name="payChannel"  :value="form.payChannel">  <!-- 支付渠道 -->
                        <input type="hidden" name="token"  :value="token">  <!-- 支付渠道 -->
                        <input type="submit" value="导出 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, // 当前页数
                        pageSize: 10, //请求行数
                        userId: '',   // 用户id
                        orderNumber: '', // 订单单号
                        stime: '', // 创建时间(开始)
                        etime: '', // 创建时间(结束)
                        status: '', // 交易状态(1开始,2进行中,3失败,4成功)
                        type:   '', // 支付类型(1.扣除  2.返还 3.转换 4.赠送)
                        ctimeState: '', // 创建时间状态(1:正序、2:倒序)
                        payChannel: '', // 支付渠道
                    },
                    token: getToken() , // 这里获取token
                }
            },
            // 页面一加载的时候
            created() {
                this.getdata();
            },
            methods:{
                submitBtn(e) {
                    e.preventDefault(); // 这个必须要有, 不然不生效
                    return false; // 这个必须要有, 不然不生效
                }
            },
        }
    </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>

这个就需要后台配合配置一下网关,如果有header中有token的话就去header中取 没有的话就去参数中取,这个亲测好使,
这里附上我的qq : 2489757828 有问题可以咨询我
我的私人博客 李大玄

一见钟情太肤浅
日久生情太苍白
别人眉来眼去
我呀 只偷看你一眼!

在这里插入图片描述

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容