はじめに
こんにちは、未経験エンジニア3年目の嶋田です。
今回は、RailsアプリケーションでExcelファイル(.xlsx
形式)を生成するためのGem
caxlsx_railsについてご紹介します。
Webサービスの管理画面によくある「ダウンロード」機能ですが、
皆さんも見たことあるのではないでしょうか??
CSVでの実装が多かったのですが、
初めてExcel形式での出力を実装する機会がありました。
調べてみると…
CSVデータですが、昨今ではダウンロード機能を廃止するサイトが増加傾向にある
そうです。(参考)
そのため、今回はExcel出力をするGemであるcaxlsx_railsを利用して、
RailsアプリケーションでExcelファイルを生成する方法をご紹介します。
ユーザーや依頼者の要望に応えられるように新しい技術を取り入れ、
柔軟に対応できるようになるのはエンジニアにとってすごく嬉しいことですね😄
目次
caxlsx_railsとは
caxlsx_rails(旧称:axlsx_rails)は、Ruby on RailsアプリケーションでExcelファイル(.xlsx
形式)を生成するためのGemです。
このGemを利用すると、Railsのビューから直接Excelスプレッドシートを作成し、
データのエクスポート機能を簡単に実装することができます。
RailsでExcel出力の方法について調べると、axlsx_rails
というGemの情報がよく出てきます。
しかし、公式サイトを見ると現在はcaxlsx_railsとして提供されていることがわかります。
(ちなみに私も最初、英語をあまり読まずにaxlsx_rails
を使っていたのはここだけの話です…😅)
公式リンク→https://github.com/caxlsx/caxlsx_rails
以下に、caxlsx_rails
を使ってExcelファイルを生成する手順を説明します。
準備
Gemインストール
まず、Gemをインストールします。Gemfile
に以下を追加し、bundle install
を実行します。
gem 'caxlsx_rails', '~> 0.6.4'
caxlsx_rails
はcaxlsx
に依存しているため、両方のGemをインストールする必要があると公式には書いてありました。
調べてみると…
gem 'caxlsx_rails'
のみで自動的にインストールされたという人がいたり、
自動的にはインストールされなかったという人がいるようです。(2023年12月の発言)
更新履歴をみる感じ2人とも0.6.3がリリースされた後ですが
gemのバージョン、環境(特にRubyやRailsのバージョン)による違いでは依存関係が自動的に解決されない可能性があるのかもしれません。
caxlsx_rails
は、caxlsx
というGemに依存していますが、
環境によっては自動的にインストールされないことがあるため、必要に応じて以下の行も追加してください。
gem 'caxlsx'
ちなみに以下の環境では、gem 'caxlsx_rails', '~> 0.6.4'
のみで依存関係のインストールに成功しました。
ruby 3.2.2
Rails 7.1.3.4
caxlsx (4.1.0)
htmlentities (~> 4.3, >= 4.3.4)
marcel (~> 1.0)
nokogiri (~> 1.10, >= 1.10.4)
rubyzip (>= 1.3.0, < 3)
caxlsx_rails (0.6.4)
actionpack (>= 3.1)
caxlsx (>= 3.0)
依存関係の詳細
-
caxlsx_rails
バージョン0.6.4 - 依存関係:
actionpack
(>= 3.1)、caxlsx
(>= 3.0)
参考:https://rubygems.org/gems/caxlsx_rails?locale=ja
MIMEタイプ登録
次に、MIMEタイプを登録します。
Excelファイルを正しく扱うために、config/initializers/mime_types.rb
に以下を追加してください。
Mime::Type.register 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', :xlsx
これでExcelファイル(.xlsx
形式)のMIMEタイプが正しく登録されます。
Excelファイルの生成
コントローラーの設定
まず、Excelファイルを生成するためのコントローラーを設定します。
以下は、ProductsController
の例です。データを取得し、.xlsx
形式でレスポンスを返す設定を行います。
class ProductsController < ApplicationController
def index
@products = Product.all
respond_to do |format|
format.html
format.xlsx do
response.headers['Content-Disposition'] = 'attachment; filename="products.xlsx"'
end
end
end
end
ビューの作成
次に、app/views/products
ディレクトリにindex.xlsx.axlsx
というファイルを作成し、Excelのテンプレートを定義します。
wb = xlsx_package.workbook
wb.add_worksheet(name: "商品一覧") do |sheet|
sheet.add_row ["商品ID", "商品名", "価格"]
@products.each do |product|
sheet.add_row [product.id, product.name, product.price]
end
end
このテンプレートでは、@products
のデータをExcelシートに書き込んでいます。add_row
メソッドで各行を追加し、データを挿入します。
ダウンロードリンクの追加
ユーザーがExcelファイルをダウンロードできるように、ビューにリンクを追加します。
app/views/products/index.html.haml
に以下のコードを挿入してください。
= link_to 'Excelでダウンロード', products_path(format: :xlsx)
これにより、ユーザーがリンクをクリックすると、products.xlsx
ファイルがダウンロードされます。
今回はDBやモデルの箇所の紹介はしていませんが、
私の環境で実装した画面とproducts.xlsx
ファイルは以下です。
まとめ
今回は、caxlsx_rails
を使用してRailsアプリケーションでExcelファイルを生成する方法をまとめてみました。
このGemはシンプルかつ柔軟にExcelファイルを生成できるため、さまざまなデータ形式にも対応可能です。
今後、管理画面でのレポート出力やデータエクスポート機能を実装する際には、ぜひcaxlsx_rails
を試してみてください。
最後までお読みいただきありがとうございました。
フィードバックがあれば、気軽にコメントお願いします!
私自身まだまだ勉強中ですので、コメントいただけると勉強になりありがたいです。