我需要将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();
所有这些东西都可以正常工作,直到我的字符串属性具有非英语字符,如西班牙语,阿拉伯语或希伯来语。如何使用所有这些非ASCII值进行导出?
答案 0 :(得分:77)
您应该在文本的开头添加UTF-8 BOM,例如:
var csvContent = "data:text/csv;charset=utf-8,%EF%BB%BF";
Excel 2013适用于我。
<强> Demo Fiddle 强>
答案 1 :(得分:57)
您可以先添加BOM,使用此代码并尝试
var BOM = "\uFEFF";
var csvContent = BOM + csvContent;
然后用数据创建文件头:“text / csv; charset = utf-8”
答案 2 :(得分:15)
Excel在检测编码方面非常糟糕,特别是在OSX上的Excel。
最佳解决方案是使用默认的Excel编码对CSV进行编码:windows-1252(也称为ANSI,基本上是ISO-8859-1的子集)。
我在https://github.com/b4stien/js-csv-encoding上提供了一个如何执行此操作的完整示例。
2个主要部分是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');
答案 3 :(得分:3)
选项1
使用iconv-lite
库并将输出编码为ascii,然后再将其发送回用户。
例如:
var iconv = require('iconv-lite');
buf = iconv.encode(str, 'win1255'); // return buffer with windows-1255 encoding
选项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
选项3
使用类似data:text/csv;base64,77u/Zm9vLGJhcg0KYWFhLGJiYg==
的base64网址格式。此方法也适用于客户端(IE10 +,FF,Chrome,Opera,Safari)。
例如:
window.location = "data:text/csv;base64,77u/" + btoa("foo,bar\r\naaa,bbb");
答案 4 :(得分:2)
以某种方式找到带有utf-16le编码的Tab-Separated-CSV,BOM在WIN / MAC Excel上工作
遵循了b4stien的回答,但对存档做了一点改动:
var csvContent = 'éà; ça; 12\nà@€; çï; 13',
textEncoder = new TextEncoder('utf-16le');
var csvContentEncoded = textEncoder.encode([csvContent]);
var bom = new Uint8Array([0xFF, 0xFE]);
var out = new Uint8Array( bom.byteLength + csvContentEncoded.byteLength );
out.set( bom , 0 );
out.set( csvContentEncoded, bom.byteLength );
var blob = new Blob([out]);
saveAs(blob, 'some-data.csv');
使用Linux / usr / bin / file tests:
Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators
答案 5 :(得分:0)
B4stien,谢谢你的回答! 在基于charset&#34; utf8&#34;测试了几个解决方案之后,编码windows-1252是唯一能让我在Excel 365中保持重音的解决方案!
Manetsus,b4stien的回答和他的链接对我的案例非常有用:我必须将法语和德语数据导出到csv文件中:没有基于&#34; utf8&#34;的解决方案。已经工作......只有他的解决方案使用&#34; ANSI&#34; (window-1252)编码器......
我提供了他的代码示例,您可以从链接中下载依赖编码索引.js,encoding.js和FileSaver.js ...
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="encoding-indexes.js"></script>
<script type="text/javascript" src="encoding.js"></script>
<script type="text/javascript" src="FileSaver.js"></script>
</head>
<body>
<a href="#" id="download-csv">Click me to download a valid CSV !</a>
<script type="text/javascript">
var csvContent = 'éà; ça; 12\nà@€; çï; 13',
textEncoder = new CustomTextEncoder('windows-1252', {NONSTANDARD_allowLegacyEncoding: true}),
fileName = 'some-data.csv';
var a = document.getElementById('download-csv');
a.addEventListener('click', function(e) {
var csvContentEncoded = textEncoder.encode([csvContent]);
var blob = new Blob([csvContentEncoded], {type: 'text/csv;charset=windows-1252;'});
saveAs(blob, fileName);
e.preventDefault();
});
</script>
</body>
</html>
尽管如此,由于Excel在支持语言和格式方面相对开放,我不排除我的开发环境中不支持UTF8,因为它的安装方式......
注意:我在Windows 7上用Firefox,Chrome和IE 11测试它,使用Excel 365 ...
答案 6 :(得分:0)
要导出包含多字节字符的CSV并使其在多个OS平台(Windows,Linux,MacOS)上的文本编辑器和Excel中可读,应遵循以下规则:
在this article中可以看到有关NodeJS的详细说明,用例和示例代码。
答案 7 :(得分:0)
data=`"red","मुकेश"`
var processdata = "data:text/csv;charset=utf-8,%EF%BB%BF" + encodeURIComponent(data);