【2021年10月6日追記】
axlsx_rails はもう古く,今は caxlsx を使えということらしい.Gemfileへの追記部分は次のようにするべし.
gem 'caxlsx'
gem 'caxlsx_rails'
【追記ここまで】
まず,Gemfileに次を追記する.
gem 'axlsx_rails'
そして次の操作でgemをインストールする.
$ bundle install
Excelファイルを出力したいコントローラに以下を追加する.
今回は app/controllers/td/rubrics_controller.rb のindexメソッドに追記した.
filename="..."でダウンロードすべきExcelファイルのファイル名を指定できる.
respond_to do |format|
format.html
format.xlsx do
response.headers['Content-Disposition'] =
"attachment; filename=Scores_#{Date.today}.xlsx"
end
end
こんな感じ(図の赤字の囲み部分).
次に,ビューに index.xlsx.axlsx というファイルを作る.HTMLの表を表示させているページと同じところ,すなわち app/views/td/rubrics/index.html.erb と同じところに次のコードを置く.これはExcelシートの中身を作るためのコード.add_worksheetとかadd_rowなどのメソッドが利用できる.
wb = xlsx_package.workbook
header = ['Names \ Items']
@rubrics.each {|rubric|
header.push(rubric.item)
}
wb.add_worksheet(name: 'Self-evaluation scores') do |sheet|
sheet.add_row(header)
@students.each do |student|
levels = [ student.fullname ]
@rubrics.each {|rubric|
levels.push(Score.find_by(user: student, rubric: rubric)&.level)
}
sheet.add_row(levels)
end
end
最後は,エクセルファイルの出力ボタンを置くために,次のコードを埋め込む.
<%= link_to "Excel file download",
td_rubrics_path(format: :xlsx), class: 'btn btn-primary' %>
埋め込まれたページの表示は,こんな感じ.
td_rubrics_path のリンクを辿ると Td::RubricController#index がキックされる.
td_rubrics_pathの引数に format: :xlsx を指定しているので,respond_to で xlsx フォーマットをレンダリングすると指定したところが効いてくる.そしてビューに新しく用意したExcelファイルのレンダリング手順が実行されてExcelファイルが作成されるというわけ.
0 件のコメント:
コメントを投稿