Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 419|回复: 0

Vue2 导出Excel + 解决乱码问题 —— axios

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 802 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726006
    发表于 2021-5-31 15:47:22 | 显示全部楼层 |阅读模式

    请求用的axios(类似ajax问题),找了很多方法,都下载不了文件。

     

    以下是解决方法):

    1.接口返回的流:

     

    2、请求头和返回头:

     

     

    方法一、方法二:

    2.下载流文件的代码

     

    方法一:是用了插件 https://github.com/kennethjiang/js-file-download

    方法二:是用了 blob

    不管哪种方法,记得设置  responseType  !!!!!

     

    附上代码:

    1.  
      // 导出Excel
    2.  
      exportBill: function () {
    3.  
       
    4.  
      let url_post = Vue.prototype.api.apiList.EXPORT_BILL; //请求地址
    5.  
       
    6.  
      let params_post = { //参数
    7.  
      orderStartDate: this.timepickerDateFormat(this.rangeTime[0]) || this.rangeTime[0] || '',
    8.  
      orderEndDate: this.timepickerDateFormat(this.rangeTime[1]) || this.rangeTime[1] || '',
    9.  
      prodCode: this.prodId,
    10.  
      promoteFlag: this.promotionSiteId,
    11.  
      policyStatusList: this.tableBillStateCheckedData,
    12.  
      };
    13.  
       
    14.  
      Vue.axios.post(url_post, params_post, {
    15.  
      responseType: 'arraybuffer'
    16.  
      }).then( (res) => {
    17.  
       
    18.  
      let fileName = res.headers['content-disposition'].match(/fushun(\S*)xls/)[0];
    19.  
       
    20.  
      fileDownload(res.data, fileName); //如果用方法一 ,这里需要安装 npm install js-file-download --save ,然后引用 var fileDownload = require('js-file-download'),使用详情见github;
    21.  
             // let blob = new Blob([res.data], {type: "application/vnd.ms-excel"});
    22.  
       
    23.  
             // let objectUrl = URL.createObjectURL(blob);
    24.  
       
    25.  
             // window.location.href = objectUrl;
    26.  
       
    27.  
      }).catch( function (res) {});
    28.  
      },
    • 1

     

     
    • 1

     

    方法三(附加):

    1、接口要求: post方法、入参为json格式、出参文件流

    * 2、axios:设置返回数据格式为 blob 或者 arraybuffer   ( 注意 )

    1.  
      axios({ // 用axios发送post请求
    2.  
      method: 'post',
    3.  
      url: ' /serviceTime/exportData', // 请求地址
    4.  
      data: form, // 参数
    5.  
      responseType: 'blob', // 表明返回服务器返回的数据类型
    6.  
      headers: {
    7.  
      'Content-Type': 'application/json'
    8.  
      }
    9.  
      }).then( res => { // 处理返回的文件流
    10.  
      const blob = new Blob([res.data]);//new Blob([res])中不加data就会返回下图中[objece objece]内容(少取一层)
    11.  
      const fileName = '统计.xlsx';//下载文件名称
    12.  
      const elink = document.createElement('a');
    13.  
      elink.download = fileName;
    14.  
      elink.style.display = 'none';
    15.  
      elink.href = URL.createObjectURL(blob);
    16.  
      document.body.appendChild(elink);
    17.  
      elink.click();
    18.  
      URL.revokeObjectURL(elink.href); // 释放URL 对象
    19.  
      document.body.removeChild(elink);
    20.  
      })
    • 1

    ( 上面代码中少取一层的导出文件):

     

     

    				<script>
    					(function(){
    						function setArticleH(btnReadmore,posi){
    							var winH = $(window).height();
    							var articleBox = $("div.article_content");
    							var artH = articleBox.height();
    							if(artH > winH*posi){
    								articleBox.css({
    									'height':winH*posi+'px',
    									'overflow':'hidden'
    								})
    								btnReadmore.click(function(){
    									articleBox.removeAttr("style");
    									$(this).parent().remove();
    								})
    							}else{
    								btnReadmore.parent().remove();
    							}
    						}
    						var btnReadmore = $("#btn-readmore");
    						if(btnReadmore.length>0){
    							if(currentUserName){
    								setArticleH(btnReadmore,3);
    							}else{
    								setArticleH(btnReadmore,1.2);
    							}
    						}
    					})()
    				</script>
    				</article>
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-15 12:55 , Processed in 1.078206 second(s), 27 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表