使用fast-csv包导出csv后,EXCEL打开中文乱码

原因:

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);
})()
打印一下buffer.png

excel打开文件.png

参考链接
什么是文件BOM头

你可能感兴趣的:(使用fast-csv包导出csv后,EXCEL打开中文乱码)