はじめに
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ファイルを操作したい方
Usermodel API
前回はPOIを利用するための環境構築を行い、サンプルプログラムを実行して、拡張子が「xlsx」であるOffice Open XML形式(以降OOXML形式)のExcelファイルを生成してみました。ソースの内容について説明はしませんでしたが、POI3.5から導入された「org.apache.poi.xssf」パッケージ(以降XSSFパッケージ)のAPIが利用されていました。
POIのAPIは、用途によって「Eventmodel API」と「Usermodel API」が用意されています。Excelファイルを読込むだけであり、メモリ消費量を抑える必要がある環境ではEventmodel APIが適しています。一方、読込に加えて、Excelファイルを作成したり加工したりする場合にはUsermodel APIを利用することになります。メモリの消費量は多くなりますが、使い勝手はシンプルで容易です。両方のAPIがXSSFとHSSFのコンポーネントごとに用意されていますが、この連載では「Usermodel API」のみ利用します。
Excel構造に対応したクラス
Usermodel APIはExcelを構成するパーツごとにクラスやインターフェースを用意しています。主な構成パーツに対応するXSSFパッケージのクラスは下記になります。
| 構成パーツ | クラス名 |
| ワークブック | XSSFWorkbook |
| ワークシート | XSSFSheet |
| 行 | XSSFRow |
| セル | XSSFCell |
| 書式設定 | XSSFCellStyle |
| フォント | XSSFFont |
XSSFコンポーネントを利用してのOOXML形式のExcelファイルの基本操作は、HSSFコンポーネントを利用してMicrosoft OLE2複合ドキュメント形式(以降OLE2形式)のExcelファイルを操作するのとほとんど変更がないように配慮がはかられています。利用するクラス名は上記の一覧にあるようにHSSFではなくXSSFから始まるクラス名を利用します。
また、HSSFを利用されたことがない方でもXSSFでのExcelファイル操作は容易に理解できるので心配はいりません。では、簡単なサンプルプログラムでExcelファイルの基本操作を確認しましょう。
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class XSSFSample {
public static void main(String[] args) throws Exception {
//(1)Excelファイルを表すワークブックオブジェクトを生成
XSSFWorkbook wb = new XSSFWorkbook();
//(2)セルスタイルの生成
XSSFCellStyle style = wb.createCellStyle();
//(3)セルスタイルへ罫線の設定
style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
style.setLeftBorderColor(IndexedColors.GREEN.getIndex());
style.setBorderRight(XSSFCellStyle.BORDER_THIN);
style.setRightBorderColor(IndexedColors.BLUE.getIndex());
style.setBorderTop(XSSFCellStyle.BORDER_MEDIUM_DASHED);
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
//(4)フォントを生成し、セルスタイルへ設定
XSSFFont font = wb.createFont();
font.setFontHeightInPoints((short) 8);
font.setFontName("Courier New");
font.setColor(IndexedColors.RED.getIndex());
style.setFont(font);
//(5)ワークシートオブジェクトを生成
XSSFSheet sheet = wb.createSheet("XSSFSheet1");
//(6)行の作成
XSSFRow row = sheet.createRow(1);
//(7)セルを生成し、値とセルスタイルを設定
XSSFCell cell = row.createCell(1);
cell.setCellValue("XSSF");
cell.setCellStyle(style);
//(8)ワークブックオブジェクトをファイル出力
FileOutputStream fileOut = new FileOutputStream("XSSFSample.xlsx");
wb.write(fileOut);
fileOut.close();
}
}
- ソース1 -(1)
- ソース1 -(2)
- ソース1 -(3)
- ソース1 -(4)
- ソース1 -(5)
- ソース1 -(6)
- ソース1 -(7)
- ソース1 -(8)
OOXML形式のExcelファイルを表すXSSFワークブックオブジェクトを生成しています。引数なしのXSSFWorkbookのコンストラクタを呼ぶだけです。
ワークブックオブジェクトからセルの書式情報を表すセルスタイルオブジェクトを生成しています。このオブジェクトの持つメソッドを利用して(3)では「罫線」、(4)では「フォント」情報をセルスタイルオブジェクトに設定しています。
セルスタイルオブジェクトのメソッドを利用して、「罫線」の種類と色を上下左右の配置ごとに設定しています。
ワークブックオブジェクトからフォントを表すフォントオブジェクトを生成しています。ここではフォントサイズ、フォント名と色を設定後、書式情報を表すセルスタイルオブジェクトへフォント情報を設定しています。
ワークブックオブジェクトから「XSSFSheet1」というシート名のワークシートオブジェクトを生成しています。
ワークシートオブジェクトから行を生成しています。引数に渡す番号は「ワークシートに表示されている行番号 -1」の値です。サンプルでは1を渡しているので、2行目を生成したことになります。
行オブジェクトからセルオブジェクトを生成しています。引数に渡す番号は「ワークシートに表示されている列番号 -1」の値です。サンプルでは1を渡しているので、2列目(B列)にセルを生成したことになります。
「XSSFSample.xlsx」というファイル名と拡張子でワークブックオブジェクトをファイル出力しています。
基本的な操作を紹介しただけのサンプルプログラムですが、XSSFのUsermodel APIが非常に直観的で容易であることが確認できたと思います。
なお、ワークブックオブジェクトから生成したセルスタイルやフォントオブジェクトはワークブック内の複数のセルで利用できます。
ソース1をコンパイル後に実行するとカレントディレクトリに「XSSFSample.xlsx」が出力されます。

