我使用了 spreadsheet gem去做这个。它可以工作,但有时可能会很慢。我什至尝试了 Roo gem ,但这并没有提高性能。有没有更好的方法来完成这项工作?奇怪的是,在同一个 excel 中,有些工作表运行速度更快,有些工作表运行速度非常慢,甚至需要长达 1 小时。
我们能否使用 open office 在单个 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
最佳答案
懦弱的前言:我是 ruby 的 super 新手,对 rails 几乎一无所知,但我以前曾与 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 秒,每次尝试都会比该时间高或低几秒。
关于ruby-on-rails - 在 ruby 中有效地将 Excel 转换为 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23765734/