2013-04-26 15 views
29

Jungs Ich benutze derzeit die POI 3.9-Bibliothek, um mit Excel-Dateien zu arbeiten. Ich kenne die getLastRowNum() Funktion, die eine Reihe von Zeilen in einer Excel-Datei zurückgibt.Wie erhalten Sie Zeilenanzahl in einer Excel-Datei mit POI-Bibliothek?

Das einzige Problem ist getLastRowNum() gibt eine Zahl mit der Zählung von 0

starten Also, wenn eine Excel-Datei verwendet die ersten drei Zeilen, getLastRowNum() kehrt 2. Wenn eine Excel-Datei hat nur 1 Zeile, getLastRowNum() kehrt 0.

Das Problem tritt auf, wenn die Excel-Datei vollständig leer ist. getLastRowNum() gibt immer noch 0 zurück, sodass ich nicht feststellen kann, ob die Excel-Datei eine Datenzeile enthält oder leer ist.

Wie kann ich feststellen, ob eine Excel-Datei leer ist oder nicht?

Antwort

55
+5

+1 Marcias. Wenn man Zellen löscht, indem man einfach auf Löschen klickt, dann scheint es so, als ob die Zeilen noch physisch existieren und die alte Anzahl zurückgegeben wird. – anujin

+1

Nun, ich denke, wenn Sie Zeilen zählen möchten, die tatsächlich einen nicht leeren Wert haben, müssen Sie selbst darüber iterieren. Ich bin mir nicht sicher, aber ich verstehe, dass diese Methode die Anzahl der Zeilen zurückgibt, die jemals "deklariert" wurden. – macias

+1

WARNUNG: Wenn das Blatt leere Zeilen enthält, enthält getPhysicalNumberOfRows sie nicht in der Zählung, die zurückgegeben wird. GetLastRowNum macht aber auch genau das, was auf der Zunge steht.Um also über alle Zeilen zu iterieren, müssen Sie getLastRowNum + 1 als Obergrenze in Ihrer Iterationsschleife verwenden. Achten Sie darauf, Zeilen zu behandeln, die möglicherweise nicht existieren. –

2

Wenn Sie einen Scheck

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

tun dies sicher, dass Sie mit Daten außer Kopf mindestens eine Zeile haben machen. Unten ist mein Programm, das gut funktioniert. Excel-Datei hat drei Spalten, dh. ID, Name, ZUNAME

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

Die [docs] (https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFSheet.html#getLastRowNum) beachten, dass es null basiert. Also würde 'getLastRowNum()' 0 zurückgeben, wenn es keine Spalten gibt oder wenn es nur 1 gibt (Header in Ihrem Fall). Um zu überprüfen, ob irgendwelche Zeilen vorhanden sind, sollte 'getPhysicalNumberOfRows()' ebenfalls verwendet werden. –

+0

auch die [HSSF-Blattdokumente] (https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFSheet.html#getLastRowNum()) haben mehr Inhalt in Bezug auf dieses Thema. –

1

Es gibt zwei Dinge, die Sie tun können,

Verwendung

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

oder

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

Es gibt einen feinen Unterschied zwischen ihnen

  1. Option 1 die Anzahl der Spalten gibt, die mit Inhalt gefüllt sind tatsächlich

  2. Option 2 nur gibt Ihnen den Index der letzten Spalte (Wenn die zweite Spalte von 10 Spalten nicht gefüllt ist, werden Sie 9 erhalten). Daher 'getLastCellNum()' getan

1

Da Sheet.getPhysicalNumberOfRows() nicht leere Zeilen zählen und Sheet.getLastRowNum() 0 zurück, wenn es sowohl eine Zeile oder keine Zeilen ist, verwende ich eine Kombination der beiden Verfahren, um genau die Gesamtzahl der Zeilen zu berechnen.

Hinweis: Dies behandelt eine Tabellenkalkulation mit einer leeren Zeile als keine, aber für die meisten Zwecke ist dies wahrscheinlich in Ordnung.