所以我们有这个网络应用程序,我们支持UTF8数据。 Hooray UTF8。我们可以将用户提供的数据导出到CSV没有问题 – 它仍然在UTF8在那一点。问题是当你在Excel中打开一个典型的UTF8 CSV,它读取它作为ANSII编码文本,因此试图读取ø和ü两个字节的字符作为两个单独的字符,你最终失败。
所以我做了一些挖掘(Intervals的人有一个有趣的帖子about it here),有一些有限的,如果可笑的恼人的选择。其中:
>提供一个UTF-16小端TSV文件,Excel将正确解释,但不支持多行数据
>使用Excel mime类型或文件扩展名在HTML表中提供数据(不确定此选项是否支持UTF8)
>有一些三到四种方法来获取XML数据到各种最新版本的excel,并且那些将支持UTF8,理论上。 SpreadsheetML,使用自定义XSLT,或通过模板生成新的Excel XML格式。
它看起来像无论什么,我可能要继续提供一个普通的CSV文件为不使用它为Excel的人和一个单独的下载选项的Excel。
什么是最简单的方式生成的Just-For-Excel文件,将正确支持UTF8,我亲爱的Stack Overflowers?如果最简单的选项只支持最新版本的Excel,这仍然是感兴趣的。
我在Rails栈上这样做,但是好奇的是.Net -ers和任何框架的人都处理这个。我在自己的几个不同的环境中工作,这绝对是一个问题,将再次成为。
更新2010-10-22:我们在我们的时间跟踪系统Tempo中使用Ruport gem提供CSV导出,当我第一次发布此问题。我的同事之一,Erik Hollensbee,一起为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
您忘记创建OleDB数据源和Excel Interop,但这些也有问题。
我推荐SpreadsheetML选项。它的工作原理很好,赔率是你的平台有一些体面的工具,用于构建xml文件,它完全支持作为OfficeXP。 Office2000不受支持,但个人经验是它的工作有限的方式。