Re: Spreadsheet::WriteExcel

On 2008-03-28 11:15, Robert Berghaus <Robert.Berghaus [at] gmx.de> wrote:
> Reinhard Pagitsch schrieb:
>> Hallo Robert,
>> Robert Berghaus wrote:
>>> Weiß jemand, wie ich Default-Einstellungen für eine Tabelle ändere (z.
>>> B. Font)?
>>> Ich kann das Modul Format.pm ändern, aber das ist wohl nicht die
>>> offizielle Methode (dafür funktioniert es). In der Doku habe ich
>>> hierüber nichts gefunden.
>>> Es ist ebenso möglich, jedem Eintrag eine Formatierung mitzugeben,
>>> aber das erscheint mir zu aufwendig für Perl.
>>>
>>
>> Das sollte helfen:
>> http://search.cpan.org/dist/Spreadsheet-WriteExcel/lib/Sprea dsheet/WriteExcel.pm#CELL_FORMATTING
>
> Danke, die Seite kenne ich schon (vielleicht verstehe ich sie nur
> nicht). Ich wollte nicht bei jedem Schreiben das Format mitgeben,
> sondern zu Beginn die Schriftart und Größe einmal setzen und dann
> nur noch die Werte schreiben.

Wo ist jetzt der große Unterschied, ob Du

$workbook->set_default_format(...); # hypothetische Methode

....
$worksheet->write(0, 0, 17);
$worksheet->write(0, 1, 42);
....


oder

my $format = $workbook->add_format(...);

....
$worksheet->write(0, 0, 17, $format);
$worksheet->write(0, 1, 42, $format);
....

schreibst? Sicher, jeder Aufruf von write hat einen zusätzlichen
Parameter, aber der ist immer gleich, erhöht also die Komplexität des
Programms kaum.

hp
hjp-usenet2 [ Sa, 29 März 2008 22:20 ] [ ID #1932028 ]

Re: Spreadsheet::WriteExcel

Peter J. Holzer schrieb:
> On 2008-03-28 11:15, Robert Berghaus <Robert.Berghaus [at] gmx.de> wrote:
>> Reinhard Pagitsch schrieb:
>>> Hallo Robert,
>>> Robert Berghaus wrote:
>>>> Weiß jemand, wie ich Default-Einstellungen für eine Tabelle än=
dere (z.
>>>> B. Font)?
>>>> Ich kann das Modul Format.pm ändern, aber das ist wohl nicht die
>>>> offizielle Methode (dafür funktioniert es). In der Doku habe ich
>>>> hierüber nichts gefunden.
>>>> Es ist ebenso möglich, jedem Eintrag eine Formatierung mitzugeben,=

>>>> aber das erscheint mir zu aufwendig für Perl.
>>>>
>>> Das sollte helfen:
>>> http://search.cpan.org/dist/Spreadsheet-WriteExcel/lib/Sprea dsheet/Wr=
iteExcel.pm#CELL_FORMATTING
>> Danke, die Seite kenne ich schon (vielleicht verstehe ich sie nur
>> nicht). Ich wollte nicht bei jedem Schreiben das Format mitgeben,
>> sondern zu Beginn die Schriftart und Größe einmal setzen und dann =

>> nur noch die Werte schreiben.
>
> Wo ist jetzt der große Unterschied, ob Du
>
> $workbook->set_default_format(...); # hypothetische Methode
>
> ...
> $worksheet->write(0, 0, 17);
> $worksheet->write(0, 1, 42);
> ...
>
>
> oder
>
> my $format =3D $workbook->add_format(...);
>
> ...
> $worksheet->write(0, 0, 17, $format);
> $worksheet->write(0, 1, 42, $format);
> ...
>
> schreibst? Sicher, jeder Aufruf von write hat einen zusätzlichen
> Parameter, aber der ist immer gleich, erhöht also die Komplexität d=
es
> Programms kaum.

1. Es ist kein großer Unterschied.
2. Ich benutze das 2. und es funktioniert einwandfrei.
3. Will ich doch versuchen, Argumente für meine Vorstellung zu
bringen. ;-)

Wenn ich eine Tabelle auf meinen Standard gesetzt habe, sehe ich
recht schnell im Programm, welche Zellen anders dargestellt
werden, anderenfalls müßte ich immer nachsehen, welches Format
gesetzt wird.
Wenn der Empfänger der Tabelle diese ergänzt, ist (bei anderer
Schriftart oder Größe) sofort zu sehen, wo ergänzt wurde (das kann =

erwünscht sein, muß es aber nicht).
Es gefällt mir einfach besser, Grundeinstellung einmal zu machen
und danach nur noch die Abweichungen davon.

