wake-up-neo.com

Wie bekomme ich einen Excel Blank Cell Value im Apache POI?

Ich habe eine riesige Excel-Datei mit Tonnen von Spalten, die wie folgt aussieht: -

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

Dies ist der Code, den ich zum Drucken dieser Werte geschrieben habe:

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

Die mit diesem Code erzeugte Ausgabe ist: -

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

Wenn wir uns also die Ausgabe oben ansehen, können wir feststellen, dass die Zellen, in denen ich leere Werte beließ, nicht von der POI-Bibliothek aufgenommen wurden. Es gibt eine Möglichkeit, diese Werte als Null zu erhalten. oder eine Möglichkeit zu erkennen, dass die angezeigten Werte leere Zellen übersprungen haben?

Vielen Dank.

36
user607429

Wenn Sie alle Zellen erhalten möchten, unabhängig davon, ob sie existieren oder nicht, ist der Iterator nicht für Sie. Stattdessen müssen Sie die entsprechenden Zellen manuell abrufen, wahrscheinlich mit einer fehlenden Zellenrichtlinie

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

Weitere Informationen dazu finden Sie in der Apache POI-Dokumentation zum Durchlaufen von Zellen

55
Gagravarr

Dieses Problem hat mich frustriert. Folgendes habe ich mit poi-3.7-20101029 und poi-3.8 gefunden.

RowIterator und CellIterator unterstützen kein Iterieren über NULL-Zellen oder -Zeilen - nur physikalisch definierte Zellen (die BLANK sein können).

Die Lösung, die das liefert, was ich erwartet habe, erfordert die Verwendung der 0-basierten Row.getCell([int], Row.CREATE_NULL_AS_BLANK), ähnlich wie die Antwort von Chavira (auf 8 Zellenreihen). Oder Sie können den Cell.columnIndex-Wert während der Iteration verwenden, um nach springenden Zahlen zu suchen ...

Nach dem Erstellen von leeren Zellen mit Methode # 1 geben die Iteratoren ärgerlich die jetzt erstellten BLANK-Zellen zurück. Ich halte es für einen Fehler, dass MissingCellPolicy von CellIterator ignoriert wird.

10
Sean Summers

Der Grund ist ziemlich einfach: Excel-Dateien können so viele Zeilen und Spalten wie möglich enthalten. Wenn Sie also alle verfügbaren leeren Zeilen und Spalten zurückgeben, werden die Zellen sehr groß und belegen viel Speicher.

Angenommen, Sie haben ein 10x10-Blatt, in Excel ist es nicht "genau" 10x10, da Sie 11x10 mit leerer Zelle sehr leicht hinzufügen können, sollte POI also die 11. Spalte zurückgeben?

Eine Möglichkeit, um das zu tun, was Sie wünschen, ist HSSFCell.getColumnIndex().

Beispiel:

//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

Unten ist was für mich gearbeitet hat. Die "row.CREATE_NULL_AS_BLANK" schien nicht gültig zu sein, aber dies könnte ein Mangel an NPOI-Wissen sein.

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

Das hat für mich funktioniert ....

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