1.概要

Microsoft Excelファイルに関しては、さまざまなセルから値を読み取るのは少し難しい場合があります。 Excel ファイルは、行とセルに編成されたスプレッドシートであり、文字列、数値、日付、ブール値、さらには数式の値を含めることができます。 Apache POI は、さまざまなExcelファイルと値型を処理するためのツールの完全なスイートを提供するライブラリです

このチュートリアルでは、Excelファイルの処理方法、行とセルの反復処理、および各セル値タイプの読み取りに適切な方法を使用する方法の学習に焦点を当てます。

2. Mavenの依存関係

ApachePOI依存関係をpom.xmlに追加することから始めましょう。

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.0</version>
</dependency>

poi-ooxml の最新バージョンは、MavenCentralにあります。

3. ApachePOIの概要

階層は、Excelファイル全体を表すブックから始まります。 各ファイルには、行とセルのコレクションである1つ以上のワークシートを含めることができます。 Excelファイルのバージョンに応じてHSSFは古いExcelファイル(.xls)を表すクラスのプレフィックスですが、XSSFは最新バージョン(.xlsx)に使用されます。したがって、次のようになります。

  • XSSFWorkbookおよびHSSFWorkbookクラスは、Excelワークブックを表します
  • SheetインターフェイスはExcelワークシートを表します
  • インターフェイスは行を表します
  • セルインターフェイスはセルを表します

3.1. Excelファイルの処理

まず、読み取りたいファイルを開き、FileInputStreamに変換してさらに処理します。 FileInputStreamコンストラクターはjava.io.FileNotFoundExceptionをスローするため、try-catchブロックをラップして、最後にストリームを閉じる必要があります。

public static void readExcel(String filePath) {
    File file = new File(filePath);
    try {
        FileInputStream inputStream = new FileInputStream(file);
        ...
        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3.2. Excelファイルを反復処理する

InputStream を正常に開いたら、 XSSFWorkbook を作成し、各シートの行とセルを繰り返し処理します。 シートの正確な数または特定のシートの名前がわかっている場合は、XSSFWorkbookのgetSheetAt(int index)および getSheet(String sheetName)メソッドを使用できます。 、それぞれ。

あらゆる種類のExcelファイルを読みたいので、 3つのネストされたforループ、1つはシート用、1つは各シートの行用、最後に1つは各シートのセル用に、すべてのシートを繰り返し処理します。シート

このチュートリアルでは、データをコンソールにのみ出力します。

FileInputStream inputStream = new FileInputStream(file);
Workbook baeuldungWorkBook = new XSSFWorkbook(inputStream);
for (Sheet sheet : baeuldungWorkBook) {
...
}

次に、シートの行を反復処理するために、シートオブジェクトから取得した最初の行と最後の行のインデックスを見つける必要があります。

int firstRow = sheet.getFirstRowNum();
int lastRow = sheet.getLastRowNum();
for (int index = firstRow + 1; index <= lastRow; index++) {
    Row row = sheet.getRow(index);
}

最後に、セルについても同じことを行います。 また、各セルにアクセスするときに、オプションで MissingCellPolicy を渡すことができます。これは、基本的に、セル値が空またはnullの場合に何を返すかをPOIに指示します。 MissingCellPolicy 列挙型には、次の3つの列挙値が含まれています。

  • RETURN_NULL_AND_BLANK
  • RETURN_BLANK_AS_NULL
  • CREATE_NULL_AS_BLANK ;

セル反復のコードは次のとおりです。

for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) {
    Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
    ...
}

3.3. Excelでセル値を読み取る

前述のように、Microsoft Excelのセルにはさまざまな値の種類が含まれている可能性があるため、あるセルの値の種類を区別し、適切な方法を使用して値を抽出できることが重要です。 以下に、すべての値タイプのリストを示します。

  • なし
  • NUMERIC
  • ストリング
  • 方式
  • 空欄
  • ブール
  • エラー

Numeric、String、Boolean、Formula の4つの主要なセル値タイプに焦点を当てます。最後のセル値には、最初の3つのタイプの計算値が含まれます。

基本的に各値の型をチェックし、それに基づいて適切なメソッドを使用して値にアクセスするヘルパーメソッドを作成しましょう。 セル値を文字列として扱い、対応するメソッドで取得することもできます。

注目に値する2つの重要なことがあります。 まず、Date値はNumeric値として格納されます。また、セルの値タイプが FORMULA の場合は、 getCachedFormulaResultType()を使用する必要があります。 ] getCellType()メソッドの代わりに数式の計算結果をチェックします

public static void printCellValue(Cell cell) {
    CellType cellType = cell.getCellType().equals(CellType.FORMULA)
      ? cell.getCachedFormulaResultType() : cell.getCellType();
    if (cellType.equals(CellType.STRING)) {
        System.out.print(cell.getStringCellValue() + " | ");
    }
    if (cellType.equals(CellType.NUMERIC)) {
        if (DateUtil.isCellDateFormatted(cell)) {
            System.out.print(cell.getDateCellValue() + " | ");
        } else {
            System.out.print(cell.getNumericCellValue() + " | ");
        }
    }
    if (cellType.equals(CellType.BOOLEAN)) {
        System.out.print(cell.getBooleanCellValue() + " | ");
    }
}

これで、セルループ内で printCellValue メソッドを呼び出すだけで、完了です。 完全なコードのスニペットは次のとおりです。

...
for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) {
    Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
    printCellValue(cell);
}
...

4. 結論

この記事では、Excelファイルを読み取り、ApachePOIを使用してさまざまなセル値にアクセスするためのサンプルプロジェクトを示しました。

完全なソースコードは、GitHubにあります。