Das soll es jetzt mal sein. Wenn ich weiter nachdenke, finde ich
bestimmt noch mehr Gründe, die Grundeinstellung einmal zu setzen
und nicht hundertfach mitzugeben.

Es hätte mir auch gereicht, wenn jemand geschrieben hätte, daß es
keine offizielle Methode für die Defaulteinstellung gibt (das war
ja schließlich meine Frage). ;-)

--
Schönen Gruß aus dem Bergischen Land
Robert
Robert Berghaus [ So, 30 März 2008 19:10 ] [ ID #1932029 ]

Re: Spreadsheet::WriteExcel

"Robert Berghaus" <Robert.Berghaus [at] gmx.de> schrieb im Newsbeitrag news:c1.2bm.393Pdh$LWn [at] TPA31p-os2.robe-edv.lokal...
> Peter J. Holzer schrieb:
>> On 2008-03-28 11:15, Robert Berghaus <Robert.Berghaus [at] gmx.de> wrote:
>>> Reinhard Pagitsch schrieb:
>>>> Hallo Robert,
>>>> Robert Berghaus wrote:
>>>>> Weiß jemand, wie ich Default-Einstellungen für eine Tabelle ändere (z. B. Font)?
>>>>> Ich kann das Modul Format.pm ändern, aber das ist wohl nicht die offizielle Methode (dafür funktioniert es). In
>>>>> der Doku habe ich hierüber nichts gefunden.
>>>>> Es ist ebenso möglich, jedem Eintrag eine Formatierung mitzugeben, aber das erscheint mir zu aufwendig für Perl.

Hallo Robert,

meine Lösung für dein Problem ist leider aufwändiger als gedacht. Hoffentlich kommt diese Antwort nicht zu spät für
dich.

Zunächst die gute Nachricht: es gibt in Spreadsheet::WriteExcel mehrere Möglichkeiten zum Formatieren von Zellbereichen:
# eine Zelle
$worksheet->write('E16', undef, $format);
# eine Zeile
$worksheet->set_row('2', undef, $format);
#mehrere Spalten
$worksheet->set_column('B:C', undef, $format);
# ein Rechteck
my $b = [([(undef) x 2]) x 3];
$worksheet->write_row('F5', $b, $format);
# geht ebenso mit $worksheet->write_col (das Rechteck wird gespiegelt)

Jetzt die schlechte Nachricht: die write*-Methoden zeigen folgendes Verhalten:
- vorhandene Zellwerte werden gelöscht
- beim anschließenden Schreiben von Werten ohne Formatierung wird die vorhandene Formatierung
ignoriert, es wird der Excel-Default benutzt. (Ich halte dies für einen Bug in Spreadsheet::WriteExcel.)
Damit sind diese Methoden für dich unbrauchbar.

Ich gehe davon aus, dass du ein Rechteck hast, in das du deine Werte schreibst (wobei auch Zellen leer bleiben), während
dich alles außerhalb nicht interessiert. Wenn alle Zellen im Rechteck dasselbe Defaultformat erhalten sollen (du
schreibst darüber nichts), so formatierst du alle Spalten, die zum Rechteck gehören, mit $worksheet->set_column. Sollten
dich die Formatierungen oberhalb und unterhalb des Rechtecks stören, so formatierst du diese Bereiche durch zwei Aufrufe
von $worksheet->write_row so, dass im Endeffekt der Excel-Default wieder hergestellt ist. Das Ganze geht auch analog mit
$worksheet->set_row, nur etwas umständlicher.

Wenn nicht alle Zellen im Rechteck dasselbe Defaultformat erhalten sollen, wirst du wohl einen Write-Handler benutzen
müssen:
$worksheet->add_write_handler(qr/./, \&my_write);
Zunächst formatierst du alle Zellen des Rechtecks, damit auch solche, die leer bleiben, formatiert sind:
$worksheet->write($row, $col, undef, default_format($row, $col));
Jetzt kannst du die Werte ohne Formatangabe in's Rechteck schreiben. Dabei steuerst du über eine globale Variable das
aktuelle Defaultformat (undef für den Excel-Default), oder du berechnest das Format im Handler, etwa so (für ein
Rechteck A1:J7):

sub my_write {
return undef if $#_ > 3; # format given, continue in write()

my $worksheet = shift;
my ($row, $col) = [at] _;
return undef if ($row > 6 or $col > 9); # outside of rect, continue in write()

$_[3] = default_format($row, $col);
return $worksheet->write( [at] _); # write with default format
}

sub default_format {
my ($row, $col) = [at] _;
my $format;

if ($row == 3) {
$format = undef;
} elsif ($row + $col < 8) {
$format = $format1;
} else {
$format = $format2;
}
return $format;
}

> [..............]
>
> 3. Will ich doch versuchen, Argumente für meine Vorstellung zu bringen. ;-)
>
> Wenn ich eine Tabelle auf meinen Standard gesetzt habe, sehe ich recht schnell im Programm, welche Zellen anders
> dargestellt werden, anderenfalls müßte ich immer nachsehen, welches Format gesetzt wird.
> Wenn der Empfänger der Tabelle diese ergänzt, ist (bei anderer Schriftart oder Größe) sofort zu sehen, wo ergänzt
> wurde (das kann erwünscht sein, muß es aber nicht).

