2013-08-15 8 views
13

Ich versuche, eine CSV-Datei auf der Clientseite mit Javascript zu generieren. Ich habe the answer on this stackoverflow question gefolgt. Ich habe Unicode-Zeichen im Inhalt (hebräische Zeichen in meinem Fall).Generieren CSV für Excel über JavaScript mit Unicode-Zeichen

Die Dateierzeugung ist erfolgreich, aber wenn ich die Datei in Excel öffne - alle Unicode-Zeichen werden als lustige Zeichen angezeigt. ASCII-Zeichen (Englisch und Zahlen) werden gut dargestellt.

Die seltsame Sache ist, dass, wenn ich die Datei im Editor öffnen, die Unicode-Zeichen gut zeigen. Ich denke, das hat etwas mit Excel zu tun und wie ich die Datei speichere.

Irgendwelche Ideen?

+1

Es könnte das Byte Order Mark sein. Hilft dieser Link? http://stackoverflow.com/questions/155097/microsoft-excel-mangles-diacritics-in-csv-files –

+0

Ja ja ja! Hinzufügen des BOM-Präfixes funktioniert! –

Antwort

29

Nach Jack Coles Kommentar und this question, was mein Problem behoben wurde, war ein Stücklisten-Präfix (\ uFEFF) am Anfang der Datei.

Dies ist der Arbeitscode:

var csvContent = "...csv content..."; 
var encodedUri = encodeURI(csvContent); 
var link = document.createElement("a"); 
link.setAttribute("href", "data:text/csv;charset=utf-8,\uFEFF" + encodedUri); 
link.setAttribute("download","report.csv"); 
link.click(); 
+0

Funktioniert gut für mich! –

+11

Funktioniert nicht für mich. Excel muss sterben. –

+0

funktionierte in meinem Fall vielen Dank –

1

auf einem Knoten/Express-Server, habe ich versucht, Shay Antwort, aber ich war für ungültige Zeichen in meinem Header einen Fehler. Stattdessen habe ich den \uFEFF am Anfang des Antwortkörpers hinzugefügt und es hat funktioniert.

app.get('/', function (req, res) { 
    var csv = Papa.unparse(...); 
    res.set({ 
     'Content-Type': 'text/csv; charset=UTF-8', 
     'Content-Disposition': 'attachment; filename="file.csv"', 
    }); 
    res.send('\uFEFF' + csv) 
}) 
+0

Arbeitete für mich, vielen Dank – user301441

0

Die vorgeschlagene Lösung nicht mit allen Browsern, aber ich fand einen Weg, es in allen Browsern zum Laufen zu bringen (Chrome, Firefox, IE11 und sogar Rand, ... weiß nicht, über IE9- 10, da ich keinen Zugang mehr zu ihnen habe).

Ich muss eine externe Bibliothek verwenden, um encoding.js zu verschlüsseln und es funktioniert erstaunlich gut mit Unicode (Ich kann meine Einhorn-Emoji in meinem CSV-Export in Excel sehen).

Also hier ist der Code

data = new TextEncoder('utf-16be').encode(csvContent); 

// create a Blob object for the download 
const blob = new Blob(['\uFEFF', data], { 
    type: 'text/csv;charset=utf-8'; 
}); 

// when using IE/Edge, then use different download call 
if (typeof navigator.msSaveOrOpenBlob === 'function') { 
    navigator.msSaveOrOpenBlob(blob, filename); 
} else { 
    // this trick will generate a temp <a /> tag that you can trigger a hidden click for it to start downloading 
    const link = document.createElement('a'); 
    const csvUrl = URL.createObjectURL(blob); 

    link.textContent = 'download'; 
    link.href = csvUrl; 
    link.setAttribute('download', filename); 

    // set the visibility hidden so there is no effect on your web-layout 
    link.style.visibility = 'hidden'; 

    // this part will append the anchor tag and remove it after automatic click 
    document.body.appendChild(link); 
    link.click(); 
    document.body.removeChild(link); 
} 

und das ist es, es funktioniert in IE/Edge/Chrome/Firefox

enter image description here