Perl Excel OLE错误,同时打开两个脚本的不同文件



尝试从单独的perl脚本打开和写入数据到两个不同的excel文件,但同时

如果一个接一个运行,它不会抛出任何错误。但是,当同时运行时,其中一个脚本以以下错误终止:

 entering 
 No Error 
 excel new created! 
 Win32::OLE(0.1709) error
 0x8001010a: "The message filter indicated that the application is
 busy"
   in METHOD/PROPERTYGET "Workbooks" at TwoExcelFiles.pl line 29. came out. sleeping 20 C:Userss.mailappanDesktopTest>
Perl script-1:

# ================
# Modules Required
# ================
use Win32::OLE qw(in with);                 # OLE Automation extensions
use Win32::OLE::Const 'Microsoft Excel';    # Extract constant definitions from TypeLib
use Cwd;                                    # Get pathname of current working directory
use File::Copy;                             # Copy files or filehandles
$Win32::OLE::Warn = 3;
    # Open Excel application
    # my $Excel2 = Win32::OLE->GetActiveObject('Excel.Application')
     # || Win32::OLE->new( 'Excel.Application', 'Quit' );
    # use existing instance if Excel is already running
    printf "nentering";
        eval {$Excel2 = Win32::OLE->GetActiveObject('Excel.Application');printf "nNo Error";};
        die "Excel not installed" if $@;
        printf "nexcel new created!";
        unless (defined $Excel2) {
        printf "ncreating new excel on file-2";
            $Excel2 = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
                    or die "Oops, cannot start Excel";
        }
        printf "ncame out. sleeping 20";
    # Open workbook
    # my $Book1 = $Excel2->Workbooks->Open("C:\Users\s.mailappan\Desktop\Test\CoreNetwork_Master_Excel_WSS_Oma.xlsx");
    my $Book2 = $Excel2->Workbooks->Open("C:\Users\s.mailappan\Desktop\Test\CoreNetwork_Master_Excel_WSS_Che.xlsx");
    # $Book1->Save;
    # $Book1->Close();
    $Book2->Save;
    $Book2->Close();
    sleep(20);
    printf "nsleep done";
    $Excel2->Quit();
Perl脚本2:

# ================
# Modules Required
# ================
use Win32::OLE qw(in with);                 # OLE Automation extensions
use Win32::OLE::Const 'Microsoft Excel';    # Extract constant definitions from TypeLib
use Cwd;                                    # Get pathname of current working directory
use File::Copy;                             # Copy files or filehandles
$Win32::OLE::Warn = 3;
    # Open Excel application
    # my $Excel1 = Win32::OLE->GetActiveObject('Excel.Application')
     # || Win32::OLE->new( 'Excel.Application', 'Quit' );
    # use existing instance if Excel is already running
    printf "nentering";
        eval {$Excel1 = Win32::OLE->GetActiveObject('Excel.Application');printf "nNo Error";};
        die "Excel not installed" if $@;
        printf "nexcel new created!";
        unless (defined $Excel1) {
        printf "ncreating new excel on file-2";
            $Excel1 = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
                    or die "Oops, cannot start Excel";
        }
        printf "ncame out. sleeping 20";
    # Open workbook
    my $Book1 = $Excel1->Workbooks->Open("C:\Users\s.mailappan\Desktop\Test\CoreNetwork_Master_Excel_WSS_Oma.xlsx");
    # my $Book2 = $Excel1->Workbooks->Open("C:\Users\s.mailappan\Desktop\Test\CoreNetwork_Master_Excel_WSS_Che.xlsx");
    $Book1->Save;
    $Book1->Close();
    # $Book2->Save;
    # $Book2->Close();
    sleep(20);
    printf "nsleep done";
    $Excel1->Quit();

正如stenci所暗示的那样-使用Win32::OLE->GetActiveObject代替Win32::OLE->GetActiveObject,使用Win32::OLE->new works如下所定义。

unless (defined $Excel1_Parse4G) {
  $Excel1_Parse4G = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
  or die "Oops, cannot start Excel";
}   
my $Book1 = $Excel1_Parse4G->Workbooks->Open("C:\pathfile1.xls");
unless (defined $Excel2_Parse4G) {
  $Excel2_Parse4G = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
  or die "Oops, cannot start Excel";
}   
my $Book2 = $Excel2_Parse4G->Workbooks->Open("C:\pathfile2.xls");

最新更新