2013-10-21 56 views
38

ho bisogno di esportare javascript array per file excel e scaricarlo lo sto facendo in questo codice. i dati sono un array di oggetti javascript.Javascript per csv esportazione problema di codifica

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(); 

Tutta questa roba funziona bene finché non hanno proprietà di stringa che hanno caratteri non inglesi, come lo spagnolo, arabo o ebraico. Come posso esportare con tutti questi valori non ASCII?

+0

la prima linea afferma utf-8, questo è ASCII. forse se lo hai cambiato in 16 questo userebbe unicode forse? – rfcoder89

+0

L'ho cambiato. stessa cosa ( – Boltosaurus

+0

@Boltosaurus, ho creato una demo qui: http://jsfiddle.net/8qPur/. Mi sembra OK: il file scaricato ha i caratteri speciali codificati correttamente. –

risposta

3

Opzione 1

uso iconv-lite biblioteca e codificare l'output per ASCII prima di rispedirlo per l'utente. Esempio:

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

Opzione 2

scrittura sulla testa del file di intestazione della distinta base di codifica UTF-8. Esempio:

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 

Opzione 3

Usa Base64 formato URL come data:text/csv;base64,77u/Zm9vLGJhcg0KYWFhLGJiYg==. Questo metodo funzionerà anche sul lato client (IE10 +, FF, Chrome, Opera, Safari).

Ad esempio:

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

Ehi, grazie per la tua risposta. Puoi per favore dare un esempio completo dell'opzione 2? Che cos'è esattamente il metodo .header()? Che cos'è esattamente l'oggetto res? – Boltosaurus

+0

Sto usando [express.js] (http://expressjs.com) framework Sul piano node.js è possibile utilizzare [setHeader] (http://nodejs.org/api/http.html#http_response_setheader_name_value). –

+1

Non sto parlando di nodo. Sto usando puro javascript lato client) – Boltosaurus

58

Si dovrebbe aggiungere il BOM UTF-8, all'inizio del testo, come:

var csvContent = "data:text/csv;charset=utf-8,%EF%BB%BF"; 

Ha funzionato per me con Excel 2013.

Demo Fiddle

+0

puoi fornire un esempio operativo completo in jsFiddle o qualcosa del genere? – jlarson

+2

@jlarson eccovi: [link] (http://jsfiddle.net/W432s/) Ho usato la demo di Benoit Blanchon. –

+1

Sul Mac ho trovato questo :(https: //www.dropbox.com/s/a36t99fvo43xhfe/Screen% 20Shot% 202014-03-04% 20at% 209.31.48% 20 AM.png – jlarson

14

Excel è davvero male a rilevare la codifica, in particolare Excel su OSX.

La soluzione migliore sarebbe quella di codificare il CSV nella codifica predefinita di Excel: windows-1252 (chiamato anche ANSI, che è fondamentalmente un sottoinsieme di ISO-8859-1).

ho messo un esempio completo di come fare a: https://github.com/b4stien/js-csv-encoding.

Le 2 parti principali sono stringencoding (per codificare il contenuto del file CSV in windows-1252) e FileSaver.js (per scaricare il Blob generato).

Assomiglia:

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'); 
+0

La migliore risposta di sempre !!!! anche grande componente !!!! ha funzionato perfettamente! – Vackup

+0

Incredibile, grazie! Sono andato attraverso le risme di pagine SO e documenti in cerca di qualcosa per risolvere un problema con un excel che distrugge CSV dopo l'apertura e il salvataggio su OSX. Questa è stata l'unica cosa che ha funzionato. –

+1

Si noti che 'TextEncoder' non accetta più alcuna codifica diversa da utf-8 ora. – tsh

1

in qualche modo trovato Tab-Separated-CSV con codifica UTF-16 con BOM opere su WIN/MAC Excel

seguito la risposta di b4stien ma fare una piccola differenza da archiviare:

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 i test/usr/bin/Linux File:

Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators 
0

B4stien, grazie per la tua risposta! Dopo aver testato diverse soluzioni basate su charset "utf8", la codifica windows-1252 è l'unica soluzione che mi ha permesso di mantenere il mio accento in Excel 365!

Manetsus, la risposta del b4stien e il suo legame erano molto utile per il mio caso: devo esportare i dati francesi e tedeschi in file CSV: nessuna soluzione basata su "utf8" ha lavorato ... Solo la sua soluzione che utilizza un " ANSI"(finestra-1252) encoder ...

dò il suo esempio di codice, e si può scaricare la seconda codifica-indexes.js, encoding.js e FileSaver.js dal link ...

<!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> 

Tuttavia, poiché Excel è relativamente aperto nel supporto di lingue e formati, non escludo che UTF8 non sia supportato nel mio ambiente di sviluppo a causa del modo in cui è installato ...

Nota: I test con Firefox, Chrome e IE 11 su Windows 7, con Excel 365 ...

36

È possibile aggiungere la distinta base in un primo momento, utilizzare questo codice e cerco

var BOM = "\uFEFF"; 
var csvContent = BOM + csvContent; 

e poi cassa le intestazioni dei file con i dati: "text/csv; charset = utf-8"

+0

QUESTO! Ci sono voluti per sempre per trovare qualcosa che avrebbe funzionato. Grazie! – KyleFarris

+0

Questo ha funzionato per me durante la conversione delle mie cose in un BLOB e quindi utilizzando il tag di ancoraggio, fare clic su Hack per attivare il download: 'var downloadLink = document.createElement (" a "); downloadLink.download = fileNameToSaveAs; downloadLink.href = window.URL.createObjectURL (textFileAsBlob); downloadLink.onclick = function (e) {document.body.removeChild (e.target); }; downloadLink.style.display = "nessuno"; document.body.appendChild (downloadLink); downloadLink.click(); ' – skrile

+0

Excel ora mostra caratteri Unicode come' ář' correttamente. Grazie – Karthik

Problemi correlati