crear - Exportar JSON a CSV o Excel con codificación UTF-8(por ejemplo, griego) con JavaScript
json to csv javascript (2)
Para hacer que Excel lea un archivo CSV Unicode, debe agregar una marca de orden de bytes como la primera cadena en el csv. Esto se puede lograr a través de JavaScript agregando la siguiente línea en su código:
line="/ufeff"+line
Estoy intentando exportar y descargar un objeto JSON al archivo CSV y tengo un problema con los caracteres griegos. Mi código funciona; no es perfecto, pero funciona.
El problema es que los caracteres griegos parecen basura.
Aquí está mi código existente:
function downloadJsonToCsv(jsonObject) {
var array = typeof jsonObject != "object" ? JSON.parse(jsonObject) : jsonObject;
if (array == null) {
return; // No data found on the jsonObject
}
var str = "";
for (var i = 0; i < array.length; i++) {
var line = "";
for (var index in array[i]) {
line += array[i][index] + ";"; // Set delimiter
}
// Here is an example where you would wrap the values in double quotes
// for (var index in array[i]) {
// line += ''"'' + array[i][index] + ''",'';
// }
line.slice(0,line.Length-1);
str += line + "/r/n";
}
window.open("data:text/csv;charset=utf-8," + encodeURI(str));
}
Tengo dos preguntas.
- ¿Cómo se puede exportar este archivo CSV con caracteres griegos correctos?
- ¿Cómo puedo exportar estos datos en formato Excel y no en formato CSV ?
Exportar a CSV
Exportar a CSV con caracteres que no sean ASCII requiere anteponer el archivo a la Marca de Orden de Byte, también conocida como BOM. En tu código de cambio
var str = "";
a:
var str = "/uFEFF";
Necesita una versión moderna de Excel para reconocer la lista de materiales. Como se menciona en este útil artículo de , Excel 2003 y versiones anteriores no respetarán correctamente la lista de materiales. Solo tengo acceso a Excel 2003 en Windows, así que no puedo probar esto en este momento, pero está bastante bien documentado.
Lamentablemente, Excel 2011 para Macintosh NO es un "Excel moderno" en este sentido. Afortunadamente, las Hojas de cálculo de Google hacen lo correcto.
Exportar directamente a Excel
Aquí hay una implementación de jsFiddle del código a continuación. Genera un documento SpreadsheetXml . Lo bueno de este método es que puede ser muy complicado ... agregar fórmulas y hacer muchas más cosas específicas para Excel.
// Test script to generate a file from JavaScript such
// that MS Excel will honor non-ASCII characters.
testJson = [
{
"name": "Tony Peña",
"city": "New York",
"country": "United States",
"birthdate": "1978-03-15",
"amount": 42
},
{
"name": "Ζαλώνης Thessaloniki",
"city": "Athens",
"country": "Greece",
"birthdate": "1987-11-23",
"amount": 42
}
];
// Simple type mapping; dates can be hard
// and I would prefer to simply use `datevalue`
// ... you could even add the formula in here.
testTypes = {
"name": "String",
"city": "String",
"country": "String",
"birthdate": "String",
"amount": "Number"
};
emitXmlHeader = function () {
var headerRow = ''<ss:Row>/n'';
for (var colName in testTypes) {
headerRow += '' <ss:Cell>/n'';
headerRow += '' <ss:Data ss:Type="String">'';
headerRow += colName + ''</ss:Data>/n'';
headerRow += '' </ss:Cell>/n'';
}
headerRow += ''</ss:Row>/n'';
return ''<?xml version="1.0"?>/n'' +
''<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">/n'' +
''<ss:Worksheet ss:Name="Sheet1">/n'' +
''<ss:Table>/n/n'' + headerRow;
};
emitXmlFooter = function() {
return ''/n</ss:Table>/n'' +
''</ss:Worksheet>/n'' +
''</ss:Workbook>/n'';
};
jsonToSsXml = function (jsonObject) {
var row;
var col;
var xml;
var data = typeof jsonObject != "object"
? JSON.parse(jsonObject)
: jsonObject;
xml = emitXmlHeader();
for (row = 0; row < data.length; row++) {
xml += ''<ss:Row>/n'';
for (col in data[row]) {
xml += '' <ss:Cell>/n'';
xml += '' <ss:Data ss:Type="'' + testTypes[col] + ''">'';
xml += data[row][col] + ''</ss:Data>/n'';
xml += '' </ss:Cell>/n'';
}
xml += ''</ss:Row>/n'';
}
xml += emitXmlFooter();
return xml;
};
console.log(jsonToSsXml(testJson));
Esto genera el documento XML a continuación. Si este XML se guarda en un archivo llamado test.xls, Excel debería reconocerlo y abrirlo con la codificación adecuada.
<?xml version="1.0"?>
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<ss:Worksheet ss:Name="Sheet1">
<ss:Table>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">name</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">city</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">country</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">birthdate</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">amount</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">Tony Peña</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">New York</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">United States</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">1978-03-15</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number">42</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">Ζαλώνης Thessaloniki</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Athens</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Greece</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">1987-11-23</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number">42</ss:Data>
</ss:Cell>
</ss:Row>
</ss:Table>
</ss:Worksheet>
</ss:Workbook>
Debo admitir, sin embargo, mi fuerte inclinación sería hacer este lado del servidor si es posible. He usado la biblioteca de Python openpyxl
para hacer esto en el pasado y es bastante simple. La mayoría de los lenguajes del lado del servidor tienen una biblioteca que genera archivos de Excel y deberían proporcionar construcciones mucho mejores que la concatenación de cadenas.
De todos modos, consulte este blog de MSDN para obtener información básica. Y este artículo de para algunos pros / contras de varias otras opciones.