make - json to csv javascript
Problema de codificación de exportación de Javascript a csv (6)
Necesito exportar la matriz de Javascript al archivo Excel y descargarlo. Lo estoy haciendo en este código. data es una matriz de objetos 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();
Todo esto funciona bien hasta que tengo propiedades de cadenas que tienen caracteres no ingleses, como español, árabe o hebreo. ¿Cómo puedo hacer una exportación con todos estos valores no ASCII?
B4stien, gracias por tu respuesta! Después de probar varias soluciones basadas en el juego de caracteres "utf8", la codificación de Windows-1252 es la única solución que me permitió mantener mi acento en Excel 365.
Manetsus, la respuesta del b4stien y su enlace fueron muy útiles para mi caso: tengo que exportar datos franceses y alemanes al archivo csv: ninguna solución basada en "utf8" ha funcionado ... Solo su solución que usa un "ANSI" (ventana -1252) codificador ...
Le doy su ejemplo de código, y puede descargar la codificación dependiente-indexes.js, encoding.js y FileSaver.js desde el enlace ...
<!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>
Sin embargo, como Excel es relativamente abierto en el soporte de idiomas y formatos, no excluyo que UTF8 no sea compatible en mi entorno de desarrollo debido a la forma en que está instalado ...
Nota: Lo pruebo con Firefox, Chrome e IE 11 en Windows 7, con Excel 365 ...
Debe agregar la lista de materiales UTF-8 al comienzo del texto, como:
var csvContent = "data:text/csv;charset=utf-8,%EF%BB%BF";
Me funcionó con Excel 2013.
Excel es realmente malo para detectar la codificación, especialmente Excel en OSX.
La mejor solución sería codificar su CSV en la codificación predeterminada de Excel: windows-1252 (también llamado ANSI, que básicamente es un subconjunto de ISO-8859-1).
Puse un ejemplo completo de cómo hacerlo en: https://github.com/b4stien/js-csv-encoding .
Las 2 partes principales son stringencoding (para codificar el contenido de su archivo CSV en windows-1252) y FileSaver.js (para descargar el blob generado).
Parece que:
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'');
Puede agregar la lista de materiales al principio, use este código e intente
var BOM = "/uFEFF";
var csvContent = BOM + csvContent;
y luego crate los encabezados de los archivos con los datos: "text / csv; charset = utf-8"
de alguna forma, se encontró que CSV con tabulación separada con codificación utf-16le con BOM funciona en WIN / MAC Excel
siguió la respuesta de b4stien pero hace una pequeña diferencia al archivo:
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'');
con pruebas de Linux / usr / bin / file:
Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators
Opción 1
use la biblioteca iconv-lite
y codifique su salida en ascii antes de devolverla al usuario. Ejemplo:
var iconv = require(''iconv-lite'');
buf = iconv.encode(str, ''win1255''); // return buffer with windows-1255 encoding
opcion 2
Escriba en el encabezado del archivo el encabezado BOM de la codificación UTF-8. Ejemplo:
res.header(''Content-type'', ''text/csv; charset=utf-8'');
res.header(''Content-disposition'', ''attachment; filename=excel.csv'');
res.write(new Buffer(''EFBBBF'', ''hex'')); // BOM header
// rest of your code
Opción 3
Use formato url base64 como data:text/csv;base64,77u/Zm9vLGJhcg0KYWFhLGJiYg==
. Este método también funcionará en el lado del cliente (IE10 +, FF, Chrome, Opera, Safari).
Por ejemplo:
window.location = "data:text/csv;base64,77u/" + btoa("foo,bar/r/naaa,bbb");