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

je développe une partie d'une application qui est responsable de l'exportation de certaines données dans les fichiers CSV. L'application utilise toujours UTF-8 en raison de sa nature multilingue à tous les niveaux. Mais l'ouverture de tels fichiers CSV (contenant par exemple des diacritiques, des lettres cyrilliques, des lettres grecques) dans Excel n'atteint pas les résultats attendus montrant quelque chose comme Г„/Г¤, Г–/Г¶ . Et je ne sais pas comment forcer Excel à comprendre que le fichier CSV ouvert est encodé en UTF-8. J'ai aussi essayé de spécifier UTF-8 BOM EF BB BF , mais Excel l'ignore.

y a-t-il une solution?

P.S. 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. 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, dans une langue courante et transparente façon. Cependant, j'ai utilisé une formulation erronée demandant de le faire automatiquement . C'est très déroutant et cela se heurte à la macro-automatisation 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 la seconde par https://stackoverflow.com/a/6488070/166589 qui sont apparus un peu tard. Du point de vue de l'utilisabilité, Excel a semblé avoir l'absence d'un bon soutien convivial UTF-8 CSV, donc je considère les deux les réponses sont correctes, et j'ai accepté la réponse D'Alex d'abord parce qu'il a vraiment déclaré Qu'Excel n'était pas en mesure de le faire de manière transparente. C'est ce que j'ai confondu avec automatiquement ici. La réponse de Mark favorise une façon plus compliquée pour les utilisateurs plus avancés d'atteindre le résultat attendu. Les deux réponses sont grands, mais celle d'Alex correspond un peu mieux à ma question.


UPDATE 2

cinq mois après la dernière édition, J'ai remarqué que la réponse D'Alex a 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 réponse plus grande maintenant. J'accepte donc la réponse de Mark comme la meilleure.

324
demandé sur Community 2011-05-14 17:53:39

24 réponses

Alex est correct, mais comme vous devez exporter vers csv, vous pouvez donner aux utilisateurs ce Conseil lors de l'ouverture des fichiers csv:

  1. Enregistrer le fichier exporté comme un csv
  2. Open Excel
  3. importer les données en utilisant les données-->Importer des données externes --> importer des données
  4. sélectionnez le type de fichier de "csv" et accédez à votre fichier
  5. dans l'Assistant d'importation changer le File_Origin en "65001 UTF" (ou choisir la bonne langue de caractères identifiant)
  6. changer le délimiteur en virgule
  7. choisir où importer et finir

de cette façon, les caractères spéciaux doivent apparaître correctement.

327
répondu Mark 2011-06-27 13:38:04

le marqueur UTF-8 Byte-order indiquera Excel 2007+ dans le fait que vous utilisez UTF-8. (Voir ce tant de poster ).

dans le cas où quelqu'un aurait les mêmes problèmes que moi, la classe D'encodage UTF8 de.Net ne produit pas de marqueur d'ordre de byte, même si son constructeur en est explicitement informé. Vous devez utiliser cette solution si vous voulez vraiment enregistrez-le avec un marqueur de byte-order.

116
répondu StriplingWarrior 2017-05-23 10:31:37

le bug avec BOM ignoré semble être corrigé pour Excel 2013. J'ai eu le même problème avec les lettres cyrilliques, mais l'ajout du caractère BOM \uFEFF a aidé.

58
répondu sshturma 2013-04-26 07:52:21

c'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 UTF-8 Fichier CSV 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 est inutile pour moi parce que je ne veux pas donner à mes utilisateurs un manuel comment configurer Excel. En dehors de cela: ce manuel s'appliquent à une version Excel mais d'autres versions Excel ont des menus et des dialogues de configuration différents. Vous aurez besoin d'un manuel pour chaque version Excel.

la question est donc de savoir comment faire Excel Afficher des données UTF8 avec un simple double clic?

bien au moins dans Excel 2007 ce n'est pas possible si vous utilisez des fichiers CSV parce que le BOM UTF8 est ignoré et vous ne verrez que des ordures. Cela fait déjà partie de la question de Lyubomyr Shaydariv.:

" j'ai aussi essayé de spécifier UTF-8 BOM EF BB BF, mais Excel ignore cela."

