2021年10月2日土曜日

AxlsxでExcelファイルを出力する【Rails備忘録】

【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 件のコメント:

コメントを投稿