在ruby中有效地将Excel转换为CSV

时间:2014-05-20 16:54:09

标签: ruby-on-rails ruby export-to-csv import-from-excel

我使用spreadsheet gem来执行此操作。它有效,但有时可能非常慢。我甚至试过Roo gem,但这并没有改善性能。有没有更好的方法来完成这项工作?奇怪的是,同一个excel中的一些工作表工作得更快,一些工作表工作得非常慢,甚至需要长达1小时。

我们可以使用开放式办公室在单个Excel中打开每个工作表(选项卡)并将它们更快地转换为csv吗?如果是的话,我将如何在ruby中完成?

或者是否有更好的解决方案?

添加一个我尝试使用Roo gem的小例子

xls = Roo::Excel.new(source_excel_file)
xls.each_with_pagename do |name, sheet|
  # p sheet.to_csv(File.join(dest_csv_dir,name + ".csv"))
  #sheet.parse(:clean => true)#.to_csv(File.join(dest_csv_dir,name + ".csv"))
  puts name
  puts sheet.parse(:clean => true)
end

4 个答案:

答案 0 :(得分:2)

懦弱的前言:我是红宝石的新手,几乎不知道铁轨,但我之前曾与Excel纠缠在一起。我在本地机器上创建了一个虚拟工作簿,有5张,每张包含10列和1000行随机生成的数字。我将每个工作表转换为自己的CSV:

require 'win32ole'
require 'csv'

# configure a workbook, turn off excel alarms
xl = WIN32OLE.new('excel.application')
book = xl.workbooks.open('C:\stack\my_workbook.xlsx')
xl.displayalerts = false

# loop through all worksheets in the excel file
book.worksheets.each do |sheet|
  last_row = sheet.cells.find(what: '*', searchorder: 1, searchdirection: 2).row
  last_col = sheet.cells.find(what: '*', searchorder: 2, searchdirection: 2).column
  export = File.new('C:\\stack\\' + sheet.name + '.csv', 'w+')
  csv_row = []

  # loop through each column in each row and write to CSV
  (1..last_row).each do |xlrow|
    (1..last_col).each do |xlcol|
      csv_row << sheet.cells(xlrow, xlcol).value
    end
    export << CSV.generate_line(csv_row)
    csv_row = []
  end
end

# clean up
book.close(savechanges: 'false')
xl.displayalerts = true
xl.quit

此脚本的眼球基准测试时间约为30秒,每次尝试都会在高于或低于该值的几秒钟内完成。

答案 1 :(得分:2)

我假设我们正在谈论旧的Excel格式(xls),看来电子表格宝石无论如何都无法与xlsx一起使用。

我试试命令行spreadhseet转换器之一:来自catdoc软件包的xls2csv(非常快,但并非所有Excel文件都成功处理)或者来自gnumeric软件包的ssconvert(速度适中,并且需要安装entrie GNumeric,有时不是服务器的选项,但非常健壮。)

注意:在解析Excel时,roo只需要电子表格并将其包装在自己的API中,因此它永远不会比电子表格更快或更可靠。

NB2:如果我没记错的话(想想这是很久以前的事情),尝试从ruby自动化OpenOffice是a)真的很难,而且b)真的很慢。

答案 2 :(得分:1)

确保您使用的是最新的Roo(1.13.2)。

还要确保使用该补丁跳过尾随空白行:

https://github.com/Empact/roo/blob/master/lib/roo/worksheet.rb

如果您可以发布需要很长时间才能解析的电子表格,那么这里的人可能会帮助您。请务必删除任何机密数据。

答案 3 :(得分:1)

sestatus