Thread Spreadsheet::WriteExcel -> set_num_format -> DATUM
(3 answers)
Opened by GoodFella at 2007-02-12 00:08
Hi, ich versuche gerade Spreadsheet::WriteExcel einige Formate beizubringen, hier mein TestScript:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 #!/usr/bin/perl -w use strict; use Spreadsheet::WriteExcel; my $workbook = Spreadsheet::WriteExcel->new('c:\test.xls'); my $worksheet = $workbook->addworksheet(); my $format1 = $workbook->addformat(); my $format2 = $workbook->addformat(); my $format3 = $workbook->addformat(); my $format4 = $workbook->addformat(); my $format5= $workbook->addformat(); my $format6 = $workbook->addformat(); my $format7 = $workbook->addformat(); my $format8 = $workbook->addformat(); my @cell_format = ( 'TEXT', 'STANDARD', '#.##', '#.## ¤', '#.## ¤ / # ¤', 'PLZ', 'TT.MM.JJJJ', 'TT.MM.JJ' ); $format1->set_num_format('@'); $format2->set_num_format('0'); $format3->set_num_format('0.00'); $format4->set_num_format('0.00 ¤'); $format5->set_num_format('0 ¤'); $format6->set_num_format('00000'); $format7->set_num_format('dd.mm.yyyy'); $format8->set_num_format('dd.mm.yy'); my $i = -1; $worksheet->write(0, $i++, $_) for (@cell_format); $worksheet->write_string(1, 0, '0123', $format1); $worksheet->write_number(1, 1, '0123', $format2); $worksheet->write(1, 2, '0123', $format3); $worksheet->write(1, 3, '0123', $format4); $worksheet->write(1, 4, '0123', $format5); $worksheet->write(1, 5, '01234', $format6); $worksheet->write(1, 6, '22.6.1980', $format7); $worksheet->write(1, 7, '1.12.1900', $format8); $workbook->close(); Das Problem besteht bei $format7 und $format8, jene werden nach öffnen der Exceldatei nicht wie erwartet als "22.06.1980" bzw. "01.12.00" dargestellt sondern als "22.6.1980" bzw. "1.12.00" ... Schaut man sich die Zelleigenschaften unter Excel an, sollte es da kein Problem geben, das Format ist korrekt. Das kommt mir so vor wie bei ->write_string, dass man trotz des setzen des '@' = Stringformates statt ->write verwenden muss, damit auch wirklich ein String in Excel angezeigt wird. Allerdings: Editiert man die beiden Datumsfelder in Excel und wechselt dann in eine andere Zelle, wird das Datum korrekt formatiert, so wie erwartet. Ich glaube, Spreadsheet::WriteExcel schreibt irgendwie Anzeigerohdaten anstatt echte Daten in die Datei .. oder so ähnlich :) ein ->write_date gibts jedenfalls nicht :P Weiss jemand, wie ich das Datum trotzdem richtig formatiert in die Exceldatei bekomme oder hat vielleicht Hintergrundinfos wie Excel da funktioniert? [EDIT] Auf http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel/lib/Spreadsheet/WriteExcel.pm#set_num_format() stehen Beispiele dazu, jedoch werden da keine Datumsangaben geschrieben sonden sowas hier: Quote Habs nicht getestet, aber daran wirds wohl liegen. Bleibt die Frage: Wie rechne ich Datumsangaben der Form DD.MM.YYYY in diese Zahl, die wohl irgendwie eine Zeitspanne beschreiben soll, um? [EDIT2] Auf http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel/lib/Spreadsheet/WriteExcel.pm#DATES_IN_EXCEL steht: Quote Werds mal damit versuchen, sage dann Bescheid obs geklappt hat. [EDIT3] Bescheid. Installieren per ppm konnte ich knicken, weil nicht aufgeführt, später ist mir dann der Grund dafür aufgefallen: es gibt für dieses Modul einen unbearbeiteten Bug-Report, der seit 2004 vom Autor ignoriert wurde; dieser Bug macht das ganze Modul unbenutzbar. Vor allem ... warum erst kompliziert umrechnen, wenn Excel das eigentlich auch allein kann... nur Spreadsheet::WriteExcel kanns nicht (oder habe ich etwas übersehen?) Vorschläge? Alternativen?\n\n <!--EDIT|GoodFella|1171234037--> |