Re: Spreadsheet::WriteExcel

Re: Spreadsheet::WriteExcel

am 29.03.2008 22:20:14 von hjp-usenet2

On 2008-03-28 11:15, Robert Berghaus 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

Re: Spreadsheet::WriteExcel

am 30.03.2008 19:10:00 von Robert Berghaus

Peter J. Holzer schrieb:
> On 2008-03-28 11:15, Robert Berghaus wrote:
>> Reinhard Pagitsch schrieb:
>>> Hallo Robert,
>>> Robert Berghaus wrote:
>>>> Weiß jemand, wie ich Default-Einstellungen für eine Tabelle än=
dere (z.=20
>>>> B. Font)?
>>>> Ich kann das Modul Format.pm ändern, aber das ist wohl nicht die=20
>>>> offizielle Methode (dafür funktioniert es). In der Doku habe ich=20
>>>> hierüber nichts gefunden.
>>>> Es ist ebenso möglich, jedem Eintrag eine Formatierung mitzugeben,=
=20
>>>> 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=20
>> Danke, die Seite kenne ich schon (vielleicht verstehe ich sie nur=20
>> nicht). Ich wollte nicht bei jedem Schreiben das Format mitgeben,=20
>> sondern zu Beginn die Schriftart und Größe einmal setzen und dann =

>> nur noch die Werte schreiben.
>=20
> Wo ist jetzt der große Unterschied, ob Du=20
>=20
> $workbook->set_default_format(...); # hypothetische Methode
>=20
> ...
> $worksheet->write(0, 0, 17);
> $worksheet->write(0, 1, 42);
> ...
>=20
>=20
> oder=20
>=20
> my $format =3D $workbook->add_format(...);
>=20
> ...
> $worksheet->write(0, 0, 17, $format);
> $worksheet->write(0, 1, 42, $format);
> ...
>=20
> 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=20
bringen. ;-)

Wenn ich eine Tabelle auf meinen Standard gesetzt habe, sehe ich=20
recht schnell im Programm, welche Zellen anders dargestellt=20
werden, anderenfalls müßte ich immer nachsehen, welches Format=20
gesetzt wird.
Wenn der Empfänger der Tabelle diese ergänzt, ist (bei anderer=20
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=20
und danach nur noch die Abweichungen davon.

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

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

--=20
Schönen Gruß aus dem Bergischen Land
Robert

Re: Spreadsheet::WriteExcel

am 18.04.2008 18:28:33 von ichhassesp

"Robert Berghaus" schrieb im Newsbeitrag news:c1.2bm.393Pdh$LWn@TPA31p-os2.robe-edv.lokal...
> Peter J. Holzer schrieb:
>> On 2008-03-28 11:15, Robert Berghaus 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) = @_;
return undef if ($row > 6 or $col > 9); # outside of rect, continue in write()

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

sub default_format {
my ($row, $col) = @_;
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
KWittrockweb.de

Re: Spreadsheet::WriteExcel

am 19.04.2008 13:34:08 von Robert Berghaus

Hallo Klaus

Vielen Dank für Deine ausführliche Beschreibung und Deine eMail=

K. Wittrock schrieb:
> "Robert Berghaus" schrieb im Newsbeitrag news:=
c1.2bm.393Pdh$LWn@TPA31p-os2.robe-edv.lokal...
>> Peter J. Holzer schrieb:
>>> On 2008-03-28 11:15, Robert Berghaus wrote:
>>>> Reinhard Pagitsch schrieb:
>>>>> Hallo Robert,
>>>>> Robert Berghaus wrote:
>>>>>> Weiß jemand, wie ich Default-Einstellungen für eine Tabe=
lle ä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 mitzug=
eben, aber das erscheint mir zu aufwendig für Perl.
>=20
> Hallo Robert,
>=20
> meine Lösung für dein Problem ist leider aufwändiger als=
gedacht. Hoffentlich kommt diese Antwort nicht zu spät für
> dich.
>=20
Nein. Zum einen ging es bei mir zunächst darum, ob das gewünsch=
te=20
mit Perl machbar ist (und es funktioniert sehr gut) und zum=20
anderen gehöre ich zu den Leuten, die auch fertige Programme noch=20
ändern, wenn ihnen eine andere Lösung besser gefällt. ;-)

> 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 =3D [([(undef) x 2]) x 3];
> $worksheet->write_row('F5', $b, $format);
> # geht ebenso mit $worksheet->write_col (das Rechteck wird gespiege=
lt)
>=20
> Jetzt die schlechte Nachricht: die write*-Methoden zeigen folgendes Ver=
halten:
> - vorhandene Zellwerte werden gelöscht
> - beim anschließenden Schreiben von Werten ohne Formatierung wir=
d 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.
>=20
Mit set_row geht es ausgezeichnet (set_column habe ich nicht=20
ausprobiert).

> Ich gehe davon aus, dass du ein Rechteck hast, in das du deine Werte sc=
hreibst (wobei auch Zellen leer bleiben), während
> dich alles außerhalb nicht interessiert. Wenn alle Zellen im Recht=
eck 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öre=
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ändlicher.
>=20
Die Zeilen gehen bis 171 (das dürfte auch fest bleiben) und die=20
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üssen:
[...]
Den Write-Handler brauche ich wohl nicht. Zur Zeit habe ich 3=20
Formate. Blöd ist nur, daß ich *meine* Defaultvorgaben bei jede=
m=20
Format einstellen muß.
Beispiel:
Ich setze in meinem Standard Format die Schriftart auf Courier und=20
belege das ganze Rechteck per set_row mit diesem Standard vor.=20
Wenn ich jetzt ein Datumsformat generiere, muß ich dort auch=20
wieder die Schriftart auf Courier setzen; sonst würde Arial=20
genommen (Grundeinstellung).

>> [..............]
>>
>> 3. Will ich doch versuchen, Argumente für 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üßte ich immer nachsehen, =
welches Format gesetzt wird.
>> Wenn der Empfänger der Tabelle diese ergänzt, ist (bei ander=
er Schriftart oder Größe) sofort zu sehen, wo ergänzt
>> wurde (das kann erwünscht sein, muß es aber nicht).
>=20
> Das verstehe ich nicht. Wenn du die Tabelle formatiert hast, wird das F=
ormat doch auch bei späteren Ergänzungen
> beachtet. Habe ich dein Problem falsch verstanden? :-(
>=20
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=20
mache, so wird wieder die Defaultformatierung genommen und nicht=20
meine vorgegebene (weil ich sie eben *nicht* vorgeben kann).
Wenn ich aber in format.pm in der sub new die Vorgaben ändere, so=20
wird die gesamte Tabelle auf diese Vorgabe gesetzt!

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



Schönen Gruß aus dem Bergischen Land
Robert