所以我们有这个支持 UTF8 数据的网络应用程序。万岁UTF8。我们可以将用户提供的数据导出到 CSV 中,这没有问题——那时它仍然是 UTF8。问题是,当您在 Excel 中打开一个典型的 UTF8 CSV 时,它会将其读取为 ANSII 编码的文本,并因此尝试将 ø 和 ü 等两字节字符作为两个单独的字符读取,而您最终会失败。
所以我做了一些挖掘(Intervals 的人在这里有一篇关于它的有趣帖子),并且有一些有限的,如果可笑的烦人的选项。其中:
- 提供 Excel 将正确解释但不支持多行数据的 UTF-16 Little Endian TSV 文件
- 提供具有 Excel mime 类型或文件扩展名的 HTML 表中的数据(不确定此选项是否支持 UTF8)
- 有大约三到四种方法可以将 XML 数据导入到各种最新版本的 excel 中,理论上这些方法都支持 UTF8。SpreadsheetML,使用自定义 XSLT,或通过模板生成新的 Excel XML 格式。
看起来无论如何,我可能会继续为那些不使用 Excel 的人提供一个普通的旧 CSV 文件,并为 Excel 提供一个单独的下载选项。
亲爱的 Stack Overflowers,生成正确支持 UTF8 的 Just-For-Excel 文件的最简单方法是什么?如果这个最简单的选项只支持最新版本的 Excel,那仍然很有趣。
我在 Rails 堆栈上执行此操作,但很好奇 .Net-ers 和任何框架上的人员如何处理此问题。我自己在几个不同的环境中工作,这绝对是一个会再次出现的问题。
2010-10-22 更新:当我第一次发布这个问题时,我们一直在我们的时间跟踪系统Tempo中使用 Ruport gem来提供 CSV 导出。我的一位同事 Erik Hollensbee 为 Ruport 提供了一个快速过滤器,为我们提供了实际的 Excel XSL 输出,我想我会在这里与任何其他 ruby 专家分享:
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