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;
}
セル入力値の取得はセルタイプ毎に行います。
ページのトップへ戻る