Das verstehe ich nicht. Wenn du die Tabelle formatiert hast, wird das Format doch auch bei späteren Ergänzungen
beachtet. Habe ich dein Problem falsch verstanden? :-(

> Es gefällt mir einfach besser, Grundeinstellung einmal zu machen und danach nur noch die Abweichungen davon.

Mir auch.

Gruß

Klaus

--
Persönliche Antwort bitte nur an
K<ohne_Punkt_und_Komma>Wittrock<Klammeraffe>web.de
ichhassesp [ Fr, 18 April 2008 18:28 ] [ ID #1945517 ]

Re: Spreadsheet::WriteExcel

Hallo Klaus

Vielen Dank f=C3=BCr Deine ausf=C3=BChrliche Beschreibung und Deine eMail=
=2E
K. Wittrock schrieb:
> "Robert Berghaus" <Robert.Berghaus [at] gmx.de> schrieb im Newsbeitrag news:=
c1.2bm.393Pdh$LWn [at] TPA31p-os2.robe-edv.lokal...
>> Peter J. Holzer schrieb:
>>> On 2008-03-28 11:15, Robert Berghaus <Robert.Berghaus [at] gmx.de> wrote:
>>>> Reinhard Pagitsch schrieb:
>>>>> Hallo Robert,
>>>>> Robert Berghaus wrote:
>>>>>> Wei=C3=9F jemand, wie ich Default-Einstellungen f=C3=BCr eine Tabe=
lle =C3=A4ndere (z. B. Font)?
>>>>>> Ich kann das Modul Format.pm =C3=A4ndern, aber das ist wohl nicht =
die offizielle Methode (daf=C3=BCr funktioniert es). In
>>>>>> der Doku habe ich hier=C3=BCber nichts gefunden.
>>>>>> Es ist ebenso m=C3=B6glich, jedem Eintrag eine Formatierung mitzug=
eben, aber das erscheint mir zu aufwendig f=C3=BCr Perl.
>
> Hallo Robert,
>
> meine L=C3=B6sung f=C3=BCr dein Problem ist leider aufw=C3=A4ndiger als=
gedacht. Hoffentlich kommt diese Antwort nicht zu sp=C3=A4t f=C3=BCr
> dich.
>
Nein. Zum einen ging es bei mir zun=C3=A4chst darum, ob das gew=C3=BCnsch=
te
mit Perl machbar ist (und es funktioniert sehr gut) und zum
anderen geh=C3=B6re ich zu den Leuten, die auch fertige Programme noch
=C3=A4ndern, wenn ihnen eine andere L=C3=B6sung besser gef=C3=A4llt. ;-)

> Zun=C3=A4chst die gute Nachricht: es gibt in Spreadsheet::WriteExcel
> mehrere M=C3=B6glichkeiten zum Formatieren von Zellbereichen:
> # eine Zelle
> $worksheet->write('E16', undef, $format);
> # eine Zeile
> $worksheet->set_row('2', undef, $format);
> #mehrere Spalten
> $worksheet->set_column('B:C', undef, $format);
> # ein Rechteck
> my $b =3D [([(undef) x 2]) x 3];
> $worksheet->write_row('F5', $b, $format);
> # geht ebenso mit $worksheet->write_col (das Rechteck wird gespiege=
lt)
>
> Jetzt die schlechte Nachricht: die write*-Methoden zeigen folgendes Ver=
halten:
> - vorhandene Zellwerte werden gel=C3=B6scht
> - beim anschlie=C3=9Fenden Schreiben von Werten ohne Formatierung wir=
d die vorhandene Formatierung
> ignoriert, es wird der Excel-Default benutzt. (Ich halte dies f=C3=BC=
r einen Bug in Spreadsheet::WriteExcel.)
> Damit sind diese Methoden f=C3=BCr dich unbrauchbar.
>
Mit set_row geht es ausgezeichnet (set_column habe ich nicht
ausprobiert).

