我使用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
答案 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