Je développe une partie d'une application responsable de l'exportation de certaines données dans des fichiers CSV. L'application utilise toujours UTF-8 en raison de sa nature multilingue à tous les niveaux. Cependant, l’ouverture de tels fichiers CSV (contenant par exemple des signes diacritiques, des lettres cyrilliques, des lettres grecques) n’atteint pas les résultats escomptés avec un résultat tel que Г„/Г¤, Г–/Г¶
. Et je ne sais pas comment forcer Excel à comprendre que le fichier CSV ouvert est codé en UTF-8. J'ai également essayé de spécifier la nomenclature UTF-8 EF BB BF
, mais Excel l'ignore.
Y a-t-il une solution de contournement?
P.S. Quels outils peuvent potentiellement se comporter comme le fait Excel?
METTRE À JOUR
Je dois dire que j'ai confondu la communauté avec la formulation de la question. Lorsque je posais cette question, j'ai demandé un moyen d'ouvrir un fichier CSV UTF-8 dans Excel sans aucun problème pour un utilisateur, de manière fluide et transparente. Cependant, j'ai utilisé une mauvaise formulation demandant de le faire automatiquement. C'est très déroutant et cela se heurte à l'automatisation des macros VBA. J'apprécie le plus deux réponses à cette question: la toute première réponse de Alex https://stackoverflow.com/a/6002338/166589 , et j'ai accepté cette réponse; et le second de Mark https://stackoverflow.com/a/6488070/166589 qui est apparu un peu plus tard. Du point de vue de la convivialité, Excel ne semblait pas disposer d’une bonne prise en charge conviviale du format CSV UTF-8. C’est pourquoi j’estime que les deux réponses sont correctes et j’ai accepté la réponse d’Alex d’abord parce Excel n'a pas pu le faire de manière transparente. C'est ce que j'ai confondu avec automatiquement ici. La réponse de Mark propose aux utilisateurs plus avancés un moyen plus compliqué d'atteindre le résultat escompté. Les deux réponses sont bonnes, mais celle d’Alex répond un peu mieux à ma question non clairement spécifiée.
MISE À JOUR 2
Cinq mois plus tard, après le dernier montage, j'ai remarqué que la réponse d'Alex avait disparu pour une raison quelconque. J'espère vraiment que ce n'était pas une question technique et j'espère qu'il n'y a plus de discussion sur la meilleure réponse pour le moment. Donc, j'accepte la réponse de Mark comme la meilleure.
Alex est correct, mais comme vous devez exporter au format csv, vous pouvez donner aux utilisateurs ce conseil lors de l’ouverture des fichiers csv:
De cette façon, les caractères spéciaux devraient s'afficher correctement.
Le marqueur d'ordre d'octets UTF-8 indiquera Excel 2007+ au fait que vous utilisez UTF-8. (Voir this SO post ).
Si quiconque a les mêmes problèmes que moi, la classe de codage UTF8 de .NET ne génère pas de marqueur d'ordre d'octet dans un appel GetBytes()
. Vous devez utiliser les flux (ou utiliser une solution de contournement ) pour que la nomenclature soit générée.
Le bogue lié à la nomenclature ignorée semble avoir été corrigé pour Excel 2013. J'ai eu le même problème avec les lettres cyrilliques, mais l'ajout du caractère de nomenclature \uFEFF
a aidé.
C'est incroyable qu'il y ait autant de réponses mais aucune ne répond à la question:
"Lorsque je posais cette question, j'ai demandé un moyen d'ouvrir un fichier UTF-8 CSV dans Excel sans aucun problème pour un utilisateur, ..."
La réponse marquée comme réponse acceptée avec plus de 200 votes positifs est inutile pour moi car je ne veux pas donner à mes utilisateurs un manuel sur la façon de configurer Excel . À part cela: ce manuel s'appliquera à une version Excel mais les autres versions d'Excel ont des menus et des boîtes de dialogue de configuration différents. Vous auriez besoin d'un manuel pour chaque version d'Excel.
La question est donc de savoir comment faire en sorte que Excel affiche les données UTF8 avec un simple double clic?
Au moins dans Excel 2007, cela n’est pas possible si vous utilisez des fichiers CSV car la nomenclature UTF8 est ignorée et vous ne verrez que des ordures. Cela fait déjà partie de la question de Lyubomyr Shaydariv:
"J'ai également essayé de spécifier UTF-8 BOM EF BB BF, mais Excel l'ignore."
Je fais la même expérience: écrire des données russes ou grecques dans un fichier CSV UTF8 avec des résultats de nomenclature obsolètes dans Excel:
Contenu du fichier CSV UTF8:
Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ
Résultat dans Excel 2007:
Une solution consiste à ne pas utiliser du tout le format CSV. Ce format est si bêtement implémenté par Microsoft que cela dépend des paramètres de région définis dans le panneau de configuration si comma ou semicolon est utilisé comme séparateur. Ainsi, le même fichier CSV peut s'ouvrir correctement sur un ordinateur, mais pas sur un autre ordinateur. "CSV" signifie "Comma Separated Values" mais, par exemple, sur un Windows allemand, le point-virgule par défaut doit être utilisé comme séparateur, tandis que la virgule ne fonctionne pas. (Ici, il devrait s'appeler SSV = valeurs séparées par des points-virgules) Les fichiers CSV ne peuvent pas être échangés entre différentes versions linguistiques de Windows. Ceci est un problème supplémentaire au problème UTF-8.
Excel existe depuis des décennies. Il est dommage que Microsoft n’ait pas été en mesure d’implémenter un élément aussi fondamental que l’importation CSV au cours de toutes ces années.
Toutefois, si vous placez les mêmes valeurs dans un fichier HTML et que vous enregistrez le fichier au format UTF8 avec la nomenclature avec l'extension de fichier XLS, vous obtiendrez le résultat correct.
Contenu du fichier UTF8 XLS:
<table>
<tr><td>Colum1</td><td>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
</table>
Résultat dans Excel 2007:
Vous pouvez même utiliser des couleurs en HTML qu'Excel affichera correctement.
<style>
.Head { background-color:gray; color:white; }
.Red { color:red; }
</style>
<table border=1>
<tr><td class=Head>Colum1</td><td class=Head>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td class=Red>Авиабилет</td><td class=Red>Tλληνικ</td></tr>
</table>
Résultat dans Excel 2007:
Dans ce cas, seule la table a une bordure noire et des lignes. Si vous souhaitez que TOUTES les cellules affichent un quadrillage, cela est également possible en HTML:
<html xmlns:x="urn:schemas-Microsoft-com:office:Excel">
<head>
<meta http-equiv="content-type" content="text/plain; charset=UTF-8"/>
<xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>MySuperSheet</x:Name>
<x:WorksheetOptions>
<x:DisplayGridlines/>
</x:WorksheetOptions>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
</x:ExcelWorkbook>
</xml>
</head>
<body>
<table>
<tr><td>Colum1</td><td>Column2</td></tr>
<tr><td>Val1</td><td>Val2</td></tr>
<tr><td>Авиабилет</td><td>Tλληνικ</td></tr>
</table>
</body>
</html>
Ce code permet même de spécifier le nom de la feuille de travail (ici "MySuperSheet")
Résultat dans Excel 2007:
Nous avons utilisé cette solution de contournement:
Avait les mêmes problèmes avec les fichiers CSV générés par PHP. Excel a ignoré la nomenclature lorsque le séparateur a été défini via "sep=,\n"
au début du contenu (mais bien sûr après la nomenclature).
Donc, ajouter une nomenclature ("\xEF\xBB\xBF"
) au début du contenu et définir le point-virgule comme séparateur via fputcsv($fh, $data_array, ";");
fait l'affaire.
J'ai eu le même problème dans le passé (comment produire des fichiers qu'Excel peut lire et que d'autres outils peuvent également lire). J'utilisais TSV plutôt que CSV, mais le même problème avec les encodages s'est posé.
Je n'ai trouvé aucun moyen de convaincre Excel de reconnaître automatiquement UTF-8 et je ne voulais pas/ne pouvais pas infliger aux utilisateurs des fichiers des instructions compliquées pour les ouvrir. Je les ai donc codés au format UTF-16le (avec une nomenclature) au lieu de UTF-8. Deux fois la taille, mais Excel peut reconnaître l'encodage. Et comme ils se compressent bien, la taille importe rarement (mais malheureusement jamais).
Vieille question mais bon sang, la solution la plus simple est:
Comme je l'ai posté sur http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-Excel-can.html :
Demandez au développeur de logiciel en charge de générer le fichier CSV de le corriger. Pour résoudre rapidement ce problème, vous pouvez utiliser gsed pour insérer la nomenclature UTF-8 au début de la chaîne:
gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv
Cette commande insère la nomenclature UTF-4 si elle n'est pas présente. C'est donc une commande idempotente. Vous devriez maintenant pouvoir double-cliquer sur le fichier et l'ouvrir dans Excel.
Vous pouvez convertir un fichier .csv en UTF-8 avec nomenclature via Notepad ++:
Encoding
→ Convert to UTF-8
.File
→ Save
.A travaillé dans Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) 64 bits à partir de Microsoft Office Professional Plus 2013 sur Windows 8.1 avec les paramètres régionaux pour les programmes non Unicode définis sur "Allemand (Allemagne)".
C'est une vieille question, mais qui apparaît dans la recherche en haut. Après de nombreux efforts, j'ai constaté que l'ajout de caractères de nomenclature au début du fichier csv aide.
Je l'ai résumé ici: https://sites.google.com/site/ritechtips/home/the-multi-line-fields-csv-file-and-Excel-import---ha
Juste pour aider les utilisateurs intéressés à ouvrir le fichier sur Excel qui réalise ce fil de discussion comme moi.
J'ai utilisé l'assistant ci-dessous et cela a bien fonctionné pour moi, en important un fichier UTF-8 . Pas transparent, mais utile si vous avez déjà le fichier.
Source: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0
Macro vba simple pour ouvrir des fichiers texte et csv utf-8
Sub OpenTextFile()
filetoopen = Application.GetOpenFilename("Text Files (*.txt;*.csv), *.txt;*.csv")
If filetoopen = Null Or filetoopen = Empty Then Exit Sub
Workbooks.OpenText Filename:=filetoopen, _
Origin:=65001, DataType:=xlDelimited, Comma:=True
End Sub
Origine: = 65001 est UTF-8 . Virgule: Vrai pour les fichiers .csv distribués en colonnes
Enregistrez-le dans Personal.xlsb pour qu'il soit toujours disponible . Personnalisez la barre d'outils Excel en ajoutant un bouton d'appel de macro et en ouvrant des fichiers à partir de là . Vous pouvez ajouter davantage de formatage à la macro, comme l'ajustement automatique des colonnes, l'alignement, etc.
Oui, c'est possible Comme indiqué précédemment par plusieurs utilisateurs, il semble exister un problème de lecture du repère d’ordre d’octets correct par Excel lorsque le fichier est codé en UTF-8. Avec UTF-16, il ne semble pas y avoir de problème, il est donc endémique à UTF-8. La solution que j'utilise pour cela consiste à ajouter la nomenclature TWICE. Pour cela, j'exécute deux fois la commande sed suivante:
sed -I '1s/^/\xef\xbb\xbf/' *.csv
, où le caractère générique peut être remplacé par n’importe quel nom de fichier. Toutefois, cela entraîne une mutation du sep = au début du fichier .csv. Le fichier .csv s'ouvrira alors normalement dans Excel, mais avec une ligne supplémentaire avec "sep =" dans la première cellule. Le "sep =" peut également être supprimé dans le fichier .csv source, mais lors de l'ouverture du fichier avec VBA, le délimiteur doit être spécifié:
Workbooks.Open(name, Format:=6, Delimiter:=";", Local:=True)
Le format 6 est le format .csv. Définissez Local sur true, s'il existe des dates dans le fichier. Si Local n'est pas défini sur true, les dates seront américanisées, ce qui, dans certains cas, corrompra le format .csv.
Ceci est ma solution de travail:
vbFILEOPEN = "your_utf8_file.csv"
Workbooks.OpenText Filename:=vbFILEOPEN, DataType:=xlDelimited, Semicolon:=True, Local:=True, Origin:=65001
La clé est Origine: = 65001
Une liste de réponses vraiment étonnante, mais comme il en manque une assez bonne, je la mentionnerai ici: ouvrez le fichier csv avec google sheets et enregistrez-le sur votre ordinateur local au format Excel.
Contrairement à Microsoft, Google a réussi à prendre en charge les fichiers csv UTF-8, de sorte que le fichier s’y ouvre simplement. Et l'exportation au format Excel fonctionne également. Donc, même si ce n'est pas la solution préférée pour tous, il est assez sûr et le nombre de clics n'est pas aussi élevé que cela puisse paraître, en particulier lorsque vous êtes déjà connecté à Google.
Oui c'est possible. Lors de l'écriture du flux créant le fichier csv, la première chose à faire est la suivante:
myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)
Il ne s'agit pas d'une réponse précise à la question, mais comme je suis tombé par hasard sur cette solution et que les solutions ci-dessus ne fonctionnaient pas ou avaient des exigences que je ne pouvais pas satisfaire, voici une autre façon d'ajouter la nomenclature lorsque vous avez accès à vim:
vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv
salut j'utilise Ruby on Rails pour la génération CSV. Dans notre application, nous prévoyons d’utiliser le multilingue (I18n) et nous avons rencontré un problème lors de la visualisation du contenu I18n dans le fichier CSV de Windows Excel.
Était bien avec Linux (Ubuntu) et mac.
Nous avons identifié la nécessité d'importer à nouveau les données dans Windows Excel pour afficher les données réelles. Pendant l'importation, nous aurons plus d'options pour choisir le jeu de caractères.
Mais cela ne peut pas être expliqué à tous les utilisateurs. La solution que nous recherchons consiste donc à l’ouvrir par un simple double clic.
Nous avons ensuite identifié le moyen d'afficher les données en mode ouvert et de démarrer dans Windows Excel à l'aide de aghuddleston Gist . Ajouté à la référence.
Exemple I18n content
Sous Mac et Linux
Suédois: Förnamn Anglais: Prénom
Sous Windows
Suédois: Förnamn Anglais: Prénom
def user_information_report(report_file_path, user_id)
user = User.find(user_id)
I18n.locale = user.current_lang
open_mode = "w+:UTF-16LE:UTF-8"
bom = "\xEF\xBB\xBF"
body user, open_mode, bom
end
def headers
headers = [
"ID", "SDN ID",
I18n.t('sys_first_name'), I18n.t('sys_last_name'), I18n.t('sys_dob'),
I18n.t('sys_gender'), I18n.t('sys_email'), I18n.t('sys_address'),
I18n.t('sys_city'), I18n.t('sys_state'), I18n.t('sys_Zip'),
I18n.t('sys_phone_number')
]
end
def body tenant, open_mode, bom
File.open(report_file_path, open_mode) do |f|
csv_file = CSV.generate(col_sep: "\t") do |csv|
csv << headers
tenant.patients.find_each(batch_size: 10) do |patient|
csv << [
patient.id, patient.patientid,
patient.first_name, patient.last_name, "#{patient.dob}",
"#{translate_gender(patient.gender)}", patient.email, "#{patient.address_1.to_s} #{patient.address_2.to_s}",
"#{patient.city}", "#{patient.state}", "#{patient.Zip}",
"#{patient.phone_number}"
]
end
end
f.write bom
f.write(csv_file)
end
end
Les choses importantes à noter ici sont le mode ouvert et bom
open_mode = "w +: UTF-16LE: UTF-8"
bom = "\ xEF\xBB\xBF"
Avant d'écrire la nomenclature CSV insérée
f.write bom
f.write (csv_file)
Windows et Mac
Le fichier peut être ouvert directement par double clic.
Linux (ubuntu)
Tout en ouvrant un fichier, demandez les options de séparateur -> choisissez “TAB”
J'ai essayé tout ce que j'ai pu trouver sur ce fil et similaire, rien n'a fonctionné pleinement. Cependant, importer des feuilles sur Google et simplement télécharger en tant que csv fonctionnait à merveille. Essayez si vous venez à mon point de frustration.
C'est une vieille question mais je viens de rencontrer un problème similaire et la solution peut aider les autres:
Le même problème se posait lorsque l’écriture de données texte au format CSV dans un fichier, puis l’ouverture du fichier .csv résultant dans Excel déplace tout le texte dans une seule colonne. Après avoir lu les réponses ci-dessus, j’ai essayé ce qui suit, qui semble régler le problème.
Appliquez un codage UTF-8 lorsque vous créez votre StreamWriter. C'est tout.
Exemple:
using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
/* ... do stuff .... */
output.Close();
}
J'ai rencontré le même problème il y a quelques jours et je n'ai trouvé aucune solution car je ne peux pas utiliser la fonction import from csv
, car elle rend tout ce qu'il faut comme style.
Ma solution a d'abord été d'ouvrir le fichier avec notpad ++ et change the encode to ASCII
. Ensuite, vient d'ouvrir le fichier dans Excel et cela a fonctionné comme prévu.
Si vous souhaitez le rendre entièrement automatique, en un clic, ou le charger automatiquement dans Excel à partir d'une page Web, par exemple, mais que vous ne puissiez pas générer les fichiers Excel appropriés, je vous suggère de rechercher le format SYLK comme solution de rechange. OK, ce n’est pas aussi simple que CSV, mais il est basé sur du texte et très facile à mettre en œuvre. Il prend en charge UTF-8 sans aucun problème.
J'ai écrit une classe PHP qui reçoit les données et génère un fichier SYLK qui s'ouvrira directement dans Excel en cliquant simplement sur le fichier (ou lancera automatiquement Excel si vous écrivez le fichier sur une page Web avec le type mime correct. Vous pouvez même ajouter une mise en forme (comme en gras, des numéros de format de manière particulière, etc.) et changer la taille des colonnes, ou des colonnes de taille automatique en texte dans les colonnes, le code n’excédant probablement pas plus de 100 lignes.
Il est extrêmement facile de procéder à l’ingénierie inverse de SYLK en créant un tableur simple, en l’enregistrant au format SYLK, puis en le lisant à l’aide d’un éditeur de texte. Le premier bloc contient les en-têtes et les formats de nombres standard que vous reconnaîtrez (que vous régurgitez dans chaque fichier créé), puis les données sont simplement des coordonnées X/Y et une valeur.
Je génère des fichiers CSV à partir d'une simple application C # et j'ai le même problème. Ma solution était de m'assurer que le fichier est écrit avec le codage UTF8, comme suit:
// Use UTF8 encoding so that Excel is ok with accents and such.
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
SaveCSV(writer);
}
A l'origine, j'avais le code suivant, avec lequel les accents avaient l'air bien dans Notepad ++ mais qui étaient malmenés dans Excel:
using (StreamWriter writer = new StreamWriter(path))
{
SaveCSV(writer);
}
Votre kilométrage peut varier. J'utilise .NET 4 et Excel à partir d'Office 365.