【问题标题】:How to convert CSV to Excel?如何将 CSV 转换为 Excel?
【发布时间】:2012-04-24 11:30:14
【问题描述】:

Ruby 中是否有任何插件可以将 CSV 文件转换为 Excel。我做了一点谷歌,但我发现的只是将 Excel 文件转换为 CSV。我知道一些可以稍微调整并用于将 Excel 转换为 CSV 的宝石,但我需要知道是否有人以前做过。

【问题讨论】:

  • 通常我们只是让 Excel 导入 CSV。通常它只是工作。
  • 另一个几乎原生的替代方案:XML 导入也可以生成“漂亮”的 Excel 文档。我将 Rails 的 #to_xml 的输出输入 XSLT 以执行此操作。
  • 为什么不直接使用 OLE? Excel可以打开csv文件直接保存为xlsx文件...
  • @IgnacioVazquez-Abrams Excel 经常破坏 CSV 数据。它将删除前导零,将小写真/假转换为大写,将大数字转换为科学记数法,甚至可能更多。通过向用户发送 XLS 文件,您可以控制格式并避免丢失数据。
  • @texasbruce Excel OLE 自动化仅适用于 Windows,大多数人在 Mac 或 Linux 上运行 Ruby。它还需要付费许可证,而其他选项是免费的。用 OLE 启动也有问题,比如如果你需要重新激活 Office,用 OLE 启动它会无限期地挂起 Excel,需要手动干预才能让它再次工作。

标签: ruby excel csv gem


【解决方案1】:

根据this postspreadsheet gem 是一种可能性。看起来这是一个非常受欢迎的宝石。看看这个。例子:

book = Spreadsheet::Workbook.new
sheet1 = book.create_worksheet

header_format = Spreadsheet::Format.new(
  :weight => :bold,
  :horizontal_align => :center,
  :bottom => true,
  :locked => true
)

sheet1.row(0).default_format = header_format

FasterCSV.open(input_path, 'r') do |csv|
  csv.each_with_index do |row, i|
    sheet1.row(i).replace(row)
  end
end

book.write(output_path)

根据this postwrite_xlsx是有可能的。

我使用Apache POI library 和JRuby 来导出xls 文件。这是一个简单的例子。

require 'java'
require 'poi.jar'
# require 'poi-ooxml.jar'
require 'rubygems'
require 'fastercsv'

java_import org.apache.poi.hssf.usermodel.HSSFWorkbook;

wb = HSSFWorkbook.new # OR XSSFWorkbook, for xlsx
sheet = wb.create_sheet('Sheet 1')

FasterCSV.open(ARGV.first) do |csv|
  csv.each_with_index do |csv_row, line_no|
    row = sheet.createRow(line_no)
    csv_row.each_with_index do |csv_value, col_no|
      cell = row.createCell(col_no)
      cell.setCellValue(csv_value) unless csv_value.nil? # can't pass nil.
    end
  end
end


f = java.io.FileOutputStream.new("workbook.xls")
wb.write(f)
f.close

格式化 POI 电子表格的一些有用方法是

  • sheet.createFreezePane(0,1,0,1)
  • wb.setRepeatingRowsAndColumns(0, -1, -1, 0, 1)
  • sheet.setColumnWidth(i, 100 *256)
  • sheet.autoSizeColumn(i),但请注意,如果您在无头模式下运行,则必须致电 java.lang.System.setProperty("java.awt.headless", "true")

如果你安装了 Excel,你也可以在 Windows 上使用 Win32ole

require 'win32ole'
require 'rubygems'
require 'fastercsv'

xl = WIN32OLE.new('Excel.Application')
xl.Visible = 0
wb = xl.Workbooks.Add
ws = wb.Worksheets(1)

FasterCSV.open(ARGV.first) do |csv|
  csv.each_with_index do |csv_row, line_no|
    csv_row.each_with_index do |value, col|
      ws.Cells(line_no + 1, col + 1).Value = value
    end
  end
