Javascript到csv导出编码问题

Bol*_*rus 51 javascript csv export-to-csv

我需要将javascript数组导出到excel文件并下载它我在这段代码中执行它.data是一个javascript对象数组.

var csvContent = "data:text/csv;charset=utf-8,";
data.forEach(function(dataMember, index)
{
    dataString = dataMember.join(",");
    csvContent += index < data.length ? dataString+ "\n" : dataString;
}); 

var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "upload_data" + (new Date()).getTime() + ".csv");
link.click();
Run Code Online (Sandbox Code Playgroud)

所有这些东西都可以正常工作,直到我的字符串属性具有非英语字符,如西班牙语,阿拉伯语或希伯来语.如何使用所有这些非ASCII值进行导出?

Ger*_*agy 85

您应该在文本的开头添加UTF-8 BOM,例如:

var csvContent = "data:text/csv;charset=utf-8,%EF%BB%BF";
Run Code Online (Sandbox Code Playgroud)

它适用于Excel 2013.

演示小提琴

  • 这对我有用,使用FileSaver.js.而不是URL编码,我这样做:var blob = new Blob(['\ ufeff'+ csvString],{type:'text/csv; charset = utf-8'}); (4认同)
  • @jlarson在这里:[link](http://jsfiddle.net/W432s/)我使用了Benoit Blanchon的演示. (2认同)
  • 如果它获得特殊符号,这将失败并且不会在 Csv 中打印。“!@#$%^&amp;1234567890.pdf”。我无法找到这个极端情况的解决方案。 (2认同)

小智 69

您可以先添加BOM,使用此代码并尝试

var BOM = "\uFEFF"; 
var csvContent = BOM + csvContent;
Run Code Online (Sandbox Code Playgroud)

然后用数据创建文件头:"text/csv; charset = utf-8"

  • 这个!花了很长时间才找到可行的方法。谢谢! (3认同)
  • 这对我有用: csv = 'data:text/csv;charset=utf-8,\uFEFF' + csvContent; (3认同)

b4s*_*ien 16

Excel在检测编码时非常糟糕,特别是在OSX上的Excel.

最好的解决方案是使用默认的Excel编码对CSV进行编码:windows-1252(也称为ANSI,基本上是ISO-8859-1的子集).

我在以下网址上提供了完整的示例:https://github.com/b4stien/js-csv-encoding.

两个主要部分是stringencoding(用于编码windows-1252中CSV的内容)和FileSaver.js(用于下载生成的Blob).

看起来像:

var csvContent = 'éà; ça; 12\nà@€; çï; 13',
    textEncoder = new TextEncoder('windows-1252');


var csvContentEncoded = textEncoder.encode([csvContent]);
var blob = new Blob([csvContentEncoded], {type: 'text/csv;charset=windows-1252;'});
saveAs(blob, 'some-data.csv');
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`TextEncoder`现在不再接受除utf-8之外的任何编码. (2认同)

btx*_*btx 10

只需将 BOM 字符粘在字符串前面即可。
\n没有必要使用该encodeURIComponent方法并粘合数据字符串片段。

\n
const data = '\xc3\xb6\xc3\xa4\xc3\xbc\xc3\x96\xc3\x84\xc3\x9c';\nconst BOM = '\\uFEFF';\nconst blob = new Blob([BOM + data], { type: 'text/csv;charset=utf-8' });\n\nconst url = window.URL.createObjectURL(blob);\nconst linkElem = document.createElement('a');\nlinkElem.href = url;\nlinkElem.click();\n
Run Code Online (Sandbox Code Playgroud)\n


Mos*_*tov 5

选项1

使用iconv-litelibrary 并将您的输出编码为 ascii,然后再将其发送回用户。例子:

var iconv = require('iconv-lite');
buf = iconv.encode(str, 'win1255'); // return buffer with windows-1255 encoding
Run Code Online (Sandbox Code Playgroud)

选项 2

在文件头部写入UTF-8编码的BOM头。例子:

res.header('Content-type', 'text/csv; charset=utf-8');
res.header('Content-disposition', 'attachment; filename=excel.csv'); 
res.write(Buffer.from('EFBBBF', 'hex')); // BOM header

// rest of your code
Run Code Online (Sandbox Code Playgroud)

选项 3

使用 base64 url​​ 格式,如data:text/csv;base64,77u/Zm9vLGJhcg0KYWFhLGJiYg==. 此方法也适用于客户端(IE10+、FF、Chrome、Opera、Safari)。

例如:

window.location = "data:text/csv;base64,77u/" + btoa("foo,bar\r\naaa,bbb");
Run Code Online (Sandbox Code Playgroud)