excel文件接口乱码的js处理函数封装

 
导出excel文件等时,后台可能返回的是这样的乱码,这时我们封装一个公用函数,以后就不需要特殊处理,直接调用函数即可

 下面是封装好的函数:

/**
 * 导出
 * @param  {function} apiFn -导出文件的api接口名称
 * @param  {object} payload={} -接口要传的参数
 * @param  {string} title='test' -导出文件的名称
 * @param  {string} type='.xls' -导出文件的格式,后缀名
 */
export const excelExportFn = (apiFn, payload = {}, title = 'test', type = '.xls') => {
  return new Promise((resolve, reject) => {
    apiFn(payload).then(res => {
      let response = res.data // 这里根据你的接口格式写
      let blob = new Blob([response], {
        type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
      })
      // for IE
      if (window.navigator && window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveOrOpenBlob(blob, title + type)
      } else {
        let a = document.createElement('a')
        document.body.appendChild(a)
        a.style = 'display: none'
        let url = window.URL.createObjectURL(blob)
        a.href = url
        a.download = title + type
        a.click()
        a.remove()
        window.URL.revokeObjectURL(url)
      }
      resolve()
    })
  })
}

 

调用时直接传参就好了:

// api函数
export const outExcelApi = (data) => {
  return axios.post('/api/xxx', data,{responseType: 'blob'});
};

// 调用
import { excelExportFn } from '上面封装工具函数的路径'
import { outExcelApi } from '上面api函数的路径'

excelExportFn(outExcelApi, {}, "导出表格").then(()=>{console.log('导出成功')});

 

 

 

效果图:

 

 

***如果是后台定义文件类型和文件名称,可用此函数***:
/**
 * 导出excel
 * @param  {Promise} apiFn-接口函数名称
 * @param  {object} payload-接口传参
 */
export const excelExportFn = (apiFn, payload = {}) => {
  return new Promise((resolve, reject) => {
    apiFn(payload).then(response => {
      let blob = new Blob([response.data], { type: 'application/vnd.ms-excel' })
      let disposition = response.headers['content-disposition']
      let xlsxName = disposition.split('=')
      if (window.navigator && window.navigator.msSaveOrOpenBlob) {
        // 兼容IE/Edge
        window.navigator.msSaveOrOpenBlob(blob, xlsxName[1])
      } else {
        let link = document.createElement('a')
        link.style.display = 'none'
        link.href = window.URL.createObjectURL(blob)
        link.download = decodeURIComponent(xlsxName[1])
        document.body.appendChild(link)
        link.click()
        window.URL.revokeObjectURL(link.href)
        document.body.removeChild(link)
      }
      resolve()
    })
  })
}
View Code

 

posted @ 2021-02-26 16:04  william_new  阅读(742)  评论(0编辑  收藏  举报