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 
相關問題