28

つまり、UTF8データをサポートするこのWebアプリがあります。HoorayUTF8。また、ユーザーが入力したデータを問題なくCSVにエクスポートできます。その時点ではまだUTF8のままです。問題は、Excelで一般的なUTF8 CSVを開くと、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:この質問を最初に投稿したとき、タイムトラッキングシステムTempoでRuport gemを使用して、CSVエクスポートを提供していました。私の同僚の1人であるErikHollensbeeは、Ruport用のクイックフィルターを一緒に使用して、実際のExcel XSL出力を提供しました。これを、他のルビー主義者のためにここで共有したいと思いました。

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
4

8 に答える 8

9

Webページの文字コードエンコーディングをutf-8に設定し、Response.Binaryでcsvファイルの先頭にUTF-8バイトオーダーマーク(0xEF 0xBB 0xBF)を書き込むと、Excel 2007(よくわからない)他のバージョン) はそれを utf-8 として認識し、正しく開きます。

于 2010-07-21T15:16:10.627 に答える
7

同じ問題に数時間苦労した後、この件に関するこの優れた投稿を見つけました

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があります。

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

于 2010-01-19T05:41:02.967 に答える
5

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

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

于 2009-01-16T19:41:15.123 に答える
1

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プログラムに送り返します。

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

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

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

お役に立てれば、

ラリー

于 2009-03-06T22:08:02.337 に答える
1

utf エンコーディングで XML を作成し、.xls として保存すると、これらの 2 バイト文字も開きます。

xml バージョン="1.0" エンコーディング="utf-8"

于 2009-01-16T19:51:00.067 に答える
-3

OpenOffice Calc を試してみてください。Unicode との親和性が高く、UTF-8 エンコーディングの CSV ファイルのインポートとエクスポートの両方が可能です。

于 2009-05-25T22:22:05.617 に答える