0

エクセルをインポートしてデータを作成したい。

Excel ファイルに状態の記録があり、状態モデルには state_name フィールドが 1 つしかありません。

Excel ファイルに存在するすべての状態のすべてのレコードを作成するレーキ タスクを作成したいのですが、Excel の操作方法がわかりません。

lib/tasks に次のような基本的なレーキ タスクを作成しました。

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 に答える