将UTF8数据导出到Excel的最佳方法是什么?

所以我们有这个Web应用程序,我们支持UTF8数据。 万岁UTF8。 而且我们可以将用户提供的数据导出为CSV,这一点还是UTF8。 问题是,当你在Excel中打开一个典型的UTF8 CSV文件时,它会将其读取为ANSII编码的文本,并相应地尝试读取ø和ü这样的两个字节的字符作为两个独立的字符,最终导致失败。

所以我做了一些挖掘(Intervals的人在这里有一个有趣的post),而且有一些有限的,如果可笑的恼人的select那里。 其中:

  • 提供一个Excel将正确解释但不支持多行数据的UTF-16 Little Endian TSV文件
  • 以HTML mimetypes或文件扩展名提供HTML表格中的数据(不确定此选项是否支持UTF8)
  • 有三四种方法可以将XML数据导入到各种最新版本的Excel中,理论上支持UTF8。 SpreadsheetML,使用自定义XSLT或通过模板生成新的Excel XML格式。

看起来无论如何,我可能要继续为那些不使用Excel的人提供一个普通的CSV文件,还要为Excel提供一个单独的下载选项。

生成Just-For-Excel文件的最简单方法是正确支持UTF8,我亲爱的Stack Overflowers? 如果这个最简单的选项只支持最新版本的Excel,那还是有趣的。

我正在Rails堆栈上做这个,但是好奇的是.net和ers在任何框架上如何处理这个问题。 我自己在几个不同的环境中工作,这绝对是一个将再次成为问题的问题。

更新2010-10-22:我们在我们的时间跟踪系统Tempo中使用了Ruport Gem,当我第一次发布这个问题时提供CSV导出。 我的同事之一Erik Hollensbee为Ruport提供了一个快速filter,为我们提供了实际的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 

你忘了创build一个OleDB数据源和Excel Interop,但也有这些问题。

我推荐SpreadsheetML选项。 它工作得很好,可能是你的平台有一些体面的工具来构buildXML文件,并且早在OfficeXP中就已经得到了完全的支持。 Office2000不被支持,但是个人经验是它以有限的方式工作。

我发现,如果您将网页的字符集编码设置为utf-8,然后在csv文件顶部的Response.BinaryWrite UTF-8字节顺序标记(0xEF 0xBB 0xBF),那么Excel 2007(不确定其他版本)会将其识别为utf-8并将其正确打开。

在同样的问题挣扎几个小时后,我发现这个问题上的优秀post

http://blog.plataformatec.com.br/2009/09/exporting-data-to-csv-and-excel-in-your-rails-app/ quote:

所以,这些是处理Excel-friendly-CSV的三个规则:

  1. 使用表格,而不是逗号。
  2. 字段不能包含换行符。
  3. 使用UTF-16 Little Endian将文件发送给用户。 并手动添加一个Little Endian BOM。

但是,如果你使用ruby,你的问题就解决了:首先你有FasterCSV gem

但我最终使用电子表格gem,直接生成Excel电子表格(我有链接的限制,只是谷歌电子表格+ ruby​​forge)辉煌!

如果使用utf编码创buildXML并将其保存为.xls,则甚至会打开这些双字节字符:

xml version =“1.0”encoding =“utf-8”

我有发送UTF8数据到Excel的完全相同的问题。 我的解决scheme

Perl Spreadsheet :: WriteExcel cpan代码的当前版本正确地使用UTF8数据写入Excel文件。

所以我写了一个Rails插件,a)打开一个双向pipe道到perl程序b)一次将数据发送到perl程序。 我使用Yaml作为消息数据格式。 (标准Ruby yaml不是UTF8,有一个特殊版本,ya2yaml)c)perl程序创buildexcel文件d)当Rails程序指示(通过yaml消息)最后一行已经发送时,perl程序创buildexcel文件并将状态发回到rails程序。

当然,通过并行进程和pipe道将perl程序添加到rails项目中,在“工程”谱图中非常多,而不是“计算机科学”。 (它完成了这项工作,但并不优雅。)但是它确实运行良好,为我节省了将WriteExcel代码移植到Ruby所需的时间。 另外请注意,当前可用的WriteExcel Ruby端口不处理utf8。

我的SW是宽松的开源,但我还没有到处发布呢。 如果你想在目前的状态,请参阅http://sandbox.kluger.com/write_excel_v.5.tar

请注意,您将需要在后台进程中创build您的Excel文件,而不是在Rails控制器的进程中,因为您在生产Excel文件时会阻止其他浏览器客户端。 我使用DelayedJob插件,效果很好。

希望这可以帮助,

拉里

我倒在这篇文章寻找Ruby的答案,为什么Excel不会正确地加载一个utf-8字符的CSV。 经过search和试验这个解决scheme为我工作:

 csv_content = CSV.generate(col_sep: "\t", headers: :first_row, encoding: 'utf-8') do |csv| csv << ["header1", "header2"] csv << ["content1", "content2"] end write_content = Iconv.conv("utf-16le", "utf-8", "\xEF\xBB\xBF") write_content += Iconv.conv("utf-16le", "utf-8", csv_content) File.open("listing.csv", 'wb') {|f| f.write(write_content) } 

Excel不能正确处理UTF-8。 您应该使用代码页来满足您的需求

 Response.ContentType = "text/plain"; // codepage: 28591, codepage name:iso-8859-1, codepage display name: Western European (ISO) Response.ContentEncoding = System.Text.Encoding.GetEncoding(28591); 

尝试OpenOffice Calc – 它更友好的Unicode – 导入和导出UTF-8编码的CSV文件。