Quelle est la meilleure façon d'exporter des données UTF8 dans Excel?

nous avons donc cette application web où nous supportons les données UTF8. Hourra UTF8. Et nous pouvons exporter les données fournies par l'utilisateur dans CSV aucun problème - il est encore dans UTF8 à ce point. Le problème est que lorsque vous ouvrez un CSV UTF8 typique dans Excel, il le lit comme texte encodé ANSII, et en conséquence tente de lire deux caractères comme ø et ü comme deux caractères séparés et vous finissez par échouer.

alors j'ai creusé un peu (les intervalles ont un post intéressant à ce sujet ici), et il y a quelques limitée si ridiculement ennuyeux options. Parmi eux:

  • fournir un petit fichier Idan TSV UTF-16 qui sera interprété correctement par Excel, mais qui ne supportera pas les données multi-lignes
  • fournir les données dans une table HTML avec un type mime Excel ou une extension de fichier (Pas sûr si cette option supporte UTF8)
  • il y a quelques trois ou quatre façons d'obtenir des données XML dans les différentes versions récentes d'excel, et ceux supporterait UTF8, en théorie. SpreadsheetML, en utilisant XSLT personnalisé, ou la génération du nouveau format Excel XML via templating.

il semble que peu importe quoi, je vais probablement vouloir continuer à offrir un simple Vieux fichier CSV pour les gens qui ne l'utilisent pas pour Excel de toute façon, et une option de téléchargement séparé pour Excel.

Quelle est la façon la plus simple de générer ce fichier Just-For-Excel qui supportera correctement UTF8, mon cher Stack Overflowers? Si que plus simple option supporte seulement la dernière version D'Excel, qui est toujours d'intérêt.

je fais ça sur une pile de Rails, mais je me demande comment les .Net-ers et les gens sur n'importe quel cadre gèrent ça. Je travaille dans différents environnements de moi-même et c'est certainement un problème qui va devenir de nouveau.

mise à jour 2010-10-22: nous avions utilisé le Gem Ruport dans notre système de suivi du temps Tempo pour fournir les exportations CSV lorsque j'ai publié pour la première fois ceci question. Un de mes collègues, Erik Hollensbee, a créé un filtre rapide pour Ruport pour nous fournir une sortie XSL Excel, et j'ai pensé que je partagerais cela ici pour tous les autres ruby-ists:

require 'rubygems'
require 'ruport'
require 'spreadsheet'
require 'stringio'

Spreadsheet.client_encoding = "UTF-8"

include Ruport::Data

class Ruport::Formatter::Excel < Ruport::Formatter
  renders :excel, :for => Ruport::Controller::Table

  def output
    retval = StringIO.new

    if options.workbook
      book = options.workbook
    else
      book = Spreadsheet::Workbook.new
    end

    if options.worksheet_name
      book_args = { :name => options.worksheet_name }
    else
      book_args = { }
    end

    sheet = book.create_worksheet(book_args)

    offset = 0

    if options.show_table_headers
      sheet.row(0).default_format = Spreadsheet::Format.new(
        options.format_options || 
        { 
          :color => :blue,
          :weight => :bold,
          :size => 18
        }
      )
      sheet.row(0).replace data.column_names
      offset = 1
    end

    data.data.each_with_index do |row, i|
      sheet.row(i+offset).replace row.attributes.map { |x| row.data[x] }
    end

    book.write retval
    retval.seek(0)
    return retval.read
  end
end
27
demandé sur Billy Gray 2009-01-16 22:30:27

8 réponses

vous oubliez de créer une source de données OleDB et Excel Interop, mais il y a des problèmes avec ceux-là aussi.

je recommande le Tableurml option. Il fonctionne assez bien, les chances sont votre plate-forme a quelques outils décents pour construire des fichiers xml, et il est entièrement soutenu aussi loin que OfficeXP. Office2000 n'est pas soutenu, mais l'expérience personnelle est qu'il fonctionne d'une manière limitée.

5
répondu Joel Coehoorn 2009-01-16 19:41:15

j'ai trouvé que si vous définissez l'encodage du jeu de caractères de la page Web à utf-8, puis répondre.BinaryWrite l'UTF-8 Byte Order Mark (0xEF 0xBB 0xBF) en haut du fichier csv, Excel 2007 (pas sûr sur d'autres versions) de reconnaître qu'il en utf-8 et de l'ouvrir correctement.

