環境
Rails 5.2
Ruby 2.6
Ubuntu 20.4
はじめに
RailsでExcel出力をする方法についての記事です。Excel出力をするgemにcaxlsx_railsを利用します。RailsでExcel出力する方法についてググると、axlsx_railsというgemに関する情報が多く検索されます。caxlsx_railsの公式サイトを見ると、以前は、axlsx_railsという名前のgemで提供されていたが、caxlsx_railsという名前に変更されているようです。
caxlsx_railsの公式サイト
https://github.com/caxlsx/caxlsx_rails
Excel出力の仕方
Gemfileに下記のgemを追加して、bundle installを実行します。
gem 'caxlsx_rails'
Excel出力をするメソッド名をこの記事ではexportとします。routesにtasksコントローラーのexportメソッドへのルート情報を記述します。
resources :tasks
get :export, on: :collection
end
コントローラーにexportメソッドを記述します。tasksテーブルの内容を全件取得して、Excelファイルに出力します。ExcelファイルはTask一覧.xlsxというファイル名にしています。ファイル選択のサブ画面を表示して、任意のファイル名を初期表示することができます。サブ画面では初期表示されたファイル名を変更することができます。
def export
@tasks = Task.All
respond_to do |format|
format.xlsx do
response.headers['Content-Disposition'] = 'attachment; filename="Task一覧.xlsx"'
end
end
end
ビューで処理を実行するボタンを記述します。form_tagではなくlink_toにしなくてはいけないところがポイントです。
= link_to "Excel出力", tasks_path(@tasks, format: :xlsx)
viewフォルダの配下に、excel.xlsx.axlsxファイルを作成します。公式サイトにテンプレートがあるため、それを参考にするといいでしょう。wb.add_worksheetでExcelのタブ名を指定できます。下記では、tasksテーブルの、idとTask名を出力しています。また、Excelの1行目にタイトルを出力しています。
wb = xlsx_package.workbook
wb.add_worksheet(name: "Task一覧") do |sheet|
sheet.add_row %w(id Task名)
@tasks.each do |task|
sheet.add_row do |row|
row.add_cell(task.id)
row.add_cell(task.tasknm)
end
end
end