3

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

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

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

4

2 回答 2

3

如果可以的话,将电子表格另存为 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 应该确保你不应该得到重复的记录。

于 2010-06-15T20:33:30.943 回答
1

使用 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
于 2010-06-15T20:52:37.587 回答