ruby-on-rails – 在ruby中有效地将Excel转换为CSV

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在ruby中有效地将Excel转换为CSV前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用 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

解决方法

懦弱的前言:我对ruby很陌生,对滚道几乎一无所知,但我之前曾与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相关文章