今回はAxlsx_railsというgemを使います。
ボタンを押したらダウンロード出来るとこまでやります。
環境
・ruby 2.3
・Rails 5.1
準備
gemを追加
gem 'rubyzip', '>= 1.2.1'
gem 'axlsx', git: 'https://github.com/randym/axlsx.git', ref: '776037c0fc799bb09da8c9ea47980bd3bf296874'
gem 'axlsx_rails'
Mime::Typeを追加
Mime::Type.unregister :xlsx
Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx
任意のアクションに対して下記のコードを追加(model名は適当です)
class ProductsController < ApplicationController
def index
@products = Product.all
respond_to do |format|
format.html
format.xlsx {
response.headers['Content-Disposition'] = 'attachment; filename="Product.xlsx"'
}
end
end
テンプレートの作成
出力するファイルのデザインや、要素を書き込んでいきます。
Axlsx_railsはAxlsxというgemに依存しているのでAxlsxのサンプルがそのまま使えます。
Axlsx サンプルコード
それでは実際に作っていきます。
実装
app/views/products
フォルダにテンプレートファイルを作成します。
ファイル名には規則があります。
action名.xlsx.axlsx
今回はindex.xlsx.axlsx
になります。
もし、actionがcreate
だとしたら
create.xlsx.axlsx
というファイル名になります。
wb = xlsx_package.workbook
wb.styles do |style|
highlight_cell = style.add_style(bg_color: "EFC376")
wb.add_worksheet(name: "Products") do |sheet|
@products.each do |product|
sheet.add_row [product.title, product.price], style: [nil, highlight_cell]
end
end
end
次にダウンロードボタンを追加します。
<%= link_to 'Download spreadsheet', product_path(format: :xlsx), data: {turbolinks: false} %>
これでExcelファイルをダウンロードできるようになりました。
参考サイト
・Generate Excel Spreadsheets with Rails and the Axlsx Gem
・【Rails】Rubyテンプレートで axlsx を出力する方法
・axlsx_rails を用いて Excel のスプレッドシートを生成する
・RailsでExcelを扱うGemまとめ