【Rails】 5分でExcel出力を実装する方法

# はじめに
社内アプリケーションを作成したときに管理部へ提出するようの資料をExcel出力するとき調べたことをまとめました。
Axlsx というライブラリを使用すると、Rails で簡単にExcel出力ができるようになります。
利点なのかわかりませんが、複数のシートを作成することができて便利だなーと感じました。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/79899beb-6810-ec48-7f83-2a5d1df728f0.png">


# コマンド

```
// Rails アプリケーション作成
$ rails _5.2.4.2_ new five_min_axlsx_rails
$ cd five_min_axlsx_rails

// scaffold で Excel モデルを作成
$ rails g scaffold excel title:string body:string
$ rails db:migrate RAILS_ENV=development
```


# Gemfile

```Ruby:Gemfile
gem 'axlsx_rails'
```

```
$ bundle install
```

# サンプルデータ作成
サンプルデータを作成するために、数も少ないのでコンソール```rails c```を開いてコマンドを実行します。

```
$ rails c
> Excel.create(title: "sample_1", body: "body_sample_1")
> Excel.create(title: "sample_2", body: "body_sample_2")
> Excel.create(title: "sample_3", body: "body_sample_3")
```


# Controller

index（一覧）のデータをExcelに出力したいケースを想定します。
controllerに追記します。

```Ruby:app/controllers/excels_controller.rb
  def index
    # Excelに出力したいデータをインスタンス変数に格納する
    @excels = Excel.all

    # 以下、追記
    respond_to do |format|
      format.html
      format.xlsx do
        # ファイル名をここで指定する（動的にファイル名を変更できる）
        response.headers['Content-Disposition'] = "attachment; filename=#{Date.today}.xlsx"
      end
    end
  end
```

# axlsx

viewのexcelフォルダに```index.xlsx.axlsx```を作成します。
__rubyの拡張子ではないため注意！！__

* ポイント
    * 複数のシート（excel用語）に分けてデータを出力するために```add_worksheet```メソッドを繰り返ししている
        * ```add_worksheet``` とは、新しいシート（excel用語）を作成します。
    * ```add_worksheet```メソッドの引数(name)に出力するファイル名を指定することができる
    * ```add_row```メソッドで1行目に追加する内容を指定することができる

```Ruby:app/views/excels/index.xlsx.axlsx
wb = xlsx_package.workbook

@excels.each_with_index do |excel, index|
  wb.add_worksheet(name: excel.title) do |sheet|
    sheet.add_row [ "No.", "title", "body" ]
    sheet.add_row [ index, excel.title, excel.body ]
  end
end
```

# view
以下の１行を追記します。

```erb:app/views/excels/index.html.erb

<h1>Excels</h1>

<!-- 以下の1行を追記 -->
<%= link_to "Excel出力", excels_path(@excels, format: :xlsx) %>

<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Body</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @excels.each do |excel| %>
      <tr>
        <td><%= excel.title %></td>
        <td><%= excel.body %></td>
        <td><%= link_to 'Show', excel %></td>
        <td><%= link_to 'Edit', edit_excel_path(excel) %></td>
        <td><%= link_to 'Destroy', excel, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Excel', new_excel_path %>
```

# 確認
ここまでできたら、実際にExcel出力ができるかどうかを確認します。

```
$ rails s
```

リンク```http://localhost:3000/excels```へアクセス。

Excel出力のリンク先をクリックするとダウンロードが開始されます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/5e060223-07b3-d0c8-0e5c-99e2e1671527.png">

ダウンロードしたExcelファイルを開くと以下のように出力されていることが確認できます。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308256/79899beb-6810-ec48-7f83-2a5d1df728f0.png">

# まとめ
いかがでしたでしょうか。gemのおかげで簡単に実装できたと思います。
最近、自分が書いた記事を参考にしてくださっているのを見て、時間をかけて書いた甲斐があるなぁとしみじみ感じております。


# 参考
* RailsでAxlsxを使ってxlsxを生成
    * https://qiita.com/necojackarc/items/0dbd672b2888c30c5a38
* Github randym/axlsx
    * https://github.com/randym/axlsx

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/