> Ich gehe davon aus, dass du ein Rechteck hast, in das du deine Werte sc=
hreibst (wobei auch Zellen leer bleiben), w=C3=A4hrend
> dich alles au=C3=9Ferhalb nicht interessiert. Wenn alle Zellen im Recht=
eck dasselbe Defaultformat erhalten sollen (du
> schreibst dar=C3=BCber nichts), so formatierst du alle Spalten, die zum=
Rechteck geh=C3=B6ren, mit $worksheet->set_column. Sollten
> dich die Formatierungen oberhalb und unterhalb des Rechtecks st=C3=B6re=
n, so formatierst du diese Bereiche durch zwei Aufrufe
> von $worksheet->write_row so, dass im Endeffekt der Excel-Default wiede=
r hergestellt ist. Das Ganze geht auch analog mit
> $worksheet->set_row, nur etwas umst=C3=A4ndlicher.
>
Die Zeilen gehen bis 171 (das d=C3=BCrfte auch fest bleiben) und die
Spalten zur Zeit bis S (das ist variabel).

> Wenn nicht alle Zellen im Rechteck dasselbe Defaultformat erhalten soll=
en, wirst du wohl einen Write-Handler benutzen
> m=C3=BCssen:
[...]
Den Write-Handler brauche ich wohl nicht. Zur Zeit habe ich 3
Formate. Bl=C3=B6d ist nur, da=C3=9F ich *meine* Defaultvorgaben bei jede=
m
Format einstellen mu=C3=9F.
Beispiel:
Ich setze in meinem Standard Format die Schriftart auf Courier und
belege das ganze Rechteck per set_row mit diesem Standard vor.
Wenn ich jetzt ein Datumsformat generiere, mu=C3=9F ich dort auch
wieder die Schriftart auf Courier setzen; sonst w=C3=BCrde Arial
genommen (Grundeinstellung).

>> [..............]
>>
>> 3. Will ich doch versuchen, Argumente f=C3=BCr meine Vorstellung zu br=
ingen. ;-)
>>
>> Wenn ich eine Tabelle auf meinen Standard gesetzt habe, sehe ich recht=
schnell im Programm, welche Zellen anders
>> dargestellt werden, anderenfalls m=C3=BC=C3=9Fte ich immer nachsehen, =
welches Format gesetzt wird.
>> Wenn der Empf=C3=A4nger der Tabelle diese erg=C3=A4nzt, ist (bei ander=
er Schriftart oder Gr=C3=B6=C3=9Fe) sofort zu sehen, wo erg=C3=A4nzt
>> wurde (das kann erw=C3=BCnscht sein, mu=C3=9F es aber nicht).
>
> Das verstehe ich nicht. Wenn du die Tabelle formatiert hast, wird das F=
ormat doch auch bei sp=C3=A4teren Erg=C3=A4nzungen
> beachtet. Habe ich dein Problem falsch verstanden? :-(
>
Das bezog sich auf die Antwort vom Peter:
>>> my $format =3D $workbook->add_format(...);
>>>
>>> ...
>>> $worksheet->write(0, 0, 17, $format);
>>> $worksheet->write(0, 1, 42, $format);

Wenn ich jetzt in der Tabellenkalkulation in C1 einen Eintrag
mache, so wird wieder die Defaultformatierung genommen und nicht
meine vorgegebene (weil ich sie eben *nicht* vorgeben kann).
Wenn ich aber in format.pm in der sub new die Vorgaben =C3=A4ndere, so
wird die gesamte Tabelle auf diese Vorgabe gesetzt!

>> Es gef=C3=A4llt mir einfach besser, Grundeinstellung einmal zu machen =
und danach nur noch die Abweichungen davon.
>
> Mir auch.
>



Sch=C3=B6nen Gru=C3=9F aus dem Bergischen Land
Robert
Robert Berghaus [ Sa, 19 April 2008 13:34 ] [ ID #1946056 ]
Perl » de.comp.lang.perl.misc » Re: Spreadsheet::WriteExcel

Vorheriges Thema: Wie Perlroutinen aus Java heraus aufrufen?
Nächstes Thema: Subscript mit Parameter aufrufen unter Windows?