rails6 EXCELファイルを作成する

rails6 EXCELファイルを作成する

rails6で、EXCELファイルを作成する手順を記述してます。railsのバージョンは6.1.0です。

環境

  • OS ubuntu20.10
  • ruby 2.7.2
  • rails 6.1.0
  • Postgresql 13.1 (dockerで構築)

事前準備

Gemfileに、EXCELを作成するため、以下を追加します。

gem 'caxlsx'
gem 'caxlsx_rails'

ダミーデータを作るのにFakerを使用するので、以下も追加してます。

gem 'faker'

インストールします。

bundle install

scaffoldで、テーブルを作成しておきます。

rails g scaffold Sample name:string job:string
rails db:migrate

samplesテーブルが作成されます。

データ作成

Fakerからダミーデータを「db」フォルダ配下の「seeds.rb」に記述して作成します。

100.times do |n|
  name = Faker::Name.name
  job = Faker::Job.position

  Sample.create(
    name: name,
    job: job,
  )
end

実行します。

bundle exec rails db:seed

実行結果 テーブル「samples」

コントローラー編集

作成された「app/controllers」内の「samples_controller.rb」を以下のように編集します。

class SamplesController < ApplicationController
  before_action :set_sample, only: [:show, :edit, :update, :destroy]

  # GET /samples
  # GET /samples.json
  def index
    # 編集
    @samples = Sample.all
    respond_to do |format|
      format.html
      format.xlsx
    end
  end

ダウンロードするEXCELのファイルの名前を変更する場合は、filenameに任意の名前を指定します。

format.xlsx {
  response.headers["Content-Disposition"] = 'attachment; filename="hoge.xlsx"'
}

テンプレート作成

「app/views/samples」フォルダ内にEXCLEのテンプレートとなる「index.xlsx.axlsx」を作成します。

wb = xlsx_package.workbook

wb.add_worksheet(name: "sheetname") do |sheet|

    sheet.add_row ["No", "name", "job"]

    @samples.each.with_index(1) do |sample,i|    
        sheet.add_row [i, sample.name, sample.job ]
    end
    
end

シート名は、以下の箇所で指定できます。

name: "sheetname"

ダウンロードリンク作成

最後に、viewにEXCELダウンロード用のリンクを作成します。

<p id="notice"><%= notice %></p>

<h1>Samples</h1>

<%# 追加 %>
<%= link_to "Excel出力", samples_path(@samples, format: :xlsx) %>

ダウンロード

実際にダウンロードして確認してみます。

ブラウザから http://プライベートIP or サーバーアドレス:3000/samples にアクセスします。

EXCELダウンロードのリンクをクリックして、EXCELをダウンロードします。

「samples.xlsx」がダウンロードされます。

確認すると、EXCELファイルにデータが書き込みこまれていることが確認できます。