Schrift
[thread]8747[/thread]

Spreadsheet::WriteExcel -> set_num_format -> DATUM

Leser: 3


<< >> 4 Einträge, 1 Seite
GoodFella
 2007-02-12 00:08
#74233 #74233
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
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
   $format07->set_num_format('mm/dd/yy');
   $worksheet->write(6,  0, 36892.521, $format07);    # 01/01/01

   $format08->set_num_format('mmm d yyyy');
   $worksheet->write(7,  0, 36892.521, $format08);    # Jan 1 2001

   $format09->set_num_format('d mmmm yyyy');
   $worksheet->write(8,  0, 36892.521, $format09);    # 1 January 2001


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
Dates and times in Excel are represented by real numbers, for example "Jan 1 2001 12:30 AM" is represented by the number 36892.521.

The integer part of the number stores the number of days since the epoch and the fractional part stores the percentage of the day.
...
See also the Spreadsheet::WriteExcel::Utility module that is included in the distro and which includes date handling functions and the DateTime::Format::Excel module, http://search.cpan.org/search?dist=DateTime-Format-Excel which is part of the DateTime project and which deals specifically with converting dates and times to and from Excel's format.


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-->
ptk
 2007-02-12 00:33
#74234 #74234
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Code: (dl )
1
2
 perl -e 'warn(36892.521/365.25)'
101.006217659138 at -e line 1.

Sieht so aus, als ob es die Tage seit 1.1.1900 wären.
GoodFella
 2007-02-12 00:49
#74235 #74235
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,11.02.2007, 23:33]
Code: (dl )
1
2
 perl -e 'warn(36892.521/365.25)'
101.006217659138 at -e line 1.

Sieht so aus, als ob es die Tage seit 1.1.1900 wären.[/quote]
Vielleicht sollte ich anstatt so viel zu editieren einfach neue Post öffnen, denn soweit war ich auch schon :) Trotzdem danke ptk ;)

[EDIT]
->write_date_time, was ich gerade versucht habe zu applizieren, produziert in jedem von mir getestetem Fall den Fall "Unable to read file" beim Öffnen der Datei. Edit: Bullshit, der Fehler lag an meinem Script. Allerding setzt diese Methode eine gewisse Datumsstruktur voraus, sodass jene für mich unbenutzbar wird.\n\n

<!--EDIT|GoodFella|1171235676-->
GoodFella
 2007-02-12 01:10
#74236 #74236
User since
2007-01-09
192 Artikel
BenutzerIn
[default_avatar]
Ich werde wohl zu
Code (perl): (dl )
1
2
3
4
5
my $date_str1 = '22.6.1980';
my $date_str2 = '2.12.1901';

$worksheet->write(1, 6, sprintf('%02d.%02d.%4d', split(/\./, $date_str1)), $format7); 
$worksheet->write(1, 7, sprintf('%02d.%02d.%2d', split(/\./, $date_str2)), $format8);


greifen müssen, um den Effekt zu erzielen. Wäre aber für Alternativen dankbar, solche, die Excels eigene Formatmethoden einbeziehen.\n\n

<!--EDIT|GoodFella|1171235466-->
<< >> 4 Einträge, 1 Seite



View all threads created 2007-02-12 00:08.