vue.js前端实现excel表格导出和获取headers里的信息

本文介绍了在Vue.js项目中如何实现Excel表格的导出功能,并解决在不同环境中遇到的.split(’;’)错误问题。通过在后端服务器设置,允许前端获取到response.headers中的'content-disposition',从而正确解析文件名。

1.HTML部分

<el-button
 :loading="loading"
 size="mini"
 class="filter-item"
 type="warning"
 icon="el-icon-download"
 @click="downloadMethodExcel"
>excel模板下载
</el-button>

2.methods中的方法

/*
**excel导出
*/
downloadMethodExcel() {
	this.url = 'api/dataReporting/download'
    this.params = {
      resourcecode: this.code
    }
    this.loading = true
    download(this.url, this.params).then(res => {
      this.loading = false
    }).catch(() => {
      this.loading = false
    })
  }

3.js文件封装excel导出方法

//引入依赖
import axios from 'axios'
import fileDownload from 'js-file-download'
// 下载文件,接受后端传递的文件名称、文件类型
export async function download(url, params) {
  const res = await axios({
    baseURL: process.env.NODE_ENV === 'production' ? process.env.VUE_APP_BASE_API : '/',
    timeout: 2 * 60 * 60 * 1000,
    headers: { 'Authorization': getToken() },
    url: url,
    method: 'get',
    params: params,
    responseType: 'blob'
  })
  const disposition = res.headers['content-disposition']
  const temp = disposition.split(';')[1].split('filename=')[1]
  // 强制转码
  const iconv = require('iconv-lite')
  iconv.skipDecodeWarning = true// 忽略警告
  const filename = iconv.decode(temp, 'UTF-8')
  const fileType = res.headers['content-type']
  const resBlob = res.data
  let resData = null
  try {
    const resText = await new Promise((resolve, reject) => {
      // 通过 FileReader 接受并解析
      const reader = new FileReader()
      reader.addEventListener('abort', reject)
      reader.addEventListener('error', reject)
      reader.addEventListener('loadend', () => {
        resolve(reader.result)
      })
      // 文件
      reader.readAsText(resBlob)
    })
    resData = JSON.parse(resText)
  } catch (err) {
  }
  if (resData) {
    if (resData.error) { } else { }
  } else {
    fileDownload(resBlob, filename)
  }
}

期间遇到的问题:在本地测试时,导出功能可用;发版至正式环境,报错。提示.split(’;’)错误。

原因 / 解决方法:response返回了包含响应头所带的所有数据,可以使用console.log(response)查看打印数据,但是打印出来的数据只能拿到默认的响应头:

 1. Cache-Control
 2. Content-Language
 3. Content-Type
 4. Expires
 5. Last-Modified
 6. Pragma

如果想让浏览器能访问到其他响应头的话,需要后端在服务器上设置Access-Control-Expose-Headers

Access-Control-Expose-Headers : 'content-disposition'

后端大致写法:

headers.add("Access-Control-Expose-Headers", "Content-Disposition");

这样response.headers[‘content-disposition’].split(’;’)[1].split(’=’)[1] 就能取到接口返回的文件名称了。

备注
控制台截图

需要截图标红2处同时在控制台显示,才能证明可以获取到headers里的信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值