je fais la même expérience: écrire des données russes ou grecques dans un fichier CSV UTF8 avec des résultats BOM dans les ordures dans Excel:

contenu du fichier CSV UTF8:

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

résultat dans Excel 2007:

CSV UTF8 Excel

une solution est de ne pas utiliser CSV du tout. Ce format est mis en œuvre si stupidement par Microsoft qu'il dépend des paramètres de région dans panneau de configuration si virgule ou point-virgule est utilisé comme séparateur. Donc le même fichier CSV peut s'ouvrir correctement sur un ordinateur mais pas sur un autre. "CSV" signifie " Virgule Valeurs Séparées", mais par exemple sur une version allemande de Windows par défaut point-virgule doit être utilisé comme séparateur, tandis que la virgule ne fonctionne pas. (Ici, il doit être appelé SSV = valeurs séparées par un point-virgule) les fichiers CSV ne peuvent pas être interchangés entre différentes versions linguistiques de Windows. Il s'agit d'un problème supplémentaire au problème de L'UTF-8.

Excel existe depuis des décennies. Il est dommage que Microsoft n'ait pas été en mesure de mettre en œuvre une telle chose de base comme CSV importation dans toutes ces années.

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 bon résultat.

contenu du fichier XLS UTF8:

<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 qui excellent 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 voulez que toutes les cellules affichent gridlines c'est aussi 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

31
répondu Elmue 2018-05-17 22:01:56

nous avons utilisé cette solution:

  1. convertir CSV en UTF-16
  2. inscrire BOM au début du fichier
  3. utiliser l'onglet comme séparateur de champ
29
répondu e-zinc 2015-10-29 19:17:48

a eu les mêmes problèmes avec les fichiers CSV générés par PHP. Excel a ignoré le BOM lorsque le séparateur a été défini via "sep=,\n" au début du contenu (mais bien sûr après le BOM).

ajouter un 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.

17
répondu Ixtlilton 2015-10-26 09:18:01

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

j'ai échoué à trouver un moyen D'obtenir Excel pour reconnaître UTF-8 automatiquement, et je n'étais pas disposé/capable d'infliger sur les consommateurs des fichiers des instructions compliquées comment les ouvrir. Donc je les ai encodés comme UTF-16le (avec un BOM) au lieu de UTF-8. Deux fois la taille, mais Excel peut reconnaître l'encodage. Et ils compriment bien, de sorte que la taille rarement (mais malheureusement pas jamais).

9
répondu Steve Jessop 2013-07-09 09:18:26

question ancienne mais heck, la solution la plus simple est:

  1. Open CSV dans le bloc-notes
  2. Enregistrer sous -> choisir le bon encodage
  3. ouvrir le nouveau fichier
9
répondu Aki 2014-04-29 13:39:49

comme j'ai posté sur http://thinkinginsoftware.blogspot.com/2017/12/correctly-generate-csv-that-excel-can.html :

dites au développeur de logiciel chargé de générer le CSV de le corriger. Comme solution rapide, vous pouvez utiliser gsed pour insérer le BOM UTF-8 au début de la chaîne:

gsed -i '1s/^\(\xef\xbb\xbf\)\?/\xef\xbb\xbf/' file.csv

cette commande insère le BOM UTF-4 s'il n'est pas présent. C'est donc une commande idempotent. Maintenant tu devrais pouvoir double-cliquer sur le fichier et l'ouvrir dans Excel.

4
répondu Nestor Urquiza 2017-12-08 17:40:49

C'est une vieille question, mais vient dans la recherche d'en haut. J'ai trouvé après beaucoup d'efforts que l'ajout de caractères BOM au début du fichier csv aide.

Je l'ai briefé ici: https://sites.google.com/site/ritechtips/home/the-multi-line-fields-csv-file-and-excel-import---ha

3
répondu Found-it-finally 2015-10-29 19:18:01

macro VBA Simple pour ouvrir le texte utf-8 et les fichiers csv

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 .fichiers csv distribués en colonnes

garde ça en privé.xlsb pour toujours l'avoir à disposition. Personnalisez la barre d'outils excel en ajoutant un bouton d'appel macro et ouvrez des fichiers à partir de là. Vous pouvez ajouter plus de formatage à la macro, comme autofit colonne, alignement, etc.

