[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.멋지고이 처리 FasterCSV라는 플러그인이있다.
멋지고이 처리 FasterCSV라는 플러그인이있다.
-
==============================
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.나는 가능 (최대 투표!) 브라이언의 대답 @, 첫 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.또 다른 방법은 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.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.그런 다음, 당신의 응답 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.내 경우에 잘 작동 및 다운로드 후 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.레일에서 CSV를 생성하는 좋은 보석 시도 https://github.com/crafterm/comma
레일에서 CSV를 생성하는 좋은 보석 시도 https://github.com/crafterm/comma
-
==============================
9.csv로 셰이퍼 보석을 살펴보십시오.
csv로 셰이퍼 보석을 살펴보십시오.
https://github.com/paulspringett/csv_shaper
그것은 좋은의 DSL을 가지고 있으며, 레일 모델 정말 잘 작동합니다. 또한 응답 헤더를 처리하고 파일 이름 사용자 정의 할 수 있습니다.
-
==============================
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(""))}
from https://stackoverflow.com/questions/94502/in-rails-how-to-return-records-as-a-csv-file by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 4 레일 : 모델의 네임없이 하위 경로에 레일 모델을 구성? (0) | 2020.02.13 |
---|---|
[RUBY-ON-RAILS] 액티브에서 만든에서 ID를 재정의 (0) | 2020.02.13 |
[RUBY-ON-RAILS] force_ssl 레일에 무엇입니까? (0) | 2020.02.13 |
[RUBY-ON-RAILS] 루비 1.9.3로 루비 - 디버그? (0) | 2020.02.13 |
[RUBY-ON-RAILS] 요청이 AJAX 인 경우 레일 감지 (0) | 2020.02.13 |