web-dev-qa-db-fra.com

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

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.

356

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:

  1. Enregistrez le fichier exporté en tant que csv
  2. Ouvrez Excel
  3. Importez les données en utilisant 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'identificateur de caractère de langue correct) 
  6. Changer le délimiteur en virgule
  7. Sélectionnez où importer et Terminer

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

345
Mark

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.

124
StriplingWarrior

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é.

61
sshturma

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:

 CSV UTF8 Excel

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:

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

 enter image description here

38
Elmue

Nous avons utilisé cette solution de contournement: 

  1. Conversion de CSV en UTF-16 
  2. Insérer une nomenclature au début du fichier
  3. Utiliser l'onglet comme séparateur de champs
34
e-zinc

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.

17
Ixtlilton

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).

10
Steve Jessop

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

  1. Ouvrez le fichier CSV dans le Bloc-notes
  2. Enregistrer sous -> sélectionner le bon encodage
  3. Ouvrez le nouveau fichier
10
Aki

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.

5
Nestor Urquiza

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

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

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)".

4

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

3
Found-it-finally

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.

  1. Ouvrez Microsoft Excel 2007.
  2. Cliquez sur l'option de la barre de menu Données.
  3. Cliquez sur l'icône Du texte.
  4. Naviguez jusqu'à l'emplacement du fichier que vous souhaitez importer. Cliquez sur le nom du fichier, puis sur le bouton Importer. La fenêtre Importation de texte Wizard - Étape 1 ou 3 apparaît maintenant à l'écran.
  5. Choisissez le type de fichier qui décrit le mieux vos données - Délimité ou Largeur fixe.
  6. Choisissez 65001: Unicode (UTF-8) dans la liste déroulante qui apparaît en regard de Origine du fichier.
  7. Cliquez sur le bouton Suivant pour afficher la fenêtre Importation de texte Wizard - Étape 2 ou 3.
  8. Cochez la case en regard 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'importation de texte Wizard - Étape 3 sur 3.
  10. Choisissez le format de données approprié pour chaque colonne de données à 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 finir d'importer vos données dans Microsoft Excel 2007.

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.

2
alc

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. 

1
TheCharlatan

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

1
Nobilis

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.

1
Christoph

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)
1
zax

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
1
CannedMoose

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”  enter image description here

1
praaveen

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.

0
pakalbekim
  1. Téléchargez et installez LibreOffice Calc
  2. Ouvrez le fichier csv de votre choix dans LibreOffice Calc 
  3. Merci au ciel qu'un assistant de texte d'importation s'affiche ...
  4. ... sélectionnez vos options de délimiteur et d'encodage des caractères
  5. Sélectionnez les données obtenues dans Calc et copiez-les dans Excel.
0
Dan

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();
}
0
Rex

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.

0
lpinto.eu

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.

0
Cloudranger

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.

0
yoyo