Microsoft Excel supprime les signes diacritiques dans les fichiers .csv?

190

J'exporte des données par programmation (en utilisant PHP 5.2) dans un fichier de test .csv.
Exemple de données: Numéro 1(notez le e accentué). Les données sont utf-8(pas de nomenclature ajoutée).

Lorsque j'ouvre ce fichier dans MS Excel s'affiche sous la forme Numéro 1.

Je suis en mesure de l'ouvrir dans un éditeur de texte (UltraEdit) qui l'affiche correctement. UE rapporte que le personnage est decimal 233.

Comment puis-je exporter des données texte dans un fichier .csv afin que MS Excel les rende correctement , de préférence sans forcer l'utilisation de l'assistant d'importation ou des paramètres de l'assistant non par défaut?

Freddo411
la source
Je serais très intéressé d'en savoir plus sur votre solution de nomenclature, car je crois avoir essayé "EF BB BF" qui n'a pas fonctionné pour moi.
James Baker
3
La solution de travail choisie était de: * inclure une nomenclature; utf-8 * utilisez cet en-tête: 'Content-type: text / plain; charset = utf-8 'Cela "a fonctionné" dans Excel 2003 et Excel 2007 - où travaillé = ouvert sans assistant d'importation et rendu les signes diacritiques correctement. Je n'ai pas vérifié que la nomenclature était requise.
Freddo411
2
La nomenclature est obligatoire, je viens de la tester maintenant. Sans cela, les caractères spéciaux ne sont pas rendus corrects.
Alex Ciminian
2
J'adorerais si quelqu'un pouvait en dire plus sur la façon d'ajouter une nomenclature (marqueur d'ordre des octets). Si je fais juste quelque chose comme Response.Write (EF BB BF "), ces caractères apparaissent juste au début du fichier.
sydneyos
sydneyos: Comme le dit Fergal ci-dessous; Ajoutez \ uFEFF à votre chaîne.
noocyte

Réponses:

243

Un fichier UTF8 correctement formaté peut avoir une marque d'ordre d'octet comme ses trois premiers octets. Ce sont les valeurs hexadécimales 0xEF, 0xBB, 0xBF. Ces octets servent à marquer le fichier comme UTF8 (car ils ne sont pas pertinents en tant qu'informations "ordre des octets"). 1 Si cette nomenclature n'existe pas, le consommateur / lecteur doit déduire le type de codage du texte. Les lecteurs qui ne sont pas compatibles UTF8 liront les octets comme un autre encodage tel que Windows-1252 et afficheront les caractères au début du fichier.

Il existe un bogue connu où Excel, lors de l'ouverture des fichiers CSV UTF8 via l'association de fichiers, suppose qu'ils sont dans un codage à un octet, sans tenir compte de la présence de la nomenclature UTF8. Cela ne peut être résolu par aucune page de code ou paramètre de langue par défaut du système. La nomenclature ne sera pas indiquée dans Excel - cela ne fonctionnera tout simplement pas. (Un rapport minoritaire affirme que la nomenclature déclenche parfois l'assistant "Importer du texte".) Ce bogue semble exister dans Excel 2003 et les versions antérieures. La plupart des rapports (parmi les réponses ici) indiquent que cela est corrigé dans Excel 2007 et plus récent.

Notez que vous pouvez toujours * ouvrir correctement les fichiers CSV UTF8 dans Excel en utilisant l'assistant "Importer du texte", qui vous permet de spécifier le codage du fichier que vous ouvrez. Bien sûr, c'est beaucoup moins pratique.

Les lecteurs de cette réponse sont très probablement dans une situation où ils ne prennent pas particulièrement en charge Excel <2007, mais envoient du texte UTF8 brut à Excel, ce qui l'interprète mal et saupoudre votre texte avec d' Ãautres caractères Windows-1252 similaires. L'ajout de la nomenclature UTF8 est probablement votre solution la meilleure et la plus rapide.

Si vous êtes coincé avec des utilisateurs sur des Excels plus anciens et qu'Excel est le seul consommateur de vos CSV, vous pouvez contourner ce problème en exportant UTF16 au lieu d'UTF8. Excel 2000 et 2003 les ouvriront deux fois correctement. (Certains autres éditeurs de texte peuvent avoir des problèmes avec UTF16, vous devrez donc peut-être peser soigneusement vos options.)


* Sauf lorsque vous ne pouvez pas, (au moins) l'assistant d'importation d'Excel 2011 pour Mac ne fonctionne pas toujours avec tous les encodages, indépendamment de ce que vous lui dites. </anecdotal-evidence> :)

James Baker
la source
14
Il m'a fallu une éternité pour trouver où spécifier l'encodage. Boîte de dialogue Enregistrer> Bouton Outils> Options Web> Onglet Encodage. Ils sont certainement bons pour cacher des choses aussi importantes.
Triynko
6
Erreur: l'ajout d'une nomenclature à un fichier UTF-8 charge ce fichier correctement sans nécessiter l'assistant d'importation dans Excel 2007.
Victor Nicollet
3
Nous avons trouvé la même chose que Victor dit aujourd'hui (en utilisant Excel 2010, c'est tout ce que nous avions à disposition). L'ajout d'une nomenclature / signature UTF-8 (EF BB BF) a semblé corriger le double-clic en utilisant l'encodage par défaut du système et utilise correctement UTF8 :)
Danny Tuppeny
20
En général , un fichier encodé en UTF-8 ne doit pas avoir de marque d'ordre d'octet en préfixe. UTF-8 n'a pas d'ordre d'octet variable, et le mettre là sabote la compatibilité ASCII de l'UTF-8. Il existe certains formats de fichiers spécifiques qui autorisent ou encouragent une fausse nomenclature UTF-8, mais sinon, cela doit être évité. CSV est totalement ignorant de l'encodage, c'est pourquoi personne ne sait si un outil donné interprétera la séquence d'octets 0xEF 0xBB 0xBF comme un indicateur de UTF-8; un caractère de contrôle invisible dans la première cellule; les caractères de la première cellule; ou tout autre chose.
bobince
3
@Ian: Personne ne sait avec certitude que c'est UTF-8 avec une nomenclature non plus - 0xEF 0xBB 0xBF est une séquence valide dans la plupart des encodages hérités également (par conséquent, elle est souvent mal interprétée comme ISO-8859-1 ou cp1252 et affichée comme ). Cela aide uniquement à deviner les algorithmes et les formats de fichiers qui en tiennent spécifiquement compte (par exemple XML). L'inconvénient d'inclure une fausse-BOM dans les fichiers UTF-8 est que vous cassez leur compatibilité ASCII (un argument de vente majeur pour UTF-8) De nombreux outils de texte ignorant l'encodage vont casser face à une fausse-BOM inattendue.
bobince
39

