HSSFその1

HSSFはJavaのプログラムからExcelファイルにアクセスするための機能です。ドキュメントによると、Excel'97〜Excel2002のExcelファイルを扱うことができるようです。これより新しいExcelのファイルについては特に記述がありません。Microsoftはファイル形式を頻繁に変えるので、新しいフォーマットについては動作確認したほうが良いでしょう。私は新しいExcelを持っていませんので判りません。

HSSFの使い方は難しくはありません。もともとExcelはスプレッドシートなので、本来的にはプログラムからは扱いやすいはずです。Excelのファイルである*.xlsファイルはブックと呼ばれ、その中に複数のシートが含まれます。各シートは複数の行からなり、各行は複数のセルからなっています。HSSFではこれらがそれぞれHSSFWorkbook、HSSFSheet、HSSFRow、HSSFCellというオブジェクトになっています。

ワークブック

ExcelファイルからHSSFWorkbookのオブジェクトを作る典型的なコードは次のようになります。

	String BOOK_NAME = "サンプルファイル.xls";
	FileInputStream fileIn = new FileInputStream(BOOK_NAME);
	HSSFWorkbook wb = new HSSFWorkbook(fileIn);
	fileIn.close();
つまり.xlsファイルからFileInputStreamを作成し、これをソースにHSSFWorkbookオブジェクトを作ります。引数のFileInputStreamを指定しなければ、全く新しいHSSFWorkbookオブジェクトになります。ファイルを新規作成したい場合はこちらを使います。

HSSFWorkbookオブジェクトをExcelのファイルとして保存するには、

	FileOutputStream fileOut = new FileOutputStream(BOOK_NAME);
	wb.write(fileOut);
	fileOut.close();
のようにFileOutputStreamオブジェクトを作成した上でHSSFWorkbook#write()メソッドを呼び出すだけです。

ワークシート

HSSFWorkbookオブジェクトから、この中にあるシートHSSFSheetオブジェクトを取得するには、シート名を指定する方法とシートの先頭からの順序を指定する方法があります。シート名を指定する場合はそのまま
	String SHEET_NAME = "シート名";
	HSSFSheet sheet = wb.getSheet(SHEET_NAME);
のようにします。またシートの順序を指定するには、
	HSSFSheet sheet = wb.getSheetAt(3);
のようにします。ここで引数はシートの順序で、先頭が0になります。

新たにシートを作成することもできます。

	HSSFSheet newsheet = wb.createSheet();
でOKです。作成したシートに名前を付けたり、既存シートの名前を変えるにはHSSFWorkbookのメソッドを使用します。シートの順序を指定して、
	wb.setSheetName(3, "新しい名前", HSSFWorkbook.ENCODING_UTF_16);
の様にします。シート名にASCII文字以外、つまり日本語を使用する場合は3番目の引数を上記の様にENCODING_UTF_16を指定しなければなりません。この引数を指定しないとシート名が文字化けを起こしてしまいます。

行、セル

さて、シート内のセルにアクセスするには、まず行を決めて、行の中からセルを取ってくるという手順になります。行もセルもインデクスを指定します。ただしExcelのA4とかC3とかではなく、行も行内のセルも、0から始まる数字で指定します。行はintですが、行内のセルはshortで指定します。
	HSSFRow row = sheet.getRow(11);
	HSSFCell cell = row.getCell((short) 4);
存在しないセル(値の入っていないセル)を取得しようとするとnullが返されます。

行を追加したり、セルを追加することもできます(値は入っていないセルに値を入れるにはセルを作る必要があります)。

	HSSFRow newrow = sheet.createRow(12);
	HSSFCell newcell = newrow.createCell((short) 0);
指定したインデクスの位置に既に行やセルが存在するばあい、そのオブジェクトが返されます。

セルに値を入れる時はデータの型を意識する必要があります。boolean、Calendar、Date、String、doubleの何れかになります(CalendarとDateは日時という同じ情報を入れる別の手段ということになります)。文字列で日本語を入れる場合は例によってエンコーディングを指定する必要があります。

	cell.setEncoding(HSSFCell.ENCODING_UTF_16);
	cell.setCellValue("日本語文字");

セルから値を取得する場合にもデータの型を意識する必要があります。型毎にHSSFCell#getStringCellValue()、getDateCellValue()、getNumericCellValue()、getBooleanCellValue()という異なるメソッドが用意されています。どのメソッドを使えばよいかはgetCellType()というメソッドで型を調べます。


POI  ソフトウェア研究室  PoisonSoft