Est-il possible de forcer Excel à reconnaître automatiquement les fichiers CSV UTF-8?

455

Je développe une partie d'une application chargée d'exporter certaines données dans des fichiers CSV. L'application utilise toujours UTF-8 en raison de sa nature multilingue à tous les niveaux. Mais ouvrir de tels fichiers CSV (contenant par exemple des signes diacritiques, des lettres cyrilliques, des lettres grecques) dans Excel n'obtient pas les résultats attendus montrant quelque chose comme Г„/Г¤, Г–/Г¶. 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?

PS Quels outils peuvent potentiellement se comporter comme Excel?


MISE À 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. Il y a deux réponses à ces questions que j'apprécie le plus: la toute première réponse d'Alex https://stackoverflow.com/a/6002338/166589 , et j'ai accepté cette réponse; et le second par Mark https://stackoverflow.com/a/6488070/166589qui sont apparus un peu plus tard. Du point de vue de la convivialité, Excel semblait manquer d'une bonne prise en charge UTF-8 CSV conviviale, donc je considère que les deux réponses sont correctes, et j'ai d'abord accepté la réponse d'Alex parce qu'elle a vraiment déclaré qu'Excel n'était pas en mesure de le faire cela de manière transparente. C'est ce que j'ai confondu avec automatiquement ici. La réponse de Mark propose un moyen plus compliqué pour les utilisateurs plus avancés d'atteindre le résultat attendu. Les deux réponses sont excellentes, mais celle d'Alex correspond 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 un problème technique et j'espère qu'il n'y a plus de discussion sur la meilleure réponse à présent. J'accepte donc la réponse de Mark comme la meilleure.

Lyubomyr Shaydariv
la source
1
Pouvez-vous utiliser des fichiers délimités par des tabulations? Si c'est le cas, vous aurez peut-être plus de chance.
Tim Perry
8
Office 2010+: meilleures œuvres: UTF-16LE avec nomenclature et \tcomme délimiteur. Fonctionnera en anglais et non anglais Excel. Peut appuyer Ctrl-Ssans sélectionner le format de fichier, etc. Préserve les caractères Unicode.
Sebastian
@Duncan franchement, je suis confus et c'est difficile de "juger". J'ai accepté la réponse d'Alex il y a plus de 2 ans (Q et R le 14 mai), puis Mark a répondu en suggérant une solution de contournement délicate (je ne l'ai pas vérifiée en fait) qui, de manière surprenante, a marqué plus de points à ma question qui est devenue populaire aussi. Nous avons en fait refusé le support d'Excel dans mon projet il y a longtemps et je ne veux pas enlever le score de réputation d'Alex, car Excel semblait, et semble toujours (veuillez me corriger si je me trompe), mal gérer CSV. C'est difficile à dire, désolé.
Lyubomyr Shaydariv
2
La réponse d'Alex a été supprimée par un modérateur. Aucune explication n'a été donnée, mais si vous avez suffisamment de réputation, vous pouvez toujours la voir.
Mark Ransom
1
Puisque les machines à voyager dans le temps n'existent pas encore, il suffit de ne pas être d'accord.
osexpert

Réponses:

398

