0

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

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

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

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

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

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

4

2 回答 2

2

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

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
于 2013-08-30T21:00:14.620 回答
1

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

如果您打算自己做,那么最好的办法是以可预测的方式将数据保存为 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
于 2013-08-30T19:26:58.560 回答