La préparation d'une nomenclature (\ uFEFF) a fonctionné pour moi (Excel 2007), dans la mesure où Excel a reconnu le fichier comme UTF-8. Sinon, l'enregistrer et utiliser l'assistant d'importation fonctionne, mais est moins idéal.


la source
1
Il ouvre toujours l'assistant d'importation de texte, donc la différence est que vous pouvez simplement double-cliquer, donc toujours pas idéal mais la seule solution connue de toute façon.
haridsv
Pour moi, aucun assistant d'importation n'apparaît avec Excel 2007.
Victor Nicollet
Aucun assistant d'importation pour moi non plus - cela fonctionne comme prévu si une nomenclature / signature UTF8 (EF BB BF) est présente.
Danny Tuppeny
De plus, \ufeffune nomenclature UTF-16 (BE) n'est-elle pas une nomenclature UTF-8
Alastair McCormack
2
Non, @AlastairMcCormack, c'est l'un ou l'autre, selon la façon dont il est encodé. "\ ufeff" encodé en UTF-8 est exactement EF BB BF. (Encodé en UTF-16, ce ne sera que deux octets.)
Dave Burt
30

Voici le code PHP que j'utilise dans mon projet lors de l'envoi de Microsoft Excel à l'utilisateur:

  /**
   * Export an array as downladable Excel CSV
   * @param array   $header
   * @param array   $data
   * @param string  $filename
   */
  function toCSV($header, $data, $filename) {
    $sep  = "\t";
    $eol  = "\n";
    $csv  =  count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
    foreach($data as $line) {
      $csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
    }
    $encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv;
    exit;
  }

MISE À JOUR: Amélioration du nom de fichier et BUG corrige le calcul de la longueur correcte. Merci à TRiG et @ ivanhoe011

