データベースの出力を 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 出力部分については明日に回します.