优先用SheetJS的XLSX.writeFile导Excel,或Blob+URL.createObjectURL导CSV;禁用手工拼接CSV,必须加uFEFF BOM头防乱码,导出后需调用revokeObjectURL释放内存。
前端导出数据,优先用 XLSX.writeFile(SheetJS)导 Excel,或用 Blob + URL.createObjectURL 导 CSV;别硬写 CSV 拼接逻辑,中文乱码和字段转义会直接翻车。
XLSX.writeFile 最省心SheetJS 的 XLSX.writeFile 是目前最稳定、兼容性最好的前端 Excel 导出方式。它能自动处理合并单元格、日期格式、数字精度,且不依赖后端。
<script src="https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js"></script>(注意是 xlsx.full.min.js,不是 xlsx.min.js,否则 table_to_sheet 会报错)XLSX.utils.table_to_sheet 只接受带 <table> 标签的 DOM 元素,不能传 querySelectorAll("tr") 的结果table_to_sheet 会原样读取,可能导致 Excel 中出现空白行或错位.xlsx,否则 Safari 可能拒绝下载或保存为未知类型uFEFF BOM 头纯 JS 导 CSV 看似简单,但跳过 BOM 头或字段转义,Excel 打开就是乱码或列错位。
uFEFF(UTF-8 BOM)是唯一可靠唤醒 UTF-8 的方式"a""b",不能只靠 replace(/"/g, '""'),还得判断是否需要包裹value.includes(",") || value.includes("n") || value.includes('"') ? `"${value.replace(/"/g, '""')}"` : value
URL.revokeObjectURL(url),否则内存泄漏在 Chrome 中会明显累积FormData 是表单导出的唯一靠谱入口HTML 表单导出不是“遍历所有 input”,而是用浏览器原生的 FormData 提取值 —— 它天然适配 type="checkbox" 多选、select[multiple]、file(仅文件名)、动态增删字段等场景。
立即学习“前端免费学习笔记(深入)”;
new FormData(formEl) 不包含 disabled 字段,如需导出,得先临时 removeAttribute("disabled") 再恢复data.entries() 对同名多值只返回最后一个,必须改用 data.getAll("field_name") 获取数组JSON.stringify(Object.fromEntries(data.entries()), null, 2),但要注意 fromEntries 无法还原数组值,仍得手写转换form.elements 或 querySelectorAll("input, textarea"),它们会混入 button、fieldset 等非数据节点html2canvas + jsPDF 导 PDF这个组合导出的是截图式 PDF,本质是单张图片,无法复制文字、搜索、编辑,缩放后模糊,还容易截断长表格或漏掉 CSS 动画后的状态。
html2canvas 渲染时机难控制 —— 经常截到 loading 状态或未更新的 DOMjsPDF 的 addImage 对 base64 图片有大小限制,超 2MB 就崩溃(尤其含图表或头像的表格)wkhtmltopdf(支持 Vue SSR 输出)或 weasyprint(Python),前端只负责发 HTML 字符串dom-to-image 替代 html2canvas,它对现代 CSS 支持更好,但依然解决不了语义缺失问题导出功能最容易被忽略的其实是「空值处理」和「用户反馈」:表格里有空单元格,导出后是留空、填 null 还是 -?点击按钮后没反应,是卡在数据提取、BOM 头拼接,还是 click() 被浏览器拦截?这些细节比选什么库更影响实际交付质量。