经过一番挖掘(Intervals的人们在这里有一篇有趣的文章),我们发现有一些非常令人恼火的有限选项,其中包括:
- 提供一个UTF-16小端TSV文件,Excel会正确解释该文件,但不支持多行数据
- 提供一个带有Excel MIME类型或文件扩展名的HTML表格(不确定此选项是否支持UTF8)
- 有三到四种方法可以将XML数据导入到各个最新版本的Excel中,这些方法理论上支持UTF8。电子表格ML,使用自定义XSLT,或通过模板生成新的Excel XML格式。
亲爱的Stack Overflowers,生成那个正确支持UTF8的"Just-For-Excel"文件的最简单方法是什么呢?如果这个最简单的选项只支持最新版本的Excel,那也很有趣。
我正在使用Rails堆栈进行此操作,但是好奇.Net开发人员和任何框架上的人如何处理此问题。我自己在几个不同的环境中工作,这绝对是一个将再次出现的问题。
更新2010-10-22:当我第一次发布这个问题时,我们一直在我们的时间跟踪系统Tempo中使用Ruport gem来提供CSV导出。我的一位同事Erik Hollensbee为Ruport快速编写了一个过滤器,以向我们提供实际的Excel XSL输出,我想在这里分享给其他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