はじめに
社内アプリケーションを作成したときに管理部へ提出するようの資料を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行目に追加する内容を指定することができる
- 複数のシート(excel用語)に分けてデータを出力するために
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のおかげで簡単に実装できたと思います。
最近、自分が書いた記事を参考にしてくださっているのを見て、時間をかけて書いた甲斐があるなぁとしみじみ感じております。
参考
- RailsでAxlsxを使ってxlsxを生成
- Github randym/axlsx