share(兼容):post及get方式导出Excel

Get方式导出Excel

import { baseUrl } from "@/config/env";
import { G_Page_Token } from "./auth";
export function outExcelSingleByGet(url, params) {
    params.Authorization = "Bearer " + G_Page_Token();
    let tempURL = process.env.NODE_ENV === "development" ? '开发地址' : baseUrl + '/fatsapi/invoice/'+url; 
    let url= urlAddParams(tempURL, params);
    let link = document.createElement("a");
    link.style.display = "none";
    link.href = url;
    link.setAttribute("download", "");
    document.body.appendChild(link);
    link.click();
    hideLoading();
    link.remove();
}

// 拼接参数
function urlAddParams(url, params) {
    let tmp = "";
    if (params) {
        for (let i in params) {
            tmp += i + "=" + params[i] + "&";
        }
        tmp = url + "?" + tmp.substr(0, tmp.length - 1);
    } else {
        tmp = url;
    }
    return tmp;
}    

众所周知,导出excel等大多直接通过window.open(get请求地址)方式下载导出,但这种方式会闪下页面才执行下载,不够友好,故采用了以上方式。正在窃喜时~~~ ^.^

                 测试发现IE不好用,原来  Eee~~~ IE浏览器字符串长度超过限制,被截取拉~~,故post导出方式在几经磨难之后,诞生了~

直接上Code:

import { exportRZQD } from '@/api/api';
import qs from 'qs';

export function outExcelSingleByPost(params) {
    let reqData = qs.stringify(params);//qs转formdata形式
    const headers = {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',// 采用formdata方式传参
            'token': 'Bearer '+ G_Page_Token()
        },
        responseType: 'blob'   //必传
    }
    exportRZQD(reqData,headers).then(res => {
        const content = res.data;
        let len = res.headers['content-disposition'].length;
        const blob = new Blob([content]);
        const fileName = decodeURI(res.headers['content-disposition'].substring(20, len));
        if ('msSaveOrOpenBlob' in navigator) {
            window.navigator.msSaveOrOpenBlob(blob, fileName);
            return;
        }
        if ('download' in document.createElement('a')) { // 非IE下载
            const elink = document.createElement('a');
            elink.download = fileName;
            elink.style.display = 'none';
            elink.href = window.URL.createObjectURL(blob);
            document.body.appendChild(elink);
            elink.click();
            window.URL.revokeObjectURL(elink.href);// 释放URL 对象
            document.body.removeChild(elink)
        } else { // IE10+下载
            window.navigator.msSaveBlob(blob, fileName)
        }
    }, error => {
        hideLoading();
    });
}

这次开发,因为改造别人代码,故温习了一下请求封装

import axios from 'axios';

export function post(url,params,config) {
  return new Promise((resolve, reject) => {
    axios
      .post(url, params, config)
      .then(
        res => {
          resolve(res)
        },
        err => {
          reject('网络连接失败,请稍后重试')
        }
      )
      .catch(err => {
        reject('网络连接失败,请稍后重试')
      })
  })
}

注:在开发过程中才知道config就是请求头的数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值