前端导出Excel时中文乱码怎么办?

端木楚萓 阅读 783

我用Blob和URL.createObjectURL做Excel导出,但下载的文件里中文全是乱码,英文正常。试过加charset=utf-8也不行,是不是编码方式不对?

这是我的导出按钮和触发代码:

<button onclick="exportExcel()">导出数据</button>

<script>
function exportExcel() {
  const data = '姓名,年龄n张三,25';
  const blob = new Blob([data], { type: 'application/vnd.ms-excel' });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = '用户数据.csv';
  a.click();
}
</script>
我来解答 赞 5 收藏
二维码
手机扫码查看
2 条解答
a'ゞ沁仪
问题很简单,就是编码没指定对。Excel打开CSV文件时需要BOM才能识别UTF-8。

改一下你的代码:

function exportExcel() {
// 前面加上 uFEFF 这是UTF-8的BOM,Excel靠这个识别编码
const data = 'uFEFF姓名,年龄n张三,25';
const blob = new Blob([data], { type: 'text/csv;charset=utf-8' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = '用户数据.csv';
a.click(); URL.revokeObjectURL(url);
}


改动就三点:

第一,data 前面加 uFEFF,这是UTF-8的BOM标记,Excel读取CSV文件时看到这三个字节就知道是UTF-8编码了。

第二,MIME类型改成 text/csv;charset=utf-8,你原来用的 application/vnd.ms-excel是给真正的xls文件用的,CSV用这个不太合适。

第三,记得释放URL,虽然不释放浏览器也会慢慢回收,但养成好习惯。

另外注意你原来的代码里是 n,应该是换行符 n,我给改过来了。
点赞
2026-03-12 19:06
UP主~建杰
你这个问题我之前也踩过坑,主要原因是 Excel(尤其是老版本)默认用的是 GBK 编码,而你的 Blob 是 UTF-8,没加 BOM 头,所以中文就乱码了。

解决办法很简单:在数据前面加一个 UTF-8 的 BOM 头 uFEFF,这样 Excel 就能识别是 UTF-8 编码了。

另外你代码里有个小问题:'姓名,年龄n张三,25' 这里的 n 应该是 n 才对,换行符写错了。

修改后的代码这样写就行:

function exportExcel() {
const data = '姓名,年龄n张三,25';
const blob = new Blob(['uFEFF' + data], { type: 'application/vnd.ms-excel;charset=utf-8' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = '用户数据.csv';
a.click();
}


注意两点:
1. 字符串前加了 uFEFF,这是 BOM 头
2. type 里加了 charset=utf-8,虽然不是必须,但加上更保险

希望能帮到你,你试试看,应该就不乱码了。
点赞 2
2026-02-25 12:04