Schrift
[thread]7939[/thread]

Excel und Win32::OLE --> Spaltenbreite und Sortier

Leser: 1


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Teutales
 2006-05-03 17:21
#65529 #65529
User since
2006-03-21
47 Artikel
BenutzerIn
[default_avatar]
Hallo, folgende Funktion ist erfolgreich im Einsatz, allerdings würde ich gerne die Spalte C breiter machen und nach Spalte A sortieren. Leider habe ich keine Dokumention gefunden, aus der das hervorgeht. Kann mir jemand nen Tip geben? Danke schonmal!

Code: (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
41
42
43
44
45
46
47
48
49
sub createExcel {

# Lokale Variaben:
my @toDo = @_;
my $EVAL_ERROR;
my $excel;
my $book;
my $sheet;

showLine();
print "FUNCTION createExcel\n";

print "Try to open Excel.\n";

# falls Instanz von Excel schon läuft benutze diese:
eval {$excel = Win32::OLE->GetActiveObject('Excel.Application')};
return 1 if $EVAL_ERROR;

#wenn $excel noch nichts zugewiesen starte Excel:
unless (defined $excel) {
$excel = Win32::OLE->new('Excel.Application') #, sub {$_[0]->Quit;}
or return 1;
}
print "Excel ok.\n";

# Excel sichtbar/unsichtbar machen
$excel->{Visible} = 1;

# Erzeuge leere Tabelle:
$book = $excel->Workbooks->Add;
$sheet = $book->Worksheets(1);

print "Write to File. \n";

my $length = @toDo;
if ($length eq 0) {
$sheet->Cells(1,1)->{Value} = "Keine passenden Einträge gefunden!";
}
else {
for (my $i=0; $i<$length; $i++) {
$sheet->Cells($i+1,1)->{Value} = $toDo[$i][0];
$sheet->Cells($i+1,2)->{Value} = $toDo[$i][3];
$sheet->Cells($i+1,3)->{Value} = $toDo[$i][1];
$sheet->Cells($i+1,4)->{Value} = $toDo[$i][2];
$sheet->Cells($i+1,5)->{Value} = $toDo[$i][4];
}
}
return 0;
}
renee
 2006-05-03 19:47
#65530 #65530
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Die entscheidenden Tipps sind in diesem Artikel enthalten: http://www.ngbdigital.com/perl_ole_excel.html

Aus dem Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
# Resize Columns
my @columnheaders = qw(A:B);
foreach my $range(@columnheaders){
$Sheet->Columns($range)->AutoFit();
}
# Order Rows
$tmp = "$mylastcol2".'3';
$Rangea = $Sheet->Range("$tmp");
$Rangeb = $Sheet->Range("a3");
$Excel->Selection->Sort({Key1 => $Rangea,
Order1 => xlDescending,
Key2 => $Rangeb});
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Teutales
 2006-05-03 23:12
#65531 #65531
User since
2006-03-21
47 Artikel
BenutzerIn
[default_avatar]
fett! danke! werds morgen gleich mal austesten!
Teutales
 2006-05-04 12:54
#65532 #65532
User since
2006-03-21
47 Artikel
BenutzerIn
[default_avatar]
[quote=renee,03.05.2006, 17:47]Die entscheidenden Tipps sind in diesem Artikel enthalten: http://www.ngbdigital.com/perl_ole_excel.html

Aus dem Code:
Code: (dl )
1
2
3
4
5
6
7
# Order Rows
$tmp = "$mylastcol2".'3';
$Rangea = $Sheet->Range("$tmp");
$Rangeb = $Sheet->Range("a3");
$Excel->Selection->Sort({Key1 => $Rangea,
Order1 => xlDescending,
Key2 => $Rangeb});
[/quote]
Das mit der Breite anpassen klappt wunderbar. Vielen Dank für den Tip! Bezüglich der Sortierung steh ich leider etwas auf dem Schlauch...
Hab ich den Code richtig verstanden:
Code: (dl )
1
2
3
$Excel->Selection->Sort({Key1 => $Rangea,
Order1 => xlDescending,
Key2 => $Rangeb});

mit $Rangea = d3; (je nachdem wieviele Spalten es gibt)
mit $Rangeb = a3; (fest)
Warum immer 3? Ich bekomme die Fehlermeldung: "Die Sort-Eigenschaft des Range-Objectes kann nicht zugeordnet werden." Ich würde gern über Spalte B von 1 bis z.b. 100 sortieren.
renee
 2006-05-04 14:59
#65533 #65533
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann probier es doch einfach mal aus mit
Code: (dl )
1
2
3
4
5
6
my $Rangea = 'B1';
my $Rangeb = 'B100';

$Excel->Selection->Sort({Key1 => $Rangea,
Order1 => xlDescending,
Key2 => $Rangeb});
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Teutales
 2006-05-04 16:17
#65534 #65534
User since
2006-03-21
47 Artikel
BenutzerIn
[default_avatar]
Sorry, hab ich natürlich auch ausprobiert, nur nicht erwähnt. Es kommt die oben erwähnte Fehlermeldung (OLE-Exception): "Die Sort-Eigenschaft des Range-Objectes kann nicht zugeordnet werden."
Strat
 2006-05-04 19:36
#65535 #65535
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
in einem meiner Codes funktionierts auf folgende Weise problemlos:
Code: (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
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';

use vars qw($Excel);

# use existing instance if Excel is already running
eval {
$Excel = Win32::OLE->GetActiveObject('Excel.Application');
};
if ($@) {
die "Error: excel is not installed\n";
} # if

unless (defined $Excel) {
$Excel = Win32::OLE->new('Excel.Application', sub { $_[0]->Quit } )
or die "Error: can't start Excel\n";
} # unless

my $workbook = $Excel->Workbooks->open($excelFile);
my $sheet = $workbook->Worksheets(1);

my $row = 100;
$sheet->Range("A2:L$row")
->Sort(
{
Key1 => $sheet->Range('e2'),
Key2 => $sheet->Range('c2'),
Key3 => $sheet->Range('d2'),
Order1 => xlAscending,
Order2 => xlAscending,
Order3 => xlAscending,
}
);

sortiert den bereich von A2:L100 nach den spalten e,c,d

(Das $Excel habe ich global, weil ich mit dem Script einige tausend Exceldateien erstelle, und da Excel nicht immer wieder beenden und neu starten will)\n\n

<!--EDIT|Strat|1146757141-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Teutales
 2006-05-05 13:35
#65536 #65536
User since
2006-03-21
47 Artikel
BenutzerIn
[default_avatar]
Ha, jetzt hab ich den Fehler: Wegen "use strict;" habe ich
Code: (dl )
Order1 => 'xlAscending',
schreiben müssen. Durch Deaktivierung von strict konnte ich die Hochkommas weglassen, jetzt läufts...
Kann ich dies nicht mit strict lösen?
Hat jemand schonmal mit FreezePane gearbeitet? Würde gerne die erste Reihe "freezen"!\n\n

<!--EDIT|Teutales|1146825004-->
renee
 2006-05-05 15:30
#65537 #65537
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hattest Du auch diese Zeile drin:
Code: (dl )
use Win32::OLE::Const 'Microsoft Excel';
Wenn ja, sollte es auch mit strict gehen, wenn nein, dann ist klar, warum es nicht geht...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Relais
 2006-05-05 15:34
#65538 #65538
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Teutales,05.05.2006, 11:35]Ha, jetzt hab ich den Fehler: Wegen "use strict;" habe ich
Code: (dl )
Order1 => 'xlAscending',
schreiben müssen. Durch Deaktivierung von strict konnte ich die Hochkommas weglassen, jetzt läufts...
Kann ich dies nicht mit strict lösen?[/quote]
Was genau gibt es da denn zu lösen?

Die Werte in Deinem Hash mußt Du quoten, wenn sie nicht rein numerisch sind, daher hast Du die Wahl zwischen Hochkommata -'- und Gänsefüßchen -"-.

Quotest Du nicht, dann versteht Perl das "nackte Wort" als Bareword. Wenn es eine Subroutine oder Funktion gleichen Namens gibt, wird diese Wort durch deren Rückgabewert ersetzt.

Ein Perl-Feature, daß nicht immer erwünscht ist, daher sollte man schon use strict; verwenden.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2006-05-03 17:21.