つまり、UTF8データをサポートするこのWebアプリがあります。 HoorayUTF8。また、ユーザーが指定したデータをCSVに問題なくエクスポートできます。その時点ではまだUTF8のままです。問題は、通常のUTF8 CSVをExcelで開くと、ANSIIでエンコードされたテキストとして読み取られ、したがって、øやüなどの2バイト文字を2つの別々の文字として読み取ろうとして、失敗することです。
だから私は少し掘り下げました(インターバルの人々は興味深い投稿をしています ここでそれについて )、そしてばかげて迷惑なオプションがそこにある場合はいくつか制限されています。その中で:
とにかく、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
OleDBデータソースとExcel相互運用機能の作成を忘れていますが、それらにも問題があります。
SpreadsheetML オプションをお勧めします。それはかなりうまく機能し、あなたのプラットフォームにはxmlファイルを構築するためのいくつかのまともなツールがあり、OfficeXPまで完全にサポートされている可能性があります。 Office2000はサポートされていませんが、個人的な経験では、限られた方法でしか機能しません。
Webページの文字セットエンコーディングをutf-8に設定し、次にResponse.BinaryWriteをcsvファイルの先頭にUTF-8バイトオーダーマーク(0xEF 0xBB 0xBF)に設定すると、Excel 2007(他のバージョン)はそれをutf-8として認識し、正しく開きます。
同じ問題に数時間苦労した後、私はこの主題に関するこの素晴らしい投稿を見つけました
http://blog.plataformatec.com.br/2009/09/exporting-data-to-csv-and-Excel-in-your-Rails-app/ 見積もり:
したがって、Excel対応のCSVを処理するための3つのルールは次のとおりです。
- カンマではなく、表を使用してください。
- フィールドに改行を含めることはできません。
- UTF-16リトルエンディアンを使用してファイルをユーザーに送信します。また、リトルエンディアンBOMを手動で含めます。
ただし、Rubyを使用している場合は、問題は解決されます。まず、 FasterCSV gemがあります。
しかし、私は優れたスプレッドシートを直接生成するスプレッドシートgemを使用することになりました(リンク制限があり、googleスプレッドシート+ rubyforgeだけです)素晴らしい!
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プラグインを使用すると、うまく機能します。
お役に立てれば、
ラリー
Utfエンコーディングを使用してXMLを作成し、それを.xlsとして保存すると、次の2バイトの文字も開きます。
xml version = "1.0" encoding = "utf-8"
私はこの投稿を探して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) }