2009-06-02 14 views
4

(S'il vous plaît pardonner mon ignorance sur les compléments Excel, et n'hésitez pas à corriger ma méthodologie le cas échéant.)Comment puis-je activer un complément Excel à partir de Perl ou de la ligne de commande?

J'ai un add-in Excel qui est utilisé régulièrement. Ce complément insère une barre d'outils avec un certain nombre de boutons. Je veux automatiser la tâche d'ouverture d'une feuille de calcul dans Excel, puis en cliquant sur l'un de ces boutons. En d'autres termes, je veux utiliser Perl (ou la ligne de commande) pour activer une fonction particulière de ce complément.

Je n'ai pas d'accès immédiat au code source pour le complément, mais je devrais être en mesure de demander des informations spécifiques telles que les noms de procédure si nécessaire.

Je ne peux pas utiliser des modules CPAN pour cette tâche — que ce qui est installé avec ma version de ActivePerl — mais j'ai Win32::OLE, qui a été utile pour d'autres bureautique.

Des pointeurs?

Répondre

6

Y at-il une liaison de touche pour le bouton de la barre d'outils?

S'il y a, vous pouvez utiliser la méthode SendKeys pour envoyer cette clé vers Excel: http://msdn.microsoft.com/en-us/library/aa202943(office.10).aspx

Alternativement, la CommandBars collection pourrait être utile. Voir http://msdn.microsoft.com/en-us/library/aa171356(office.11).aspx pour référence.

L'exemple de code ci-dessous répertorie les barres de commande visibles et les contrôles dans la barre d'outils 'Standard'. Lorsqu'il trouve un contrôle avec la légende Ouvrir, il appelle le contrôle. Cela devrait afficher le "Fichier -> Ouvrir" dialogue:

#!/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 - merci, merci! – Rini

+0

Vous êtes les bienvenus. J'ai beaucoup appris en faisant des recherches sur cette question. –

1

Je ne sais pas comment vous pourriez cliquer sur l'un de ces boutons.
Mais je pourrais avoir une solution de contournement. Si vous pouvez créer une macro dans Excel pour appuyer sur le bouton appelant cette macro de Perl est possible.

Untested!

#!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); 

Plus de conseils à http://www.perlmonks.org/?node_id=153486

1

Je pense que vous êtes sur la bonne voie au sein de OLE Win32. Je l'ai utilisé pour automatiser le travail avec Excel par le passé. Je ne crois pas que OLE vous donne accès aux éléments de l'interface graphique (par exemple en activant une pression sur un bouton), vous aurez donc probablement besoin de savoir si la barre d'outils prend en charge OLE et quelle est l'interface.

L'autre alternative que je peux penser serait d'essayer de contrôler par programmation la souris pour réellement cliquer sur le bouton. Cela suppose que vous exécutez OLE avec Excel visible (il ne doit pas être) et crée la situation difficile de déterminer comment positionner le curseur. OLE serait beaucoup plus simple si c'est une option.