Aru*_*lam 9 ruby ruby-on-rails import-from-excel export-to-csv
我使用电子表格gem来做到这一点.它有效,但有时可能会非常慢.我甚至尝试过Roo宝石,但这并没有改善性能.有没有更好的方法来完成这项工作?奇怪的是,同一个excel中的一些工作表工作得更快,一些工作表工作得非常慢,甚至需要长达1个小时.
我们可以使用开放式办公室在单个Excel中打开每个工作表(选项卡)并将它们更快地转换为csv吗?如果是的话,我将如何在红宝石中做到这一点?
还是有更好的解决方案?
刚刚添加了一个我尝试使用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 超级陌生,对 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 秒,每次尝试都会比该基准高或低几秒。