Как активировать надстройку Excel из Perl или из командной строки? - PullRequest
4 голосов
/ 02 июня 2009

(Пожалуйста, прости меня за незнание надстроек Excel и не стесняйтесь исправлять мою терминологию, где это уместно.)

У меня есть надстройка для Excel, которая используется регулярно. Эта надстройка вставляет панель инструментов с несколькими кнопками. Я хочу автоматизировать задачу открытия электронной таблицы в Excel, а затем «нажать» одну из этих кнопок. Другими словами, я хочу использовать Perl (или командную строку) для активации определенной функции этой надстройки.

У меня нет немедленного доступа к исходному коду надстройки, но я должен иметь возможность запрашивать определенную информацию, такую ​​как имена процедур, если требуется.

Я не могу использовать модули CPAN для этой задачи - только то, что установлено с моей версией ActivePerl - но у меня есть Win32 :: OLE , которая была полезна для автоматизации других Office.

Есть указатели?

Ответы [ 3 ]

6 голосов
/ 03 июня 2009

Есть ли привязка клавиш для кнопки панели инструментов?

Если есть, вы можете использовать метод SendKeys для отправки этого ключа в Excel: http://msdn.microsoft.com/en-us/library/aa202943(office.10).aspx

В качестве альтернативы может быть полезна коллекция CommandBars . См. http://msdn.microsoft.com/en-us/library/aa171356(office.11).aspx для справки.

В приведенном ниже примере кода перечислены видимые панели команд и элементы управления на стандартной панели инструментов. Когда он находит элемент управления с заголовком Open , он вызывает элемент управления. Это должно отобразить диалоговое окно «Файл -> Открыть»:

#!/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 "$@\n" if $@;

    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__

НТН

1 голос
/ 02 июня 2009

Я думаю, что вы находитесь на правильном пути в Win32 :: OLE. Я использовал его для автоматизации работы с Excel в прошлом. Я не верю, что OLE дает вам доступ к элементам графического интерфейса пользователя (например, активация нажатия кнопки), поэтому вам, вероятно, потребуется выяснить, поддерживает ли панель инструментов OLE и каков интерфейс.

Другая альтернатива, которую я могу придумать, это попытаться программно управлять мышью, чтобы фактически нажать кнопку. Это предполагает, что вы запускаете OLE с видимым Excel (это не обязательно должно быть), и создает сложную ситуацию для выяснения, как позиционировать курсор. OLE был бы намного проще, если бы это было возможно.

1 голос
/ 02 июня 2009

Я не знаю, как бы вы поступили, нажав одну из этих кнопок.
Но у меня может быть обходной путь. Если вы можете создать макрос в Excel, нажмите кнопку, вызывая этот макрос из perl.

Непроверено!

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

Дополнительные советы на http://www.perlmonks.org/?node_id=153486

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...