Letzte geschriebene Zeile von Excel Datei bekommen

moin moin,
ich hänge am nächsten Perl Problem

Mit dem Module Spreadsheet::WriteExcel schaffe ich es, eine Exceldatei anzulegen und was reinzuschreiben.
Mit Spreadsheet::stuck_out_tongue:arseExcel::SaveParser kann ich dat ding dann wieder öffnen und was neues reinschreiben.

Mein problem ist aktuell, dass ich die letzte geschriebenen Zeilen der existierenden excel Datei nicht herausbekomme.
Da ich aber so eine Art Log Datei schreiben will, muss ich halt immer hinter der letzte Zeile einen Eintrag machen.

Mit diesem Skript hier öffne ich die Datei:

 use strict;
 use Spreadsheet::stuck\_out\_tongue:arseExcel;
 use Spreadsheet::stuck\_out\_tongue:arseExcel::SaveParser;

 # Open the template with SaveParser
 my $parser = new Spreadsheet::stuck\_out\_tongue:arseExcel::SaveParser;
 my $template = $parser-&gt:stuck\_out\_tongue\_winking\_eye:arse('Log.xls');

 my $sheet = 0;
 my $row = 0;
 my $col = 0;

 # Get the format from the cell
 my $format = $template-\>{Worksheet}[$sheet]
 -\>{Cells}[$row][$col]
 -\>{FormatNo};

 # Write data to some cells
 $template-\>AddCell(0, $row, $col, 1, $format);
 $template-\>AddCell(0, $row+1, $col, "Hello", $format);

 # Add a new worksheet
 # $template-\>AddWorksheet('New Data');

 # The SaveParser SaveAs() method returns a reference to a
 # Spreadsheet::WriteExcel object. If you wish you can then
 # use this to access any of the methods that aren't
 # available from the SaveParser object. If you don't need
 # to do this just use SaveAs().
 #
 my $workbook;

 {
 # SaveAs generates a lot of harmless warnings about unset
 # Worksheet properties. You can ignore them if you wish.
 local $^W = 0;

 # Rewrite the file or save as a new file
 $workbook = $template-\>SaveAs('Log.xls');
 }

 # Use Spreadsheet::WriteExcel methods
 my $worksheet = $workbook-\>sheets(0);

 $worksheet-\>write($row+2, $col, "World2");

 $workbook-\>close();

_[MOD]:

-Tags hinzugefügt, bitte in Zukunft selbst machen_ 

Hallo,

$workbook = $template->SaveAs(‚Log.xls‘);
}

Use Spreadsheet::WriteExcel methods

my $worksheet = $workbook->sheets(0);

$worksheet->write($row+2, $col, „World2“);

$workbook->close();

Für mich sieht das so aus, als ob du erst speicherst und dann die zusätzlliche Zeile schreibst.

Übrigens würde ich Excel für Logdateien vermeiden, wenn es irgendwie geht :wink:

Grüße,
Moritz

mhh, habe die zeilen ja selber nur kopiert :wink:
aber es funktioniert. wenn ich ne excel datei wo schon was drin steht mit dem skript bearbeite, steht danach das alte plus das neue drin.

das mit excel als logdatei ist auch nicht meine idee. nur meine aufgabe :wink:

aber wie gesagt: das eigentlich problem ist vor dem schreiben herauszufinden, wo die erste leere zeile anfängt

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Für mich sieht das so aus, als ob du erst speicherst und dann
die zusätzlliche Zeile schreibst.

Übrigens würde ich Excel für Logdateien vermeiden, wenn es
irgendwie geht :wink:

Grüße,
Moritz

mhh, habe die zeilen ja selber nur kopiert :wink:

Als Programmierer entbindet dich das nicht der Aufgabe, selbst zu denken.

aber wie gesagt: das eigentlich problem ist vor dem schreiben
herauszufinden, wo die erste leere zeile anfängt

Das Beispiel hier: http://search.cpan.org/~szabgab/Spreadsheet-ParseExc… verwendet $sheet->{MaxRow}.

Falls das Objekt tatsächlich ein Spreadsheet::stuck_out_tongue:arseExcel-Dingsi ist sollte das gehen.

Grüße,
Moritz

Als Programmierer entbindet dich das nicht der Aufgabe, selbst
zu denken.

