如何从Rails中的Excel电子表格填充表格?

时间:2010-06-15 19:44:18

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

例如,这里是如何使用旧的FasterCSV宝石

来读取文件中的所有行
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应确保您不会获得重复记录。

答案 1 :(得分: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