はじめに
POIはJavaからMicrosoftのドキュメントを操作するためのAPIで、2007年6月からApache Software Foundationのトップレベルプロジェクトに格上げされました。オープンソースとして提供されているので誰でも無償で利用することができます。
なぜ初期のリリース後、7年以上も経過し、多くの情報が存在するPOIを今回あらためて取り上げることにしたかと言うと、2009年9月リリースのVersion 3.5でOffice Open XML形式(以降、OOXML形式)への対応という大きな変更が加わったからです。
分かりやすくいうと2007形式のExcel(xlsx)やWord(docx)のファイルも扱えるようになったということです。
本連載では、POIの中からExcelを操作するコンポーネント(HSSF/XSSF)に対象を絞り、下記の予定で紹介していきます。
- 準備編:POIの概要と環境構築
- 基本編:Usermodel APIを利用してExcelファイルを操作
- 応用編:
- 帳票作りに挑戦(今回)
- グラフ作りに挑戦
- 番外編:OSSのフレームワークを利用してExcelレポートを簡単作成
また、本連載はOOXML形式のExcelファイルを基本として進めますが、Excel 2003以前のMicrosoft OLE2複合ドキュメント形式(以降OLE2形式)への対応方法についても随時紹介していきます。
対象読者
- JavaでExcelファイルを操作したい方
納品書の作成
前回までに、POIが提供するAPIについていくつか紹介してきました。今回は「Excelファイルで帳票を作成する」というテーマを通して、POIの活用方法をより詳細に紹介していこうと思います。作成する帳票は「納品書」と「月間売上一覧」です。納品書とは売り手から買い手に商品を納める時に、納品の明細を記入して渡す伝票です。今回作成する納品書は下記になります。
- 入力ファイル名: inputDeliveryNote.xlsx
- 出力ファイル名: outputDeliveryNote.xlsx
納品書には「納入先の宛先」や「納入する商品」のように作成するたびに値が変更される箇所と、「納品書の構成」や「納入者の宛先」のように変更のない箇所があります。変更がない箇所は、POIを通して直接作るのではなく、あらかじめテンプレートシートに作成しておきPOIで読み込むことにします。用意したテンプレートシートは以下の図です。
納入者の宛先のように、納品書の作成ごとに値が変動しない箇所はテンプレートシートに直接書き込んでいます。また、今回作成する納品書では1つの納品書に記載できる明細の数を「最大で11個まで」という固定形式にしています。
一方、伝票番号のように納品書の作成ごとに値が変動する箇所には「$変数名」の形式でセルに値を設定しています。さらに、納入する商品情報のように作成ごとに値と表示する数が変動する箇所には「$変数名[]」の形式でセルに値をあらかじめ設定しておきます。
これらの情報をもとにして、POIを通して実際の値に置き換えるセルの位置や置き換え方法を判別できるようにしておきます。「合計金額(税込)」などの金額を設定する箇所はセルに計算式を設定するのではなく、プログラムで計算して3桁ごとにカンマを付加し、設定済みの値を該当セルに設定する仕様とします。
もう1つ、今回のサンプルでのテンプレートシートの利用方法として説明を加えておきます。納入先が1つの場合には、テンプレートシートにPOIを通して置き換えの値を直接設定していきます。納入先が複数の場合は、複数の納入先への納品書を一度に出力可能にするために、テンプレートシートを納入先分シートコピーして納品書を作成することにします。