2016-07-13 24 views
0

私はレールアプリでルビーを開発しており、そのためにExcelファイルをインポートする必要があります。私はスプレッドシートの宝石を使用しています。
私の問題は、Excelファイルから単一の行データを取得できないということです。どのようにレールで1つのExcelの行データを解析する

私のコードはここにある:

def actual_import(file) 
    puts "In the actual_import method" 
    spreadsheet= Employee.open_spreadsheet(file) 
    header=spreadsheet.row(1) 
    (2..spreadsheet.last_row).each do |i| 
    row=Hash[[header,spreadsheet.row(i)].transpose] 
    $send_name=row.to_hash.slice('firstname') 
    puts $send_name.to_s  #this prints a weird result,,described below 
    puts $send_name.length 
    create 
    end 
end 

、従業員のモデルで私のopen_spreadsheet方法は次のとおりです。

def self.open_spreadsheet(file) 
    case File.extname(file.original_filename) 
    #when ".csv" then Roo::Csv.new (file.path nil, :ignore) 
    when ".xlsx" then Roo::Excelx.new (file.path) 
    #when ".xlsx" then Excelx.new (file.path, nil, :ignore) 
    else raise "Unknown file type: #{file.original_filename}" 
    end 
end 

$send_nameプリント{"firstname"=>"Abc"}と私は$send_name.lengthを使用する場合、それは私に1を与えます。しかし、私は "Abc"だけをキャプチャする必要があります。
私のExcelファイルには、firstnameという名前の列が1つだけ含まれています。しかし、私は文字列として各反復の行データだけを必要とします。

この問題を解決するにはどうすればよいですか?

答えて

1

私はBatchFactory gemを使用することをお勧めします。
フードの下にRoo宝石を使用します。
BatchFactoryは、すべてのExcelファイル行を、操作に非常に便利なハッシュの配列として読み取ることができます。

require 'batch_factory' 
factory = BatchFactory.from_file 'filename.xlsx', keys: [:header1, :header2] 
factory.rows 

これは、あなたがこれはfirstname列のすべての値のあなたの配列を与える

factory = BatchFactory.from_file 'filename.xlsx', keys: [:firstname] 
firstnames = factory.rows.map { |row| row[:firstname] } 

を行うことができ、あなたの場合は

[ 
    { header1: 'value11', header2: 'value12' }, 
    { header1: 'value21', header2: 'value22' }, 
    ... 
] 

を与えるだろう。 BatchFactoryは、いくつかのmethod_missing、すなわち

firstnames = factory.map { |row| row[:firstname] } 
+0

おかげで,,,私のためにその作業を実装するためにあなたもfactory.rows.maprowsを省略することができます

UPDATE
。 – Abhradip

関連する問題