トッカンソフトウェア

Excel読み込み(Apache POI)

今回はExcelファイル読み込みをやります。環境構築はExcel出力を参照して下さい。


簡単な読み込みサンプル

POI 4 以降
				
package test;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DateUtil;
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.xssf.usermodel.XSSFWorkbook;

public class PoiTest {
	public static void main(String[] args) {

		String filePath = "C:\\work\\hp\\workbook.xlsx";

		try (
				// Excelのワークブックの読み込み
				Workbook book = new XSSFWorkbook(filePath);) {

			// シートの読み込み
			Sheet sheet = book.getSheet("しーと");

			// 値読み込み
			for (int rowIdx = sheet.getFirstRowNum(); rowIdx <= sheet.getLastRowNum(); rowIdx++) {
				Row row = sheet.getRow(rowIdx);

				if (row == null) {
					continue;
				}

				SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd");
				SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

				for (int colIdx = row.getFirstCellNum(); colIdx < row.getLastCellNum(); colIdx++) {
					Cell cell = row.getCell(colIdx);
					String cellString = null;
					if (cell == null) {
						continue;
					}

					// cell.getCellType()はCellTypeというEnumを返すようになった
					switch (cell.getCellType()) {
					case STRING:
						cellString = cell.getStringCellValue();
						break;
					case NUMERIC:
						if (DateUtil.isCellDateFormatted(cell)) {
							Date date = cell.getDateCellValue();
							cellString = sdf1.format(date) + " " + sdf2.format(date);
						} else {
							cellString = Double.toString(cell.getNumericCellValue());
						}
						break;
					case FORMULA:
						cellString = cell.getCellFormula();
						break;
					default:
						break;
					}

					// switch文はEnumの頭の部分を省略するが、if文は付ける必要がある
					if (cell.getCellType() == CellType.STRING) {

					}

					System.out.println(rowIdx + ":" + colIdx + ":" + cellString);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

			
POI 4 より前のバージョン
				

package test;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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.xssf.usermodel.XSSFWorkbook;

public class PoiTest {
	public static void main(String[] args) {

		String filePath = "C:\\work\\hp\\workbook.xlsx";

		try (
			// Excelのワークブックの読み込み
			Workbook book = new XSSFWorkbook(filePath);
			) {

			// シートの読み込み
			Sheet sheet = book.getSheet("しーと");

			// 値読み込み
			for (int rowIdx = sheet.getFirstRowNum(); rowIdx <= sheet.getLastRowNum(); rowIdx++) {
				Row row = sheet.getRow(rowIdx);

				if (row == null) {
					continue;
				}

				SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd");
				SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

				for (int colIdx = row.getFirstCellNum(); colIdx < row.getLastCellNum(); colIdx++) {
					Cell cell = row.getCell(colIdx);
					String cellString = null;
					if (cell == null) {
						continue;
					}
					switch (cell.getCellType()) {
					case Cell.CELL_TYPE_STRING:
						cellString = cell.getStringCellValue();
						break;
					case Cell.CELL_TYPE_NUMERIC:
						if (DateUtil.isCellDateFormatted(cell)) {
							Date date = cell.getDateCellValue();
							cellString = sdf1.format(date) + " " + sdf2.format(date);
						} else {
							cellString = Double.toString(cell.getNumericCellValue());
						}
						break;
					case Cell.CELL_TYPE_FORMULA:
						cellString = cell.getCellFormula();
						break;
					}

					System.out.println(rowIdx + ":" + colIdx + ":" + cellString);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


			
Excelを読み込み、出力するだけの簡単なサンプルです。

ワークブック読み込み

				
FileInputStream fs = new FileInputStream(filePath);
// Excelのワークブックの読み込み
Workbook book = new XSSFWorkbook(fs);


			
filePathにファイルのパスを指定します。
ワークブックを閉じる場合、closeメソッド使用しますが、今回はtry-with-resources文でcloseメソッドを省略しています。

シート読み込み

				
// シートの位置を指定して読み込み
Sheet sheet = book.getSheetAt(0);

// シート名を指定して読み込み
Sheet sheet = book.getSheet("しーと");


			

行読み込み

				
// 行読み込み
for (int rowIdx = sheet.getFirstRowNum(); rowIdx <= sheet.getLastRowNum(); rowIdx++) {
	Row row = sheet.getRow(rowIdx);

	if (row == null) {
		continue;
	}
}

			
getFirstRowNumメソッドでデータがある最初の行を取得し、getLastCellNumでデータのある最後の行を取得して、その間をループしています。
途中でデータのない行はNULLになるのでNULLチェックを行って下さい。

セル読み込み

				
// セル読み込み
for (int colIdx = row.getFirstCellNum(); colIdx < row.getLastCellNum(); colIdx++) {
	Cell cell = row.getCell(colIdx);

	if (cell == null) {
		continue;
	}
}

			
getFirstCellNumメソッドでデータのある最初のセルを取得し、getLastCellNumでデータのある最後のセルを取得して、その間をループしています。
途中でデータのないセルはNULLになるので、NULLチェックを行って下さい。

セル入力値の読み込み

POI 4 以降
				
String cellString = null;
if (cell == null) {
	continue;
}

// cell.getCellType()はCellTypeというEnumを返すようになった
switch (cell.getCellType()) {
case STRING:
	cellString = cell.getStringCellValue();
	break;
case NUMERIC:
	if (DateUtil.isCellDateFormatted(cell)) {
		Date date = cell.getDateCellValue();
		cellString = sdf1.format(date) + " " + sdf2.format(date);
	} else {
		cellString = Double.toString(cell.getNumericCellValue());
	}
	break;
case FORMULA:
	cellString = cell.getCellFormula();
	break;
default:
	break;
}

// switch文はEnumの頭の部分を省略するが、if文は付ける必要がある
if (cell.getCellType() == CellType.STRING) {

}

			
POI 4 より前のバージョン
				
// セル入力値の読み込み
String cellString = null;

switch (cell.getCellType()) {

case Cell.CELL_TYPE_STRING:

	// 文字列
	cellString = cell.getStringCellValue();
	break;

case Cell.CELL_TYPE_NUMERIC:
	if (DateUtil.isCellDateFormatted(cell)) {

		// 日付
		Date date = cell.getDateCellValue();
		cellString = sdf1.format(date) + " " + sdf2.format(date);
	} else {

		// 数値
		cellString = Double.toString(cell.getNumericCellValue());
	}
	break;

case Cell.CELL_TYPE_FORMULA:

	// 計算式
	cellString = cell.getCellFormula();
	break;
}


			
セル入力値の取得はセルタイプ毎に行います。



ページのトップへ戻る