尝试从单独的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");