문제

내가 간단한 데이터베이스 테이블라"항목을":

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

나는 어떻게 처리기를 작성하는 것이익의 내용이 테이블 항목을 CSV 파일로 바로(는 방식으로 그것이 자동으로 열리는 Excel)?

class EntriesController < ApplicationController

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

    # ??? NOW WHAT ????

  end

end
도움이 되었습니까?

해결책

라는 플러그인이 있다 FasterCSV 는 이것을 처리하고 있습니다.

다른 팁

FasterCSV 은 확실히 갈 수있는 방법,그러나 당신이 그것을 제공하기 위해 원하는에서 직접 레일 응용 프로그램으로,당신은 설정하려면 어떤 응답 헤더,too.

나 유지하는 방법을 설정하는 파일 이름 및 필요한 헤더:

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 %>

내 나이(그리고 투표니다!) @브라이언에 응답을 위해,최초를 가리키는 나 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

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

이 필요 루비 csv 라이브러리에서는 이니셜라이저는 파일과 같은 config/이니셜라이저/종속성입니다.rb

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

습니다.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 버전의 보고서 페이지가 링크가 있을 수출하는 보고서에는 사용자가 볼 수 있습니다.다음은 link_to 반환하는 csv 버전의 보고서:

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

볼로 FasterCSV 보석입니다.

필요한 모든 경우에는 excel 지원할 수 있습 또한 볼로 생성 xls 직접 있습니다.(참조 스프레드시트::Excel)

gem install fastercsv
gem install spreadsheet-excel

내가 찾는 이러한 옵션에 대한 좋은 열기는 csv 파일에서 Windows Excel:

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

로 ActiveRecord 부분 같은 것을 할 것이라:

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

을 설정해야 합 Content-Type 헤더에서의 응답,데이터를 보낼.Content_Type:응용 프로그램/vnd.ms-excel 해야 합니다.

수도 있습니다 설정하고 싶은 콘텐츠 처리 헤더도록처럼 보이는 Excel 문서,그리고 브라우저 선택 합리적인 기본 파일 이름;는 무언가가 같은 내용 처리:첨부 파일filename="#{suggested_name}.xls"

내가 사용하는 것이 좋습니다 fastercsv 루비 보석을 생성하 CSV,그러나 있는 내장을 제공합니다.이 fastercsv 샘플 코드(에서 보석 문서)는 다음과 같습니다:

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

다음과 같은 접근을 잘 나의 케이스 및 원인은 브라우저를 열고 적절한 응용 프로그램를 위한 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

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

을 살펴 CSV 셰이퍼 보석입니다.

https://github.com/paulspringett/csv_shaper

그것은 좋은 DSL 및 정말 잘 작동 가로장으로 모델이다.그것은 또한 처리에 응답 헤더 수 있습름을 사용자 정의.

만약 당신이 원하는 단순히 얻 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(""))}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top