下準備
CSVクラスをRailsで使えるようにする必要があります。
config/application.rb
# config/application.rb
require File.expand_path('../boot', __FILE__)
require 'rails/all'
require 'csv'
View
CSVダウンロード、エクセルダウンロードのリンクを作ります。
html.erb
# csv_downloadするリンク -> このリンク押すとcsvデータがダウンロードされる。
<%= link_to "CSV", csv_download_path(format: "csv") %>
# excel_downloadするリンク -> このリンク押すとexcelデータがダウンロードされる。
<%= link_to "Excel", excel_download_path(format: "excel") %>
FilesController
リクエストを受け取ったら、CSV/エクセルデータを返します。
class FilesController < ApplicationController
def csv_download
# 分かりやすいようにインスタンス変数にしておきました。
@csv_data = FileData.csv_data
respond_to do |format|
# .csv
format.csv { send_data @csv_data }
end
end
def excel_download
# 分かりやすいようにインスタンス変数にしておきました。
# なんだかよく分からないoptionが入ります。
@excel_data = FileData.excel_data(col_sep: "\t")
respond_to do |format|
# .xls
format.xls { send_data @excel_data }
end
end
end
FileData Model
CSV/エクセルオブジェクトを作成します。
class FileData
# 引数無し
def self.csv_data
csv_data = CSV.generate do |csv|
# csvに二次元配列を代入
csv = [
['a','a','a','a'],
['b','b','b','b'],
['c','c','c','c']
]
end
return csv_data
end
# excel_dataの場合はoptionsを渡す。
# 引数有り!
def self.excel_data(options = {})
# 引数有り!
excel_data = CSV.generate(options) do |csv|
# csvに二次元配列を代入
csv = [
['a','a','a','a'],
['b','b','b','b'],
['c','c','c','c']
]
end
return excel_data
end
end
Excelデータ出力のその他の処理
config/initializers/mime_types.rb
これを追加する。
Mime::Type.register "application/xls", :xls
↓結果
# Be sure to restart your server when you modify this file.
# Add new mime types for use in respond_to blocks:
# Mime::Type.register "text/richtext", :rtf
Mime::Type.register "application/xls", :xls
参考リンク