1. 概要

このチュートリアルでは、JavaとJavaを使用してExcelスプレッドシートの最後の行を見つける方法について説明します。 Apache POI.

まず、ApachePOIを使用してファイルから単一の行をフェッチする方法を説明します。 次に、ワークシートのすべての行をカウントする方法を見ていきます。 最後に、それらを組み合わせて、特定のシートの最後の行をフェッチします。

2. 単一行をフェッチ

すでにご存知のように、 Apache POIは、JavaでMicrosoftドキュメントを含むExcelを表す抽象層を提供します。 ファイル内のシートにアクセスしたり、各セルを読み取ったり変更したりすることもできます。

から単一の行をフェッチすることから始めましょう Excelファイル。 先に進む前に、 ワークシート ファイルから:

Workbook workbook = new XSSFWorkbook(fileLocation);
Sheet sheet = workbook.getSheetAt(0);

The ワークブック はExcelファイルのJava表現ですが、 Sheet は、 ワークブック The ワークシート の最も一般的なサブタイプです シート、セルのグリッドを表します。

ワークシートをJavaで開くと、ワークシートに含まれるデータ、つまり行データにアクセスできます。 単一の行をフェッチするには、 getRow(int) 方法:

Row row = sheet.getRow(2);

このメソッドはを返しますオブジェクト– Excelファイルからの単一行の高レベル表現、または行が存在しない場合はnull。

ご覧のとおり、要求された行のインデックス(0ベース)という単一のパラメーターを指定する必要があります。 残念ながら、最後の行を直接取得するために使用できるAPIはありません。

3. 行数を見つける

Javaを使用してExcelファイルから単一の行を取得する方法を学習しました。 次に、特定のシートの最後の行のインデックスを見つけましょう。

Apache POIは、行のカウントに役立つ2つのメソッド getLastRowNum() getPhysicalNumberOfRows()を提供します。 それぞれを見てみましょう。

3.1. getLastRowNum()を使用する

ドキュメントによると、 getLastRowNum()メソッドは、ワークシートで最後に初期化された行の番号(0ベース)を返します。行が存在しない場合は-1を返します。

int lastRowNum = sheet.getLastRowNum();

lastRowNum をフェッチしたら、 getRow()メソッドを使用して最後の行に簡単にアクセスできるようになります。

以前にコンテンツがあり、後で空に設定された行は、引き続き行としてカウントされる可能性があることに注意してください。 したがって、期待どおりの結果が得られない場合があります。 これを理解するには、物理行についてさらに学ぶ必要があります。

3.2. getPhysicalNumberOfRows()の使用

Apache POIのドキュメントを調べると、行に関連する特別な用語である物理行を見つけることができます。

行には、データが含まれている場合は常に物理として解釈されます。 行は、その行のセルにテキストや数式が含まれている場合だけでなく、背景色、行の高さ、使用されているデフォルト以外のフォントなど、書式設定に関するデータがある場合にも初期化されます。 つまり、初期化される各行も物理です。

物理行の数を取得するために、ApachePOIはgetPhysicalNumberOfRows()メソッドを提供します。

int physicalRows = sheet.getPhysicalNumberOfRows();

物理行の説明によると、結果は getLastRowNum()メソッドで取得された数値と異なる場合があります。

4. 最後の行をフェッチします

次に、より複雑なExcelグリッドに対して両方の方法をテストしてみましょう。

ここで、先頭の行にはテキストデータ、式( = A1 )で計算された値が含まれ、それに応じて背景色が変更されます。 次に、4行目は高さを変更し、5行目と6行目は変更されていません。 7行目にもテキストが含まれています。 8行目では、テキストは以前にフォーマットされていましたが、後でクリアされました。 9行目以降は編集されていません。

countメソッドの結果を確認してみましょう。

assertEquals(7, sheet.getLastRowNum());
assertEquals(6, sheet.getPhysicalNumberOfRows());

前述したように、最後の行番号と物理的な行数が異なる場合があります。

次に、インデックスに基づいて行をフェッチしましょう。

assertNotNull(sheet.getRow(0)); // data
assertNotNull(sheet.getRow(1)); // formula
assertNotNull(sheet.getRow(2)); // green
assertNotNull(sheet.getRow(3)); // height
assertNull(sheet.getRow(4));
assertNull(sheet.getRow(5));
assertNotNull(sheet.getRow(6)); // last?
assertNotNull(sheet.getRow(7)); // cleared later
assertNull(sheet.getRow(8));
...

ご覧のとおり、 getPhysicalNumberOfRows()は、ワークシート内のnull以外の(つまり、初期化された)行の総数を返します。 getLastRowNum()値は、最後のnullではない行のインデックスです。

したがって、シートの最後の行をフェッチできます。

Row lastRow = null;
int lastRowNum = sheet.getLastRowNum();
if (lastRowNum >= 0) {
    lastRow = sheet.getRow(lastRowNum);
}

ただし、Apache POIによって返される最後の行は、特にMicrosoft Excelなどの一部のUIエディターでは、テキストまたは数式が表示される行であるとは限らないことを覚えておく必要があります。

5. 結論

この記事では、Apache POI APIを調べて、特定のExcelファイルから最後の行をフェッチしました。

まず、Javaでスプレッドシートを開くための基本的な方法のいくつかを再検討しました。 次に、 getRow(int)メソッドを導入して、単一のRowを取得しました。 その後、 getLastRowNum() getPhysicalNumberOfRows()の値を確認し、それらの違いを説明しました。 最後に、Excelグリッドに対してすべてのメソッドをチェックして、最後の行をフェッチしました。

いつものように、コードのフルバージョンはGitHubから入手できます。