読者です 読者をやめる 読者になる 読者になる

Railsアプリにxlsxダウンロード機能を実装する

今回はGem rubyXLを使ってxlsxダウンロード機能を実装していきます。

準備

rails new
rails new xlsx_download
rubyXLをインストール

Gemfileに追記

gem 'rubyXL'
$ bundle install
rake db:create
$ rake db:create

.

ユーザデータを用意する

モデルとコントローラーを作成
$ rails g model user name:string gender:string email:string birthday:date
$ rails g controller users index

マイグレーションファイルはこんな感じ

class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :gender
      t.string :email
      t.date :birthday

      t.timestamps
    end
  end
end

マイグレーションする

$ bundle exec rails db:migrate

.

ダミーデータを作成

今回はダミーデータの作成方法は詳しく説明しません
こちらを参考にしました http://qiita.com/saino-katsutoshi/items/29c0918e489b27df637a

faker、forgeryをインストール

gem 'faker'
gem 'forgery'
$ bundle install

db/seeds.rbに以下を追記してrake db:seed

100.times do
  User.create(name: Forgery::Name.full_name, gender: Forgery::Personal.gender
, email: Forgery::Email.address, birthday: Faker::Date.backward(10000 + rand(1000)))
end
bundle exec rake db:seed

これで100件のユーザデータを作成できました

.

xlsxダウンロード機能を実装する

users#indexをルートに設定する

config/routes

root 'users#index'

.

MIME Type の追加

config/initializers/mime_types.rb

Mime::Type.register "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", :xlsx

ちなみに追記しないとこんな感じでエラーになる

f:id:stivan:20170202005804p:plain

.

xlsx出力するメソッドを作成

app/models/user.rb

def self.to_xlsx(users)
  workbook = RubyXL::Workbook.new
  worksheet = workbook[0]

  %w(名前 性別 EMAIL 生年月日).each_with_index do |val, idx|
    worksheet.add_cell(0, idx, val)
  end

  users.each.with_index(1) do |user, row_idx|
    %w(name gender email birthday).each_with_index do |key, col_idx|
      worksheet.add_cell(row_idx, col_idx, user.__send__(key))
    end
  end

  workbook.stream.read
end

.

コントローラに設定

app/controllers/users_controller.rb

def index
  @users = User.all

  respond_to do |format|
    format.html
    format.xlsx do
      send_data User.to_xlsx(@users),
        filename: "ユーザ一覧.xlsx"
    end
  end
end

.

ダウンロードリンクを追記

app/views/users/index.html.erb

<%= link_to 'ユーザ一覧ダウンロード', root_path(format: :xlsx) %>

.

これで完成です!

トップページにアクセスしてリンクを押すとダウンロードできるはずです

f:id:stivan:20170202005926p:plain

こんな感じ

f:id:stivan:20170202010037p:plain

お疲れ様でした!