はじめに
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の概要
POIはPoor Obfuscation Implementation(不十分で曖昧な実装)を表わしており、旧来(2003以前)のOLE2形式は不十分なものだという皮肉から名付けられています。
このOLE2形式は、Office独自のファイルフォーマットのため下記のような問題を持っていました。
- 専用アプリケーションがないと操作できない
- バージョンアップによって互換性が失われる可能性がある
- 検索性が落ちる
これだけ日々の業務で利用・蓄積されたデータが特定の会社の独自フォーマットに基づいているというのは、確かに恐ろしい話です。
このような背景から、オープンな規格へというニーズに対応したのがOOXML形式への移行です。
OOXML形式はECMA(European Computer Manufacturer's Association:欧州電子計算機工業会)を経由してISO/IEC(国際電気標準会議)で標準化されたオープンな規格で、OpenOfficeも対応しています。
このように利用者にはメリット(その多くは目に見えないものですが)が多いファイルフォーマットの変更ですが、POIやその他のOfficeを扱うライブラリはすぐには対応できず、OOXML形式を扱えない状態が続いていました。
そんな中、ついに2009年9月にリリースされたPOI 3.5からOOXML形式のファイルもサポート対象になりました。つまりPOIを利用して、拡張子が「xlsx」「docx」といった2007形式のファイルの読み書きが可能になったのです。
このことは、単なる新たなファイルフォーマットへの対応というだけでなく、扱えるデータ件数の増加やピボット機能の充実など、Excel 2007の機能を利用して、より多くのシーンでPOIが利用できるようになったことを意味します。
JavaでExcelファイルを操作するAPIとしてはPOIの他に「Java Excel API」が有名ですが、執筆時点(2009年12月)では、Java Excel APIはOOXML形式のファイルをサポートしていません。
また、POIと言うとExcelのイメージが強いのですが、Excelだけではなく、Word、PowerPoint、Outlook、Visio、PublisherへのJava用APIも提供しています。ただし、Excelへのサポートと比較するとまだまだ十分ではない状況です。下記にPOIのコンポーネント一覧を記載します。
コンポーネント | 対応アプリケーション |
POIFS | OLE2 Filesystem |
HPSF | OLE2 Property Sets |
HSSF / XSSF | Excel(拡張子XLS/XLSX) |
HSLF / XSLF | PowerPoint(拡張子PPT/PPTS) |
HWPF / XWPF | Word(拡張子DOC/DOCX) |
HDGF | Visio(拡張子VSD) |
HPBF | Publisher(拡張子PUB) |
HSMF | Outlook(拡張子MSG) |
OpenXML4J | OOXML |
本連載ではExcelのみを対象としますので下記コンポーネントを利用します。
- XSSF:拡張子xlsxのExcelファイルの生成、加工、読み書きに必要です。
- HSSF:Excel 97以降の拡張子xlsのExcelファイルの生成、加工、読み書きに必要です。
- POIFS: OLE2形式(xls、docなど)のファイル生成と読込みに必要です。
- OpenXML4J:ECMA-376 で定義されている、Zipファイル形式を採用しているOpen Packaging Conventions用のピュアJava実装で、OOXML形式(xlsx、docxなど)のファイルを利用する場合に必要です。
また、version3.5からAPIへの大きな変更点として下記パッケージが導入されています。
- org.apache.poi.xssf
- org.apache.poi.ss
OOXML形式のExcelファイルを操作するために必要なAPIを提供
OOXMLとOLE2形式の両方をサポート可能にする共通インターフェイスAPIを提供