2
répondu alc 2012-03-19 15:02:40

juste pour aider les utilisateurs intéressés à ouvrir le fichier sur Excel qui réalisent ce fil comme moi.

j'ai utilisé le magicien ci-dessous et il a fonctionné très bien pour moi, l'importation D'un fichier UTF-8. Pas transparent, mais utile si vous avez déjà le fichier.

  1. Ouvrir Microsoft Excel 2007.
  2. cliquez sur l'option de barre de menu de données.
  3. cliquez sur l'icône du texte.
  4. naviguez vers le l'emplacement du fichier que vous souhaitez importer. Cliquez sur le nom du fichier, puis sur le bouton Importer. La fenêtre de L'Assistant D'importation de texte - Étape 1 ou 3 apparaîtra 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 s'affiche à côté de File origin.
  7. cliquez sur le bouton Suivant pour afficher L'Assistant D'importation de texte - Étape 2 ou 3 la fenêtre.
  8. cochez à côté du délimiteur qui a été utilisé dans le fichier que vous souhaitez importer dans Microsoft Excel 2007. La fenêtre de prévisualisation 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 de 3.
  10. Choisir le format de données pour chaque colonne de données que vous souhaitez importer. Vous avez aussi l'option 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

2
répondu Wagner Bertolini Junior 2015-10-13 14:38:25

une liste de réponses vraiment étonnante, mais puisqu'il en manque une assez bonne, je la mentionnerai ici: ouvrez le fichier csv avec Google sheets et sauvegardez-le sur votre ordinateur local comme un fichier excel.

contrairement à Microsoft, Google a réussi à prendre en charge les fichiers CSV UTF-8 de sorte qu'il fonctionne tout simplement à ouvrir le fichier. Et l'exportation vers le format excel fonctionne aussi tout simplement. Donc, même si ce n'est pas la solution préférée pour tous, il est assez sûr d'échec et le nombre de clics n'est pas aussi élevé qu'il peut sembler, surtout quand vous êtes déjà connecté à google de toute façon.

2
répondu Christoph 2017-04-08 19:26:20

C'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 L'origine: = 65001

1
répondu Nobilis 2013-10-18 09:49:47

Oui c'est possible. En écrivant le flux créant le csv, la première chose à faire est ceci:

myStream.Write(Encoding.UTF8.GetPreamble(), 0, Encoding.UTF8.GetPreamble().Length)
1
répondu zax 2014-02-28 21:18:08

Oui, c'est possible. Comme noté précédemment par plusieurs utilisateurs, il semble y avoir un problème avec la lecture par excel de L'ordre correct des octets lorsque le fichier est encodé en UTF-8. Avec L'UTF-16, Il ne semble pas avoir de problème, il est donc endémique à L'UTF-8. La solution que j'utilise pour cela est d'ajouter le BOM, deux fois. Pour cela, j'exécute deux fois la commande sed suivante:

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

, où le Joker peut être remplacé par n'importe quel nom de fichier. Cependant, cela conduit à une mutation du sep= au début du .fichier csv. Le. csv fichier puis ouvrir normalement dans excel, mais avec une ligne supplémentaire avec "sep=" dans la première cellule. Le "sep=" peut également être supprimé dans la source .csv lui-même, mais en ouvrant le fichier avec VBA le délimiteur doit être spécifié:

Workbooks.Open(name, Format:=6, Delimiter:=";", Local:=True)

Format 6 est le .le format csv. Définissez Local à true, au cas où il y aurait des dates dans le fichier. Si Local n'est pas mis à vrai, les dates seront américanisées, ce qui dans certains cas corrompre l' .le format csv.

1
répondu TheCharlatan 2016-12-05 10:08:40

ce n'est pas exactement répondre à la question, mais comme je suis tombé sur cette et les solutions ci-dessus ne fonctionnait pas pour moi ou avait des exigences que je ne pouvais pas répondre, voici une autre façon d'ajouter le BOM quand vous avez accès à vim:

vim -e -s +"set bomb|set encoding=utf-8|wq" filename.csv
1
répondu CannedMoose 2017-11-01 17:10:03

nous sommes en 2018, et je viens du futur.

