必须提取纯文本内容:用cell.textContent剥离HTML标签,遇input/select取其value;CSV字段含逗号、换行或双引号时须用双引号包裹且内部双引号转义为两个;导出前加\uFEFF BOM头防中文乱码。

导出表格数据时,innerHTML 里有 HTML 标签怎么办?
直接取 table.innerHTML 或 row.innerHTML 会把 <td><strong>100</strong></td> 这类结构原样写进 CSV,导致字段里混入标签。必须提取纯文本内容。
- 用
cell.textContent替代cell.innerHTML,自动剥离所有标签 - 注意
textContent会合并空白(如换行、多个空格变成单空格),若单元格内有刻意排版的空格,需先用cell.innerText或正则清理 - 遇到
<input value="abc">或<select>,textContent拿不到当前值,得用cell.querySelector('input')?.value
CSV 字段含逗号、换行或双引号时怎么安全转义?
CSV 规范要求:字段若含 ,、\n 或 ",必须用双引号包裹,且内部的双引号要变成两个双引号(" → "")。
- 别手写拼接,用函数封装转义逻辑:
function escapeCsv(value) { if (typeof value !== 'string') value = String(value); if (/[,\"\n\r]/.test(value)) { return '"' + value.replace(/"/g, '""') + '"'; } return value; } - 漏处理换行符会导致 CSV 行数错乱,Excel 打开后整张表偏移
- 中文字段一般不用转义,但含 emoji 或特殊控制字符时同样适用该规则
用 Blob + URL.createObjectURL 下载,为什么点一次就失效?
URL.createObjectURL(blob) 生成的是临时 URL,浏览器只保留到对应 Blob 被 GC 或显式调用 URL.revokeObjectURL()。下载完成后不撤销,会堆积内存;撤销太早(比如在 a.click() 前),链接就 404 了。
- 正确顺序:创建 blob → 创建 URL → 触发下载 → 在
click后的微任务中撤销 - 推荐写法:
const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'table-export.csv'; a.click(); // 微任务确保下载已发起 Promise.resolve().then(() => URL.revokeObjectURL(url)); - IE11 不支持
Blob,需回退到data:text/csv;charset=utf-8,Base64 方案(但有长度限制)
导出的 CSV 在 Excel 里中文显示乱码?
UTF-8 编码的 CSV 文件,Windows 版 Excel 默认用 ANSI(如 GBK)打开,必然乱码。不是前端没编码,是 Excel 没认对。
立即学习“前端免费学习笔记(深入)”;
- 解决方案:在 CSV 内容头部加 UTF-8 BOM(
\uFEFF),即const csvContent = '\uFEFF' + actualCsv; - BOM 只对 Windows Excel 有效,macOS Numbers 和 Google Sheets 会忽略它,不影响
- 别尝试用
charset=gbk,现代浏览器不支持非 UTF-8 的 Blob type,且会丢失生僻字



















