Wie Sie sich richtig formatieren einer Zelle date, und füllen Sie Inhalte mit Apache POI 3.7
Hintergrund:
Ich brauche zu exportieren einer Tabellenkalkulation Dokument mit einer Spalte mit Datum formatiert Daten.
Ich bin derzeit Aufbau der Arbeitsmappe-Stil, etwa so:
...
dateTimeStyle = workbook.createCellStyle();
//dateTimeStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
dateTimeStyle.setDataFormat((short)0x16);
...
und das einfügen der Daten in die Zelle/Einstellung das format von der Zelle, etwa so:
...
if (Date.class.isAssignableFrom(o.getClass())) {
Calendar cal = Calendar.getInstance();
cal.setTime((Date) o);
cell.setCellStyle(dateTimeStyle);
cell.setCellValue(cal);
}
...
Hinweis: Nach BuiltinFormats Dokumentation (http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/BuiltinFormats.html) 0x16 bezieht sich auf das Datum-format, das ich bin versucht zu erreichen.
Das problem ist, dass ich, wenn ich öffnen Sie das exportierte Dokument in Microsoft Office Excel 2007, wenn ich mit der rechten Maustaste auf die Zelle und wählen Sie Zellen Formatieren... es zeigt die gewählte Zelle mit einem benutzerdefinierten format dd/mm/yyyy hh:mm
Auch, SVERWEIS Operationen funktionieren nicht auf der Säule (was ich, zugegebenermaßen, falsch gemacht):
Ich habe das Gefühl, durch ein Missverständnis, wie Excel speichert Formate und Inhalte, und wäre dankbar jede Hilfe zur Verfügung gestellt.
Frage:
So, wie kann ich das richtig formatieren/füllen Sie die Zelle so, dass Microsoft Excel behandelt es als Datum und VLOOKUPs Arbeit etc?
Update: Wenn ich öffnen Sie die resultierende Datei in Open Office Calc und wählen Sie " Zellen Formatieren... das format korrekt als Datum. Ab zu Fragen, dann ist dies ein Problem mit der POI-Bibliothek und Excel 2007...
Vielen Dank.
- Für Ihre SVERWEIS zu arbeiten, die Zellen zu enthalten, die eine Zeit von 00:00 Uhr was können Sie tun, durch die Rundung nach unten das Datum (=ROUNDDOWN(ZELLE; 0)). Ändern Sie das format (in Excel) auf dd-mm-yy wird sich nicht ändern, deren Werte (d.h. die Zeit wird ausgeblendet, aber immer noch da), nicht sicher über POI.
- So gibt es keine Möglichkeit zu tun, einen SVERWEIS auf ein datetime? Auch, wenn ich ersetzen Sie den ersten parameter der SVERWEIS mit einem Zellbezug auf die Spalte, es immer noch nicht überein?
- Es ist. Aber SVERWEIS suchen nach einer genauen übereinstimmung (wenn der Letzte parameter ist auf false gesetzt) und dein argument "2012/01/31" ist nicht gleich "31/01/2012 14:34" so müssen Sie zum anpassen einer von Ihnen. Wenn Sie den letzten parameter von SVERWEIS ist wahr, dann sucht nach der nächsten übereinstimmung, die möglicherweise oder möglicherweise nicht, was Sie brauchen.
- Danke für Eure Hilfe! Ich habe das Gefühl das ist der Tipp mit dem SVERWEIS Eisbergs! Was ist, wenn ich dies tun: =SVERWEIS("31/01/2012 14:34" A2:G20", 7, FALSE) mit FALSE oder TRUE am Ende bekomme ich die #N/A Fehler. Ist das, weil der Wert, den es sucht muss mit dem cell format? Warum würde das nicht funktionieren?
- Sie können zum Beispiel mit =SVERWEIS(DATUM(2012,1,31)+ZEIT(14,34,0),A2:G20", 7,FALSE), (vorausgesetzt, Sekunden sind 0) oder =SVERWEIS(H1,xxxx) angenommen, H1 enthält das Datum+die Zeit, die Sie suchen
- Versuchen
getBuiltinFormat("m/d/yy")
. In Excel ist dies das einzige DATUM-format, das nicht betroffen ist durch die system-locale, so dass das Datum der Arbeit unabhängig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten die Daten in excel zu "benehmen" richtig (einschließlich SVERWEIS, etc), schreiben Sie Sie als Zahl und nicht als Kalender.
Auch wenn dabei das Datum,- > Excel-Double-conversion vorsichtig sein, über das einstellen der richtigen Zeitzone in Ihrem Kalender-Objekt, andernfalls die Zeitzone offset zur UTC, wird automatisch Hinzugefügt, und Sie werden am Ende mit datetimes in Excel unterscheidet sich von dem Datum, Zeiten, die Sie dachten, Sie hätten in Java.
Schließlich beachten Sie, dass Ihre setDataFormat() verwendet 0x16 format-id, wenn ich daran denke, für standard-Datum-format sollte es einfach nur 16 (dezimal). Sehen dieses tutorial für eine Liste der gültigen Formate.
Sehen, dieses kleine Beispiel, das erzeugt eine Excel, in denen das lookup funktioniert Prima:
csDate.setDataFormat((short)16);
ist falsch. NachBuiltinFormats
API, der richtige Wert ist0x16, "m/d/yy h:mm"
, die einen decimal - '22'.