Кодировать символ при создании csv-файла

#javascript #node.js #express

Вопрос:

На моей веб-странице я могу экспортировать данные в csv-файл, который мы можем открыть и прочитать в Excel. Но я заметил, что каждый символ нравится ô или Ø не поддерживается. Например, вместо Ø того , чтобы, у меня есть Ø .

Я хотел бы предотвратить это, но в данный момент я не могу этого сделать.

app.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   'rn';
  }
  return (header   'rn'   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   'rn';
        }

        let csv = header   'rn'   str;
        csv = 'data:text/csv;charset=utf-8,;'   csv;
        return encodeURI(csv);
    }
 

С помощью этого кода, когда я открываю csv-файл, все данные находятся в одной строке, а слова с символом выглядят так Tampon GO Ø 3.8 amp; 12 , а Tampon GO Ø 3.8 amp; 12 не так .

Ответ №1:

Недавно у меня была довольно похожая проблема, и я смог ее решить, добавив спецификацию utf-8 ( ufeff ) в csv-строку. Только с помощью этого Excel смог правильно интерпретировать его.

Так что в вашем случае попробуйте:

 convertToCSV(objArray) {
  //...
  return ('ufeff'  header   'rn'   str); 
}
 

и в вашем контроллере:

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

Комментарии:

1. К сожалению, у меня все еще есть те же проблемы с символами …

2. Ладно, это странно. Вы уверены, что данные в вашей базе данных закодированы в кодировке utf-8?

3. Я думаю, что эта проблема возникает у меня только при экспорте данных. В противном случае, на веб-странице или в MSSM я могу видеть все символы

4. Хм, ты можешь попробовать еще кое-что? Отмените мое изменение с помощью спецификации и просто установите тип содержимого в: res.set('Content-Type', 'text/csv;charset=windows-1252');