つまり、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