【Ruby on Rails】caxlsx_railsを使用して簡単にExcel出力！

# はじめに

こんにちは、未経験エンジニア3年目の嶋田です。

今回は、RailsアプリケーションでExcelファイル（`.xlsx`形式）を生成するためのGem
**caxlsx_rails**についてご紹介します。

Webサービスの管理画面によくある「ダウンロード」機能ですが、
皆さんも見たことあるのではないでしょうか？？

![csvダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524119/71ddf3b8-dd50-1c9f-a211-a03fe0edf160.png)

CSVでの実装が多かったのですが、
初めてExcel形式での出力を実装する機会がありました。

調べてみると…
> CSVデータですが、昨今ではダウンロード機能を廃止するサイトが増加傾向にある

そうです。([参考](https://pig-data.jp/blog_news/blog/scraping-crawling/csv/))

そのため、今回はExcel出力をするGemである**caxlsx_rails**を利用して、
RailsアプリケーションでExcelファイルを生成する方法をご紹介します。

ユーザーや依頼者の要望に応えられるように新しい技術を取り入れ、
柔軟に対応できるようになるのはエンジニアにとってすごく嬉しいことですね😄


## 目次
- [caxlsx_railsとは](#caxlsx_railsとは)
- [準備](#準備)
    - [Gemインストール](#Gemインストール)
    - [MIMEタイプ登録](#MIMEタイプ登録)
- [Excelファイルの生成](#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`を実行します。

```ruby
gem 'caxlsx_rails', '~> 0.6.4'
```

`caxlsx_rails`は`caxlsx`に依存しているため、両方のGemをインストールする必要があると公式には書いてありました。

調べてみると…
[`gem 'caxlsx_rails'`のみで自動的にインストールされた](https://dev.to/superails/export-from-database-table-to-excel-workbook-level-1-55jd#comment-2bbeb)という人がいたり、
[自動的にはインストールされなかったという人](https://dev.to/superails/export-from-database-table-to-excel-workbook-level-1-55jd#comment-2bhh0)がいるようです。(2023年12月の発言)
[更新履歴](https://github.com/caxlsx/caxlsx_rails?tab=readme-ov-file#change-log)をみる感じ2人とも0.6.3がリリースされた後ですが
gemのバージョン、環境（特にRubyやRailsのバージョン）による違いでは依存関係が自動的に解決されない可能性があるのかもしれません。

`caxlsx_rails`は、`caxlsx`というGemに依存していますが、
環境によっては自動的にインストールされないことがあるため、必要に応じて以下の行も**追加**してください。
```ruby
gem 'caxlsx'
```

ちなみに以下の環境では、`gem 'caxlsx_rails', '~> 0.6.4'`のみで依存関係のインストールに成功しました。
```ruby
ruby 3.2.2
Rails 7.1.3.4
```

```ruby
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`に以下を追加してください。

```ruby
Mime::Type.register 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', :xlsx
```
これでExcelファイル（`.xlsx`形式）のMIMEタイプが正しく登録されます。

## Excelファイルの生成

### コントローラーの設定

まず、Excelファイルを生成するためのコントローラーを設定します。  
以下は、`ProductsController`の例です。データを取得し、`.xlsx`形式でレスポンスを返す設定を行います。

```ruby
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のテンプレートを定義します。

```ruby
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`に以下のコードを挿入してください。

```haml
= link_to 'Excelでダウンロード', products_path(format: :xlsx)
```
これにより、ユーザーがリンクをクリックすると、`products.xlsx`ファイルがダウンロードされます。

今回はDBやモデルの箇所の紹介はしていませんが、
私の環境で実装した画面と`products.xlsx`ファイルは以下です。

![実装画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524119/d487e757-6915-b23c-a7eb-3f6d4cd98b1d.png)

![Excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524119/9ae995cf-62f8-9cea-683d-bc644d671b6d.png)


## まとめ

今回は、`caxlsx_rails`を使用してRailsアプリケーションでExcelファイルを生成する方法をまとめてみました。

このGemはシンプルかつ柔軟にExcelファイルを生成できるため、さまざまなデータ形式にも対応可能です。
今後、管理画面でのレポート出力やデータエクスポート機能を実装する際には、ぜひ`caxlsx_rails`を試してみてください。

最後までお読みいただきありがとうございました。
フィードバックがあれば、気軽にコメントお願いします！
私自身まだまだ勉強中ですので、コメントいただけると勉強になりありがたいです。