【问题标题】:How do I populate a table from an Excel Spreadsheet in Rails?如何从 Rails 中的 Excel 电子表格填充表格?
【发布时间】:2010-06-15 19:44:17
【问题描述】:

我有一个简单的 4 列 Excel 电子表格,可将大学与其 ID 代码相匹配,以进行查找。该文件非常大(300k)。

我需要想出一种方法来将这些数据转换为我的 Rails 应用程序中的填充表。问题是这是一个不时更新的文档,所以它不能只是一个一次性的解决方案。理想情况下,它会是某种 ruby​​ 脚本,它会读取文件并自动创建条目,这样当我们通过电子邮件收到新版本时,我们就可以自动更新它。如果这很重要,我会在 Heroku 上。

我怎样才能完成这样的事情?

【问题讨论】:

    标签: ruby-on-rails database import-from-excel


    【解决方案1】:

    如果可以,请将电子表格另存为 CSV,解析 CSV 文件比解析 excel 电子表格要好得多。我发现处理此类问题的一种有效方法是创建一个读取 CSV 文件并根据需要创建所有记录的 rake 任务。

    例如,这里是如何使用旧的但仍然有效的FasterCSV gem 从文件中读取所有行

    data = FasterCSV.read('lib/tasks/data.csv')
    columns = data.remove(0)
    unique_column_index = -1#The index of a column that's always unique per row in the spreadsheet
    data.each do | row |
      r = Record.find_or_initialize_by_unique_column(row[unique_column_index])
      columns.each_with_index do | index, column_name |
        r[column_name] = row[index]
      end
      r.save! rescue => e Rails.logger.error("Failed to save #{r.inspect}")
    end
    

    不过,它确实有点依赖于您在原始电子表格中拥有一个独特的列。

    如果您将其放入 rake 任务中,则可以将其连接到您的 Capistrano 部署脚本中,这样每次部署时都会运行它。 find_or_initialize 应该确保你不应该得到重复的记录。

    【讨论】:

    • 非常感谢 Ceilingfish!我正在使用 Heroku 进行部署,所以我必须弄清楚,因为文件每月更新一次,所以不会太难。
    【解决方案2】:

    使用 Hpricot 解析新的 Excel 文件并不太麻烦。这会给你一个二维数组:

    require 'hpricot'
    
    doc  = open("data.xlsx") { |f| Hpricot(f) }
    rows = doc.search('row')
    rows = rows[1..rows.length] # Skips the header row
    
    rows = rows.map do |row|
        columns = []
        row.search('cell').each do |cell|
            # Excel stores cell indexes rather than blank cells
            next_index          = (cell.attributes['ss:Index']) ? (cell.attributes['ss:Index'].to_i - 1) : columns.length
            columns[next_index] = cell.search('data').inner_html
        end
        columns
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      相关资源
      最近更新 更多