2009-06-02 3 views
4

(Bitte verzeihen Sie meine Unwissenheit über Excel-Add-Ins, und fühlen Sie sich frei, meine Teminologie zu korrigieren, wo angemessen.)Wie kann ich ein Excel-Add-In von Perl oder der Befehlszeile aus aktivieren?

Ich habe ein Excel-Add-in, das regelmäßig verwendet wird. Dieses Add-In fügt eine Symbolleiste mit einer Anzahl von Schaltflächen ein. Ich möchte die Aufgabe automatisieren, eine Tabelle in Excel zu öffnen und dann auf eine dieser Schaltflächen "zu klicken". Mit anderen Worten, ich möchte Perl (oder die Befehlszeile) verwenden, um eine bestimmte Funktion dieses Add-Ins zu aktivieren.

Ich habe keinen direkten Zugriff auf den Quellcode für das Add-In, aber ich sollte in der Lage sein, spezifische Informationen wie Prozedurnamen anzufordern, falls erforderlich.

Ich kann nicht CPAN-Module für diese Aufgabe verwenden — nur das, was mit meiner Version von ActivePerl — installiert ist, aber ich Win32::OLE haben, die für andere Büroautomatisierung hilfreich waren.

Irgendwelche Zeiger?

Antwort

6

Gibt es eine Tastenbindung für die Symbolleistenschaltfläche?

Wenn ja, könnten Sie die Sendkeys-Methode verwenden, diesen Schlüssel zu Excel senden: http://msdn.microsoft.com/en-us/library/aa202943(office.10).aspx

Alternativ kann die Command Sammlung nützlich sein könnte. Siehe http://msdn.microsoft.com/en-us/library/aa171356(office.11).aspx als Referenz.

Der folgende Beispielcode enthält die sichtbaren Befehlsleisten und die Steuerelemente in der Symbolleiste 'Standard'. Wenn es ein Steuerelement mit der Beschriftung Öffnen findet, ruft es das Steuerelement auf. Dies sollte die "Datei -> Öffnen" anzuzeigen Dialog:

#!/usr/bin/perl 

use strict; 
use warnings; 

use Win32::OLE qw(in with); 
$Win32::OLE::Warn = 3; 

my $app = get_excel(); 
$app->{Visible} = 1; 

my $book = $app->Workbooks->Add; 

for my $bar (in $app->CommandBars) { 
    if ($bar->{Visible}) { 
     print $bar->{Name}, "\n"; 
    } 
} 

print "Controls in the 'Standard' toolbar:\n"; 

my $bar = $app->CommandBars->{Standard}; 
for my $control (in $bar->{Controls}) { 
    print "\t", $control->{Caption}, "\n"; 
    if ($control->{Caption} =~ /^Open/) { 
     print "opening ...\n"; 
     $control->Execute; 
    } 
} 

sub get_excel { 
    my $excel; 
    eval { 
     $excel = Win32::OLE->GetActiveObject('Excel.Application'); 
    }; 

    die "[email protected]\n" if [email protected]; 

    unless(defined $excel) { 
     $excel = Win32::OLE->new('Excel.Application', sub { $_[0]->Quit }) 
      or die "Oops, cannot start Excel: ", 
        Win32::OLE->LastError, "\n"; 
    } 
    return $excel; 
} 

__END__ 

HTH

+0

Genius - danke, danke! – Rini

+0

Gern geschehen. Ich habe viel gelernt, während ich diese Frage erforscht habe. –

1

Ich weiß nicht, wie Sie eine dieser Schaltflächen klicken würden.
Aber ich könnte einen Workaround haben. Wenn Sie ein Makro in Excel erstellen können, drücken Sie die Schaltfläche, die das Makro von Perl aufruft.

Nicht getestet!

#!c:\perl\bin\ 
use strict; 

use Win32::OLE qw(in with); 
use Win32::OLE::Const 'Microsoft Excel'; 
use Win32::OLE::Variant; 
use Win32::OLE::NLS qw(:LOCALE :DATE); 

$Win32::OLE::Warn = 3; # Die on Errors. 

my $excelfile = $path_to_exelfile_with_macro; 

my $Excel = Win32::OLE->GetActiveObject('Excel.Application') 
     || Win32::OLE->new('Excel.Application', 'Quit'); 

my $Book = $Excel->Workbooks->Open($excelfile); 

$Excel->Run($MacroName); 

Weitere Tipps bei http://www.perlmonks.org/?node_id=153486

1

ich glaube, Sie auf dem richtigen Weg sind innerhalb Win32 :: OLE. Ich habe es verwendet, um das Arbeiten mit Excel in der Vergangenheit zu automatisieren. Ich glaube nicht, dass OLE Ihnen Zugriff auf GUI-Elemente gewährt (z. B. das Aktivieren eines Tastendrucks), so dass Sie wahrscheinlich herausfinden müssen, ob die Symbolleiste OLE unterstützt und nicht, was die Schnittstelle ist.

Die andere Alternative, die ich denken kann, wäre zu versuchen, die Maus programmgesteuert zu steuern, um tatsächlich auf die Schaltfläche zu klicken. Das setzt voraus, dass Sie OLE mit Excel ausführen (das muss nicht sein), und erstellt die schwierige Situation, herauszufinden, wie der Cursor positioniert wird. OLE wäre viel einfacher, wenn es eine Option ist.

Verwandte Themen