pour ouvrir le fichier avec un double clic qui affiche les caractères corrects, ouvrez le fichier dans le bloc-notes++ et sélectionnez Encoding - > UTF-8-BOM et cliquez sur Enregistrer.

1
répondu Christopher Adi Pascual 2018-09-20 08:15:40

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

a eu le même problème où l'écriture de données de texte CSV à un fichier, puis l'ouverture du résultat .csv in Excel déplace tout le texte en une seule colonne. Après avoir lu les réponses ci-dessus, j'ai essayé la suivante, ce qui semble régler le problème.

applique un encodage de 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
répondu Rex 2013-03-25 13:41:02

si vous voulez le rendre entièrement automatique, un clic, ou pour charger automatiquement dans Excel à partir d'une page Web, par exemple, mais ne peut pas générer des fichiers Excel appropriés, alors je suggérerais de regarder le format SYLK comme une alternative. OK il n'est pas aussi simple que CSV mais il est basé sur le texte et très facile à mettre en œuvre et il soutient UTF-8 sans problèmes.

j'ai écrit une classe PHP qui reçoit les données et produit un fichier SYLK qui s'ouvrira directement dans Excel en cliquant simplement sur le fichier (ou va auto-lancer Excel si vous écrivez le fichier à une page web avec le type mime correct. Vous pouvez même ajouter du formatage (comme des caractères gras, des numéros de format en particulier, etc) et changer la taille des colonnes, ou des colonnes de taille automatique au texte dans les colonnes et tout dans tout le code n'est probablement pas plus de 100 lignes.

il est très facile d'Inverser SYLK en créant un simple tableur et en sauvegardant sous SYLK puis en le lisant avec un éditeur de texte. Le premier bloc sont des en-têtes et les formats de nombre standard que vous reconnaîtrez (que vous ne faites que régurgiter dans chaque fichier que vous créez), alors les données sont simplement une coordonnée X/Y et une valeur.

0
répondu Cloudranger 2016-05-10 10:16:02
  1. Télécharger & installer LibreOffice Calc
  2. ouvrir le fichier csv de votre choix en LibreOffice Calc
  3. Dieu merci qu'un assistant d'importation de texte apparaisse...
  4. ...sélectionnez vos options de délimiteur et d'encodage des caractères
  5. sélectionner les données résultantes dans Calc et copier coller pour Excel
0
répondu Dan 2017-11-06 02:40:36

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 très bien dans Notepad++ mais étaient en train de se mutiler dans Excel:

using (StreamWriter writer = new StreamWriter(path))
{
    SaveCSV(writer);
}

votre kilométrage peut varier - j'utilise .NET 4 et Excel de Office 365.

0
répondu yoyo 2018-08-14 21:21:00

Salut j'utilise ruby on rails pour la génération csv. Dans notre application, nous prévoyons d'aller pour le multi langage(I18n) et nous avons fait face à un problème lors de la visualisation de contenu I18n dans le fichier CSV de windows excel.

était parfait avec Linux (Ubuntu) et mac.

nous avons identifié que windows excel doit être importé les données à nouveau pour voir les données réelles. Tandis que l'importation nous obtiendrons plus d'options pour choisir le jeu de caractères.

mais ça ne peut pas être instruit pour chaque utilisateur, donc solution que nous cherchons est d'ouvrir juste par double clic.

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

exemple i18n contenu

dans Mac et Linux

Suédois: Förnamn Anglais : Premier le nom de

Dans 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

choses Importantes à noter ici est en mode ouvert et bom

open_mode = "w+: UTF-16LE: UTF-8"

compilation de nomenclature " = "\xEF\xBB\xBF"

avant d'écrire le CSV insérer BOM

F. Ecrire bom

F. Ecrire (csv_file)

Windows et Mac

Le fichier

peut être ouvert directement par double clic.

Linux (ubuntu)

lors de l'ouverture d'un fichier demander les options du séparateur - > choisir " onglet" enter image description here

0
répondu praaveen 2018-08-15 12:27:24

sauvegardez D'abord la feuille de calcul Excel en texte Unicode. Ouvrez le fichier TXT en utilisant Internet explorer et cliquez sur "Enregistrer sous" encodage TXT-choisissez l'encodage approprié, i.e. Pour Win Cyrillic 1251

-1
répondu Bragabondio 2011-12-06 20:59:19