代码之家  ›  专栏  ›  技术社区  ›  Rini

如何从Perl或命令行激活Excel外接程序?

  •  4
  • Rini  · 技术社区  · 17 年前

    (请原谅我对Excel加载项的无知,并在适当的情况下随时更正我的术语。)

    我有一个经常使用的Excel加载项。此加载项插入带有多个按钮的工具栏。我想自动化在Excel中打开电子表格,然后“单击”其中一个按钮的任务。换句话说,我想使用Perl(或命令行)来激活这个外接程序的特定功能。

    我不能立即访问外接程序的源代码,但如果需要,我应该能够请求特定的信息,如过程名称。

    我不能将CPAN模块用于此任务,只能使用我的ActivePerl版本安装的模块,但我确实有 Win32::OLE 有助于其他办公自动化。

    有什么指针吗?

    3 回复  |  直到 17 年前
        1
  •  6
  •   Sinan Ünür    17 年前

    工具栏按钮是否有键绑定?

    如果有,可以使用sendkeys方法将该键发送到Excel: http://msdn.microsoft.com/en-us/library/aa202943(office.10).aspx

    或者, 命令栏 收集可能有用。见 http://msdn.microsoft.com/en-us/library/aa171356(office.11).aspx 供参考。

    下面的示例代码列出了“标准”工具栏中可见的命令栏和控件。当它找到带有标题的控件时 正常开放 ,它调用控件。这将显示“文件->打开”对话框:

    #!/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__
    

    高温高压

        2
  •  1
  •   Nifle Hassan Syed    17 年前

    我不知道你怎么点击这些按钮。
    但我可能有个解决办法。如果您可以在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

        3
  •  1
  •   Michael Carman    17 年前

    我认为您在win32::ole中走对了。我过去用它来自动处理Excel。我不认为OLE能让你访问图形用户界面元素(例如激活按钮),所以你可能需要知道工具栏是否支持OLE以及界面是什么。

    我能想到的另一种选择是尝试通过编程控制鼠标来实际单击按钮。这假设您运行的是Excel可见的OLE(不一定是这样),并创建了计算如何定位光标的困难情况。如果可以选择的话,OLE会简单得多。

    推荐文章