首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将UTF8数据导出到Excel的最佳方法是什么?

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

Stack Overflow用户
提问于 2009-01-16 19:30:27
回答 8查看 33K关注 0票数 28

因此,我们有一个支持UTF8数据的web应用程序。万岁UTF8.而且我们可以将用户提供的数据导出到CSV中,没有问题--到那时它还在UTF8中。问题是,当您在Excel中打开一个典型的UTF8 CSV时,它会将它读取为ANSII编码的文本,然后尝试将两个字节的字符(例如,和ü)读取为两个不同的字符,结果会失败。

因此,我已经做了一些调查(人们有一个有趣的帖子关于这里),还有一些有限的,即使是荒谬的恼人的选择。其中:

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

看起来无论如何,我可能会继续为那些没有在Excel上使用它的人提供一个普通的CSV文件,并为Excel提供一个单独的下载选项。

有什么最简单的方法来生成正确支持UTF8 (我亲爱的Stack Overflowers )的仅为Excel的文件?如果这个最简单的选项只支持最新版本的Excel,那还是很有趣的。

我是在Rails堆栈上这样做的,但好奇的是..Net ers和任何框架上的人员是如何处理这个问题的。我自己在几个不同的环境中工作,这肯定是一个会再次出现的问题。

更新2010-10-22:当我第一次发布这个问题时,我们已经在我们的时间跟踪系统节拍中使用Ruport来提供CSV出口。我的同事之一埃里克·霍伦斯比( Erik Hollensbee )为Ruport组装了一个快速过滤器,为我们提供了实际的Excel输出,我想我可以在这里分享给其他红宝石专家:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/451636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档