railsで別途用意したエクセルファイルを出力する機能を作成したので、備忘録用に簡単にまとめる。
rubyXLは初めて使い、エンジニア歴も浅いため至らないコードもあるかと思いますが、参考程度になればと思います。
環境
rubyのバージョン
ruby 2.7.2p137
railsのバージョン
Rails 6.0.3.4
rubyXLのバージョン
rubyXL (3.4.25)
Gemfileのインストール
まずはrubyXLをインストールします。
gem 'rubyXL'
$ bundle install
MIMEタイプの登録
下記設定を追記しないとエクセル出力した際にエラーが発生する。
To respond to a custom format, register it as a MIME type first: https://guides.rubyonrails.org/action_controller_overview.html#restful-downloads. If you meant to respond to a variant like :tablet or :phone, not a custom format, be sure to nest your variant response within a format response: format.html { |html| html.tablet { ... } }
というエラーが発生する。
「カスタムフォーマットに対応するために、まずそれをMIMEタイプとして登録してください」という内容
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx ## この行を追記する
serviceクラスを作成していきます。
わざわざクラスをわけるほどではないかもしれませんが、ここからソースコードが複雑になることを想定しています。
class ExcelGenerator
def generate_excel
template_path = Rails.root.join('public', 'files', 'template.xlsx') # 別途用意したエクセルファイルを配置し、そのパスを記述します。
workbook = RubyXL::Parser.parse(template_path) # ここで配置してあるエクセルファイルを元にWorkbookオブジェクトを作成
workbook # 呼び出し元へworkbookを返す
end
end
Controller
コントローラーを作成します。
$ rails g controller excel_controller
class ExcelController < ApplicationController
require 'rubyXL'
def generate
excel_generator = ExcelGenerator.new # 一つ前で作成したクラスからオブジェクトを作成
workbook = excel_generator.generate_excel # generate_excelでworkbookを作成
respond_to do |format|
format.xlsx do
send_data workbook.stream.string, filename: 'example.xlsx', type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', disposition: 'attachment' # エクセルファイルを出力
end
end
end
end
ルーティング設定。
get 'excel/generate', to: 'excel#generate', as: 'generate_excel', defaults: { format: :xlsx }
viewに出力ボタンを作成。
<%= link_to 'クリックするとエクセルファイルを出力します', generate_excel_path, class: 'XXXXX' %>
これで別途用意したエクセルファイルを出力することができます。
今回はただ単に出力するだけですが、ここからエクセルにデータを書きこんでいくことも可能です。
また、改善点などありましたらアドバイスを頂けますと幸いです。
記事も随時更新したいと思います。