# Apache POI: Gezieltes Auslesen von Zellen



## rowJoe (19. Mai 2014)

Hallo Leute,

ich möchte es kurz machen und komme gleich auf den Punkt:

Es gibt eine Excel-Tabelle in der ich ausgebend von Zelle C1 alle Zellen rechts davon bis zum Ende der Zeile ausgeben möchte. Dazu habe ich den Code (s.o.) geschrieben, bei dem es beim Abbruch der Schleife zu einem Fehler kommt (er bricht am Ende nicht ab, will den nicht vorhandenen Zellinhalt ausgeben und dadurch tritt der Fehler auf). Leider weiß ich nicht so recht, wie ich das verhindern kann...

Könnt ihr mir einen Tipp geben?


Ganz herzlichen Dank an alle,

rowJ


Hier der Code:

```
public void XLSXCellOut(XSSFSheet sheet) throws IOException {
	try {
	    // Auslesen physikalischer Zeilen und zuweisen von erster Zeile an
	    // "row"
	    Iterator rows = sheet.rowIterator();
	    XSSFRow row = (XSSFRow) rows.next();

	    // Auslesen der physikalischen Zellen (stellvertretend für Spalten)
	    // in der Zeile und Übergabe an "cells"
	    Iterator cells = row.cellIterator();

	    // Festlegen der Startzelle "C1" durch Deklarieren von "rowStart"
	    // und "colStart"
	    int colStart = 2; // Spalte C
	    int rowStart = 0; // Zeile 1

	    // Abfragen des Zellinhaltes ausgehend von Startzelle (hier C1) und
	    // Ausgabe in der Konsole
	    while (cells.hasNext()) {
		CellReference cellReference = new CellReference(rowStart,
			colStart);
		Row cellRow = sheet.getRow(cellReference.getRow());
		Cell cell = cellRow.getCell(cellReference.getCol());

		if (cell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
		    System.out.println(cell.getStringCellValue());
		} else if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
		    System.out.println(cell.getNumericCellValue());
		} else {
		    // U Can Handel Boolean, Formula, Errors
		}

		colStart++;
	    }

	} catch (Exception e) {
	    e.printStackTrace();
	}
    }
```


----------



## knilch (19. Mai 2014)

Hi,
das Problem liegt hierbei, dass der cellIterator n mal in der while- Schleife iteriert.
Du fängst aber bei n-2 an, also kommt eine NPE weil der iterator noch 2 mal mehr iterieren will, aber im Excel- sheet kein Eintrag in der row mehr vorhanden ist.
In einem excel sheet hab ich in row 1 in Cell A1, B1, C1, D1, E1 einen Eintrag. Mit dem cellIterator iteriere ich über alle 5 Elemente.
Hier ein Beispiel dazu:

```
Iterator<Cell> cells = row.cellIterator();
int count = 0;
while (cells.hasNext()) {
	Cell cell = cells.next();
	if(cell.getCellType() == XSSFCell.CELL_TYPE_STRING)
		System.out.println(cell.getStringCellValue());
	else if(cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC)
		System.out.println(cell.getNumericCellValue());
	count++;
}
System.out.println("done: "+ count);
```
Hier werden alle 5 cells von der row 1 ausgegeben.

Du könntest mit folgendes machen wenn du z.b. bei der 2 oder 3. cell anfangen möchtest.

```
Iterator<Cell> cells = row.cellIterator();
int count = 0;
while (cells.hasNext()) {
	Cell cell = cells.next();
	if(count > 1) {    // in diesem Fall soll ab cell C1 die Ausgabe erfolgen.
		if(cell.getCellType() == XSSFCell.CELL_TYPE_STRING)
			System.out.println(cell.getStringCellValue());
		else if(cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC)
			System.out.println(cell.getNumericCellValue());
	}

	count++;
}
System.out.println("done: "+ count);
```

Gruss

knilch


----------



## rowJoe (21. Mai 2014)

Prima, das habe ich gesucht! Danke! :applaus:


----------

