Perl Excel OLE error opening different files from two scripts simultanesouly

1

Trying to open and write data into two different excel files from separate perl scripts but simultaneously.

It doesn't throw any error if run one after other. But while running simultaneously it one of the script terminates with following error.

 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 script-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();
perl
excel
ole
excel-2013
asked on Stack Overflow Jun 14, 2013 by Siva • edited Jun 14, 2013 by Siva

1 Answer

1

As hinted by stenci - instead of using Win32::OLE->GetActiveObject, using Win32::OLE->new works as defined below.

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");
answered on Stack Overflow Nov 5, 2013 by Siva

User contributions licensed under CC BY-SA 3.0