月間売上一覧の作成
次に同じ「SimpleReportCreatorクラス」を利用して月間売上一覧を作成してみます。この帳票の特徴は明細行数をあらかじめ設定していないことです。実際の明細データ数に応じて、明細行数が追加されていきます。テンプレートシートは以下の図です。
- 入力ファイル名: inputSalesList.xlsx
- 出力ファイル名: outputSalesList.xlsx
基本的な処理の流れは「納品書」の作成と変わりません。テンプレートシートを読み込んだ後、ワークシート上の、最上位の行からセルを順番に確認していき、「$変数名」のセルでは実際の値に置き換えを実施します。
「$変数名[]」の値をあらかじめ設定していたセルではSimpleReportCreator -(13)、(14)、(15)の説明」の箇所で述べましたが、明細の数などがあらかじめ不明な場合の対応として、繰り返しの開始行だけを用意し、実際の明細データ数に合わせて行とセルを新規に追加で作成していきます。新規に作成した行は、繰り返し処理の開始行に設定されている行の高さを設定します。新規に作成したセルは繰り返し処理の開始行のセルから書式設定などをコピーした後に、置き換えの値を各セルに設定していきます。それでは、繰り返し処理の開始行のセルの書式設定などを新規に作成したセルにコピーしている処理を行っているメソッドをソースから確認しておきましょう。
// (17)セルの値を別セルにコピーする public static void copyCell(Cell fromCell, Cell toCell) { if (fromCell != null) { int cellType = fromCell.getCellType(); switch (cellType) { case Cell.CELL_TYPE_BLANK: break; case Cell.CELL_TYPE_FORMULA: String cellFormula = fromCell.getCellFormula(); toCell.setCellFormula(cellFormula); break; case Cell.CELL_TYPE_BOOLEAN: toCell.setCellValue(fromCell.getBooleanCellValue()); break; case Cell.CELL_TYPE_ERROR: toCell.setCellErrorValue(fromCell.getErrorCellValue()); break; case Cell.CELL_TYPE_NUMERIC: toCell.setCellValue(fromCell.getNumericCellValue()); break; case Cell.CELL_TYPE_STRING: toCell.setCellValue(fromCell.getRichStringCellValue()); break; default: } if (fromCell.getCellStyle() != null) { toCell.setCellStyle(fromCell.getCellStyle()); } if (fromCell.getCellComment() != null) { toCell.setCellComment(fromCell.getCellComment()); } } }
- SimpleReportCreator -(17)
セルのタイプ(文字列、真偽値など)に合わせてコピー元からコピー先に値を設定しています。書式設定(セルスタイル)やコメントも設定されている場合には合わせてコピーします。
テストデータを利用した実行結果を下記に示します。なお、このサンプルの売上一覧では同じ客先への同じ日の売上であっても商品NOが異なれば、別の売上NOで管理しています。
実行結果から分かるように、売上の数だけ行とセルが新規に作成され、値が設定されています。
まとめ
今回は、簡単ではありますが、Excelファイルで帳票を作成するというテーマに沿ってPOIの活用方法を紹介しました。これまでに紹介した画像を埋め込む処理、計算式を設定する処理なども活かした方法も考えてみると、POIを利用したExcelファイルの操作がより興味深いものになるのではないでしょうか。次回はピボットテーブルとピボットグラフをPOIで生成したデーダと連携させる方法を紹介する予定です。