web-dev-qa-db-ja.com

POIライブラリを使用してExcelファイルの行数を取得する方法は?

私は現在、POI 3.9ライブラリを使用してExcelファイルを操作しています。 Excelファイルの行数を返すgetLastRowNum()関数を知っています。

唯一の問題は、getLastRowNum()が0から始まるカウントで数値を返すことです。

したがって、Excelファイルが最初の3行を使用する場合、getLastRowNum()は2を返します。Excelファイルに1行しかない場合、getLastRowNum()は0を返します。

この問題は、Excelファイルが完全に空の場合に発生します。 getLastRowNum()は引き続き0を返すため、Excelファイルに1行のデータがあるかどうか、または空であるかどうかを判断できません。

それでは、Excelファイルが空かどうかをどのように検出できますか?

38
Ahmad
75
macias

Sheet.getPhysicalNumberOfRows()は空の行をカウントせず、Sheet.getLastRowNum()は行が1つでも行がない場合でも0を返すため、2つの方法を組み合わせて行の総数を正確に計算します。

int rowTotal = sheet.getLastRowNum();

if ((rowTotal > 0) || (sheet.getPhysicalNumberOfRows() > 0)) {
    rowTotal++;
}

注:これは、空の行が1つあるスプレッドシートを何もないものとして扱いますが、ほとんどの目的ではおそらくこれで問題ありません。

2
MatthijsM

確認したら

if
(getLastRowNum()<1){
 res="Sheet Cannot be empty";
return
}

これにより、ヘッダー以外のデータを含む行が少なくとも1つあることが確認されます。以下は正常に動作する私のプログラムです。 Excelファイルには3つの列があります。 ID、NAME、LASTNAME

XSSFWorkbook workbook = new XSSFWorkbook(inputstream);
        XSSFSheet sheet = workbook.getSheetAt(0);
        Row header = sheet.getRow(0);
        int n = header.getLastCellNum();
        String header1 = header.getCell(0).getStringCellValue();
        String header2 = header.getCell(1).getStringCellValue();
        String header3 = header.getCell(2).getStringCellValue();
        if (header1.equals("ID") && header2.equals("NAME")
                && header3.equals("LASTNAME")) {
            if(sheet.getLastRowNum()<1){
                System.out.println("Sheet empty");
                         return;
            }   
                        iterate over sheet to get cell values
        }else{
                          SOP("invalid format");
                          return;
                          }
2
JavaGeek

できることは2つあります

つかいます

int noOfColumns = sh.getRow(0).getPhysicalNumberOfCells();

または

int noOfColumns = sh.getRow(0).getLastCellNum();

それらの間には微妙な違いがあります

  1. オプション1は、実際にコンテンツで満たされる列の数を示します(10列の2列目が満たされていなければ、9列になります)

  2. オプション2は、最後の列のインデックスを提供します。したがって、'getLastCellNum()'完了

2
Abhishek Singh