end

wb.SaveAs("workbook.xls", 56) # 56 = xlExcel8 aka Excel 97-2003. i.e. xls
wb.SaveAs("workbook.xlsx", 51) # 51 = xlOpenXMLWorkbook
wb.SaveAs("workbook.xlsb", 50) # 50 = xlExcel12

wb.Close(2) #xlDoNotSaveChanges
xl.Quit

使用 Excel 格式化的一些有用方法是

  • xl.Rows(1).Font.Bold = true
  • ws.Cells.EntireColumn.AutoFit

另一种选择是直接写入 Microsoft 的 XML Spreadsheet 格式,就像 Railscasts.com 的 Ryan Bates 所做的 at the end of his Exporting CSV and Excel episode

<?xml version="1.0"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:o="urn:schemas-microsoft-com:office:office"
  xmlns:x="urn:schemas-microsoft-com:office:excel"
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:html="http://www.w3.org/TR/REC-html40">
  <Worksheet ss:Name="Sheet1">
    <Table>
      <Row>
        <Cell><Data ss:Type="String">ID</Data></Cell>
        <Cell><Data ss:Type="String">Name</Data></Cell>
        <Cell><Data ss:Type="String">Release Date</Data></Cell>
        <Cell><Data ss:Type="String">Price</Data></Cell>
      </Row>
    <% @products.each do |product| %>
      <Row>
        <Cell><Data ss:Type="Number"><%= product.id %></Data></Cell>
        <Cell><Data ss:Type="String"><%= product.name %></Data></Cell>
        <Cell><Data ss:Type="String"><%= product.released_on %></Data></Cell>
        <Cell><Data ss:Type="Number"><%= product.price %></Data></Cell>
      </Row>
    <% end %>
    </Table>
  </Worksheet>
</Workbook>

This gem looks promising, too.

【讨论】:

  • 看来,如果您使用的是 win32ole,您只需在 excel 中“打开”csv 文件并将其保存为 xls。我不确定代码是什么。
  • 好点。我希望只是使示例看起来与上面的示例相似,但是将 CSV 直接打开到 Excel 中是一个更聪明的主意。
  • 我发现还有一颗宝石,writeexcel 非常轻松地完成了这项工作。再次感谢。
【解决方案2】:

如果您没有找到任何将 CSV 转换为 EXCEL 的 gem,那么您可以尝试分别找到两个 gem

  1. 读/写 CSV(用于读取 CSV 文件)例如FasterCSV
  2. 读/写 EXCEL(用于写 EXCEL 文件)例如SpreadSheet

【讨论】:

  • 请注意,FasterCSV 现在内置在 Ruby 1.9 中,在标准库中为 require "csv"
【解决方案3】:

对于那些目前看到这一点的人来说,这八年来语法发生了一些变化。根据先前的答案(为了您的复制和粘贴习惯而在此处重新复制),以下内容对我来说非常有效:

def convert_csv_to_xlsx
  book = Spreadsheet::Workbook.new
  sheet1 = book.create_worksheet

  header_format = Spreadsheet::Format.new(
    weight: :bold,
    horizontal_align: :center,
    bottom: :medium,
    locked: true
  )

  sheet1.row(0).default_format = header_format

  CSV.open(input_path, 'r') do |csv|
    csv.each_with_index do |row, i|
      sheet1.row(i).replace(row)
    end
  end

  book.write(output_path)
end

IE:FasterCSV 现在只是 CSV,并且不推荐使用 :bottom 为 true

【讨论】:

    【解决方案4】:

    简单的方法是:

    1. 使用您喜欢的文本编辑器(如 Sublime Text)打开 CSV。记事本没问题
    2. 将所有,(逗号)替换为标签\t
    3. 另存为扩展名.xls
    4. 使用 Excel 和 TADA 打开文件!给你!

    【讨论】:

      猜你喜欢
      • 2014-11-19
      • 2012-10-10
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      相关资源
      最近更新 更多