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('导出成功')});
效果图:
***如果是后台定义文件类型和文件名称,可用此函数***:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * 导出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() }) }) }
自律使我自由