복붙노트

[RUBY-ON-RAILS] 레일에 어떻게 CSV 파일로 레코드를 반환합니다

RUBY-ON-RAILS

레일에 어떻게 CSV 파일로 레코드를 반환합니다

나는 "항목"라는 간단한 데이터베이스 테이블이 있습니다

class CreateEntries < ActiveRecord::Migration
  def self.up
    create_table :entries do |t|
      t.string :firstName
      t.string :lastName
      #etc.
      t.timestamps
    end
  end

  def self.down
    drop_table :entries
  end
end

어떻게 (이상적으로는 Excel에서 자동으로 열리도록하는 방법으로) CSV 파일로 항목 테이블의 내용을 반환하는 핸들러를 작성하려면 어떻게해야합니까?

class EntriesController < ApplicationController

  def getcsv
    @entries = Entry.find( :all )

    # ??? NOW WHAT ????

  end

end

해결법

  1. ==============================

    1.멋지고이 처리 FasterCSV라는 플러그인이있다.

    멋지고이 처리 FasterCSV라는 플러그인이있다.

  2. ==============================

    2.FasterCSV 확실히 갈 수있는 방법이지만, 당신은 당신의 레일 응용 프로그램에서 직접 서비스를 제공하려는 경우, 당신도, 어떤 응답 헤더를 설정할 수 있습니다.

    FasterCSV 확실히 갈 수있는 방법이지만, 당신은 당신의 레일 응용 프로그램에서 직접 서비스를 제공하려는 경우, 당신도, 어떤 응답 헤더를 설정할 수 있습니다.

    나는 파일 이름과 필요한 헤더를 설정하는 방법의 주위를 계속 :

    def render_csv(filename = nil)
      filename ||= params[:action]
      filename += '.csv'
    
      if request.env['HTTP_USER_AGENT'] =~ /msie/i
        headers['Pragma'] = 'public'
        headers["Content-type"] = "text/plain" 
        headers['Cache-Control'] = 'no-cache, must-revalidate, post-check=0, pre-check=0'
        headers['Content-Disposition'] = "attachment; filename=\"#{filename}\"" 
        headers['Expires'] = "0" 
      else
        headers["Content-Type"] ||= 'text/csv'
        headers["Content-Disposition"] = "attachment; filename=\"#{filename}\"" 
      end
    
      render :layout => false
    end
    

    그것을 사용하면 쉽게 내 컨트롤러에 이런 식으로 뭔가를 할 수 있습니다 :

    respond_to do |wants|
      wants.csv do
        render_csv("users-#{Time.now.strftime("%Y%m%d")}")
      end
    end
    

    그리고 모양이 좋아하는 것을 볼 수있다 : (generate_csv이 FasterCSV에서입니다)

    UserID,Email,Password,ActivationURL,Messages
    <%= generate_csv do |csv|
      @users.each do |user|
        csv << [ user[:id], user[:email], user[:password], user[:url], user[:message] ]
      end
    end %>
    
  3. ==============================

    3.나는 가능 (최대 투표!) 브라이언의 대답 @, 첫 FasterCSV에 저를 가리키는 위해. 나는 보석을 찾기 위해 인터넷 검색 할 때 다음, 나는이 위키 페이지에서 상당히 완전한 예제를 발견했다. 하나로 모으기, 다음 코드에 정착했다.

    나는 가능 (최대 투표!) 브라이언의 대답 @, 첫 FasterCSV에 저를 가리키는 위해. 나는 보석을 찾기 위해 인터넷 검색 할 때 다음, 나는이 위키 페이지에서 상당히 완전한 예제를 발견했다. 하나로 모으기, 다음 코드에 정착했다.

    그런데, 보석을 설치하는 명령은 다음과 같습니다     sudo는 보석 fastercsv 설치 (모두 소문자)

    require 'fastercsv'
    
    class EntriesController < ApplicationController
    
      def getcsv
          entries = Entry.find(:all)
          csv_string = FasterCSV.generate do |csv| 
                csv << ["first","last"]
                entries.each do |e|
                  csv << [e.firstName,e.lastName]
                end
              end
              send_data csv_string, :type => "text/plain", 
               :filename=>"entries.csv",
               :disposition => 'attachment'
    
      end
    
    
    end
    
  4. ==============================

    4.또 다른 방법은 FasterCSV를 사용하지 않고이 작업을 수행합니다 :

    또 다른 방법은 FasterCSV를 사용하지 않고이 작업을 수행합니다 :

    설정 / 초기화 / dependencies.rb 같은 초기화 파일에 루비의 CSV 라이브러리를 필요

    require "csv"
    

    약간의 배경으로 다음 코드는 검색 리소스를 생성 라이언 노여움의 고급 검색 양식의 기반으로한다. 내 경우에는 검색 자원의 표시 방법은 이전에 저장 한 검색 결과를 반환합니다. 또한 CSV에 응답하여 원하는 출력 포맷으로 뷰 템플릿을 사용한다.

      def show
        @advertiser_search = AdvertiserSearch.find(params[:id])
        @advertisers = @advertiser_search.search(params[:page])
        respond_to do |format|
          format.html # show.html.erb
          format.csv  # show.csv.erb
        end
      end
    

    다음과 같은 show.csv.erb 파일 외모 :

    <%- headers = ["Id", "Name", "Account Number", "Publisher", "Product Name", "Status"] -%>
    <%= CSV.generate_line headers %>
    <%- @advertiser_search.advertisers.each do |advertiser| -%>
    <%- advertiser.subscriptions.each do |subscription| -%>
    <%- row = [ advertiser.id,
                advertiser.name,
                advertiser.external_id,
                advertiser.publisher.name,
                publisher_product_name(subscription),
                subscription.state ] -%>
    <%=   CSV.generate_line row %>
    <%- end -%>
    <%- end -%>
    

    보고서 페이지의 HTML 버전에 나는 사용자가보고있는 것을 보고서를 내보낼 수있는 링크가 있습니다. 다음은 보고서의 CSV 버전을 반환 LINK_TO입니다 :

    <%= link_to "Export Report", formatted_advertiser_search_path(@advertiser_search, :csv) %>
    
  5. ==============================

    5.FasterCSV 보석으로 살펴 보자.

    FasterCSV 보석으로 살펴 보자.

    당신이 필요로하는 모든 엑셀 지원하는 경우, 당신은 또한 직접 XLS를 생성에 볼 수 있습니다. (스프레드 시트 : 엑셀 참조)

    gem install fastercsv
    gem install spreadsheet-excel
    

    나는 윈도우 Excel에서 csv 파일을 여는 옵션 좋은를 찾을 수 :

    FasterCSV.generate(:col_sep => ";", :row_sep => "\r\n") { |csv| ... }
    

    액티브 부분에 관해서는, 이런 식으로 뭔가를 할 것이다 :

    CSV_FIELDS = %w[ title created_at etc ]
    FasterCSV.generate do |csv|
      Entry.all.map { |r| CSV_FIELDS.map { |m| r.send m }  }.each { |row| csv << row }
    end
    
  6. ==============================

    6.그런 다음, 당신의 응답 Content-Type 헤더를 설정 데이터를 전송해야합니다. CONTENT_TYPE는 : 응용 프로그램 / vnd.ms-엑셀 트릭을 할해야합니다.

    그런 다음, 당신의 응답 Content-Type 헤더를 설정 데이터를 전송해야합니다. CONTENT_TYPE는 : 응용 프로그램 / vnd.ms-엑셀 트릭을 할해야합니다.

    당신은 또한 Excel 문서처럼 보이는, 브라우저 합리적인 기본 파일 이름을 선택합니다 수 있도록 내용 - 처리 헤더를 설정할 수 있습니다; 내용 - 처리 등의 일이 : 첨부 파일; 파일 이름 = "# {suggested_name} .XLS"

    나는 당신의 CSV를 생성하는 fastercsv 루비 보석을 사용하는 것이 좋습니다,하지만 내장의 CSV도있다. (보석의 설명서에서)을 fastercsv 샘플 코드는 다음과 같습니다 :

    csv_string = FasterCSV.generate do |csv|
      csv << ["row", "of", "CSV", "data"]
      csv << ["another", "row"]
    # ...
    end
    
  7. ==============================

    7.내 경우에 잘 작동 및 다운로드 후 CSV 형식에 적합한 응용 프로그램을 열 수있는 브라우저가 발생 접근 다음.

    내 경우에 잘 작동 및 다운로드 후 CSV 형식에 적합한 응용 프로그램을 열 수있는 브라우저가 발생 접근 다음.

    def index
      respond_to do |format|
        format.csv { return index_csv }
      end
    end
    
    def index_csv
      send_data(
        method_that_returns_csv_data(...),
        :type => 'text/csv',
        :filename => 'export.csv',
        :disposition => 'attachment'
      )
    end
    
  8. ==============================

    8.레일에서 CSV를 생성하는 좋은 보석 시도 https://github.com/crafterm/comma

    레일에서 CSV를 생성하는 좋은 보석 시도 https://github.com/crafterm/comma

  9. ==============================

    9.csv로 셰이퍼 보석을 살펴보십시오.

    csv로 셰이퍼 보석을 살펴보십시오.

    https://github.com/paulspringett/csv_shaper

    그것은 좋은의 DSL을 가지고 있으며, 레일 모델 정말 잘 작동합니다. 또한 응답 헤더를 처리하고 파일 이름 사용자 정의 할 수 있습니다.

  10. ==============================

    10.당신은 단순히 콘솔에서 CSV 데이터베이스를 직접 취득하고자하는 경우 당신은 몇 줄에 그렇게 할 수 있습니다

    당신은 단순히 콘솔에서 CSV 데이터베이스를 직접 취득하고자하는 경우 당신은 몇 줄에 그렇게 할 수 있습니다

    tags = [Model.column_names]
    rows = tags + Model.all.map(&:attributes).map(&:to_a).map { |m| m.inject([]) { |data, pair| data << pair.last } }
    File.open("ss.csv", "w") {|f| f.write(rows.inject([]) { |csv, row|  csv << CSV.generate_line(row) }.join(""))}
    
  11. from https://stackoverflow.com/questions/94502/in-rails-how-to-return-records-as-a-csv-file by cc-by-sa and MIT license