2010-06-15 131 views
3

我有一个简单的4列Excel电子表格,可以将大学与他们的ID代码进行匹配以进行查找。该文件相当大(300k)。如何从Rails中的Excel电子表格填充表格?

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

我该如何做到这样?

回答

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应该确保你不应该得到重复的记录。

+0

非常感谢Ceilingfish!我使用Heroku进行部署,所以我必须弄清楚,这不会太难,因为这些文件每月更新一次。 – Kevin 2010-06-15 21:21:21

0

使用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