紙一重の積み重ね

35歳のエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【Rails5】axlsx_railsを使ってCSV出力機能を実装する

f:id:yokoyantech:20190109155303p:plain

はじめに

axlsx_railsを使ってCSV出力機能を実装するメモ。

やりたいこと

  • Rails5アプリケーションからCSVを出力したい

実現方法

実装方法

gemインストール

gem 'axlsx_rails'

MIMEの登録

長いので\config\initializers\mime_types.rbに登録する。

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

実装

View

  • Excelのヘッダー部とデータ部を定義する。
  • app/view/hoge/fuga.xlsx.axlsxという感じで作成する。
wb = xlsx_package.workbook

wb.styles do |s|
  row_style = s.add_style alignment: { horizontal: :left, vertical: :top, wrap_text: true }
  wb.add_worksheet(name: "source") do |sheet|
    # ヘッダー
    headers = [t('activerecord.attributes.user.user_code'),
               t('activerecord.attributes.user.user_name')]
    sheet.add_row headers, style: row_style

    # データ
    @hoge.each do |hoge|
      row = [hoge.user.user_code, hoge.user.user_name]
      sheet.add_row row, style: row_style
    end
  end
end

Controller

  • respond_toメソッドの呼び出し
    • xlsxのフォーマットでリクエストが来た場合、app/view/hoge/fuga.xlsx.axlsxを表示する。
    • templateには、上部で定義したExcelのフォーマットの場所を指定する
def csv
  respond_to do |format|
    format.html
    format.xlsx do
      response.headers['Content-Disposition'] = 'attachment'
    end
  end
  render xlsx: source_file_name, template: 'hoge/fuga'
end

参考情報

qiita.com