0
0

【Rails】rubyXLを使って別途用意したエクセルファイルを出力する機能を作成

Last updated at Posted at 2024-01-17

railsで別途用意したエクセルファイルを出力する機能を作成したので、備忘録用に簡単にまとめる。

rubyXLは初めて使い、エンジニア歴も浅いため至らないコードもあるかと思いますが、参考程度になればと思います。

環境

rubyのバージョン
ruby 2.7.2p137
railsのバージョン
Rails 6.0.3.4
rubyXLのバージョン
rubyXL (3.4.25)

Gemfileのインストール

まずはrubyXLをインストールします。

Gemfile
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タイプとして登録してください」という内容

config/initializers/mime_types.rb
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx ## この行を追記する

serviceクラスを作成していきます。

わざわざクラスをわけるほどではないかもしれませんが、ここからソースコードが複雑になることを想定しています。

app/services/excel_generator.rb
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
excel_controller.rb
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

ルーティング設定。

routes.rb
get 'excel/generate', to: 'excel#generate', as: 'generate_excel', defaults: { format: :xlsx }

viewに出力ボタンを作成。

test.html.erb
<%= link_to 'クリックするとエクセルファイルを出力します', generate_excel_path, class: 'XXXXX' %>

これで別途用意したエクセルファイルを出力することができます。
今回はただ単に出力するだけですが、ここからエクセルにデータを書きこんでいくことも可能です。
また、改善点などありましたらアドバイスを頂けますと幸いです。
記事も随時更新したいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0