2011-01-28 5 views
13

연락처 정보가 포함 된 Excel 파일을 업로드하고 싶습니다. 그런 다음 구문 분석하고 내 연락처 모델에 대한 레코드를 만들 수있게되었습니다.Rails에서 Excel 파일을 업로드하고 구문 분석하려면 어떻게해야합니까?

내 응용 프로그램은 Rails 응용 프로그램입니다.

저는 heroku에서 클립 클립 젬을 사용하고 있는데, 저는 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에 저장된 내용 (index) ... 열에 의한 배열입니까? – Angela

+0

물론, @workheet.row (index)는 인덱스에서 행을 반환 할 것이므로 index가 0이면 첫 번째 행을 반환하고, 1이면 두 번째 등을 반환합니다. 마지막 블록은 index = 0에서 시작하여 until 루프를 반환합니다. index는 last_row_index, 즉 엑셀 워크 시트에서 마지막으로 사용 된 행의 색인입니다. 나의 예에서는 행을 가지고 실제로 아무것도하지 않는다. 나는 당신이 그것을 어떻게 접근 할 수 있는지를 보여준다. – DanneManne

10

레일 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

예. 나는 클립 클립을 사용하여 업로드를 만들고 업로드를 만드는 데 다른 견해를 가지고 있으며 파일을 처리하고 업로드시 데이터를 읽습니다. –

0

이 작업을 쉽게 수행 할 수있는 보석을 만들었습니다. 나는 Parxer이라고 불렀고 ...

  • 그것은에 내장 된 roo 보석.
  • xls, xlsx 및 csv 파일을 구문 분석 할 수 있습니다.
  • 처리 할 DSL이 있습니다.
    • 열 매핑.
    • 파일, 행 및 열/셀 유효성 검사.
    • 열/셀 서식 지정.
관련 문제