LoginSignup
18
13

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

Last updated at Posted at 2020-05-13

はじめに

社内アプリケーションを作成したときに管理部へ提出するようの資料をExcel出力するとき調べたことをまとめました。
Axlsx というライブラリを使用すると、Rails で簡単にExcel出力ができるようになります。
利点なのかわかりませんが、複数のシートを作成することができて便利だなーと感じました。

コマンド

// 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

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に追記します。

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行目に追加する内容を指定することができる
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

以下の1行を追記します。

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出力のリンク先をクリックするとダウンロードが開始されます。

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

まとめ

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

参考

18
13
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
18
13