原因:
EXCEL打开的CSV文件默认是ANSI编码,使用fast-csv包导出的CSV文件的编码方式是utf-8
解决方案:
在字节流前面加上这4个字符\xEF\xBB\xBF
即可(BOM头)
async generateCSV(rows) {
const csvStream = csv.format({ headers: true });
const outStream = new stream.PassThrough();
const buffers = [];
return new Promise((resolve, reject) => {
csvStream.pipe(outStream)
.on('data', data => {
arrayBuffer && buffers.push(data);
})
.on('end', () => {
// 解决MS Excel导出乱码的问题
const dataBuffer = Buffer.concat([ Buffer.from('\xEF\xBB\xBF', 'binary'), Buffer.concat(buffers) ]);
resolve(dataBuffer);
}
})
.on('error', function(err) {
reject(err);
});
rows.forEach(function(row) {
csvStream.write(row);
});
csvStream.end();
});
}
const data = [
{
"第一列": 'A一',
"第二列": 'A二',
"第三列": 'A三',
},
{
"第一列": 'B一',
"第二列": 'B二',
"第三列": 'B三',
},
{
"第一列": 'C一',
"第二列": 'C二',
"第三列": 'C三',
},
{
"第一列": 'D一',
"第二列": 'D二',
"第三列": 'D三',
}
];
(async function generate() {
const csvArrayBuffer = await fileService.generateCSV(data, { arrayBuffer: true });
console.log(csvArrayBuffer);
fs.writeFileSync(`./生成csv文件.csv`, csvArrayBuffer);
})()
参考链接
什么是文件BOM头