Wie kann ich in Apache POI (Excel Dateien schreiben) Datumszellen in Excel erzeugen

osix

Bekanntes Mitglied
Hallo Leute,

mit dieser Methode möchte ich bliebige Spalten die als ArrayListen vorliegen in eine xlsx-Datei schreiben.
Ich kann beliebig viele ArrayListen übergeben, und das funktioniert auch - vom Prinzip her schon, die Methode unten ist nur ein "Proof of Consept" noch nicht "schön" ausgeführt..

Unten kann ich eine Typen abfrage durchführen, das hab ich nur mal für STRING ausgeführt, das geht natürlich auch für DOUBLE als mit CellType.NUMERIC

Und jetzt meine Frage:

Was mach ich mit DATUMspalten ? Ich bin irritiert, Apache POI kennt komischerweise den CellType.DATE nicht !

Ich möchte aber Datumsspalten schreiben, wie kann ich das schaffen.


Java:
public void writeArrayListToXLSX(File filename,ArrayList... al) throws FileNotFoundException, IOException
    {               
        Row row;
        Cell c = null;
                                
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet();
                
        for (int i=0; i<al[1].size(); i++)  // über alle Reihen, also nach unten !
        {           
            row = sheet.createRow(i);  // Die i.te Reihe wird angelegt

            for (int p=0; p<al.length; p++)                       
            {
                 System.out.println("i:"+i+" p: "+p);
                 String klasse=al[p].get(0).getClass().toString();  // stellt fest welcher Art, das Array und somit die ganze Spalte ist

                 if (klasse.contains("String"))   {
                                                        c = row.createCell(p, CellType.STRING);  // Die p.te Zelle in der Reihe wird festgelegt
                                                                                                                
                                                        c.setCellValue((String) al[p].get(i));   // Cast nötig
                                                  
                                                        // c.setCellStyle(style);                // Die p.te Zelle (oben festgelegt) wird mit dem i.ten Element belegt
                                                        System.out.println("i:"+i+" p: "+p+" Zelle c:"+c);
                                                  }   
                
            }   
        }   
        FileOutputStream outFile = new FileOutputStream(filename);
        workbook.write(outFile);               
    }
 
ja danke, daß geht zwar

Java:
 c.setCellValue(new Date(1978,2,2));

weil ich nicht gedacht habe, daß ich nicht unbedingt einen CELLTYPE übergeben muß ( c = row.createCell(p, CellType.STRING); ) Man kann den letzten Parameter auch weglassen.

Dummerweise wird in Excel mit obigem Datum 1978,2,2 eingetragen "2-Mär-3878"


Java:
CellStyle style = workbook.createCellStyle();
                                                        style.setDataFormat(cp.createDataFormat().getFormat("m/d/yy h:mm"));
                                                        c.setCellStyle(style);
                                                                                                               
                                                        c.setCellValue(new Date(1978,2,2));

Warum ???
auch wenn ich in getFormat das umstelle auf yyyy/m/d nützt das nichts
 
ok, ja habs selber rausgefunden

Date will Jahr ab 1970, Monat 0=Januar, letzte Stelle Tag von 1 bis 31
Nein, das ist falsch. @mihe7 hat doch den Link gegeben:
year - the year minus 1900.
month - the month between 0-11.
date - the day of the month between 1-31.

Also Jahr ab 1900 und nicht ab 1970! Das zeigen ja auch Deine Werte, denn 3878 - 1978 = 1900.
 

Zurück
Oben