das ist wohl war :smile: Mein Problem ist, dass ich quasi vor 2 werktagen das erste mal Perlcode gesehen habe und darum mir nicht jeder codeschnipsel sofort vollkommen klar ist.

Das Beispiel hier:
http://search.cpan.org/~szabgab/Spreadsheet-ParseExc…
verwendet $sheet->{MaxRow}.

jo da haste recht. aber trotzdem komme ich nicht weiter :frowning:

ich versuche gerade folgende zeilen zu verstehen (EDIT: ok, sieht hier nicht wirklich schön aus, darum einfach das erste beispiel hinter dem link hier http://search.cpan.org/~szabgab/Spreadsheet-ParseExc…):
_______________
my $excel = Spreadsheet::stuck_out_tongue:arseExcel::Workbook-&gt:stuck_out_tongue_winking_eye:arse(‚Log.xls‘);
foreach $sheet (@{$excel->{Worksheet}}) {
printf(„Sheet: %s\n“, $sheet->{Name});
$sheet->{MaxRow} ||= $sheet->{MinRow};
foreach $row ($sheet->{MinRow} … $sheet->{MaxRow}) {
$sheet->{MaxCol} ||= $sheet->{MinCol};
foreach $col ($sheet->{MinCol} … $sheet->{MaxCol}) {
my $cell = $sheet->{Cells}[$row][$col];
if ($cell) {

printf("( %s , %s ) => %s\n", $row, $col, $cell->{Val});

printf($row);
printf($col);
}
}
}
}
_________________
Wenn ich die auf meine Excel Datei los lasse, kriege ich auch folgendes raus:
( 0 , 1 ) => 9999
sprich 0. zeile 1. spalte und den wert. das geht ja schon in die richtige richtung

wenn ich jetzt aber mir folgendes
$var = $sheet->{MaxRow};
in eine Variable speicher bricht perl den seitenaufbau ab. Jedenfalls bekomme ich ab dieser Zeile keine Ausgaben mehr.

jo, eigentlich finde ich die paar zeilen code da oben nicht so schwer zu verstehen, aber darum wundert es mich, warum der das $sheet->{MaxRow}; nicht mag…

EDIT
vor allem diese Zeile verstehe ich nicht:
$sheet->{MaxRow} ||= $sheet->{MinRow};

Hallo,

vor allem diese Zeile verstehe ich nicht:
$sheet->{MaxRow} ||= $sheet->{MinRow};

Objekte sind in Perl meistens spezielle Hashreferenzen. Auf deren Felder kannst du mit dem Pfeiloperator ->{…} zugreifen.

Diese Zeile liest also das Feld MaxRow aus $sheet aus, und falls es keinen wert hat ( das ist das ‚||‘) weist es den Wert von $sheet->{MinRow} diesem Hashelement zu.

Übrigens: wenn du hier code posten willst, dann bitte in pre-Tags:

 # dein Code hier

Ciao,
Moritz

Objekte sind in Perl meistens spezielle Hashreferenzen. Auf
deren Felder kannst du mit dem Pfeiloperator ->{…}
zugreifen.

Diese Zeile liest also das Feld MaxRow aus $sheet aus, und
falls es keinen wert hat ( das ist das ‚||‘) weist es den Wert
von $sheet->{MinRow} diesem Hashelement zu.

Schonmal vielen Dank für deine Hilfe!

Übrigens: wenn du hier code posten willst, dann bitte in
pre-Tags:

dein Code hier

Sowas habe ich gesucht bei meiner Antwort. Merk ich mir :wink:

mhh, aber wie kommt es denn, dass wenn der Interpreter die Zeile

 $var = $sheet-\>{MaxRow};

erreicht, die Seite nicht weiter aufgebaut wird? Wenn ich diese Zeile auskommentiere läuft das Skript durch.

ok, ich habs… endlich :smile:
lag wohl an meinen mangelnden perl kenntnissen :wink: hatte bei der zuweisung von $sheet nen fehler gemacht

so gehts:

 use strict;
 use Spreadsheet::stuck\_out\_tongue:arseExcel;

 my $excel = Spreadsheet::stuck\_out\_tongue:arseExcel::Workbook-&gt:stuck\_out\_tongue\_winking\_eye:arse("Log.xls");
 my $sheet = $excel-\>{Worksheet}[0];
 print $sheet-\>{MaxRow};