Javascript pour l'export csv problème de codage de

je dois exporter le tableau javascript pour le fichier excel et le télécharger je le fais dans ce code. de données est un tableau d'objets 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();

toutes ces choses fonctionnent bien jusqu'à ce que j'ai des propriétés de chaîne qui ont des caractères non-anglais, comme l'Espagnol, l'arabe ou l'Hébreu. Comment puis-je faire une exportation avec toutes ces valeurs non ASCII?

44
demandé sur Benoit Blanchon 2013-10-21 15:06:03

6 réponses

vous devez ajouter le BOM UTF-8 au début du texte, comme:

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

cela a fonctionné pour moi avec Excel 2013.

Démo Fiddle

68
répondu Gergő Nagy 2017-01-14 21:50:37

Vous pouvez ajouter le BOM en premier, utilisez ce code et essayez

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

et puis la caisse de la en-têtes de fichier avec les données: "text/csv;charset=utf-8"

45
répondu Marcelo Lujan 2016-07-04 22:19:50

Excel est vraiment mauvais pour détecter l'encodage, surtout Excel sur OSX.

la meilleure solution serait d'encoder votre CSV dans L'encodage Excel par défaut: windows-1252 (aussi appelé ANSI, qui est essentiellement un sous-ensemble de ISO-8859-1).

j'ai mis un exemple complet de la façon de le faire: https://github.com/b4stien/js-csv-encoding.

Les 2 parties principales sont stringencoding (pour encoder le contenu de votre CSV dans windows-1252) et FileSaver.js (pour télécharger le Blob généré).

Ça ressemble:

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');
14
répondu b4stien 2014-02-28 07:57:42

Option 1

utiliser iconv-lite bibliothèque et d'encoder vos sortie ascii avant de l'envoyer à l'utilisateur. Exemple:

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

Option 2

écrire sur la tête du fichier l'en-tête BOM de l'encodage UTF-8. Exemple:

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

Option 3

utilisez le format d'url base64 comme data:text/csv;base64,77u/Zm9vLGJhcg0KYWFhLGJiYg==. Cette méthode fonctionnera également côté client (IE10+, FF, Chrome, Opera, Safari).

Pour exemple:

window.location = "data:text/csv;base64,77u/" + btoa("foo,bar\r\naaa,bbb");
3
répondu Moshe Simantov 2013-11-28 10:21:20

d'une façon ou d'une autre trouvé Tab-Separated-CSV avec utf-16LE encoding avec BOM works sur Win/MAC Excel

suivi de la réponse de b4stien mais faire une petite différence à archiver:

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');
Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators
1
répondu gjchen 2015-03-25 08:40:17

B4stien, merci pour votre réponse! Après avoir testé plusieurs solutions basées sur le jeu de caractères "utf8", encoder windows-1252 est la seule solution qui m'a permis de garder mon accent dans Excel 365!

Manetsus, la réponse du b4stien et son lien ont été très utiles pour mon cas: je dois exporter des données françaises et allemandes dans le fichier csv: aucune solution basée sur "utf8" n'a fonctionné... Seulement sa solution qui utilise un encodeur "ANSI" (window-1252)...

je donne son échantillon de code, et vous pouvez télécharger les index d'encodage en fonction.js, l'encodage.JS et FileSaver.js à partir du lien...

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

Néanmoins, comme Excel est relativement ouvert dans le support des langues et des formats, Je n'exclus pas que UTF8 n'est pas supporté dans mon environnement de développement en raison de la façon dont il est installé ...

Note: je le teste avec Firefox, Chrome et IE 11 sur windows 7, avec Excel 365...

0
répondu Didier68 2015-12-19 09:23:00