如何从 Rails 中的 Excel 电子表格填充表格?
Posted
技术标签:
【中文标题】如何从 Rails 中的 Excel 电子表格填充表格?【英文标题】:How do I populate a table from an Excel Spreadsheet in Rails? 【发布时间】:2010-06-15 19:44:17 【问题描述】:我有一个简单的 4 列 Excel 电子表格,可将大学与其 ID 代码相匹配,以进行查找。该文件非常大(300k)。
我需要想出一种方法来将这些数据转换为我的 Rails 应用程序中的填充表。问题是这是一个不时更新的文档,所以它不能只是一个一次性的解决方案。理想情况下,它会是某种 ruby 脚本,它会读取文件并自动创建条目,这样当我们通过电子邮件收到新版本时,我们就可以自动更新它。如果这很重要,我会在 Heroku 上。
我怎样才能完成这样的事情?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于如何从 Rails 中的 Excel 电子表格填充表格?的主要内容,如果未能解决你的问题,请参考以下文章
Excel 中的宏:如何使用两个相邻单元格(水平)的内容、自动填充和在电子表格中的某个单词处停止
将 Excel 电子表格中的数据提取到 Ruby 中的数据库中
Pentaho/PDI/Kettle:如何用 Excel 电子表格中的值填充“插入/更新”?