首页 > 解决方案 > 创建 csv 文件时编码符号

问题描述

在我的网页中,我可以将数据导出到一个 csv 文件中,我们可以在 Excel 中打开和读取该文件。但我注意到每个符号都喜欢ôØ不被支持。例如Ø,我有,而不是Ø

我想阻止这种情况,但目前我做不到。

应用程序.js:

app.post("/exportLibelles", function(req, res) {
    try {
        dao.exportLibelle().then((value) =>  {
            res.attachment(__dirname+'/ExportLibelle.csv');
            res.status(200).send(value);
        })

    } catch (e) {
        console.log(e);
    }
})

exportLibelle 函数:

async exportLibelle() {
  try {
    let request = "SELECT * FROM PROFACE.dbo.ParametresMachines;"

    let results = await sql.query(request);

    return this.convertToCSV(JSON.stringify(results.recordset))

  } catch (e) {
    console.log(e);
  }
}

convertToCSV(objArray) {
  var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
  var str = '', header = '';

  for (var i = 0; i < array.length; i++) {
      var line = '';

      for (var index in array[i]) {
          if (i == 0) {
              if (header != '') {
                 header += ';'
              }
              header += index;
          }
          if (line != '') {
            line += ';'
          }
          line += array[i][index];
      }
      str += line + '\r\n';
  }
  return (header + '\r\n' + str);
}

我尝试使用encodeURI()encodeURIComponent()喜欢这样:

convertToCSV(objArray) {
        var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
        var str = '', header = '';

        for (var i = 0; i < array.length; i++) {
            var line = '';

            for (var index in array[i]) {
                if (i == 0) {
                    if (header != '') {
                    header += ';'
                    }
                    header += index;
                }
                if (line != '') {
                line += ';'
                }
                line += array[i][index];
            }
            str += line + '\r\n';
        }

        let csv = header + '\r\n' + str;
        csv = 'data:text/csv;charset=utf-8,%EF%BB%BF;' + csv;
        return encodeURI(csv);
    }

使用此代码,当我打开 csv 文件时,所有数据都在一行上,带有符号的单词看起来像这样Tampon%20GO%20%C3%98%203.8%20&%2012,而不是Tampon GO Ø 3.8 & 12.

标签: javascriptnode.jsexpress

解决方案


最近有一个非常相似的问题,并且能够通过将 utf-8 bom ( \ufeff) 附加到 csv 字符串来解决它。只有使用该 Excel 才能正确解释它。

所以在你的情况下尝试:

convertToCSV(objArray) {
  //...
  return ('\ufeff'+ header + '\r\n' + str); 
}

在你的控制器中:

dao.exportLibelle().then((value) =>  {
      res.setHeader('Content-disposition', 'attachment; filename=ExportLibelle.csv');
      res.set('Content-Type', 'text/csv');
      res.status(200).send(value);
})

推荐阅读