尝试从单独的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:\Users\s.mailappan\Desktop\Test>
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();
答案 0 :(得分:1)
正如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");