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

时间:2013-06-14 18:58:02

标签: perl excel ole excel-2013

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

1 个答案:

答案 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");