# POI Excel lesen und schreiben



## hans (23. Feb 2010)

ich versuche eine Exeltabelle zulesen (klappt super), und dann zu schreiben. Das geht nicht, die Zelle bleibt leer.
Was mache ich falsch?


```
private boolean checkImportFile(File file)
  {
    FileInputStream fis;
    FileOutputStream fos;
    try
    {
      fis = new FileInputStream(file);
      HSSFWorkbook wb = new HSSFWorkbook(fis);
      
       readXLS(wb, 0, 0, 0);
     
       writeCell(wb,0,1,1)
      
      fis.close();

      FileOutputStream fileOut = new FileOutputStream(file);
      wb.write(fileOut);
      fileOut.close();

    } catch (Exception e)
    {}
    return false;
  }


private void writeCell(HSSFWorkbook wb, int sheetIdx, int startRow, int startCol)
  {
    HSSFCell cell;
    HSSFRow row;
    
      HSSFSheet sheet = wb.getSheetAt(sheetIdx);
      row = sheet.getRow(startRow);
      if (row != null)
      {
        int cellnum = row.getPhysicalNumberOfCells();
        cell = row.createCell((short) cellnum);
       
        HSSFRichTextString text = new HSSFRichTextString("MEIN TEXT");
        if (cell != null) cell.setCellValue(text);      
      }
    }   
  }
```


----------



## kama (23. Feb 2010)

Hallo,

wenn ich mir mal die Beispiele auf der POI Seite anschaue (Busy Developers' Guide to HSSF and XSSF Features)
dann komme ich zu der Vermutung, dass das createRow() fehlt...

BTW: Bei der Prüfung if (row != null) würde ich im anderen falle auch mal eine Meldung ausgeben...
MfG
Karl Heinz Marbasie


----------



## hans (24. Feb 2010)

Die row ist da, und createRow() würde ja eine neue Zeile erzeugen. Ich will aber in einer Bestehenden Row einen Wert schreieben.


----------



## kama (24. Feb 2010)

Hi,

bist Du dir da sicher....Woher weißt Du dass eine Row vorhanden ist? 
Hast Du mal eine Meldung im Falle (row == null) ausgegeben ? 

MfG
Karl Heinz Marbaise


----------



## SlaterB (24. Feb 2010)

was läßt dich vermuten, dass die Row und dann auch die Cell schon da sind?
du hast ja nicht mal im Progamm eine minimale Absicherung eingebaut:

```
if (row != null) {
..
} else {
System.out.println("row ist null, ach deshalb klappt das nicht, "+
" das war ja einfach, da müsste ich nichtmal das Forum fragen");
}
```


----------



## hans (24. Feb 2010)

... weil ich es schon eingebaut hatte! Das Programm kommt auch bei cell.setCellValue(text) vorbei, alles schon getestet!!!! Sonst hätte ich hier nicht gefragt.


----------



## kama (24. Feb 2010)

Hallo,

@hans: Die Infos standen aber nicht im Quelltext...Ok...

Was mir noch aufgefallen ist, dass der Parameter startCol (writeCell) nicht verwendet wird..Weiterhin ist der Aufruf: row.getPhysicalNumberOfCells();
nicht ganz richtig...(Zumindest wenn ich die Doku richtig verstehe).
Ich würde die Zeitel:

```
cell = row.createCell((short) cellnum);
```
in folgendes ändern:

```
cell = row.createCell(startCol);
```

Und dann mal schauen ob es funktioniert. Weiterhin würde ich die Help Sachen verwenden die auf der Doku Seite erwähnt sind...

```
...
    CreationHelper createHelper = wb.getCreationHelper();
    row.createCell(2).setCellValue(
         createHelper.createRichTextString("This is a string"));
...
```

Gruß
Karl Heinz


----------



## Guybrush Threepwood (24. Feb 2010)

SlaterB hat gesagt.:


> ```
> System.out.println("row ist null, ach deshalb klappt das nicht, "+
> " das war ja einfach, da müsste ich nichtmal das Forum fragen");
> ```



:applaus:


----------



## SlaterB (24. Feb 2010)

@hans
das macht einen schlechten Eindruck, anderen Personen Informationen vorzuenthalten und sie so sinnlos arbeiten zu lassen,
und dann noch mit '!!!!' zu antworten..

mir ist die Lust vergangen, einen abschließenden Tipp kann ich mir aber nicht verkneifen:

bei meiner alten Version gibts gar keine Methode setValue(HSSFRichTextString),
habe extra die neue Version 3.6 herunterladen, damit kompiliert der Code, zur Laufzeit gibts aber
> java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFCell.setCellValue(Lorg/apache/poi/ss/usermodel/RichTextString; )

aber nein, das könnte bei dir kaum das Problem sein, du hast zwar gefährlichen
catch (Exception e)  {} -Code, einen NoSuchMethodError solltest du dennoch sehen,

in jedem Fall wäre es vielleicht besser, erstmal  
> cell.setCellValue("test");
zu coden, damit läuft es bei mir

in die Ursprungsdatei wieder zu schreiben ist auch gefährlich, scheint aber nicht zu stören


----------



## kama (24. Feb 2010)

Hallo,



SlaterB hat gesagt.:


> @hans
> das macht einen schlechten Eindruck, anderen Personen Informationen vorzuenthalten und sie so sinnlos arbeiten zu lassen,
> und dann noch mit '!!!!' zu antworten..


Danke für die klaren Worte...

Ich ziehe mich jetzt auch raus.

Bye.
Karl Heinz


----------



## hans (24. Feb 2010)

Ich hatte ja geschrieben "Die row ist da" wenn das nicht reicht, ok!  

"row ist null, ach deshalb klappt das nicht, das war ja einfach, da müsste ich nichtmal das Forum fragen"
Solche Aussagen machen auf mich einen schlechten Eindruck.

Aber nichts für ungut, danke für Eure Hilfe  ( auch wenn es immer noch nicht klappt).


----------

