Excel への出力 (その1)

データベースの出力を Excel ではき出して欲しいという要望はかなり多いです.Web アプリの場合,HTML ファイルをそのまま Excel に読み込ませてしまえば,Excel 側がそれなりに解釈してくれるため,出力する側でうまく工夫してあげればよいことになります.Excel 出力の要望はかなり頻繁にあるため,その部分で手抜きができるように,仕組みを作ったので紹介してみます.

コントローラの変更

Excel 出力したいときには,以下のようにインスタンス変数 @export_excel を true にし,format に .xls を追加します.これだけでページが Excel 出力可能になります.

  def show
    @export_excel = true # この行を追加
    @club, @ids = get_parameters_and_ids [ Club.gp(true) ]
    (省略)
    respond_to do |format|
      format.html # show.html.haml
      format.xls { output_excel('/teacher/clubs/show.html', "#{@club.name}_部員一覧.xls") }
      # 第一引数は自動で生成できそうな気がしてきた.後で修正するかも,第二引数は出力するファイル名です.
    end
  end

これだけで Excel 出力可能になるための仕組みは以下の通りです.

app/views/shared/_top_link_bar.html.haml の抜粋

@export_excel が true になっているとき,app/views/layouts/application.html.haml 内から render されている _top_link_bar.html.haml において,Excel 出力のリンクが作成されます.

    %ul{id: :edit_mode}
      (中略)
      -if @export_excel
        %li=link_to('[Excel 出力]', export_excel_path(@ids || {}))

app/helpers/application_helper.rb の抜粋

export_excel_path は先日紹介した application_helper.rb において,以下のように定義されています.この結果,同じコントローラの同じアクションに現在のページと同じ引数で format のみが xls に変更されたリンクが生成されます.従って,[Excel 出力] のリンクをクリックすると,現在画面に表示されているものが Excel 出力されることになります.

  # excel 書き出しのパスを作成
  def export_excel_path(ids = {}, option = {})
    recursive_path(ids, option.merge(format:'xls'))
  end

長くなりそうなので,実際の Excel 出力部分については明日に回します.