9
répondu Andrew Csontos 2010-07-21 15:16:10

Après avoir lutté avec le même problème, pour quelques heures, j'ai trouvé cet excellent post sur le sujet

http://blog.plataformatec.com.br/2009/09/exporting-data-to-csv-and-excel-in-your-rails-app/ citation :

Donc, ce sont les trois règles d' traiter avec Excel-friendly-CSV:

  1. utilisez des tableaux, pas des virgules.
  2. les champs ne doivent pas contenir de nouvelles lignes.
  3. utiliser UTF-16 Little Endian pour envoyer le fichier à l'utilisateur. Et comprennent un Little Endian BOM manuellement.

cependant, si vous utilisez ruby, votre problème est résolu: d'abord vous avez le FasterCSV bijou

mais j'ai fini par utiliser le tableur gem qui génère directement des tableurs excell (j'ai le lien limitation, juste de calcul google + rubyforge) Brillant !

7
répondu Alexis Perrier 2011-05-08 00:51:51

si vous créez un XML avec encodage utf et le Sauvegardez comme A.xls il sera ouvert même à ceux de deux octets caractères:

xml version= " 1.0 "encoding=" utf-8"

1
répondu Rulas 2009-01-16 19:51:00

j'ai eu exactement le même problème d'envoyer des données UTF8 à Excel. Ma solution:

la version actuelle du tableur Perl::WriteExcel CPAN code écrit correctement les fichiers Excel en utilisant les données UTF8.

J'ai donc écrit un plugin Rails qui a) ouvre une pipe à deux sens à un programme perl b) envoie les données, ligne par ligne, au programme perl. J'utilise Yaml que le message de format de données. (Ruby yaml Standard n'est pas UTF8, il y a une version spéciale disponible, ya2yaml) c) le programme perl crée le fichier excel d) Lorsque le programme Rails indique (via un message yaml) que la dernière ligne a été envoyée, le programme perl crée le fichier excel et renvoie l'état au programme rails.

bien sûr, l'ajout d'un programme perl à un projet de rails par un procédé parallèle et un tuyau est beaucoup plus dans le spectre de "L'Ingénierie" que "L'Informatique."(Il fait le travail, mais n'est pas très élégant.) Mais il fonctionne bien et m'a sauvé la semaines, il faudrait pour le port Ecrivez le code à Ruby. Notez également que le port Ruby de WriteExcel actuellement disponible ne traite pas utf8.

Mon sw est permissive open source, mais je n'ai pas eu l'occasion de le relâcher encore. Si vous le souhaitez, dans son état actuel, reportez-vous à http://sandbox.kluger.com/write_excel_v.5.tar

notez que vous allez vouloir créer vos fichiers excel dans un processus de fond, pas dans le processus du Controller de Rails car cela bloquerait les autres clients du navigateur comme vous broyez en produisant le fichier excel. J'utilise delayedjob plugin, fonctionne bien.

j'Espère que cette aide,

Larry

1
répondu Larry K 2009-03-06 22:08:02

je suis tombé sur ce post à la recherche de la réponse rubis à pourquoi Excel ne chargerait pas correctement un CSV avec des caractères utf-8. Après avoir cherché et expérimenté cette solution a fonctionné pour moi:

csv_content = CSV.generate(col_sep: "\t", headers: :first_row, encoding: 'utf-8') do |csv|
  csv << ["header1", "header2"]
  csv << ["content1", "content2"]
end
write_content = Iconv.conv("utf-16le", "utf-8", "\xEF\xBB\xBF")
write_content += Iconv.conv("utf-16le", "utf-8", csv_content)
File.open("listing.csv", 'wb') {|f| f.write(write_content) }
1
répondu Russell 2011-11-15 05:06:56

Excel ne gère pas correctement L'UTF-8. Vous devriez utiliser à la place une page de code qui satisfait vos besoins

Response.ContentType = "text/plain";
// codepage: 28591, codepage name:iso-8859-1, codepage display name: Western European (ISO)
Response.ContentEncoding = System.Text.Encoding.GetEncoding(28591);
-1
répondu kri 2010-03-05 09:21:59

essayez OpenOffice Calc - il est beaucoup plus facile D'importer et D'exporter des fichiers CSV avec encodage UTF - 8.

-3
répondu 2009-05-25 22:22:05