【実践】RailsでExcelレポート出力(その2)


前回は作成したExcelがダウンロードできるところまで実装しました。今回はそのExcelの内容を動的に変更して出力します。

Viewの編集

とりあえず、ダウンロードしたExcelを見てみましょう。(ダウンロード ※拡張子はxmlに変更してください

dowload-xls

各値はこのExcelを作ったとき入力した固定値のままです。というわけで、これらの値を動的な値にしていきましょう。

行(日付)を動的に

まずは、日付を動的に出力することにしましょう。 app/views/report/output.xls.erb を開きます。そして以下のような箇所を探し出しましょう。

日付が出力され、その後に各金額(1000, 2000, 3000...)が出力されているブロックがあるはずです。これが2/1から2/28まで繰り返されています。まずはこれを以下のように変更してみましょう。

まずは動くかどうかの確認なので、erbの中にハードコーディングしていますが、日付をループさせて行を出力するようにしました。また、金額も空に変更しました。この状態でレポートを出力してExcelで開くと、金額が全てゼロの表が開くはずです。

列(商品)を動的に

一旦、列(商品)を動的に出力する作業へ移りましょう。Excel(xml)とはいえ結局のところは erb で出力してるだけです。何も恐れることはありません。 output.xls.erb の以下のようなコードを探し出します。

今、固定値で出力されている商品名をrubyコードに置き換えます。とりあえず、全商品名を横にズラッと並べてみましょう。以下のように変更します。

ヘッダー行だけでなく、金額行も変更するのを忘れずに。変更したら実際に出力してExcelで開いてみましょう。マメに確認しておくのがポイントです。

では試しに、商品を追加してレポートを出力してみましょうか。http://localhost:3000/products にアクセスし、何か商品を追加してみましょう。追加が終わったら http://localhost:3000/report/ に戻り、レポートを出力してExcelで開いてみます。ちゃんと列は増えているでしょうか??

load_error

な、なんと。 エラーが表示されて開くことができません・・・。 しかも筆者の環境では、記載されている場所にログファイルは作成されていませんでした! あなおそろしやマイクロソフトめ。

色々試行錯誤のすえ、原因を突き止めることができました。原因の箇所は以下にあります。

ss:ExpandedColumnCount="10" と  ss:ExpandedRowCount="35" という属性が原因です。これは使用している最終セルを示すための属性なのですが、列を動的に追加したことでこの属性値と矛盾が生じたのですね。この属性はわざわざ指定しなくても問題ないので、いっそのこと削除してしましましょう。2つの属性を削除してレポートを出力し、Excelで開くと・・・

output-xls

先程追加した商品列が出力されています。上手く行きました。

ちゃんと実装する

正しくレポートを出力する道筋は見えたので、ちゃんと実装しておきましょう。まずは、この月間売上専用のモデルを作りましょう。 app/models/report.rb を作成します。

(sales_amount_onメソッドで集計SQLを発行するので、『日付 × 商品数』回だけSQLを発行してしまうことになります。今回はサンプルなのでこのままにしておきますが、必要に応じ書き換えてください。)

続いて、コントローラです。

そして最後にビューを編集します。ポイントだけ抜粋しています。

@reportから必要なデータを取得しつつ出力しています。

変更を保存したら、レポートを出力し、Excelで開いて確認します。

output

ばっちり!! 何だか一回り成長した気分。口笛でも吹くか。

 

完成したソースは、GitHubに公開しておきます。参考になれば幸いです。

それでは、ナイスなRails&Excelライフを!

関連する記事