vue导出excel文件乱码

项目导出excel数据的时候遇到了乱码问题,但是通过接口文档下载的文件正常,乱码截图如下:

查看后端接口响应数据,能顺利拿到数据流,所有接口没问题。

很多博主说的文件格式与响应类型对不上,要加responseType: 'blob'或者设置编码 UTF-8,我都尝试过了,依旧没有解决问题。在axios的请求拦截器中直接把响应数据打印出来看看,发现,responseType是空的,data不是blob对象而是一个字符串,这就有问题了。

正常来说,前端响应接收到应该是一个blob对象,如下图:

然后又回去看如何调导出接口,发现了一个疑点。因为这个项目用的是TDesign封装的框架,只封装了axios,但是没有封装接口,前接手的同事顺着框架的风格走,直接在页面引入axios实例发起请求,导致responseType失效。

toExport(){
  const FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8';
  const params = this.filterData
  const url = "/sys/export";
  const QSparams = Qs.stringify(params)
  this.loading = true
  this.$request.post(url,QSparams,{responseType:'blob',headers:{'Content-type':FORM_URLENCODED}}).then((res)=>{
    if(res.code){
      this.$message.error(res.message)
    }else{
      download(res)
    }
  }).finally(()=>{
    this.loading = false
  })
}

 既然简单粗暴地调接口不行,那就封装接口再使用。

// 新建API.ts接口文件
import request from './request'

export function exportGet(url:string) {
    return request({
        url: url,
        method: 'get',
        // 在封装的接口这里加blob才有效啊!
        responseType: 'blob',
    });
}

修改导出方法:

<script>
  import { download } from '@/utils/download';
  import { exportGet } from '@/utils/API';
  import Qs from 'querystring';
  toExport() {
    const params = this.filterData;

    for (const key in params) {
      if (!params[key] || (Array.isArray(params[key]) && params[key].length === 0)) {
        delete params[key];
      }
    }

    // application/x-www-form-urlencoded;charset=UTF-8 时 参数要stringify才是form-data的参数格式
    const QSparams = Qs.stringify(params);
    const url = '/sys/export' + '?' + QSparams;
    this.loading = true;

    exportGet(url)
      .then((res) => {
        if (res.code) {
          this.$message.error(res.msg);
        } else {
          download(res);
        }
      })
      .finally(() => {
        this.loading = false;
      });
  },
</script>

导出excel方法:

export const download = (res = null) => {
  if (!res.data) return
  // const blob = new Blob([res.data], { type: 'application/vnd.ms-excel;charset=utf-8' })
  const blob = new Blob([res.data], { type: 'application/octet-stream;charset=UTF-8' })
  const contentDisposition = res.headers['content-disposition']
  const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
  const $link = document.createElement('a')
  $link.href = URL.createObjectURL(blob)
  $link.download = decodeURIComponent(patt.exec(contentDisposition)[1])
  $link.click()
  document.body.appendChild($link)
  document.body.removeChild($link) // 下载完成移除元素
  window.URL.revokeObjectURL($link.href) // 释放掉blob对象
}

// 自己自定义下载的excel文件名称
export const download2 = (flow = null) => {
  if (!flow) return
  const blob = new Blob([flow],{type: 'application/vnd.ms-excel'})
  const blobUrl = window.URL.createObjectURL(blob)
  const dateTimeFormat = dayjs().format('YYYY_MM_DD_hh_mm_ss')
  const fileName = `账单导出${dateTimeFormat}.xlsx`
  const a = document.createElement('a')
  a.style.display = 'none'
  a.download = fileName // 自定义下载的文件名
  a.href = blobUrl
  a.click()
}

最终文件顺利导出!高清无乱码!

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue导出Excel文件文件流可以通过以下步骤来实现: 1. 在前端请求的时候,将接收文件的格式设置为"application/octet-stream",这样可以接收到文件流。 2. 请求接口设置接收的数据格式为blob,以便能够正确处理文件流数据。 3. 在点击导出按钮时发送请求到接口,获取到文件流数据。可以使用两种方式来实现: - 方式一:将接口返回的文件流使用Blob对象进行处理,设置文件类型为"application/vnd.ms-excel",然后创建一个URL对象,将Blob对象赋值给URL对象的参数,最后将URL转换为下载链接并触发下载操作。 - 方式二:在请求到数据之后,将文件流赋值给一个变量,然后创建一个URL对象,将文件流数据包装成Blob对象,设置文件类型为"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8",然后创建一个a标签,设置其href属性为URL对象的值,设置download属性为文件名及文件类型后缀,再将a标签添加到页面上,触发点击操作,最后移除a标签并释放URL对象。 这样就可以通过Vue导出Excel文件文件流了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue导出数据为文件excel,后端返回的是文件流](https://blog.csdn.net/weixin_42150719/article/details/124582921)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Vue实现excel文件导出功能(后端直接返回文件流)](https://blog.csdn.net/weixin_40252368/article/details/124448552)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值