POI のスニペット集
このページは、POI (Apache POI) のスニペットとユーティリティメソッドをまとめる予定のページです。
目次
注意
- コードのライセンスは CC0 (クレジット表示不要、改変可、商用可) です。使いたい形と少し違う場合は、使いやすいようにカスタマイズしてください。
スニペット
Excel の生成・書き込み
String outputPath = "test.xlsx"; // 出力先パス
Workbook book = null;
try {
// ワークブック生成
book = new XSSFWorkbook(); // xlsx (xlsの場合は HSSFWorkbook)
Sheet sheet = book.createSheet(); // シート生成
// セルの値のセット (コード量が多くなってしまうため、ユーティリティメソッドを作って使うなどしたほうがよいです)
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("test");
// 保存
try (FileOutputStream stream = new FileOutputStream(outputPath)) {
book.write(stream);
}
catch (Exception e) {
// エラー処理
}
}
catch (Exception e) {
// エラー処理
}
finally {
try { if (book != null) book.close(); } catch (Exception e) {}
}
Excel の読み込み
String inputPath = "test.xlsx"; // 読み込み元パス
Workbook book = null;
try {
book = WorkbookFactory.create(new File(inputPath));
Sheet sheet = book.getSheetAt(0);
// セルの値の読み込み (コード量が多くなってしまうため、ユーティリティメソッドを作って使うなどしたほうがよいです)
Row row = sheet.getRow(0);
if (row != null) {
Cell cell = row.getCell(0);
String value = "";
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BLANK: // 空
break;
case Cell.CELL_TYPE_BOOLEAN: // true, false
boolean boolValue = cell.getBooleanCellValue();
value = boolValue ? "TRUE" : "FALSE";
break;
case Cell.CELL_TYPE_ERROR: // エラー
break;
case Cell.CELL_TYPE_FORMULA: // 数式 (計算結果を取得する場合はもっと複雑になります)
String formula = cell.getCellFormula();
value = formula;
break;
case Cell.CELL_TYPE_NUMERIC: // 数値 (日付も数値(シリアル))
double numericValue = cell.getNumericCellValue();
value = String.valueOf(numericValue);
break;
case Cell.CELL_TYPE_STRING: // 文字列
value = cell.getStringCellValue();
break;
}
System.out.println(value);
}
}
catch (Exception e) {
// エラー処理
}
finally {
try { if (book != null) book.close(); } catch (Exception e) {}
}
ユーティリティメソッド
セルの取得 (A1形式をもとに取得)
/**
* 対象シートのセルをA1形式で指定して取得します。(セルオブジェクトが存在しない場合はセルを生成して返します)
*
* <pre>{@code
* Cell cell = getCell(sheet, "A1");
* }</pre>
*
* @param sheet 対象シート
* @param a1 A1形式のセル参照文字列
* @return セルオブジェクト
*/
public static Cell getCell(Sheet sheet, String a1) {
CellReference ref = new CellReference(a1);
return getCell(sheet, ref.getRow(), ref.getCol());
}
セルの取得 (行番号、列番号をもとに取得)
/**
* 対象シートのセルを行・列番号を指定して取得します。(セルオブジェクトが存在しない場合はセルを生成して返します)
*
* <pre>{@code
* Cell cell = getCell(sheet, 0, 0);
* }</pre>
*
* @param sheet 対象シート
* @param rowIndex 行番号 (0ベース)
* @param colIndex 列番号 (0ベース)
* @return セルオブジェクト
*/
public static Cell getCell(Sheet sheet, int rowIndex, int colIndex) {
Row row = sheet.getRow(rowIndex);
if (row == null) row = sheet.createRow(rowIndex);
Cell cell = row.getCell(colIndex);
if (cell == null) cell = row.createCell(colIndex);
return cell;
}
セルの値の取得
/**
* セルの値を取得します。(このメソッドで値のオブジェクトを取得した後、instanceof などで型を判別してキャストするか、toString() などで文字列化する想定)
* セルの値が数式の場合は、計算結果を取得します。
*
* <pre>{@code
* getCellValue(cell);
* }</pre>
*
* @param cell セルオブジェクト
* @return セルの値 (Object)
*/
public static Object getCellValue(Cell cell) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BLANK: // 空
return null;
case Cell.CELL_TYPE_BOOLEAN: // true, false
return cell.getBooleanCellValue();
case Cell.CELL_TYPE_ERROR: // エラー
return null;
case Cell.CELL_TYPE_FORMULA: // 数式 (計算結果を返す)
Workbook book = cell.getSheet().getWorkbook();
FormulaEvaluator evaluator = book.getCreationHelper().createFormulaEvaluator();
CellValue v = evaluator.evaluate(cell);
switch (v.getCellType()) {
case Cell.CELL_TYPE_BLANK: // 数式の結果が空
return null;
case Cell.CELL_TYPE_BOOLEAN: // 数式の結果が true, false
return v.getBooleanValue();
case Cell.CELL_TYPE_ERROR: // 数式の結果がエラー
return null;
case Cell.CELL_TYPE_NUMERIC: // 数式の結果が数値 (日付書式が設定されている場合 Date, それ以外は Double)
if (DateUtil.isCellDateFormatted(cell)) return DateUtil.getJavaDate(v.getNumberValue());
return v.getNumberValue();
case Cell.CELL_TYPE_STRING: // 文字列
return v.getStringValue();
default:
return null;
}
case Cell.CELL_TYPE_NUMERIC: // 数値 (日付書式が設定されている場合 Date, それ以外は Double)
if (DateUtil.isCellDateFormatted(cell)) return cell.getDateCellValue();
return cell.getNumericCellValue();
case Cell.CELL_TYPE_STRING: // 文字列
return cell.getStringCellValue();
default:
return null;
}
}
セルの値のセット (書式付き)
/**
* セルに値を書式付きでセットします。
*
* <pre>{@code
* setCellValue(cell, 12345678, "#,###");
* }</pre>
*
* @param cell セルオブジェクト
* @param value 値
* @param format 書式文字列
*/
public static void setCellValue(Cell cell, Object value, String format) {
if (value instanceof Integer) {
cell.setCellValue((Integer) value);
} else if (value instanceof Double) {
cell.setCellValue((Double) value);
} else if (value instanceof Date) {
cell.setCellValue((Date) value);
} else if (value instanceof Calendar) {
cell.setCellValue((Calendar) value);
} else if (value != null) {
cell.setCellValue(value.toString());
}
if (format != null) setCellStyle(cell, format); // 書式のセット用のメソッドを使用します (後述)
}
セルの書式のセット
/**
* セルに書式を設定します。
*
* <pre>{@code
* setCellStyle(cell, "#,###");
* }</pre>
*
* @param cell セルオブジェクト
* @param format 書式
*/
public static void setCellStyle(Cell cell, String format) {
Workbook book = cell.getSheet().getWorkbook();
CellStyle cellStyle = book.createCellStyle();
cellStyle.setDataFormat(book.getCreationHelper().createDataFormat().getFormat(format));
cell.setCellStyle(cellStyle);
}