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

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

我使用了 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/

相关文章:

ruby-on-rails - 如何修复 rails 中的 "Function not implemented - Failed to initialize inotify (Errno::ENOSYS)"

c# - 将数组转换为多行字符串的最快方法

javascript - 如何在 Laravel 中导出带日期范围的 MYSQL 数据?

ruby-on-rails - 是否可以从 : with an email from database in Rails Action Mailer? 替换默认值

ruby-on-rails - 单独的多态关联表

ruby-on-rails - 我如何强制 ActiveRecord 重新加载一个类?

php - 如何使用 php 将 mysql 数据表搜索查询导出到 csv?

ruby-on-rails - Javan 每当 Gem 将输出作为本地邮件发送给我时

ruby-on-rails - Active Record - 获取数据库中的第二个,第三个......项目(没有ID)

ruby - 数组用逗号连接,仅当元素不为 nil 时