S-JIS[2014-03-27/2017-02-18] 変更履歴

Apache POI

POI(ポイ)は、JavaExcelファイルを操作する為のライブラリー。


ダウンロード

POIのライブラリー(jarファイル)を使うには、Gradleを使っていれば、build.gradleの依存関係にPOIを指定すればよい。

build.gradle:

apply plugin: 'java'
apply plugin: 'eclipse'

repositories {
	mavenCentral()
}

dependencies {
	compile group: 'org.apache.poi', name : 'poi', version: '3.13'
	compile(group: 'org.apache.poi', name : 'poi-ooxml', version: '3.13') {
		exclude group: 'stax', module: 'stax-api'
	}
	testCompile 'junit:junit:4.11'
}

poiだけだと、Excel2007より前の形式(拡張子xls)しか扱えない。
poi-ooxmlを含めると、XML形式(拡張子xlsx)のExcelファイルも扱える。


実行環境のjavaのバージョンによっては、xlsxファイルを扱うときに例外が発生することがある。[2015-11-11]

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.poi.openxml4j.opc.internal.marshallers.ZipPackagePropertiesMarshaller
	at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:162)
	at org.apache.poi.openxml4j.opc.OPCPackage.(OPCPackage.java:142)
	at org.apache.poi.openxml4j.opc.Package.(Package.java:37)
	at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:88)
	at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:273)
	at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:209)
	at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:168)
	Suppressed: javax.xml.stream.FactoryConfigurationError: Provider com.bea.xml.stream.EventFactory not found
		at javax.xml.stream.FactoryFinder.newInstance(FactoryFinder.java:72)
		at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:178)
		at javax.xml.stream.FactoryFinder.find(FactoryFinder.java:92)
		at javax.xml.stream.XMLEventFactory.newInstance(XMLEventFactory.java:30)
		at org.apache.poi.openxml4j.opc.internal.marshallers.PackagePropertiesMarshaller.(PackagePropertiesMarshaller.java:41)
		at org.apache.poi.openxml4j.opc.OPCPackage.init(OPCPackage.java:162)
		at org.apache.poi.openxml4j.opc.OPCPackage.(OPCPackage.java:142)
		at org.apache.poi.openxml4j.opc.Package.(Package.java:37)
		at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:88)
		at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:273)
		at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:209)
		at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:168)

この事自体はFAQに載っている。

なんか、stax-apiが悪さをしているらしい。これはJava5以前で必要なライブラリーであり、Java6以降では不要なので、依存関係から除いていいらしい。
という訳で、build.gradleのdependenciesからstax-apiをexcludeする。

dependencies {
	compile group: 'org.apache.poi', name : 'poi', version: '3.13'
	compile(group: 'org.apache.poi', name : 'poi-ooxml', version: '3.13') {
		exclude group: 'stax', module: 'stax-api'
	}
	testCompile 'junit:junit:4.11'
}

Excelファイルを読み込むサンプル

import java.io.File;
import java.io.IOException;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class PoiExample {

	public static void main(String... args) throws IOException, InvalidFormatException {
		File file = new File(args[0]);
		Workbook workbook = WorkbookFactory.create(file);

		for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
			Sheet sheet = workbook.getSheetAt(i);
			System.out.println("sheetName=" + sheet.getSheetName());

			Row row = sheet.getRow(0);
			if (row != null) {
				Cell cell = row.getCell(0);
				if (cell != null) {
					switch (cell.getCellType()) {
					case Cell.CELL_TYPE_NUMERIC:
						System.out.println(cell.getNumericCellValue());
						break;
					case Cell.CELL_TYPE_STRING:
						System.out.println(cell.getStringCellValue());
						break;
					default:
						System.out.println("cellType=" + cell.getCellType());
						break;
					}
				}
			}
		}
	}
}

ファイルからWorkbookオブジェクトを生成し、そこからWorkSheetオブジェクトを取得する。
getRow()でロー(行)を取得し、そこからgetCell()でセルを取得する。getRow()やgetCell()の引数は0オリジンである。
データの無い行やセルではnullが返ってくるので、nullチェックは必須。



Excel操作ライブラリーへ戻る / Java目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま