日々常々

ふつうのプログラマがあたりまえにしたいこと。

WorkbookFactoryを使う

POIでExcelワークブックを使用する場合、使用するファイルの形式に従ったWorkbookの具象クラスでインスタンス生成する必要があります。例を挙げると、Excel97-2007ではHSSFWorkbookになります。

InputStream stream = new FileInputStream("ファイルへのパス");
HSSFWorkbook workbook = new HSSFWorkbook(stream);

HSSFはPOIでのExcel97-2007ファイル形式を指します。2008以降ではXSSFになります。Excel2008形式のファイルでHSSFWorkbookのインスタンスを作ろうとしても例外が発生しますので、この場合はXSSFWorkbookのインスタンスを生成しなくてはいけません。でもファイル形式をいちいち判別したり、例外をキャッチしてXSSFWorkbookで開き直すなどといった実装は現実的ではありません。
これを吸収してくれるのが、
WorkbookFactoryのcreateメソッドです。これによりHSSFかXSSFかに関わらずWorkbookインスタンスを生成する事が出来ます。当然のことながら、HSSFでもXSSFでもないファイルでインスタンスを生成しようとしても出来ません。

Workbook workbook = WorkbookFactory.create(stream);

WorkbookFactoryを使うことで、HSSFWorkbookクラスではなく、Workbookインタフェースで扱う事になります。これによりHSSFとXSSFの違いをPOIが吸収してくれることになります。
勿論、弊害もあります。例えばHSSFのみで提供されているメソッドはキャストしなければ使えませんし、Workbookから生成されるSheetやCell、CellStyle等もすべてHSSFのクラスではなく、インタフェースで扱う事になります。
ネット上に公開されているPOI使用例のいくつかは、HSSFのクラスを使用し、HSSFにしか存在しないメソッドが使用されている事もあります。HSSFしかない頃なので仕方ありません。その際は適宜読み替えて、同等の別メソッドを使用するとかするといいと思います。

      • -

なお、WorkbookFactoryおよびXSSFWorkbook等のクラスは poi-ooxml-version-yyyymmdd.jar にはいっています。poi-version-yyyymmdd.jar には入っていませんので注意してください。
poi-ooxmlを使用する場合は、poi-ooxml-schemasが必要になったりしますが、この辺の依存関係は「不安なら全部入れてしまえば良いじゃない」で片付ける事にしています。たいていの場合は別に悪さもしませんし、必要なものが欠けてNoClassDefFoundErrorなんてものが出ると原因究明に時間がかかりますので。各々のjarに何が入っているか気になるならば、以下を見てください。
Apache POI - Component Overview