Alex a raison, mais comme vous devez exporter vers csv, vous pouvez donner aux utilisateurs ce conseil lors de l'ouverture des fichiers csv:

  1. Enregistrez le fichier exporté au format csv
  2. Ouvrez Excel
  3. Importez les données à l'aide de Données -> Importer des données externes -> Importer des données
  4. Sélectionnez le type de fichier "csv" et accédez à votre fichier
  5. Dans l'assistant d'importation, remplacez File_Origin par "65001 UTF" (ou choisissez l'identifiant de caractère de langue correct)
  6. Remplacez le délimiteur par une virgule
  7. Sélectionnez où importer et terminer

De cette façon, les caractères spéciaux devraient s'afficher correctement.

marque
la source
163

Le marqueur d'ordre des octets UTF-8 indiquera Excel 2007+ au fait que vous utilisez UTF-8. (Voir cet article SO ).

Dans le cas où quelqu'un 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'octets dans un GetBytes()appel. Vous devez utiliser des flux (ou utiliser une solution de contournement ) pour obtenir la nomenclature en sortie.

StriplingWarrior
la source
18
L'insertion d'une nomenclature UTF-8 semble être la voie à suivre. Après c'est transparent.
vy32
12
J'utilise Notepad ++ pour convertir facilement le .csv UTF-8àUTF-8 with BOM
Sébastien
3
Oui - la meilleure solution. Beaucoup de messages confus autour de la définition d'en-têtes dans les réponses http. Cela résout le problème. La même chose peut être vue lors de l'ouverture du fichier dans le bloc-notes et de la sauvegarde directement à l'aide de l'option UTF-8. Ajoute également le marqueur d'ordre des octets.
user369142
1
@Elmue: J'ai pensé que peut-être (comme moi) il pensait qu'il le sauvegardait avec un marqueur d'ordre des octets, mais pas parce qu'une bibliothèque ne fonctionnait pas comme il le pensait. J'ai trouvé utile d'ajouter cette réponse, et de toute évidence, un certain nombre d'autres personnes l'ont également trouvée utile. En tout cas, cela semble être une meilleure réponse que de dire de ne pas utiliser CSV ou d'instruire les utilisateurs comment ouvrir le fichier d'une manière bizarre.
StriplingWarrior
1
La version Mac d'Excel semble toujours ignorer la nomenclature. (Excel pour Mac 2011.)
Thomas Andrews
74

Le bogue avec la nomenclature ignorée semble être corrigé pour Excel 2013. J'ai eu le même problème avec les lettres cyrilliques, mais l'ajout de caractère BOM \uFEFFa aidé.

sshturma
la source
8
Depuis que j'ai ajouté \ uFEFF au début de mon fichier CSV (généré en Java), Excel est capable de les ouvrir correctement! Thx
Galdo
16
cela a résolu mon problème aussi, en php, cela ressemble à ceci $utf8_with_bom = chr(239) . chr(187) . chr(191) . $csvText:;
Abdullah
@updola merci beaucoup pour ce commentaire, m'a fait gagner des heures
nathan hayfield
UTF-8, par définition, n'utilise ni ne doit utiliser les caractères de nomenclature. La façon dont Excel lit la nomenclature met en évidence l'avantage de l'UTF-8 sur Unicode, qui est une compatibilité descendante avec ASCII. L'ajout de la nomenclature fera fonctionner Excel, mais interrompra les autres lectures de fichiers UTF-8 / ASCII appropriées.
Nelson
1
\ FE \ FF fait de Mac OS Excel 2016 le fichier entier sous forme de hiéroglyphes japonais.
Nakilon
56

Il est incroyable qu'il y ait autant de réponses mais aucune ne répond à la question:

"Quand 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, ..."

La réponse marquée comme la 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. En dehors de cela: ce manuel s'appliquera à une version d'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 qu'Excel affiche les données UTF8 d'un simple double-clic?

Eh bien au moins dans Excel 2007, ce 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: L'écriture de données russes ou grecques dans un fichier CSV UTF8 avec une nomenclature entraîne des ordures dans Excel:

Contenu du fichier CSV UTF8:

Colum1;Column2
Val1;Val2
Авиабилет;Tλληνικ

Résultat dans Excel 2007:

CSV UTF8 Excel

Une solution consiste à ne pas utiliser du tout CSV. Ce format est implémenté si bêtement par Microsoft qu'il dépend des paramètres de région dans le panneau de configuration si une virgule ou un point - virgule 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 " Valeurs séparées par des virgules " mais par exemple sur un Windows allemand par défaut, le point-virgule doit être utilisé comme séparateur alors que la virgule ne fonctionne pas. (Ici, il doit être nommé 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. Il s'agit d'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 de mettre en œuvre une chose aussi fondamentale que l'importation CSV pendant toutes ces années.


Cependant, si vous mettez les mêmes valeurs dans un fichier HTML et enregistrez ce fichier en tant que fichier UTF8 avec BOM 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:

UTF8 HTML Excel

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:

UTF8 HTML Excel

Dans ce cas, seule la table elle-même a une bordure et des lignes noires. Si vous souhaitez que TOUTES les cellules affichent le 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 calcul (ici "MySuperSheet")

Résultat dans Excel 2007:

entrez la description de l'image ici

Elmue
la source
1
Et c'est aussi incroyable que les gens y répondent encore. :) Cependant, je dirais que CSV est mort: CSV est un format de streaming simple et mortel, et, lorsque j'étais sur ce projet, nous l'avons utilisé très fortement pour l'interaction des composants. Je n'utiliserais jamais le format HTML en raison de sa nature trop représentative, et je ne pourrais jamais obliger les utilisateurs de ce projet à exporter des données au format HTML juste pour le rendre convivial pour Excel. Excel était nul à l'UTF-8 CSV, et je n'ai aucune idée de ce qui a changé depuis 5 ans. Mais ces fichiers séparés par des virgules, des points-virgules et des tabulations sont de la vraie folie, je suppose.
Lyubomyr Shaydariv
5
Ce n'est pas incroyable que les gens répondent toujours à votre question parce que Google les amène ici: Tous avec la même question: Comment puis-je obtenir Excel stupide pour faire ce que je veux? Entrez 3 mots dans Google: "excel csv utf8" et votre question est le PREMIER résultat mondial. Vous avez écrit un best-seller!
Elmue
8
Étant donné que vous avez pris le temps de souligner qu'aucune des autres réponses ici ne provoque l'ouverture correcte d'un fichier CSV par Excel, il convient de mentionner que cette réponse ne fait pas cela non plus. La réponse initialement acceptée (qui a été supprimée par un modérateur) recommandait d'exporter les données directement dans un fichier Excel ou d'exporter un fichier HTML et de permettre aux utilisateurs d'ouvrir le fichier dans Excel. L'une ou l'autre de ces solutions est moins hacky que l'enregistrement d'un fichier HTML avec une extension de fichier XLS, mais aucune réponse n'a été proposée qui répond réellement à la question.
StriplingWarrior
3
@Warrior: "..mais aucune réponse n'a été proposée qui répond réellement à la question." Ce n'est pas correct. J'AI répondu à cette question: au moins avec Excel 2007, ce n'est PAS POSSIBLE. Telle est la réponse définitive. Si Excel ignore la nomenclature UTF8 et interprète les données comme ANSI, il n'y a aucun moyen d'importer par exemple du texte grec ou russe dans Excel via CSV par un simple double clic sur le fichier (ce qui était la question: "sans aucun problème pour un utilisateur" ). Ce que je propose est une solution de travail qui fonctionne avec TOUTES les versions d'Excel avec un double clic et ne nécessite pas d'étapes supplémentaires dans les menus d'Excel.
Elmue
2
Non seulement cela ne répond pas à la question, mais il est tout à fait faux d'affirmer que le CSV est "hérité" et "mort". Ce n'est pas parce que vous n'en voyez pas l'utilité qu'il est mort. De plus, vous ne comprenez clairement pas que c'est de l'histoire ou à quel point il est utilisé aujourd'hui. C'est mieux que XML (en raison des tailles de paquets plus petites) et le problème ici est de savoir comment Microsoft ne suit tout simplement pas une norme pour le format UTF8. La bonne réponse serait d'utiliser Open Office et non Microsoft, car Microsoft n'a jamais été bon en encodage.
Jeremy
49

Nous avons utilisé cette solution de contournement:

  1. Convertir CSV en UTF-16 LE
  2. Insérer la nomenclature au début du fichier
  3. Utiliser l'onglet comme séparateur de champ
e-zinc
la source
1
Merci! J'ai essayé toutes les autres réponses dans ce fil, mais la conversion en UTF-8 n'a tout simplement pas fonctionné. Lorsque j'ai essayé UTF-16 avec BOM, cela a fonctionné instantanément.
Husky
Pour Excel pour Mac 2011, j'ai réussi avec les petits fichiers csv endian UTF-16
multidynamique
Merci, cette solution est excellente pour donner à mes utilisateurs un csv unicode qu'ils peuvent ouvrir dans Excel.
user1073075
21

Eu 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 BOM ( "\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.

Ixtlilton
la source
13

J'ai eu le même problème dans le passé (comment produire des fichiers qu'Excel peut lire et d'autres outils peuvent également lire). J'utilisais TSV plutôt que CSV, mais le même problème avec les encodages est survenu.

Je n'ai pas trouvé de moyen pour qu'Excel reconnaisse automatiquement UTF-8, et je n'étais pas disposé / capable d'infliger aux consommateurs des fichiers des instructions compliquées pour les ouvrir. Je les ai donc encodés en UTF-16le (avec une nomenclature) au lieu d'UTF-8. Deux fois la taille, mais Excel peut reconnaître l'encodage. Et ils se compriment bien, donc la taille importe rarement (mais malheureusement jamais).

Steve Jessop
la source
C'est une vieille question, mais je suis heureux que les gens y répondent toujours. Je vous remercie. :)
Lyubomyr Shaydariv
1
@LyubomyrShaydariv: depuis que j'ai répondu à cette question, un collègue m'a dit que le dernier Excel identifie les fichiers CSV UTF-8 à condition qu'ils aient une nomenclature initiale. Donc dans quelques années, quand tout le monde (ou de toute façon, tout le monde à qui nous livrons les fichiers) est sur cette version d'Excel ou mieux, je pourrai peut-être changer mon encodage :-)
Steve Jessop
Étrange, pour moi ça ne marche pas. Transforme les personnages en symboles chinois ... (ils sont censés être
hébreux
J'avais des caractères chinois dans Excel lorsque j'ai enregistré dans "UTF-16 BE with BOM". Quand j'ai essayé "UTF-16 LE avec BOM" ça a marché! J'ai utilisé Sublime Text pour les tests.
Henno
12

Vieille question mais bon sang, la solution la plus simple est:

  1. Ouvrir CSV dans le bloc-notes
  2. Enregistrer sous -> sélectionner le bon encodage
  3. Ouvrez le nouveau fichier
Aki
la source
1
Quelle version d'Excel utilisez-vous?
Lyubomyr Shaydariv
1
Brillant, fonctionne simplement et résout le problème (au moins pour moi)
Auberon Vacher
1
Non, car le problème est qu'Excel ouvre le fichier .csv en tant que fichier csv. Je veux dire, j'ai un processus où je génère des fichiers csv. L'utilisateur n'aurait alors qu'à ouvrir les fichiers. Ici, il / elle doit faire plus que cela.
Veverke
2
@Veverke si vous générez des fichiers régulièrement, ce n'est pas la meilleure solution. Mais s'il s'agit d'un cas unique, cette réponse est parfaite. Cela fonctionne car le Bloc-notes placera la nomenclature au début d'un fichier UTF-8 ou UTF-16.
Mark Ransom
Fonctionne comme un charme. ((:
user2925795
10

Comme je l'ai publié sur http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html :

Dites au développeur du logiciel en charge de générer le CSV de le corriger. Pour contourner le 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.

Nestor Urquiza
la source
Merci, cela l'a corrigé. Je viens de convertir le csv ';' séparé en UTF-BOM dans Notepad ++ et sache que Excel l'ouvre correctement.
RandomGuy
Exactement ce qui était nécessaire! Voici un pointeur sur la façon de l'implémenter dans PHP stackoverflow.com/questions/25686191/…
EFC
Il s'agit de la solution de contournement pour Excel qui n'a pas pu reconnaître les caractères utf dans les fichiers csv. Donc, cette correction pour résoudre le problème Excel.
cobp
Cela a fonctionné pour la version grecque d'Excel 2007, avec des séparateurs par virgule. Je vous remercie.
NameOfTheRose
Modification de l'encodage en 'UTF-16le' dans fs.createWriteStream (fileName, {encoding: 'UTF-16le'}) et Excel a ouvert le fichier CSV correctement
rahul shukla
9

Vous pouvez convertir un fichier .csv en UTF-8 avec BOM via Notepad ++:

  1. Ouvrez le fichier dans Notepad ++ .
  2. Allez dans le menu EncodingConvert to UTF-8.
  3. Allez dans le menu FileSave.
  4. Fermez le Bloc-notes ++.
  5. Ouvrez le fichier dans Excel.

Fonctionné dans Microsoft Excel 2013 (15.0.5093.1000) MSO (15.0.5101.1000) 64 bits de Microsoft Office Professionnel Plus 2013 sur Windows 8.1 avec paramètres régionaux pour les programmes non Unicode définis sur «Allemand (Allemagne)».

Christopher Adi Pascual
la source
1
J'ai fait ce que tu as dit, ça n'a pas marché du tout. Conversion / encodage, définition des jeux de caractères, rien n'a fonctionné dans mon cas. L'importation de fichiers sur Google Sheets, le téléchargement au format CSV, a fonctionné sans problème. Votre accueil à partir de 2045
pakalbekim
1
Je devais le convertir avec Encoding -> Cinvert ti UTF-8-BOM Excel version 2016
Igor Vuković
4

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: vraie pour les fichiers .csv distribués dans des 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 ouvrez des fichiers à partir de là. Vous pouvez ajouter plus de formatage à la macro, comme l'ajustement automatique des colonnes, l'alignement, etc.

alc
la source
2
Merci. Malheureusement, c'est la suggestion pour les utilisateurs Excel très avancés, et ce que je vise, en posant cette question, c'est de faire Excel lui-même automatiquement.
Lyubomyr Shaydariv
J'ai essayé d'utiliser cet extrait de code, mais cela ne fonctionne pas pour moi. J'utilise Excel 2013.
Sharunas Bielskis
3

Juste pour aider les utilisateurs intéressés à ouvrir le fichier sur Excel qui réalisent ce fil 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.

  1. Ouvrez Microsoft Excel 2007.
  2. Cliquez sur l'option de la barre de menu Données.
  3. Cliquez sur l'icône From Text.
  4. Accédez à l'emplacement du fichier que vous souhaitez importer. Cliquez sur le nom du fichier, puis sur le bouton Importer. La fenêtre Assistant d'importation de texte - Étape 1 ou 3 apparaît maintenant à l'écran.
  5. Choisissez le type de fichier qui décrit le mieux vos données - largeur délimitée ou fixe.
  6. Choisissez 65001: Unicode (UTF-8) dans la liste déroulante qui apparaît à côté de l'origine du fichier.
  7. Cliquez sur le bouton Suivant pour afficher la fenêtre Assistant d'importation de texte - Étape 2 ou 3.
  8. Placez une coche à côté du délimiteur utilisé dans le fichier que vous souhaitez importer dans Microsoft Excel 2007. La fenêtre d'aperçu des données vous montrera comment vos données apparaîtront en fonction du délimiteur que vous avez choisi.
  9. Cliquez sur le bouton Suivant pour afficher l'assistant d'importation de texte - Étape 3 sur 3.
  10. Choisissez le format de données approprié pour chaque colonne de données que vous souhaitez importer. Vous avez également la possibilité de ne pas importer une ou plusieurs colonnes de données si vous le souhaitez.
  11. Cliquez sur le bouton Terminer pour terminer l'importation de vos données dans Microsoft Excel 2007.

Source: https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0

Wagner Bertolini Junior
la source
3

Oui, c'est possible. Comme indiqué précédemment par plusieurs utilisateurs, il semble y avoir un problème avec Excel qui lit le bon ordre de byte lorsque le fichier est encodé en UTF-8. Avec UTF-16, il ne semble pas avoir de problème, il est donc endémique à UTF-8. La solution que j'utilise pour cela est d'ajouter la nomenclature, deux fois. Pour cela, j'exécute la commande sed suivante deux fois:

sed -I '1s/^/\xef\xbb\xbf/' *.csv

, où le caractère générique peut être remplacé par n'importe quel nom de fichier. Cependant, cela conduit à 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 .csv source lui-même, 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, au cas où il y aurait 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.

TheCharlatan
la source
1
lors de l'exécution de la commande sed, j'obtiens: "sed: option invalide - 'I'", je pense que cela devrait être 'i'
BiAiB
2

Voici 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

Nobilis
la source
2

Oui c'est possible. Lors de l'écriture du flux créant le csv, la première chose à faire est la suivante:

myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)
zax
la source
Vous n'avez pas lu la question! Lyubomyr Shaydariv a écrit: "J'ai également essayé de spécifier UTF-8 BOM EF BB BF, mais Excel l'ignore."
Elmue
C'est du code qui fonctionne. Si vous écrivez des fichiers UTF-8 à partir d'applications .Net avec ce câble, Excel reconnaîtra le fichier comme UTF8.
zax
Peut être dans VOTRE Excel, cela fonctionne. Mais au moins dans Excel 2007, la nomenclature est complètement ignorée. Donc, si vous avez l'intention d'écrire un code qui fonctionne sur toutes les versions d'Excel, votre code n'est pas utile.
Elmue
2

Une liste de réponses vraiment étonnante, mais comme il en manque une assez bonne, je vais la mentionner ici: ouvrez le fichier csv avec des feuilles de google et enregistrez-le sur votre ordinateur local en tant que fichier excel.

Contrairement à Microsoft, Google a réussi à prendre en charge les fichiers csv UTF-8, il fonctionne donc simplement pour y ouvrir le fichier. Et l'exportation au format Excel fonctionne également. Donc, même si ce n'est pas la solution préférée pour tous, c'est assez sûr et le nombre de clics n'est pas aussi élevé que cela puisse paraître, surtout lorsque vous êtes déjà connecté à Google de toute façon.

Christoph
la source
2

Cela ne répond pas exactement à la question, mais comme je suis tombé sur ce problème et que les solutions ci-dessus ne fonctionnaient pas pour moi 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
CannedMoose
la source
2

salut j'utilise ruby ​​sur rails pour la génération csv. Dans notre application, nous prévoyons d'opter pour le multi-langue (I18n) et nous avons rencontré un problème lors de l'affichage du contenu I18n dans le fichier CSV de Windows Excel.

Était bien avec Linux (Ubuntu) et mac.

Nous avons identifié que Windows Excel doit à nouveau importer les données 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 éduqué pour chaque utilisateur, donc la solution que nous recherchons est d'ouvrir simplement en double-cliquant.

Ensuite, nous avons identifié la façon d'afficher les données par mode ouvert et bom dans windows excel à l'aide de aghuddleston gist . Ajouté à la référence.

Exemple de contenu I18n

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 insert

f. écrire bom

f.write (csv_file)

Windows et Mac

Le fichier peut être ouvert directement en double-cliquant.

Linux (ubuntu)

Lors de l'ouverture d'un fichier, demandez les options de séparation -> choisissez «TAB» entrez la description de l'image ici

praaveen
la source
1

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 import from csvfonctionnalité car elle permet de tout styliser sous forme de chaîne.

Ma solution a d'abord été d'ouvrir le fichier avec notpad ++ et change the encode to ASCII. Il suffit ensuite d'ouvrir le fichier dans Excel et cela a fonctionné comme prévu.

lpinto.eu
la source
1

En php, vous ajoutez simplement $ bom à votre $ csv_string:

$bom = sprintf( "%c%c%c", 239, 187, 191); // EF BB BF
file_put_contents( $file_name, $bom . $csv_string );

Testé avec MS Excel 2016, php 7.2.4

vess
la source
0

C'est une vieille question mais je viens de rencontrer un problème similaire et la solution peut aider les autres:

Nous avons eu le même problème lors de l'écriture de données texte CSV dans un fichier, puis en ouvrant le 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, ce qui semble résoudre le problème.

Appliquez un encodage UTF-8 lorsque vous créez votre StreamWriter. C'est ça.

Exemple:

using (StreamWriter output = new StreamWriter(outputFileName, false, Encoding.UTF8, 2 << 22)) {
   /* ... do stuff .... */
   output.Close();
}
Rex
la source
@elmue soin d'élaborer un peu? Sûrement, la sortie de CSV en utilisant le bon encodage pour commencer garantit qu'il n'y a pas de problèmes de compatibilité avec Excel plus tard dans le flux de travail?
Rex
Le code est incorrect car vous n'avez pas besoin de sortie.Close () si vous avez une instruction using (). En dehors de cela, l'inport Excel CSV est très primitif. Je ne l'utiliserais pas du tout. Si vous souhaitez importer dans Excel, utilisez plutôt un tableau HTML et ouvrez-le dans Excel.
Elmue
Merci d'avoir clarifié @Elmue - malheureusement, j'ai rencontré un certain nombre de scénarios (y compris des fichiers sur des lecteurs réseau) où une fermeture est explicitement requise ainsi que la suppression. Pas trouvé de raison pour laquelle je pense que je me souviens avoir vu un appel à Close()dans la Disposepile mais nous y voilà . Vous avez également tort de dire que l'importation CSV est primitive, car elle n'a pas besoin de l'approche HTML inefficace que vous avez suggérée. En fait, créer des étapes de programmation supplémentaires pour prendre des données en texte brut, les transformer en HTML puis les extraire dans Excel semble contre-intuitif
Rex
suite ... Cependant, différents scénarios ont des exigences différentes et mon exemple montre correctement comment spécifier l'encodage comme l'OP demandé
Rex
Veuillez relire la question d'origine: "J'ai également essayé de spécifier UTF-8 BOM EF BB BF, mais Excel l'ignore." J'ai testé le même et j'arrive au même résultat: Excel ne reconnaît PAS la nomenclature UTf8. Essayez! Écrivez un fichier CSV et mettez-y des caractères grecs ou russes. Ensuite, ouvrez cela dans Excel et vous obtiendrez une garbarge. Votre réponse ne résout donc rien.
Elmue
0

Si vous souhaitez le rendre entièrement automatique, en un seul clic, ou pour le charger automatiquement dans Excel, par exemple une page Web, mais ne pouvez pas générer de fichiers Excel appropriés, je vous suggère de regarder le format SYLK comme alternative. OK, ce n'est pas aussi simple que CSV mais il est basé sur du texte et très facile à implémenter et 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 ajoutez la mise en forme (comme le gras, formatez les nombres de manière particulière, etc.) et changez la taille des colonnes, ou la taille automatique des colonnes au texte dans les colonnes et dans l'ensemble, le code ne dépasse probablement pas environ 100 lignes.

Il est très facile de désosser SYLK en créant une simple feuille de calcul et en l'enregistrant en tant que SYLK, puis en la lisant avec un éditeur de texte. Le premier bloc sont des en-têtes et des formats numériques standard que vous reconnaîtrez (que vous régurgitez simplement dans chaque fichier que vous créez), puis les données sont simplement une coordonnée X / Y et une valeur.

Cloudranger
la source
0
  1. Téléchargez et installez LibreOffice Calc
  2. Ouvrez le fichier csv de votre choix dans LibreOffice Calc
  3. Dieu merci, un assistant d'importation de texte apparaît ...
  4. ... sélectionnez vos options de délimitation et d'encodage des caractères
  5. Sélectionnez les données résultantes dans Calc et copiez-les dans Excel
Dan
la source
0

Je génère des fichiers csv à partir d'une simple application C # et j'ai eu le même problème. Ma solution était de m'assurer que le fichier est écrit avec l'encodage UTF8, comme ceci:

// Use UTF8 encoding so that Excel is ok with accents and such.
using (StreamWriter writer = new StreamWriter(path, false, Encoding.UTF8))
{
    SaveCSV(writer);
}

J'avais à l'origine le code suivant, avec lequel les accents semblent bien dans Notepad ++, mais se déformaient 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.

yo-yo
la source
0

Solution de travail pour Office 365

  • enregistrer dans UTF-16(pas LE, BE)
  • utiliser un séparateur \t

Code en PHP

$header = ['číslo', 'vytvořeno', 'ěščřžýáíé'];
$fileName = 'excel365.csv';
$fp = fopen($fileName, 'w');
fputcsv($fp, $header, "\t");
fclose($fp);

$handle = fopen($fileName, "r");
$contents = fread($handle, filesize($fileName));
$contents = iconv('UTF-8', 'UTF-16', $contents);
fclose($handle);

$handle = fopen($fileName, "w");
fwrite($handle, $contents);
fclose($handle);
podolinek
la source
-1

Enregistrez d'abord la feuille de calcul Excel au format Unicode. Ouvrez le fichier TXT à l'aide d'Internet Explorer et cliquez sur "Enregistrer sous" Encodage TXT - choisissez l'encodage approprié, c'est-à-dire pour Win Cyrillic 1251

Bragabondio
la source
-1

J'ai essayé tout ce que je pouvais trouver sur ce fil et similaire, rien ne fonctionnait pleinement. Cependant, l'importation dans des feuilles Google et le téléchargement simple au format csv ont fonctionné comme un charme. Essayez-le si vous venez à mon point de frustration.

pakalbekim
la source