2013-04-26 14 views
29

Faceci Obecnie korzystam z biblioteki punktów POI 3.9 do pracy z plikami Excel. Wiem o funkcji getLastRowNum(), która zwraca liczbę wierszy w pliku Excel.Jak uzyskać liczbę wierszy w pliku Excel przy użyciu biblioteki punktów POI?

Jedynym problemem jest getLastRowNum() zwraca liczbę z liczbą począwszy od 0.

Więc jeśli plik Excel używa pierwszych 3 rzędach, getLastRowNum() powraca 2. Jeśli plik Excel ma tylko 1 wiersz, getLastRowNum() powroty 0.

Problem występuje, gdy plik programu Excel jest całkowicie pusty. getLastRowNum() nadal zwraca 0, więc nie mogę stwierdzić, czy plik Excel ma 1 wiersz danych, czy jest pusty.

Jak zatem wykryć, czy plik Excel jest pusty, czy nie?

Odpowiedz

55
+5

+1 Marcias. Tylko jeśli ktoś usunie komórki, po prostu naciskając klawisz Delete, wydaje się, że wiersze nadal istnieją fizycznie i zwracana jest stara liczba. – anujin

+1

Cóż, myślę, że jeśli chcesz policzyć wiersze, które rzeczywiście mają jakąś niepustą wartość, będziesz musiał sam go powtórzyć. Nie jestem pewien, ale rozumiem, że ta metoda zwraca liczbę wierszy, które kiedykolwiek były "zadeklarowane". – macias

+1

OSTRZEŻENIE: Jeśli arkusz ma puste wiersze, to parametr getPhysicalNumberOfRows nie uwzględnia ich w liczonej liczbie. Jednak getLastRowNum robi dokładnie to, co mówi na puszce.Aby powtórzyć wszystkie wiersze, należy użyć getLastRowNum + 1 jako górnej granicy w pętli iteracji - zwracając uwagę na obsługę wierszy, które mogą nie istnieć. –

2

Jeśli nie czek

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

Pozwoli to upewnić się, że co najmniej jeden wiersz z danymi z wyjątkiem cel. Poniżej znajduje się mój program, który działa dobrze. Plik Excel ma trzy kolumny tj. Id, nazwisko, nazwisko

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) zwróć uwagę, że bazuje ona na wartości zero. Więc 'getLastRowNum()' zwróci 0, gdy nie ma kolumn lub gdy jest tylko 1 (nagłówek w twoim przypadku). W związku z tym należy sprawdzić, czy istnieją również wiersze 'getPhysicalNumberOfRows()'. –

+0

także [Dokumenty HSSF] (https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFSheet.html#getLastRowNum()) mają więcej treści dotyczących tego tematu. –

1

Istnieją dwie rzeczy można zrobić

użycie

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

lub

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

Istnieje cienka różnica między nimi

  1. Wariant 1 nie daje kolumn, które są właściwie wypełnione treścią (Jeśli Kolumna 2 z 10 kolumn nie jest wypełniona otrzymasz 9)

  2. Opcja 2 tylko daje indeks ostatniej kolumnie. W związku z tym wykonane 'getLastCellNum()'

1

Ponieważ Sheet.getPhysicalNumberOfRows() nie liczy pustych wierszy i Sheet.getLastRowNum() zwraca 0 zarówno jeżeli istnieje jeden rząd lub rzędy nie, że stosowanie kombinacji tych dwóch metod dokładnego obliczenia całkowitej liczby rzędów.

int rowTotal = sheet.getLastRowNum(); 

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

Uwaga: To potraktuje arkusz kalkulacyjny z jednym pustym wierszem jako nieposiadającym żadnego, ale dla większości celów jest to prawdopodobnie w porządku.