【问题标题】:What's the best way to export UTF8 data into Excel?将 UTF8 数据导出到 Excel 的最佳方法是什么?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

    在同一个问题苦苦挣扎了几个小时后,我发现了这篇关于该主题的优秀帖子

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

    所以,这是三个规则 处理 Excel 友好的 CSV:

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

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

    但我最终使用了直接生成 Excel 电子表格的电子表格 gem (我有链接限制,只是 google 电子表格 + ruby​​forge) 太棒了!

    【讨论】:

      【解决方案3】:

      您忘记了创建 OleDB 数据源和 Excel 互操作,但这些也存在问题。

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

      【讨论】:

      • "你忘记了...一个 OleDB..." 嘘!这是一个 unix 环境,所以我想避免那种 Voodoo。感谢您的提示!
      • @Richard - 因为第二段不依赖 oledb。尽管从 1 1/2 年后发布的更新来看,这里应该有一个答案将人们指向 Ruby Rupert。
      【解决方案4】:

      如果您使用 utf 编码创建 XML 并将其保存为 .xls,它甚至会打开那些两字节字符:

      xml 版本="1.0" 编码="utf-8"

      【讨论】:

      • 我确实尝试使用扩展名 .xls 保存表格数据的 XML 文档,然后用 Excel for Mac 2003 打开它,结果就被它吐了。我们的相当一部分用户是 Mac 用户。
      • 我从未尝试过使用 MAC 但它应该可以工作,XML 是一个标准
      【解决方案5】:

      我在将 UTF8 数据发送到 Excel 时遇到了完全相同的问题。我的解决方案:

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

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

      当然,通过并行进程和管道将 perl 程序添加到 rails 项目在很大程度上属于“工程”范畴,而不是“计算机科学”范畴。 (它完成了工作,但并不优雅。)但它运行良好,并为我节省了将 WriteExcel 代码移植到 Ruby 所需的数周时间。另请注意,WriteExcel 当前可用的 Ruby 端口不处理 utf8。

      我的 sw 是允许的开源软件,但我还没有开始发布它。如果您希望它处于当前状态,请参阅http://sandbox.kluger.com/write_excel_v.5.tar

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

      希望这会有所帮助,

      拉里

      【讨论】:

        【解决方案6】:

        我在这篇文章中寻找 Ruby 的答案,为什么 Excel 不能正确加载带有 utf-8 字符的 CSV。在四处搜索和试验后,这个解决方案对我有用:

        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) }
        

        【讨论】:

          【解决方案7】:

          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);
          

          【讨论】:

          • 对我来说似乎可以正常工作,只要您添加 UTF8 签名/BOM (EF BB BF)。
          【解决方案8】:

          试试 OpenOffice Calc - 它对 Unicode 更友好 - 使用 UTF-8 编码导入和导出 CSV 文件。

          【讨论】:

          • 问题是关于如何从 web 应用程序中导出这些数据,以便用户可以在 Excel 中打开它。告诉所有客户使用 openoffice 可能行不通。
          • 公平地说,张贴者说 OpenOffice 比 Excel 对 unicode 更友好是正确的。我来这里是为了寻找一种使用 Excel 来完成此任务的方法,因为我不想再使用 OpenOffice。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-29
          • 2011-02-19
          • 2016-01-15
          • 2018-01-10
          • 1970-01-01
          相关资源
          最近更新 更多