2012-08-31 26 views

Respuesta

5

Tiene que recorrer todas las celdas de la fila y verificar si están todas vacías. No sé cualquier otra solución ...

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; 
    } 
} 

El código es de here

2

Suponiendo que desea comprobar si la fila n está vacío, recordando que las filas de Apache POI son cero no se basan uno basan , querrías algo como:

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

Estoy usando el siguiente método en mi proyecto POI y es Trabajando bien. Es una variación de la solución de zeller.

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

He usado el mismo fragmento de código pero devuelve falso para el valor de celda vacío. Si compruebo si (cell.getStringCellValue! = Null && cell.getNumericValue! = Null) funciona para el valor String, pero para el valor BigDecimal devuelve IllegalStateException: No se puede convertir texto a valor numérico. ¿Puede sugerirme cómo manejar isRowEmpty para que sea verdadero para una fila vacía? – Harleen

+0

¿Y qué pasa si el tipo de celda es de fórmula? –

3

Sí, pero si de alguna fila que tendremos en algunos celular = "" y valores vacíos en otras células. Este método será un trabajo mejor:

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

El iterador fila devuelve sólo las filas que contienen datos, sin embargo si están completamente vacía, entonces la iteración por el índice de la fila, getRow(index) vuelve null

Solución:

Hasta POI versión 3.14 (gracias a 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; 
} 

Desde la versión PDI 03.15 a 04.02 (int getCellType() es obsoleto):

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; 
} 

partir de la versión 4 de POI (CellTypeEnum getCellType() devolverá el Enum no int):

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

intente utilizar si (iterator.hasNext)

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