【发布时间】:2010-10-01 21:15:51
【问题描述】:
所以我们有了这个支持 UTF8 数据的网络应用程序。万岁UTF8。我们可以将用户提供的数据导出到 CSV 中,这没有问题——那时它仍然是 UTF8。问题是,当您在 Excel 中打开一个典型的 UTF8 CSV 时,它会将其读取为 ANSII 编码文本,并因此尝试将 ø 和 ü 等两字节字符作为两个单独的字符读取,而您最终会失败。
所以我做了一些挖掘(Intervals 的人有一个有趣的帖子about it here),并且有一些有限的,如果可笑地烦人的选项。其中:
- 提供 Excel 可以正确解释但不支持多行数据的 UTF-16 Little Endian TSV 文件
- 在 HTML 表格中提供具有 Excel mime 类型或文件扩展名的数据(不确定此选项是否支持 UTF8)
- 有大约三到四种方法可以将 XML 数据导入到各种最新版本的 excel 中,理论上这些方法都支持 UTF8。 SpreadsheetML,使用自定义 XSLT,或通过模板生成新的 Excel XML 格式。
看起来无论如何,我可能会继续为那些不将它用于 Excel 的人继续提供一个普通的旧 CSV 文件,并为 Excel 提供一个单独的下载选项。
亲爱的 Stack Overflowers,生成正确支持 UTF8 的 Just-For-Excel 文件的最简单方法是什么?如果这个最简单的选项只支持最新版本的 Excel,那仍然值得关注。
我在 Rails 堆栈上执行此操作,但很好奇 .Net 人员和任何框架上的人员如何处理此问题。我自己在几个不同的环境中工作,这绝对是一个会再次出现的问题。
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
【问题讨论】:
标签: xml excel csv utf-8 utf-16