# Apache POI-Datei lesen und umschreiben



## ehc (23. Mai 2012)

Hallo, 

ich arbeite mich gerade in POI ein (HSSF/.xls) und bin jetzt auf das lesen, bearbeiten und speichern einer Ecxel-Tabelle gestoßen. Ich wollte also wie in meiner Hilfe (Busy Developers' Guide to HSSF and XSSF Features) beschreiben eine Datei auslesen, und bearbeiten. Das ging auch ganz gut... bis ich die einzulendene Datei änderte! 
Wenn ich: _InputStream inp = new FileInputStream("D:/_*workbook.xls*_");_ stehen lasse geht es! (Zeile 23) Wenn ich aber jetzt *workbook2.xls* (JA die Datei gibt es) schreibe gibt er mir einen Fehler! (siehe unten) :bahnhof:

Kann mir bitte jemand Helfen und sagen was ich falsch mache?!? 


```
package na.meins;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;


public class LesenUndSchreiben {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		
		InputStream inp = new FileInputStream("D:/workbook.xls");
		
		HSSFWorkbook wb = new HSSFWorkbook(inp);
	    Sheet sheet = wb.getSheetAt(0);
	    Row row = sheet.getRow(1);
	    Cell cell = row.getCell(0);
	    if (cell == null)
	        cell = row.createCell(3);
	    cell.setCellType(Cell.CELL_TYPE_STRING);
	    cell.setCellValue("BEARBEITET");

	    // Write the output to a file
	    FileOutputStream fileOut = new FileOutputStream("workbookbearbeitet.xls");
	    wb.write(fileOut);
	    fileOut.close();

	}

}
```

Fehlermeldung:

Exception in thread "main" java.lang.NullPointerException
	at de.deutscherv.bund.geraeteverzeichnis.LesenUndSchreiben.main(LesenUndSchreiben.java:31)

Ich hoffe ihr versteht was ich meine.
mfg
ehc


----------



## faetzminator (23. Mai 2012)

[c]cell[/c] ist [c]null[/c]. Gut möglich, dass POI [c]null[/c] zurück gibt, wenn die Zelle weder ein bestimmtes Format noch Inhalt besitzt.


----------



## ehc (23. Mai 2012)

Ja aber wenn ich das mit dem workbook.xls mache schreibt er mir BEARBEITET in die eine leere Zeile... wenn ich aber workbook2.xls schreibe gibt er mir den fehler...auch wenn ich das Feld ändere wo er BEARBEITET rein schreiben soll!


----------



## c_sidi90 (23. Mai 2012)

Bei mir funktioniert dein Code. Du musst halt auch schauen, ob deine workbook2.xls schon was in der 2ten Zeile stehen hat, sonst bringt dir das 
	
	
	
	





```
sheet.getRow(1)
```
 nichts anderes als NULL zurück.

Wenn es keine persönlichen Daten sind, kannst du auch gerne die xls hochladen, dann schau ich mir das nochmal genauer an.


----------



## faetzminator (23. Mai 2012)

Ich hab nun für ein paar Sekunden in die API geschaut. Steht doch ganz klar da... und zwar auf beiden Ebenen:



> [c]public HSSFRow getRow(int rowIndex)[/c]
> Returns:
> HSSFRow representing the row number *or null if its not defined* on the sheet


Aber zum Glück...


> [c]public HSSFRow createRow(int rownum)[/c]


Gleiches gilt für die [c]Cell[/c].


----------



## c_sidi90 (23. Mai 2012)

Daraus ergibt sich folglich:


```
if(sheet.getRow(1)!= null){
        	row = sheet.getRow(1);
        
        }else{
        	row = sheet.createRow(1);
        }
    	
        Cell cell = row.getCell(0);
        
    	if (cell == null){
    	
    		cell = row.createCell(3);
    		cell.setCellType(Cell.CELL_TYPE_STRING);
    		cell.setCellValue("BEARBEITET");
    		
    		  // Write the output to a file
            FileOutputStream fileOut = new FileOutputStream("C:/workbookbearbeitet.xls");
            wb.write(fileOut);
            fileOut.close();
    	}
        }
```

Würde die Abfragen vlt Zusammenfassen, aber hauptsache du verstehst worum es geht.


----------



## ehc (23. Mai 2012)

Ich wollte mein workbook hochladen doch leider macht er das nicht aber egal da stehen nur ein paar worte drinnen sowas wie TEXT und so... also nix besonderes!


----------



## c_sidi90 (23. Mai 2012)

Es geht nicht darum was drin steht, sondern darum wo es steht. Hast du mein Codebeispiel mal ausprobiert ?


----------



## ehc (23. Mai 2012)

So jetzt ja danke! 
Das geht so... ich komme nur halt noch etwas durcheinander aber es geht erst mal so wie es gehen sollte! 

Danke!


----------

