如何从 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 电子表格中的值填充“插入/更新”?

在电子表格中如何设置步长的大小

从 Excel 更新 SQL Server 表,然后填充剩余的列数据

如何使用ruby中的电子表格gem从excel单元格中提取超链接地址?