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

试图打开和写入数据到两个不同的Excel文件,而不同的Perl脚本, 但同时

它不会抛出任何错误,如果一个接一个地运行。 但在同时运行时,脚本的一个终止会出现以下错误。

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:\Users\s.mailappan\Desktop\Test> 

Perl脚本-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->新的作品定义如下。

 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:\\path\file1.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:\\path\file2.xls");