前端接EXCEL
一 后端返回的是文件流
/*** 下载文件统一封装* @param {string} url 文件接口* @param {string} filename 下载文件名*/
export const axiosDownload = async (url, filename) => {try {const res = await fetch(url, {method: 'GET',credentials: 'include',});if (!res.ok) {const errText = await res.text();throw new Error(`HTTP错误: ${res.status},返回内容:${errText}`);}// 这里用 text(),因为后端返回的是 HTMLconst text = await res.text();// 生成 Excel 文件const blob = new Blob([text], {type: 'application/vnd.ms-excel;charset=utf-8',});const blobUrl = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = blobUrl;a.download = filename;document.body.appendChild(a);a.click();document.body.removeChild(a);window.URL.revokeObjectURL(blobUrl);return { code: 200 };} catch (err) {console.error('❌ 文件下载失败:', err);return { code: 500, msg: err.message };}
};
二 后端返回的是纯文本
/*** 下载文件统一封装* @param {string} url 文件接口* @param {string} filename 下载文件名*/
export const axiosDownload = async (url, filename) => {try {const res = await service.get(url, {responseType: 'text', // 强制按文本拿withCredentials: true});const blob = new Blob([res], { type: 'application/vnd.ms-excel;charset=utf-8' });const blobUrl = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = blobUrl;a.download = filename;document.body.appendChild(a);a.click();document.body.removeChild(a);window.URL.revokeObjectURL(blobUrl);toast('下载成功', 'success');return { code: 200 };} catch (err) {console.error('❌ 文件下载失败:', err);toast('下载失败:' + err.message, 'error');return { code: 500, msg: err.message };}
};
后端:纯HTML返
// 发票——导出excelpublic function exportInvoiceExcel(Request $request){$id = $request->route('id');// 获取发票信息$invoice = $this->orderButtonService->getInvoice($id, 'I');$consignee = $invoice['consignee_info']['CONS_NM_EN'] ?? '';$fname = $id . '_Invoice_' . $consignee;// 替换特殊字符,避免文件名无效$fname = preg_replace('/[\/\\\?\%\*\:\|\"\<\>]/', '_', $fname);$encodedName = rawurlencode($fname);$html = view('admin.invoice_excel', compact('invoice'))->render();return response($html)->header('Content-Type', 'application/vnd.ms-excel')->header('Content-Disposition', "attachment; filename=\"{$encodedName}.xls\"; filename*=UTF-8''{$encodedName}.xls");}