Marc Carlucci
la source
1
J'ai essayé plusieurs autres suggestions sur cette page, mais cela a fonctionné pour moi dans Excel 2007. Les changements les plus importants ont été d'utiliser des tabulations au lieu de virgules (même s'il s'agit d'un fichier .csv) et la ligne au-dessus qui fait écho aux deux caractères suivis de la appel à mb_convert_encoding (). J'ai également dû recompiler PHP avec --enable-mbstring pour obtenir le support de mb_convert_encoding (). Merci!
Russell G
1
Cela a bien fonctionné pour moi aussi, merci. Cependant, dans Safari, j'obtiens une erreur dans ma console `` Ressource interprétée comme un document mais transférée comme ... '' Je suppose que c'est une bizarrerie WebKit, à en juger par stackoverflow.com/questions/3899426/... , mais peut-être que ce n'est pas le cas et / ou que quelqu'un l'a trouvé une solution. De plus, dans votre exemple, je suggérerais un changement: 'Content-Disposition: attachment; filename="'.$filename.'.csv"'parce que Firefox veut les guillemets, sinon il coupera votre nom de fichier après un espace.
kasimir
Pourquoi sortez-vous CSV ( text/csv) mais l'appelez-vous Excel ( application/vnd.ms-excel)?
TRiG
2
Cela fonctionne très bien! Je peux confirmer que cela fonctionne également sur Mac (dans Office 2011).
Jonathan
Cela ne devrait-il pas être header('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));?
Rich Bradshaw
13

La réponse pour toutes les combinaisons de versions d'Excel (2003 + 2007) et de types de fichiers

La plupart des autres réponses ici concernent uniquement leur version Excel et ne vous aideront pas nécessairement, car leur réponse pourrait ne pas être vraie pour votre version d'Excel.

Par exemple, l'ajout du caractère de nomenclature pose des problèmes avec la reconnaissance automatique du séparateur de colonne, mais pas avec toutes les versions d'Excel.

Il existe 3 variables qui déterminent si cela fonctionne dans la plupart des versions d'Excel:

  • Codage
  • Présence du personnage de la nomenclature
  • Séparateur de cellules

Quelqu'un de stoïque chez SAP a essayé toutes les combinaisons et a rapporté le résultat. Résultat final? Utilisez UTF16le avec la nomenclature et le caractère de tabulation comme séparateur pour qu'il fonctionne dans la plupart des versions d'Excel.

Tu ne me crois pas? Je ne le ferais pas non plus, mais lisez ici et pleurez: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator

Christiaan Westerbeek
la source
Pourquoi ne pas simplement ajouter sep=,ou tout ce que vous voulez utiliser? Si vous ajoutez déjà la nomenclature, je suppose que vous n'êtes pas opposé à l'ajout d'éléments au fichier.
Casey
Eh bien, en fait, pour répondre à ma propre question, vous n'ajouteriez pas la déclaration de séparateur de champ car cela empêche cette astuce de fonctionner. Donc, fondamentalement, c'est un encodage brouillé ou votre fichier n'est pas interprété correctement en tant que CSV si vos utilisateurs ont les mauvais paramètres de région.
Casey
1
utf-16le + BOM (0xFF 0xFE) + tab est le meilleur
zhaozhi
10

sélectionnez UTF-8 enconding lors de l'importation. si vous utilisez Office 2007, c'est ici que vous l'avez choisi: juste après avoir ouvert le fichier.

Daniels
la source
1
C'est utile. J'ai modifié la question pour demander comment faire cela sans recourir à l'assistant
Freddo411
9

Faites écho à la nomenclature UTF-8 avant de sortir les données CSV. Cela résout tous les problèmes de caractères dans Windows mais ne fonctionne pas pour Mac.

echo "\xEF\xBB\xBF";

Cela fonctionne pour moi car je dois générer un fichier qui ne sera utilisé que sur les PC Windows.

Johal
la source
Ce n'est pas vrai pour tous les types de séparateurs de colonnes ni pour toutes les versions d'Excel. Lisez ma réponse ci-dessous (ci-dessous pour le moment).
Christiaan Westerbeek
7

UTF-8 ne fonctionne pas pour moi dans Office 2007 sans aucun service pack, avec ou sans BOM (U + ffef ou 0xEF, 0xBB, 0xBF, ni l'un ni l'autre) l'installation de sp3 fait fonctionner UTF-8 lorsque 0xEF, 0xBB, 0xBF BOM est ajouté.

UTF-16 fonctionne lors de l'encodage en python en utilisant "utf-16-le" avec un 0xff 0xef BOM en préfixe, et en utilisant tab comme séparateur. J'ai dû écrire manuellement la nomenclature, puis utiliser "utf-16-le" plutôt que "utf-16", sinon chaque encode () ajoutait la nomenclature à chaque ligne écrite qui apparaissait comme des ordures sur la première colonne du deuxième ligne et après.

Je ne peux pas dire si UTF-16 fonctionnerait sans aucun sp installé, car je ne peux pas revenir en arrière maintenant. soupir

C'est sur Windows, je ne sais pas sur Office pour MAC.

pour les deux cas de travail, l'importation fonctionne lors du lancement d'un téléchargement directement depuis le navigateur et l'assistant d'importation de texte n'intervient pas, il fonctionne comme prévu.

gerald dol
la source
Fonctionne également sur Excel 2011 pour Mac.
Adam
merci pour votre message, utilisez utf-16le est ok même si vous n'avez pas installé office 2007 sp3, mais la nomenclature devrait être 0xFF 0xFE
zhaozhi
4

Comme Fregal l'a dit, \ uFEFF est la voie à suivre.

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("\uFEFF");
// csv text here
%>
Kristof Neirynck
la source
1
Regardez et voyez comment votre séparateur d'onglets est ignoré dans Excel 2007 lorsque vous utilisez la nomenclature. Vous devez trouver quelque chose de plus.
Christiaan Westerbeek
3

J'ai également remarqué que la question avait été «répondue» il y a quelque temps, mais je ne comprends pas les histoires qui disent que vous ne pouvez pas ouvrir un fichier csv encodé en utf8 avec succès dans Excel sans utiliser l'assistant de texte.

Mon expérience reproductible: tapez Old MacDonald had a farm,ÈÌÉÍØdans le Bloc-notes, appuyez sur Entrée, puis sur Enregistrer sous (en utilisant l'option UTF-8).

Utiliser Python pour montrer ce qu'il y a réellement là-dedans:

>>> open('oldmac.csv', 'rb').read()
'\xef\xbb\xbfOld MacDonald had a farm,\xc3\x88\xc3\x8c\xc3\x89\xc3\x8d\xc3\x98\r\n'
>>> ^Z

Bien. Le bloc-notes a mis une nomenclature à l'avant.

Maintenant, allez dans l'Explorateur Windows, double-cliquez sur le nom du fichier, ou faites un clic droit et utilisez "Ouvrir avec ...", et affiche Excel (2003) avec l'affichage comme prévu.

John Machin
la source
@Cocowalla: Eh bien, j'ai juste essayé ceci (encore une fois; je l'ai testé avant de poster) et cela a fonctionné avec Excel 2007 (ce que j'utilise maintenant). Avez-vous fait open('oldmac.csv', 'rb').read()pour vérifier votre entrée?
John Machin
Je n'ai pas essayé avec Excel 2007 (je sais qu'Excel 2007 lit très bien les fichiers UTF-8 avec une nomenclature), j'ai essayé avec Excel 2003
Cocowalla
@Cocowalla: Eh bien, cela a fonctionné pour moi avec Excel 2003 quand je l'ai eu. Êtes-vous sûr de disposer du dernier service pack pour Excel 2003? Avez-vous vérifié votre entrée comme je l'ai suggéré?
John Machin
J'ai vérifié que le bloc-notes avait bloqué une nomenclature au début du fichier, mais je suis sur Excel 2003 SP2 (SP3 est disponible) - donc je suppose que cela ne fonctionne que dans SP3
Cocowalla
2

Vous pouvez enregistrer un fichier html avec l'extension «xls» et les accents fonctionneront (avant 2007 au moins).

Exemple: enregistrez ceci (en utilisant Enregistrer sous utf8 dans le Bloc-notes) sous le nom test.xls:

<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
  <th>id</th>
  <th>name</th>
</tr>
<tr>
 <td>4</td>
 <td>Hélène</td>
</tr>
</table>
</html>
Benjol
la source
option intéressante. Il ouvre le texte à droite mais pour une raison quelconque, toute la page est complètement blanche. Sans les lignes de feuille de calcul classiques délimitant les lignes et les colonnes (Office pour Mac)
Sebastian Sastre
Ouais, même chose dans Office 2007 sous Windows. Je suis toujours surpris que cela ait fonctionné du tout, pour être honnête. (Remarque, si vous ajoutez border="1"à la table, vous faites obtenir des lignes, mais seulement autour des 4 cellules :)
Benjol
1

C'est juste une question de codage de caractères. Il semble que vous exportiez vos données au format UTF-8: é en UTF-8 est la séquence de deux octets 0xC3 0xA9, qui, lorsqu'elle est interprétée dans Windows-1252, est à ©. Lorsque vous importez vos données dans Excel, assurez-vous de lui indiquer que le codage de caractères que vous utilisez est UTF-8.

Adam Rosenfield
la source
J'ai confirmé que les données sont UTF-8. Que dois-je mettre dans le fichier pour informer Excel que mes données sont utf-8 (BOM?)
Freddo411
Je pense que vous devez changer le codage du fichier, Excel utilise la page de codes par défaut du système pour gérer les fichiers csv
albertein
Je ne suis pas tout à fait sûr, car Excel n'est pas installé sur la machine que j'utilise actuellement, mais avec OpenOffice, il existe une liste déroulante pour l'encodage de caractères lorsque vous importez un fichier CSV. De là, choisissez Unicode (UTF-8).
Adam Rosenfield
Excel n'a pas le menu déroulant AFAIK
albertein
1

Le format CSV est implémenté en ASCII, et non en unicode, dans Excel, ce qui modifie les signes diacritiques. Nous avons rencontré le même problème, c'est la façon dont j'ai découvert que la norme CSV officielle était définie comme étant basée sur ASCII dans Excel.

Jeff Yates
la source
En fait, CSV n'est pas lié à un encodage spécifique. C'est Excel qui suppose ASCII. en.wikipedia.org/wiki/Comma-separated_values
spoulson
C'est ce que j'ai dit. "implémenté comme ASCII dans Excel", "CSV défini comme basé sur ASCII dans Excel". Je ne sais pas quel argument vous faites, car vous semblez être d'accord avec moi.
Jeff Yates
2
En fait, vous dites "Le format CSV est implémenté en ASCI", je pense que c'est de là que vient la confusion.
RichardOD
1

Excel 2007 lit correctement UTF-8 avec csv codé BOM (EF BB BF).

Excel 2003 (et peut-être plus tôt) lit UTF-16LE avec BOM (FF FE), mais avec des tabulations au lieu de virgules ou de points-virgules.

user203319
la source
1

Je ne peux que CSV pour analyser correctement dans Excel 2007 en tant que petit boutiste UTF-16 séparé par des tabulations en commençant par la marque d'ordre d'octet appropriée.

Manfred Stienstra
la source
1

L'écriture d'une nomenclature dans le fichier CSV de sortie a en fait fonctionné pour moi dans Django:

def handlePersoonListExport(request):
    # Retrieve a query_set
    ...

    template = loader.get_template("export.csv")
    context = Context({
        'data': query_set,
    })

    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=export.csv'
    response['Content-Type'] = 'text/csv; charset=utf-8'
    response.write("\xEF\xBB\xBF")
    response.write(template.render(context))

    return response

Pour plus d'informations http://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.html Merci les gars!

Lukas Batteau
la source
Oui, cela a fonctionné pour moi avec Excel 2010. En utilisation Java printWriter.print('\ufeff'), voir aussi Comment ajouter une nomenclature UTF-8 en java .
tsauerwein le
1

Une autre solution que j'ai trouvée était simplement d'encoder le résultat en tant que page de code Windows 1252 (Windows-1252 ou CP1252). Cela serait fait, par exemple en définissant de Content-Typemanière appropriée quelque chose comme text/csv; charset=Windows-1252et en définissant le codage de caractères du flux de réponse de la même manière.

creechy
la source
Merci pour celui-ci. Fonctionne sur Excel Windows et Mac. Je l'utilise.
Sebastian Sastre
Cela ne fonctionnera que si votre plage de caractères non-ascii relève entièrement de Windows-1252. Donc, par exemple, pas de coréen / chinois / japonais, pas de cyrillique, etc. Mais je suppose que vous glisserez avec cela pour la plupart des langues d'Europe occidentale.
Tom McClure
1

Notez que l'inclusion de la nomenclature UTF-8 n'est pas forcément une bonne idée - les versions Mac d'Excel l'ignorent et afficheront en fait la nomenclature au format ASCII… trois mauvais caractères au début du premier champ de votre feuille de calcul…

Ned Martin
la source
Je sais que ce commentaire date de 6 ans plus tard, mais FWIW: Utiliser JavaScript pour télécharger un fichier '\uFEFF' + myCsvStringfonctionne comme prévu sur Mac Excel 15.19.1 (2016).
bobjones
0

Vérifiez l'encodage dans lequel vous générez le fichier, pour que Excel affiche correctement le fichier, vous devez utiliser la page de codes par défaut du système.

Quelle langue utilisez-vous? s'il s'agit de .Net, il vous suffit d'utiliser Encoding.Default lors de la génération du fichier.

Albertein
la source
Les données d'exportation sont utf-8.
J'écris
Transcoder les données vers la page de codes Windows-1252, je ne sais pas comment y parvenir avec PHP
albertein
0

Si vous avez du code hérité dans vb.net comme moi, le code suivant a fonctionné pour moi:

    Response.Clear()
    Response.ClearHeaders()
    Response.ContentType = "text/csv"
    Response.Expires = 0
    Response.AddHeader("Content-Disposition", "attachment; filename=export.csv;")
    Using sw As StreamWriter = New StreamWriter(Context.Response.OutputStream, System.Text.Encoding.Unicode)
        sw.Write(csv)
        sw.Close()
    End Using
    Response.End()
Johann
la source
0

J'ai trouvé un moyen de résoudre le problème. C'est un mauvais hack mais cela fonctionne: ouvrez le document avec Open Office , puis enregistrez-le dans n'importe quel format Excel; le résultat .xlsou .xlsxaffichera les caractères accentués.

Fred Reillier
la source
1
Le PO dit qu'il exporte par programmation, il ne recherche donc pas une solution nécessitant une intervention manuelle.
Christiaan Westerbeek
0

Avec Ruby 1.8.7, j'encode chaque champ en UTF-16 et je supprime la nomenclature (peut-être).

Le code suivant est extrait de active_scaffold_export:

<%                                                                                                                                                                                                                                                                                                                           
      require 'fastercsv'                                                                                                                                                                                                                                                                                                        
      fcsv_options = {                                                                                                                                                                                                                                                                                                           
        :row_sep => "\n",                                                                                                                                                                                                                                                                                                        
        :col_sep => params[:delimiter],                                                                                                                                                                                                                                                                                          
        :force_quotes => @export_config.force_quotes,                                                                                                                                                                                                                                                                            
        :headers => @export_columns.collect { |column| format_export_column_header_name(column) }                                                                                                                                                                                                                                
      }                                                                                                                                                                                                                                                                                                                          

      data = FasterCSV.generate(fcsv_options) do |csv|                                                                                                                                                                                                                                                                           
        csv << fcsv_options[:headers] unless params[:skip_header] == 'true'                                                                                                                                                                                                                                                      
        @records.each do |record|                                                                                                                                                                                                                                                                                                
          csv << @export_columns.collect { |column|                                                                                                                                                                                                                                                                              
            # Convert to UTF-16 discarding the BOM, required for Excel (> 2003 ?)                                                                                                                                                                                                                                     
            Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]                                                                                                                                                                                                                                        
          }                                                                                                                                                                                                                                                                                                                      
        end                                                                                                                                                                                                                                                                                                                      
      end                                                                                                                                                                                                                                                                                                                        
    -%><%= data -%>

La ligne importante est:

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]
Antonio Bardazzi
la source
-2

ouvrir le fichier csv avec notepad ++ cliquer sur Encode, sélectionner convertir en UTF-8 (ne pas convertir en UTF-8 (sans BOM)) Enregistrer ouvert par double clic avec excel En espérant que cela aide Christophe GRISON

Christophe GRISON
la source
1
Cela ne répond pas à la question car il est censé être fait par programme et ne nécessite pas d'intervention de l'utilisateur pour réenregistrer manuellement chaque fichier
Joe W