web-dev-qa-db-fra.com

Comment déterminer une ligne vide?

Comment puis-je déterminer les lignes vides dans les documents .xls à l'aide d'un POI Apache? 

23
MyTitle

J'utilise la méthode suivante dans mon projet de POI et cela fonctionne bien. C'est une variante de la solution 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;
}
29
Takaitra

L'itérateur de ligne ne renvoie que les lignes contenant des données. Toutefois, si elles sont complètement vides, puis itératives par index de ligne, getRow(index) renvoie null.

Solution:

Jusqu’à la version 3.14 de POI (merci à 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;
}

De POI version 3.15 à 4.2 (int getCellType() est obsolète):

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

A partir de la version 4 de POI (CellTypeEnum getCellTypeEnum() renverra le Enum not 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.getCellTypeEnum() != CellType.BLANK && StringUtils.isNotBlank(cell.toString())) {
            return false;
        }
    }
    return true;
}
20
EpicPandaForce

Vous devez parcourir toutes les cellules de la ligne et vérifier si elles sont toutes vides. Je ne connais pas d'autre solution ...

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

Le code est de ici

5
zeller

Oui, mais si dans row nous aurons dans cell = "" et des valeurs vides dans d'autres cellules. Cette méthode fonctionnera mieux:

  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;
   }
3
Sergii Lisnychyi

En supposant que vous souhaitiez vérifier si la ligne n est vide, en gardant à l'esprit que les lignes des points d'intérêt Apache sont à zéro et non à base unique, vous souhaiterez probablement:

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

essayez d'utiliser if (iterator.hasNext)

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

Si vous utilisez Apache-poi [4+]:

Ensuite, la méthode ci-dessous fonctionne pour vous. Comme les autres méthodes suggérées ne fonctionnaient pas pour moi, je devais le faire de cette façon.

public static boolean isRowEmpty(Row row) {
    boolean isEmpty = true;
    DataFormatter dataFormatter = new DataFormatter();
    if(row != null) {
        for(Cell cell: row) {
            if(dataFormatter.formatCellValue(cell).trim().length() > 0) {
                isEmpty = false;
                break;
            }
        }
    }
    return isEmpty;
}

La méthode dataFormatter.formatCellValue(cell) renverrait "", un empty / ZERO length string lorsque la cellule est null ou BLANK.

Les déclarations d'importation pour votre référence:

import org.Apache.poi.ss.usermodel.DataFormatter;
import org.Apache.poi.ss.usermodel.Sheet;
import org.Apache.poi.ss.usermodel.Row;
import org.Apache.poi.ss.usermodel.Cell;

J'espère que cela t'aides!

1
snmaddula

récupérez l'instance de CellReference et utilisez formatAsString () sur l'instance. comparer avec une chaîne vide 

`

if("".equals(cellRef.formatAsString())){
     System.out.println("this is an empty cell");
   }else{
      System.out.println("Cell value : "+cellRef.formatAsString());
   }

`.__ Référence: http://www.javabeat.net/2007/10/Apache-poi-reading-Excel-sheet-using-Java/

0
Preet