2011-01-28 15 views
13

連絡先情報を含むExcelファイルをアップロードできます。私はそれを解析して私のコンタクトモデルのレコードを作成できるようになりました。RailsでExcelファイルをアップロードして解析するにはどうすればよいですか?

私のアプリケーションはRailsアプリケーションです。

私はherokuでpaperclip gemを使用しています.VimカードをContactモデルに解析できました。同様のものを探していますが、Excelファイルのすべての行を調べます。

タスクとサンプルコードを簡素化する宝石が参考になるでしょう!

答えて

17

スプレッドシートは、私がこれまでに見つけた最高のExcelパーサーです。それは非常に多くの機能を提供します。

あなたは良い添付ファイルのためにPaperclipを使用していると言います。しかし、S3で添付ファイルを保存する場合(私はHerokuを使用していると仮定します)、スプレッドシートにファイルを渡す構文は少し異なりますが難しくありません。

ここでは、連絡先の解析をどのように開始するのか分からないため、どのクラスやモジュールにも使用できない純粋な構文の例を示します。

# load the gem 
require 'spreadsheet' 

# In this example the model MyFile has_attached_file :attachment 
@workbook = Spreadsheet.open(MyFile.first.attachment.to_file) 

# Get the first worksheet in the Excel file 
@worksheet = @workbook.worksheet(0) 

# It can be a little tricky looping through the rows since the variable 
# @worksheet.rows often seem to be empty, but this will work: 
0.upto @worksheet.last_row_index do |index| 
    # .row(index) will return the row which is a subclass of Array 
    row = @worksheet.row(index) 

    @contact = Contact.new 
    #row[0] is the first cell in the current row, row[1] is the second cell, etc... 
    @contact.first_name = row[0] 
    @contact.last_name = row[1] 

    @contact.save 
end 
+0

こんにちは、これは使いやすいようです...最後のdo-blockのロジックを説明できますか...少し難解です。 – Angela

+0

も... @ worksheet.rowに格納されているもの)...列単位の配列ですか? – Angela

+0

もちろん、@workheet.row(index)はindexの行を返します。したがって、indexが0の場合は最初の行、1の場合は2番目の行などを返します。最後のブロックはindex = 0から始まり、untilまでループしますindexはlast_row_indexです。つまり、Excelワークシートの最後に使用された行のインデックスです。私の例では、実際に列で何もしません、私はあなたがそれにアクセスする方法を示しています。 – DanneManne

10

私のRails 2.1.0アプリケーションでも同様の要件がありました。扱うでしょう

class Upload < AR::Base 
    has_attached_file :doc, 
    :url => "datafiles/:id", 
    :path => ":rails_root/uploads/:id/:style/:basename.:extension" 

    # validations, if any 
end 

生成UploadsController:

require 'spreadsheet' 

module DataReader 
    def read_bata(path_to_file) 
    begin 
     sheet = book.worksheet 0 
     sheet.each 2 do |row| 
     unless row[0].blank? 
      # Create model and save it to DB 
      ... 
     end 
     end 
    rescue Exception => e 
     puts e 
    end 
    end 
end 

は、モデルのアップロードを持っていた:私はこのようなモジュールを書いた「LIB」フォルダに

:私は、次のようにして、それを解決しましたファイルをアップロードし、適切な場所に保存します。私はファイルをアップロードするためにPaperclipを使用しました。 'スプレッドシート' ライブラリherehereについて

class UploadsController < AC 
    include DataReader 

    def new 
    @upload = Upload.new 
    end 

    def create 
    @upload = Upload.new(params[:upload]) 

    @upload.save 
    file_path = "uploads/#{@upload.id}/original/#{@upload.doc_file_name}" 
    @upload.read = DataReader.read_data(file_path) 

    # respond_to block 
    end 
end 

読みます。適切な改善を行い、このテクニックをRails 3で動作させることができます。これが役立つことを願っています。

+1

こんにちは、あなたはいくつかの良いupvotesを得たように見えます...まだそれを読んで...あなたがクリップしてアップロードを構築しましたか?アップロード時にデータを読み込みますか? – Angela

+0

ファイルをアップロードするには別のビューとフォームを作成する必要がありますか? – Angela

+0

はい。私はpaperclipを使ってアップロードを行い、アップロードを作成するためのさまざまなビューを持ち、アップロード時にファイルを処理してデータを読みます。 –

0

これを簡単に達成するための宝石を作りました。私はそれをParxerと呼んでいます。

  • これはrooに築かれた宝石です。
  • xls、xlsx、およびcsvファイルを解析できます。
  • 処理するDSLを持っている:
    • 列マッピング。
    • ファイル、行、および列/セルの検証。
    • 列/セルの書式設定。
関連する問題