web-dev-qa-db-fra.com

Comment obtenir une valeur de cellule vide dans Apache POI?

J'ai un énorme fichier Excel avec des tonnes de colonnes qui ressemble à ceci: -

Column1 Column2 Column3 Column4 Column5
abc             def             ghi
        mno             pqr
......

C'est le code que j'ai écrit pour imprimer ces valeurs:

try {
    FileInputStream inputStr = new FileInputStream(fileName);
    XSSFWorkbook xssfWork = new XSSFWorkbook(inputStr) ;
    XSSFSheet sheet1 = xssfWork.getSheetAt(0);
    Iterator rowItr = sheet1.rowIterator();

    while ( rowItr.hasNext() ) {
        XSSFRow row = (XSSFRow) rowItr.next();
        System.out.println("ROW:-->");
        Iterator cellItr = row.cellIterator();

        while ( cellItr.hasNext() ) {
            XSSFCell cell = (XSSFCell) cellItr.next();
            System.out.println("CELL:-->"+cell.toString());
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

La sortie générée par ce code est: -

ROW:-->
CELL:-->Column1
CELL:-->Column2
CELL:-->Column3
CELL:-->Column4
CELL:-->Column5
ROW:-->
CELL:-->abc
CELL:-->def
CELL:-->ghi
ROW:-->
CELL:-->mno
CELL:-->pqr

Ainsi, si nous examinons le résultat ci-dessus, nous pouvons constater que les cellules dans lesquelles j'ai laissé des valeurs vierges n'ont pas été récupérées par la bibliothèque de points d'intérêt, existe-t-il un moyen de les rendre nuls? ou un moyen de reconnaître que les valeurs présentées ont sauté des cellules vides?

Merci.

36
user607429

Si vous voulez obtenir toutes les cellules, peu importe si elles existent ou non, l'itérateur n'est pas pour vous. Au lieu de cela, vous devez extraire manuellement les cellules appropriées, probablement avec une stratégie de cellule manquante.

for(Row row : sheet) {
   for(int cn=0; cn<row.getLastCellNum(); cn++) {
       // If the cell is missing from the file, generate a blank one
       // (Works by specifying a MissingCellPolicy)
       Cell cell = row.getCell(cn, Row.CREATE_NULL_AS_BLANK);
       // Print the cell for debugging
       System.out.println("CELL: " + cn + " --> " + cell.toString());
   }
}

Il y a plus de détails sur tout cela dans la documentation Apache POI sur l'itération sur les cellules

55
Gagravarr

J'ai été frustré par ce même problème. Voici ce que j'ai trouvé avec poi-3.7-20101029 et poi-3.8.

RowIterator et CellIterator ne prennent pas en charge l'itération sur des cellules ou des lignes NULL - uniquement des cellules physiquement définies (qui peuvent être BLANK).

La solution qui renvoie ce que j'attend nécessite l'utilisation de la fonction Row.getCell([int], Row.CREATE_NULL_AS_BLANK) à base 0, un peu comme la réponse de Chavira y fait allusion (en supposant 8 lignes de cellules). Ou vous pouvez utiliser la valeur Cell.columnIndex lors de l'itération pour vérifier les numéros sautés ...

Malheureusement, après avoir créé des cellules vides à l'aide de la méthode n ° 1, les itérateurs renverront les cellules BLANK maintenant créées. Je considère comme un bug que CellIterator ignore MissingCellPolicy.

10
Sean Summers

La raison est assez simple: les fichiers Excel peuvent contenir autant de lignes et autant de colonnes que possible. Par conséquent, le renvoi de toutes les lignes et colonnes vides disponibles rendra les cellules énormes et nécessitera beaucoup de mémoire.

En supposant que vous ayez une feuille 10x10, dans Excel, ce n'est pas "exactement" 10x10 puisque vous pouvez ajouter très facilement 11x10 avec une cellule vide, le POI doit-il renvoyer la 11ème colonne?

Une façon de faire ce que vous demandez est d'utiliser HSSFCell.getColumnIndex().

Exemple:

//Assuming your have a 2 dimensional array.
String[][] values = ......;// It is assigned

POIFSFileSystem fileSystem = new POIFSFileSystem(new FileInputStream(fileName));
HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);

//Going through every worksheet.
for (int sheetPos = 0; sheetPos < workbook.getNumberOfSheets(); sheetPos++) {
    HSSFSheet sheet = workbook.getSheetAt(sheetPos);

    int rowPos = 0;
    Iterator<Row> rows = sheet.rowIterator();
    while (rows.hasNext()) {
        HSSFRow row = (HSSFRow) rows.next();

        Iterator<Cell> cells = row.cellIterator();
        while (cells.hasNext()) {
            HSSFCell cell = (HSSFCell) cells.next();
            String value = "";

            switch (cell.getCellType()) {
                case HSSFCell.CELL_TYPE_NUMERIC:
                    value = BigDecimal.valueOf(cell.getNumericCellValue()).toPlainString();
                    break;

                case HSSFCell.CELL_TYPE_STRING:
                    value = cell.getStringCellValue();
                    break;

                case HSSFCell.CELL_TYPE_BLANK:
                    value = "";
                    break;

                case HSSFCell.CELL_TYPE_FORMULA:
                    value = cell.getCellFormula();
                    break;

                default:
                    break;
            }

            values[rowPos][cell.getColumnIndex()] = value;
        }

        rowPos++;
    }
}
3
Buhake Sindi

Voici ce qui a fonctionné pour moi. La "ligne.CREATE_NULL_AS_BLANK" ne semble pas être valide, mais cela pourrait être un manque de connaissances NPOI.

HSSFCell dataCell= (HSSFCell)row.GetCell(column, NPOI.SS.UserModel.MissingCellPolicy.CREATE_NULL_AS_BLANK);
1
damnnewbie
        for(org.Apache.poi.ss.usermodel.Row tmp : hssfSheet){
            for(int i = 0; i<8;i++){
                System.out.println(tmp.getCell(i));
            }               
        }
1
Chavira
List cellDataList = new ArrayList(); 

int lineNumber = 0;   

while (rowIterator.hasNext()) {
    HSSFRow hssfRow = (HSSFRow) rowIterator.next();
    //System.out.println("Befor If");
    lineNumber++;
    if(lineNumber==1){continue;}
    //System.out.println("Out side if ");

    Iterator<Cell> iterator = hssfRow.cellIterator();
    List<Cell> cellTempList = new ArrayList();
    int current = 0, next = 1;
    while (iterator.hasNext()) {
      Cell hssfCell = iterator.next();
      current = hssfCell.getColumnIndex();

      if(current<next){
          System.out.println("Condition Satisfied");
      }
      else{
          int loop = current-next;
          System.out.println("inside else Loop value : "+(loop));
          for(int k=0;k<loop+1;k++){
             System.out.println("Adding nulls");
             cellTempList.add(null);
             next = next + 1;
          }
      }

      cellTempList.add(hssfCell);

      next = next + 1;
      System.out.println("At End  next value is : "+next);
  }
  cellDataList.add(cellTempList);
}
0
Praveen
public String[] rowToString(Row row)
{
    Iterator<Cell> cells = row.cellIterator() ;
    String[] data = new String[row.getLastCellNum()] ;

    int previousCell = 0 ;

    Cell cell = cells.next() ;
    int currentCell = cell.getColumnIndex();

    while (true)
    {
        if (previousCell == currentCell) {
            switch (cell.getCellType()) {
                case Cell.CELL_TYPE_NUMERIC:
                    data[previousCell] = cell.getNumericCellValue()+"" ;
                    break;
                case Cell.CELL_TYPE_STRING:
                    data[previousCell] = cell.getStringCellValue() ;
                    break;
                    /* // there could be other cases here.
                    case Cell.CELL_TYPE_FORMULA:
                        data[previousCell] =eval.evaluateFormulaCell(cell);
                        break;
                    case Cell.CELL_TYPE_BOOLEAN:
                        data[previousCell] = cell.getBooleanCellValue();
                        break;
                    case Cell.CELL_TYPE_BLANK:
                        data[previousCell] = "";
                        break;
                    case Cell.CELL_TYPE_ERROR:
                        data[previousCell] = "ERROR";
                        break;
                    */
            }
            if(cells.hasNext()){
                cell = cells.next() ;
                currentCell = cell.getColumnIndex();
            } else {
                break ;
            }

        } else {
            data[previousCell] = "";
        }
        previousCell++ ;

    }

    return data ;

}
0
Albe

Cela a fonctionné pour moi ....

int rowNumber;
int previousCell;
int currentCell;
int currentRowNumber;
HSSFCell cell;

while (rows.hasNext()) {
    previousCell = -1;
    currentCell = 0;
    while (cellIterator.hasNext()) {
        cell = (HSSFCell) cellIterator.next();
        currentCell = cell.getColumnIndex();
        if (previousCell == currentCell-1)  {
            //...
        }
        else {
            System.out.println("Blank cell found");
        }
        previousCell = currentCell;
    }
}
0
Konza