merrymonk has asked for the wisdom of the Perl Monks concerning the following question:

Attached is text code to illustrate problems I am having opening Excel workbooks. I am using Office 2007.
The text code tries to open and save two different spreadsheets.
If a spreadsheet is open on the system I frequently get the message
Can't call method "Add" on an undefined value at ….. at line 41.
The code at 41 is
$$ref_workbook = $$ref_excel -> Workbooks -> Add;
The following two previous message seem to indicare that theExcel object has been created successfully.
open_spreadsheet_for_excel_write Excel installation test passed
open_spreadsheet_for_excel_write after excel result <1> excel <Win32::OLE=HASH(0x1995540)> message <>
If a spreadsheet is not open, I sometimes get the same error message when trying to open the second spreadsheet.
This code is extracted from an application where I need to write two different spreadsheets.
If I try to do this without closing the application I find that
Opening the first spreadsheet always works
I frequently get the second error message when opening the second spreadsheet.
Can anyone explain how to cure this temperamental behavior?
use strict; use Win32; use OLE; use Win32::OLE::Const "Microsoft Excel"; my ($excel2, $workbook2, $sheet2, $excel_open_res); my ($excel, $workbook, $sheet, $close_res); #================================================================== # # open spredsheet_for_excel_write # # this opens a new spredshert # #================================================================== sub open_spreadsheet_for_excel_write($$$$) { my ($ref_excel, $ref_workbook, $ref_sheet, $ref_excel_res) = @_; my ($ew_obj_message, $err_dialog, $err_ans, $ew_message); $ew_obj_message = ''; eval { $$ref_excel = Win32::OLE->GetActiveObject( 'Excel.Application' +) }; if( $@ ) { $ew_obj_message = "[open_spreadsheet_for_excel_write] Error: no E +xcel installed - message <$@>\n"; if(defined($main::mw_Main)) { $err_dialog = $main::mw_Main->Dialog( -title => "Excel Installation Failure", -text => $ew_obj_message, -bitmap => 'error', -default_button => 'OK', -buttons => ['OK']); $err_ans = $err_dialog->Show(); } } else { print "[open_spreadsheet_for_excel_write] Excel installation test +passed\n"; } unless( defined $$ref_excel ) { # if not running, start it $$ref_excel = Win32::OLE->new('Excel.Application', 'Quit') or ($$r +ef_excel_res = 0, $ew_message = "Could not create excel object"); } else { $$ref_excel_res = 1; } print "[open_spreadsheet_for_excel_write] after excel result <$$ref_ex +cel_res> excel <$$ref_excel> message <$ew_message>\n"; #___ ADD NEW WORKBOOK $$ref_workbook = $$ref_excel -> Workbooks -> Add; $$ref_sheet = $$ref_workbook -> Worksheets("Sheet1"); $$ref_sheet -> {Name} = "Raw Costs"; print "[open_spreadsheet_for_excel_write] workbook <$$ref_workbook> sh +eet <$$ref_sheet>\n"; $$ref_sheet -> Activate; } # main # # open spreadsheet first time open_spreadsheet_for_excel_write(\$excel, \$workbook, \$sheet, \$excel +_open_res); $workbook -> SaveAs ("C:\\exc1.xlsx"); $close_res = $workbook->Close(); print "[main] A close result <$close_res>\n"; $excel -> Quit; # open spreadsheet second time open_spreadsheet_for_excel_write(\$excel2, \$workbook2, \$sheet2, \$ex +cel_open_res); $workbook2 -> SaveAs ("C:\\exc2.xlsx"); $close_res = $workbook2->Close(); print "[main] B close result <$close_res>\n"; $excel -> Quit;

Replies are listed 'Best First'.
Re: Open Excel Spreadsheets Problem
by jethro (Monsignor) on Jun 10, 2010 at 11:45 UTC

    Small suggestion: Before that line add a line that dumps $ref_excel (and the other reference vars) with Data::Dumper. Compare the first (successfully opened) sheet with the one that failed