Ruby on RailsでExcelファイルを出力(ダウンロード)する方法を紹介します。今回は「Axlsx」というGemを使って出力します。
【Rails】AxlsxでExcelファイルを出力(ダウンロード)する方法
Gemfileに以下を指定して、「Axlsx」をインストールします。
詳しいGemのインストールの組み合わせは以下の公式に記載されています。
GitHub - caxlsx/caxlsx_rails: A Rails plugin to provide templates for the axlsx gem
1 2 3 | gem 'rubyzip', '>= 1.2.1' gem 'axlsx', git: 'https://github.com/randym/axlsx.git', ref: 'c8ac844' gem 'axlsx_rails' |
指定したら、bundle installしましょう。
1 | bundle install |
respond_toを使用するためにmime_types.rbに以下を追記します。
・config/initializers/mime_types.rb
1 2 3 4 5 | # 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.unregister :xlsx Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx |
・app/view/users/index.html.erb
Viewにエクセル出力するためのボタンを設置します。
1 2 3 | <%= button_to excel_users_path(format: :xlsx), method: :get do %> ユーザ一覧エクセル出力 <% end %> |
今回は、例としてusersコントローラのexcelメソッドでエクセル出力を行うため、ルーティングに以下(get :excel)を追記しましょう。
・config/routes.rb
1 2 3 4 5 | resources :users, only: [:index] do collection do get :excel end end |
Viewでユーザ一覧エクセル出力ボタンを押下すると、usersコントローラのexcelメソッドに送信され、xlsxフォーマットを指定してエクセル出力処理が行われます。
ファイル名は「filename=”user_lists”‘+ Time.zone.now.strftime(‘%Y%m%d%H%M%S’) + ‘.xlsx’」で指定しており、user_lists20190621163621.xlsxのようなファイルが出力されます。
今回はユーザ一覧を出力するため「@users = ::User.all」で全ユーザを取得しておきます。
・app/controllers/users_controller.rb
1 2 3 4 5 6 7 8 9 | def excel @users = ::User.all respond_to do |format| format.html format.xlsx { response.headers['Content-Disposition'] = 'attachment; filename="user_lists"'+ Time.zone.now.strftime('%Y%m%d%H%M%S') + '.xlsx' } end end |
エクセル出力を定義するViewを用意し、出力内容を書いていくと完成です。
ファイル名の指定はアクション名.xlsx.axlsxです。今回はexcelメソッドを使用しているため、excel.xlsx.axlsxです。「wb.add_worksheet(name: “ユーザ一覧”) do |sheet|」で、シート名を指定します。
stylesでエクセル内のフォントや配置を指定しています。今回はヘッダー部分の背景色の指定とデータ部分の背景色・下線を指定しています。もっと詳しい指定方法は以下のサイトに記載されています。
@users.each do |user|で先ほど取得したユーザを出力しています。
・app/view/users/excel.xlsx.axlsx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | wb = xlsx_package.workbook wb.styles do |style| wb.add_worksheet(name: "ユーザ一覧") do |sheet| styles = { header: wb.styles.add_style(bg_color: 'A4C6FF'), cell: wb.styles.add_style(bg_color: 'DDDDDD', :border=> {:style => :medium, :color => "000000", :edges => [:bottom]}), } sheet.add_row do |row| row.add_cell('ID', style: styles[:header]) row.add_cell('名前', style: styles[:header]) end @users.each do |user| sheet.add_row do |row| row.add_cell(user.id, style: styles[:cell]) row.add_cell(user.name, style: styles[:cell]) end end end end |
実際にユーザ一覧エクセル出力ボタンを押下すると、エクセルファイルが出力され、以下のようなデータが表示されます。