React里用xlsx导出Excel时中文乱码怎么办?

Mr-雨萓 阅读 355

我在React项目里用xlsx库导出表格数据,英文和数字都正常,但中文全是乱码,试了网上说的encodeURI也不行,到底该怎么处理?

我现在的代码是这样:

import * as XLSX from 'xlsx';

const exportToExcel = () => {
  const data = [['姓名', '年龄'], ['张三', 25]];
  const ws = XLSX.utils.aoa_to_sheet(data);
  const wb = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
  XLSX.writeFile(wb, '用户数据.xlsx');
};
我来解答 赞 5 收藏
二维码
手机扫码查看
2 条解答
书生シ玉宁
遇到中文乱码问题是因为xlsx默认的编码问题,试试这样改:

const exportToExcel = () => {
const data = [['姓名', '年龄'], ['张三', 25]];
const ws = XLSX.utils.aoa_to_sheet(data);
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');

// 关键修改在这里
const blob = new Blob(
[XLSX.write(wb, { type: 'array', bookType: 'xlsx' })],
{ type: 'application/octet-stream' }
);
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = '用户数据.xlsx';
a.click();
URL.revokeObjectURL(url);
};


原理是改用Blob方式处理文件流,绕过直接writeFile的编码问题。这个方案在多个项目里验证过有效,直接复制过去试试。
点赞
2026-03-09 18:05
萌新.巧丽
这个中文乱码问题我碰到过,xlsx.js的文档里其实有提到解决方案。关键是要在writeFile时加上type: 'binary'选项,然后用一个转换函数处理编码。

标准写法是这样的:

import * as XLSX from 'xlsx';

const exportToExcel = () => {
const data = [['姓名', '年龄'], ['张三', 25]];
const ws = XLSX.utils.aoa_to_sheet(data);
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');

// 关键改动在这行
XLSX.writeFile(wb, '用户数据.xlsx', { type: 'binary' });
};

// 如果是用write方法生成blob的话,还要加这个
function s2ab(s) {
const buf = new ArrayBuffer(s.length);
const view = new Uint8Array(buf);
for (let i = 0; i < s.length; i++) view[i] = s.charCodeAt(i) & 0xff;
return buf;
}


我上次折腾了半天才发现,xlsx.js默认用UTF-8编码,但Excel对中文文件需要特别处理。不用搞什么encodeURI,那样反而会把事情搞复杂。
点赞 2
2026-03-09 09:04