2013-04-26 76 views
29

私は現在、POI 3.9ライブラリを使用してExcelファイルを操作しています。私はgetLastRowNum()関数を知っています。これは、Excelファイル内のいくつかの行を返します。POIライブラリを使用してExcelファイルの行数を取得する方法は?

Excelファイルがちょうど1行、getLastRowNum()リターンを持っている場合にのみ問題がExcelファイルは、最初の3行を使用する場合、カウントはそう0

から始まるgetLastRowNum()戻り数、getLastRowNum()戻り2 あります0

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

Excelファイルが空であるかどうかをどのように検出できますか?

答えて

55

あなたがチェック

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

を行う場合、これはあなたがヘッダを除いたデータに少なくとも一つの行を持っていることを確認しますSheet.getPhysicalNumberOfRows()

+5

+1 Marcias。ちょうどDeleteキーを押すだけでセルを削除すると、物理的に行がまだ存在し、古いカウントが返されているようです。 – anujin

+1

さて、実際には空ではない値を持つ行を数えたい場合は、自分でそれを反復処理する必要があると思います。私は確信していませんが、私はこのメソッドが "宣言された"種類の行を返すことを理解しています。 – macias

+1

警告:シートに空白の行がある場合、getPhysicalNumberOfRowsはシートに空白行が含まれている場合、それが返すカウントにそれらを含めません。しかし、getLastRowNumは、それがスズについて言うことを正確に行います。したがって、すべての行を反復処理するには、反復ループの上限としてgetLastRowNum + 1を使用する必要があります。存在しない行を処理するように注意してください。 –

2

を試してみてください。以下は、うまく動作する私のプログラムです。 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; 
          } 
+1

[docs](https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFSheet.html#getLastRowNum)はゼロベースであることに注意してください。だから、 'getLastRowNum()'は、列がないときや1(あなたのケースのヘッダー)しかないときに0を返します。したがって、 'getPhysicalNumberOfRows()'の行があるかどうかをチェックするためにも使用する必要があります。 –

+0

[HSSFシートドキュメント](https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFSheet.html#getLastRowNum())には、この件に関するいくつかの内容があります。 –

1

2つの物事はあなたが行うことができますがあります

使用

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

またはそれらの間の

    細かい違いがあり

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

  1. オプション1

  2. オプション2は、ちょうどあなたの最後の列のインデックスを与える(10列の2列が満たされていない場合は9を取得します)実際に内容物を充填された列の何を与えません。したがってSheet.getPhysicalNumberOfRows()ため'getLastCellNum()'

1

を行うと、空の行とSheet.getLastRowNum()戻り0をカウント双方一列又は行が存在する場合、私は正確に行の合計数を計算するために二つの方法の組み合わせを使用していません。

int rowTotal = sheet.getLastRowNum(); 

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

注:空の行が1つあるスプレッドシートは、ほとんどの目的では使用できませんが、これはおそらく大丈夫です。

関連する問題