根本原因是Windows版Excel默认用GBK解析无BOM的UTF-8 CSV文件;必须在CSV字符串最开头添加\uFEFF(UTF-8 BOM),即EF BB BF三字节,才能强制Excel识别为UTF-8并正确显示中文表头。

中文表头导出乱码,根本不是表头内容写错了,而是 Excel 打开时编码猜错了——必须在 CSV 字符串最开头加 \ufeff(UTF-8 BOM),否则 Windows 版 Excel 默认用 GBK 解析,中文必然变问号或方块。
为什么加 \ufeff 就能解决
Windows 版 Excel 不看文件后缀、不读 HTTP header、也不认 text/csv;charset=utf-8,它只靠文件前三个字节(\ufeff 对应 EF BB BF)判断是否为 UTF-8。没这个头,就强制按系统 ANSI(如 GBK)解码,UTF-8 编码的中文字符串一读就崩。Layui 的 table.exportFile() 默认不加,所以得你手动塞。
- 加的位置必须是整个 CSV 字符串的最开头,不能插在中间,也不能漏掉
-
\ufeff是 Unicode 字符,JS 字符串里直接写'\ufeff姓名,城市'即可,无需额外转义 - Mac 版 Excel 默认用 UTF-8,加了 BOM 可能显示成
,这不是错误,是行为差异;若用户群含 Mac,建议提供“带 BOM”和“无 BOM”两个导出入口
别用 table.exportFile('id') 快捷方式
这个方法会绕过所有自定义逻辑:它直接读 table.cache,用逗号硬拼字段,不加 BOM、不转义特殊字符、也不处理表头 title。导出中文表头必乱码。
- 正确做法是手动构造 CSV 字符串,再调用
table.exportFile(null, csvStr, 'csv') - 表头取自列配置的
title字段,确保初始化时每列都写了中文title,例如{field: 'user_name', title: '用户名'} - 如果用了
templet渲染函数,导出仍以title为准,不影响
字段含逗号、双引号或换行符怎么办
光加 BOM 不够。CSV 规范要求:含 ,、" 或 \n 的字段必须用双引号包裹,且内部 " 要替换成 "",否则 Excel 会错列。
- 对每个字段值做检测:
if (val.includes(',') || val.includes('"') || val.includes('\n')) - 满足条件则包裹双引号,并将内部
"替换为"",例如'"北京,""朝阳区"""' - 表头行也要同样处理,比如
title是"用户姓名",就得包裹转义 - 拼接时用
\n换行,不要用<br>
或其他 HTML 标签
中文文件名在旧浏览器上无效怎么办
table.exportFile() 的 filename 参数在 IE 和旧 Edge 上基本失效,因为 Content-Disposition 对 UTF-8 文件名支持极差。现代浏览器(Chrome/Firefox/Edge 80+)可直接用,但稳妥起见建议统一走 Blob 流程。
- 构造好带
\ufeff的csvStr后,用new Blob([csvStr], {type: 'text/csv;charset=utf-8'}) - 再用
URL.createObjectURL(blob)生成链接,赋给a.download(现代浏览器支持中文名) - 记得最后调用
URL.revokeObjectURL(url)防内存泄漏,尤其高频导出场景 - 如果用
table.on('toolbar(filter)')拦截导出按钮,务必return false阻止默认行为
最常被忽略的一点:\ufeff 虽简单,但它不属于 CSV 标准,某些老旧 ETL 工具或脚本读取时可能跳过首行——如果你的下游系统对格式极其敏感,得提前验证兼容性,而不是只看 Excel 是否显示正常。


















