2012-08-31 5 views

Antwort

5

Sie müssen durch alle Zellen in der Zeile iterieren und prüfen, ob sie alle leer sind. Ich kenne keine andere Lösung ...

short c; 
for (c = lastRow.getFirstCellNum(); c <= lastRow.getLastCellNum(); c++) { 
    cell = lastRow.getCell(c); 
    if (cell != null && lastRow.getCell(c).getCellType() != HSSFCell.CELL_TYPE_BLANK) { 
      nonBlankRowFound = true; 
    } 
} 

Der Code ist von here

2

Angenommen, Sie, wenn Zeile n überprüfen möchten leer ist, nicht vergessen, dass Zeilen in Apache POI Null basiert nicht eine Basis Sie möchten etwas wie:

Row r = sheet.getRow(n-1); // 2nd row = row 1 
boolean hasData = true; 

if (r == null) { 
    // Row has never been used 
    hasData = false; 
} else { 
    // Check to see if all cells in the row are blank (empty) 
    hasData = false; 
    for (Cell c : r) { 
     if (c.getCellType() != Cell.CELL_TYPE_BLANK) { 
     hasData = true; 
     break; 
     } 
    } 
} 
26

Ich verwende die folgende Methode in meinem POI-Projekt und es ist gut arbeiten. Es ist eine Variation von Zellers Lösung.

public static boolean isRowEmpty(Row row) { 
    for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) { 
     Cell cell = row.getCell(c); 
     if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK) 
      return false; 
    } 
    return true; 
} 
+0

Ich habe das gleiche Stück Code verwendet, aber es gibt false für Zellenwert leer. Wenn ich überprüfe, ob (cell.getStringCellValue! = Null && cell.getNumericValue! = Null) funktioniert es für String-Wert, aber für BigDecimal-Wert gibt es IllegalStateException zurück: Kann Text nicht in numerischen Wert konvertieren. Können Sie mir vorschlagen, wie iSRowEmpty behandelt wird, um für die leere Zeile "True" zurückzugeben? – Harleen

+0

Und was, wenn Zelltyp von Formel ist? –

3

Ja, aber wenn in einigen Reihe werden wir in einigen Zelle = "" und leere Werte in anderen Zellen haben. Diese Methode wird eine bessere Arbeit sein:

boolean isEmptyRow(Row row){ 
    boolean isEmptyRow = true; 
     for(int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++){ 
      Cell cell = row.getCell(cellNum); 
      if(cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK && StringUtils.isNotBlank(cell.toString())){ 
      isEmptyRow = false; 
      }  
     } 
    return isEmptyRow; 
    } 
12

Die Zeile Iterator gibt nur die Zeilen, die Daten enthalten, aber wenn sie ganz leer sind dann Iterieren durch Zeilenindex, getRow(index) kehrt null

Lösung:

Bis zu POI Version 3.14 (Danke an Sergii Lisnychyi):

private boolean checkIfRowIsEmpty(Row row) { 
    if (row == null) { 
     return true; 
    } 
    if (row.getLastCellNum() <= 0) { 
     return true; 
    } 
    for (int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++) { 
     Cell cell = row.getCell(cellNum); 
     if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK && StringUtils.isNotBlank(cell.toString())) { 
      return false; 
     } 
    } 
    return true; 
} 

Von POI Version 3,15-4,2 (int getCellType() ist veraltet):

private boolean checkIfRowIsEmpty(Row row) { 
    if (row == null) { 
     return true; 
    } 
    if (row.getLastCellNum() <= 0) { 
     return true; 
    } 
    for (int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++) { 
     Cell cell = row.getCell(cellNum); 
     if (cell != null && cell.getCellTypeEnum() != CellType.BLANK && StringUtils.isNotBlank(cell.toString())) { 
      return false; 
     } 
    } 
    return true; 
} 

Von POI Version 4 (CellTypeEnum getCellType() die Enum nicht int zurück):

private boolean checkIfRowIsEmpty(Row row) { 
    if (row == null) { 
     return true; 
    } 
    if (row.getLastCellNum() <= 0) { 
     return true; 
    } 
    for (int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++) { 
     Cell cell = row.getCell(cellNum); 
     if (cell != null && cell.getCellType() != CellType.BLANK && StringUtils.isNotBlank(cell.toString())) { 
      return false; 
     } 
    } 
    return true; 
} 
0

versuchen Sie es mit if (iterator.hasNext)

Row nextRow = null; 
Cell nextCell = null; 
Iterator<Row> iterator = firstSheet.rowIterator(); 
if(iterator.hasNext) { 
    return true; 
} 
else { 
    return false; 
}