web-dev-qa-db-ja.com

UTF8データをExcelにエクスポートする最良の方法は何ですか?

つまり、UTF8データをサポートするこのWebアプリがあります。 HoorayUTF8。また、ユーザーが指定したデータをCSVに問題なくエクスポートできます。その時点ではまだUTF8のままです。問題は、通常のUTF8 CSVをExcelで開くと、ANSIIでエンコードされたテキストとして読み取られ、したがって、øやüなどの2バイト文字を2つの別々の文字として読み取ろうとして、失敗することです。

だから私は少し掘り下げました(インターバルの人々は興味深い投稿をしています ここでそれについて )、そしてばかげて迷惑なオプションがそこにある場合はいくつか制限されています。その中で:

  • excelが正しく解釈するが、複数行のデータをサポートしないUTF-16リトルエンディアンTSVファイルを提供する
  • excelのmimeタイプまたはファイル拡張子を持つHTMLテーブルのデータを提供します(このオプションがUTF8をサポートしているかどうかはわかりません)
  • xMLデータをExcelのさまざまな最近のバージョンに取り込むには3つまたは4つの方法があり、理論的にはそれらがUTF8をサポートします。 SpreadsheetML、カスタムXSLTの使用、またはテンプレートによる新しいExcelXML形式の生成。

とにかく、Excelで使用していない人のために、昔ながらのCSVファイルと、Excel用の別のダウンロードオプションを提供し続けたいと思うでしょう。

親愛なるStackOverflowersであるUTF8を正しくサポートするJust-For-Excelファイルを生成する最も簡単な方法は何ですか?その最も単純なオプションが最新バージョンのExcelのみをサポートしている場合でも、それは興味深いことです。

私はこれをRailsスタックで行っていますが、フレームワークの.Net-ersと人々がこれをどのように処理するのか興味があります。私はいくつかの異なる環境で作業しています。これは間違いなく問題です。再び立ち上がるでしょう。

更新2010-10-22:時間追跡システムでRuport gemを使用していた Tempo CSVを提供するこの質問を最初に投稿したときにエクスポートします。私の同僚の1人であるErikHollensbeeは、Ruportのクイックフィルターをまとめて、実際のExcel XSL出力を提供してくれました。これを、他のRuby-istと共有したいと思いました。

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
Billy Gray

OleDBデータソースとExcel相互運用機能の作成を忘れていますが、それらにも問題があります。

SpreadsheetML オプションをお勧めします。それはかなりうまく機能し、あなたのプラットフォームにはxmlファイルを構築するためのいくつかのまともなツールがあり、OfficeXPまで完全にサポートされている可能性があります。 Office2000はサポートされていませんが、個人的な経験では、限られた方法でしか機能しません。

5
Joel Coehoorn

Webページの文字セットエンコーディングをutf-8に設定し、次にResponse.BinaryWriteをcsvファイルの先頭にUTF-8バイトオーダーマーク(0xEF 0xBB 0xBF)に設定すると、Excel 2007(他のバージョン)はそれをutf-8として認識し、正しく開きます。

9
Andrew Csontos

同じ問題に数時間苦労した後、私はこの主題に関するこの素晴らしい投稿を見つけました

http://blog.plataformatec.com.br/2009/09/exporting-data-to-csv-and-Excel-in-your-Rails-app/ 見積もり:

したがって、Excel対応のCSVを処理するための3つのルールは次のとおりです。

  1. カンマではなく、表を使用してください。
  2. フィールドに改行を含めることはできません。
  3. UTF-16リトルエンディアンを使用してファイルをユーザーに送信します。また、リトルエンディアンBOMを手動で含めます。

ただし、Rubyを使用している場合は、問題は解決されます。まず、 FasterCSV gemがあります。

しかし、私は優れたスプレッドシートを直接生成するスプレッドシートgemを使用することになりました(リンク制限があり、googleスプレッドシート+ ruby​​forgeだけです)素晴らしい!

7
Alexis Perrier

UTF8データをExcelに送信するのとまったく同じ問題がありました。私の解決策:

現在のバージョンのPerlSpreadsheet :: WriteExcel cpanコードは、UTF8データを使用してExcelファイルを正しく書き込みます。

だから私はRailsプラグインa)Perlプログラムへの双方向パイプを開くb)データを一度に1行ずつPerlプログラムに送信するように書いた。メッセージデータ形式としてYamlを使用しています。 (標準Ruby yamlはUTF8ではありません。特別なバージョンが利用可能です。ya2yaml)c)PerlプログラムがExcelファイルを作成します。d)Railsプログラムが示す場合(yamlメッセージを介して)最後の行が送信されたことを確認すると、PerlプログラムはExcelファイルを作成し、ステータスをRailsプログラムに送り返します。

もちろん、PerlプログラムをRailsプロジェクトに並列プロセスとパイプを介して追加することは、「コンピューターサイエンス」ではなく、「エンジニアリング」の領域に非常に多く含まれます(これで作業は完了しますが、エレガントではありません。)しかし、それはうまく機能し、WriteExcelコードをRubyに移植するのにかかる数週間を節約しました。また、現在利用可能なRuby WriteExcelの移植はutf8を処理しないことにも注意してください。

私のswは寛容なオープンソースですが、まだリリースに取り掛かっていません。現在の状態にしたい場合は、 http://sandbox.kluger.com/write_Excel_v.5.tar を参照してください。

Railsコントローラーのプロセスではなく、バックグラウンドプロセスでExcelファイルを作成することをお勧めします。これは、Excelファイルの作成を挽くときに他のブラウザークライアントをブロックするためです。I DelayedJobプラグインを使用すると、うまく機能します。

お役に立てれば、

ラリー

1
Larry K

Utfエンコーディングを使用してXMLを作成し、それを.xlsとして保存すると、次の2バイトの文字も開きます。

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

1
Rulas

私はこの投稿を探してRuby Excelがutf-8文字のCSVを正しくロードしない理由の答えを探しました。このソリューションを検索して実験した後、私はうまくいきました:

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
Russell