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);
    }