【问题标题】:How to write rake task to create data using excel in rails 3.2如何编写 rake 任务以在 Rails 3.2 中使用 excel 创建数据
【发布时间】:2013-09-03 13:34:26
【问题描述】:

我想通过导入excel来创建数据。

我在 excel 文件中获得了状态记录,而我的状态模型只有一个字段 state_name。

我想做一个 rake 任务来创建 excel 文件中存在的所有状态的所有记录,但我不知道如何使用 excel。

我在 lib/tasks 中创建了一个像这样的基本 rake 任务:-

namespace :state do
  task :create => :environment do
  end
end

如何放置读取 excel 文件并基于该文件创建状态的代码?

【问题讨论】:

  • 你所说的“州”是什么意思,比如一个国家的一个地区?如果是这样,您可能想要使用像 carmen-rails 这样的工具来为您和翻译处理。
  • 是的,就像一个国家的一个地区,我不想使用 carmen-rails,而是想用 excel 和 rake 来做

标签: ruby-on-rails ruby-on-rails-3.2 rake-task


【解决方案1】:

您可以将 xls 文件放入 /tmp 目录。然后将 gem spreadsheet 放入您的 Gemfile。然后使用 read 方法在 lib 中创建 xls.rb 类。

class Xls
  require 'spreadsheet'

  def self.read file_path
    Spreadsheet.open(file_path) do |book|
      book.worksheets.each do |ws|
        0.upto ws.last_row_index do |index|
          row = ws.row(index)
          yield ws, row
        end
      end
    end
  end

end

然后,进入你的任务..

namespace :project do
  desc "Load xls"
  task :load => :environment do
    Xls.read("xls_file_path") do |sheet, row|
      state = row[0] #row[0] = the first column of the this row. 
      YourModel.save(state: state)
    end
  end
end

【讨论】:

  • 首先尝试使用“Microsoft Excel 97/2000/XP/2003 (.xls)”格式保存您的电子表格。我只是展示了如何读取 xls 文件并执行 rake 任务。如果需要,您可以使用其他工具来完成此操作。 rubyxl 或者 simple-xls 例如...
  • 感谢 +1 提供了很好的解释,如果您能写一篇关于如何使其与 roo 一起使用的帖子,那就太好了 :)
【解决方案2】:

如果您自己做,您必须自己管理翻译,自己编写所有帮助程序并自己管理所有数据。使用库可以为您节省大量工作,如果您需要添加或删除区域,您可以快速轻松地完成此操作。不建议自己做。

如果您打算自己做,那么最好的办法是以可预测的方式将数据保存为 CSV 格式,并通读 CSV 创建条目。假设您的 CSV 格式如下:

State,Country
Alabama,USA
Arkansas,USA
...

解析它会很简单:

require "csv"

task :load_states => :environment do
  CSV.foreach(csv_file, {headers: :first_row}) do |row|
    state = State.create(name: row["State"])
    state.country = Country.where(name: row["Country"]).first_or_create
    state.save
  end
end

【讨论】:

  • 如果您没有标题并通过索引 (row[0]) 而不是标题名称访问行元素,则显然省略 {headers: :first_row}
  • 您可以使用 first_or_create 删除条件,即 country = Country.where(name: row["Country"]).first_or_create (rails 4) - 请参阅 stackoverflow.com/questions/3046607/…
  • 你是对的,当我写下这个建议时,你对此感到震惊。谢谢并更新了答案。
猜你喜欢
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 2012-03-08
相关资源
最近更新 更多