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

Hi All,

While I am trying to access a data from a table in MsWord document using Perl an internal beep is generating. Please tell me how to resolve this issue. The program is::

package ReadingTR; #use strict; #use warnings; use Carp; use Cwd 'abs_path'; use Win32::OLE; #use Win32::OLE qw(in with); #use Win32::OLE::Variant; use Win32::OLE::Const 'Microsoft Word'; use Win32::OLE::Const 'Microsoft Excel'; $searchdir = $ARGV[0]; $TotalPath; #print "1 --- $searchdir\n"; $val = opendir(SEARCHDIRH ,"$searchdir") or croak "die1 - $!"; #print "6 -- $val\n"; while($filedir = readdir SEARCHDIRH) { # print "2---- $filedir\n"; $tempsearch = $searchdir.qq{/}; # print "3 --- $tempsearch\n"; next if ($filedir eq qq{.}); next if ($filedir eq qq{..}); if(($TotalPath = ($tempsearch.$filedir)) =~ m/\.doc/gix) { print "4 --- $TotalPath\n"; $abs= abs_path($TotalPath); $abs =~ s/\//\\/xg; print $abs."\n"; &Word_Func($abs); } else { $TotalPath = $searchdir."/".$filedir; print "7--- $TotalPath\n"; } } sub Word_Func { my $TotalPath = shift; #print "5--------$TotalPath\n"; $Word = CreateObject Win32::OLE 'Word.Application' || croak $!; $Word->{'Visible'} = 1; $Word->{DisplayAlerts} = 1; $Word->Documents->Open("$TotalPath") || croak"Unable to open $TotalPat +h --- Win32::OLE->LastError()"; $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OL +E->new('Excel.Application'); $Excel->{'Visible'} = 1; #0 is hidden, 1 is visible $Excel->{DisplayAlerts}=1; #0 is hide alerts $filename = "D:/OLE Progs/Test.xls"; #Create New Book $workbook = $Excel->Workbooks->Add(); $Excel->{SheetsInNewWorkBook} = 3; $worksheet1 = $workbook->Worksheets(1); $worksheet2 = $workbook->Worksheets(2); $worksheet3 = $workbook->Worksheets(3); #Naming the sheets $worksheet1->{Name} = "ProjectInfo"; $worksheet2->{Name} = "ChkListTable"; $worksheet3->{Name} = "FindingsListTable"; # get the first table my $table1 = $Word->ActiveDocument->Tables(1); # get the Second table my $table2 = $Word->ActiveDocument->Tables(2); # get the Third table my $table3 = $Word->ActiveDocument->Tables(3); for($i = 1; $i<7;$i++) { $text1 = $table1->Cell($i,1)->Range->{Text}; #Entering a value into cell $worksheet1->Range("A$i")->{Value} = "$text1"; } for($j=2;$j<10;$j++) { $Msg = $table2->Cell($j,2)->Range->{Text}; $Msg1 = $table2->Cell($j,3)->Range->{Text}; $text2 = $table2->Cell($j,4)->Range->{Text}; # print "$Msg1\n$text2\n"; if($Msg1 eq $text2) { $worksheet2->Range("A$j")->{Value} = "$Msg"; $worksheet2->Range("C$j")->{Value} = "Matched"; } elsif($Msg1 ne $text2) { $worksheet2->Range("A$j")->{Value} = "$Msg"; $worksheet2->Range("C$j")->{Value} = "NotMatched"; } } for($k=2;$k<4;$k++) { $Msg2 = $table3->Cell($k,1)->Range->{Text}; $text3 = $table3->Cell($k,2)->Range->{Text}; if($Msg2 eq $text3) { $worksheet3->Range("A$k")->{Value} = "$Msg2"; $worksheet3->Range("B$k")->{Value} = "$text3"; $worksheet3->Range("C$k")->{Value} = "Matched"; } elsif($Msg2 ne $text3) { $worksheet3->Range("A$k")->{Value} = "$Msg2"; $worksheet3->Range("B$k")->{Value} = "$text3"; $worksheet3->Range("C$k")->{Value} = "NotMatched"; } } print "Closing Document And Word\n"; $Word->ActiveDocument->Close(); $Word->Quit; return; } 1;

Replies are listed 'Best First'.
Re: How to resolve the sound error while executing this program?
by CountZero (Bishop) on Mar 17, 2012 at 10:44 UTC
    Please put your code inside of <code> ... </code> tags.

    When exactly happens the beep? Try to reduce your program to the least number of lines that still show the problem and then tell tell us at which line the beep happens.

    CountZero

    A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

    My blog: Imperial Deltronics
Re: How to resolve the sound error while executing this program?
by marto (Cardinal) on Mar 17, 2012 at 14:05 UTC

    Welcome, before responding your question I'd like to point out that the formatting of your post could be better. Formatting advice is displayed when posting, but in case you missed it see the start if How do I post a question effectively?. If you have the time PerlMonks for the Absolute Beginner is also worth reading. Not a huge deal, but the easier you make it for people to help you, the more likely they are to do so.

    On to the problem at hand. Is the beep the only thing you're having problems with? If I recall correctly (please let me know if this is wrong) DisplayAlerts may be what you want to disable. You could quickly test this by substituting the following lines in your code:

    $Word->{DisplayAlerts} = 1; to $Word->{DisplayAlerts} = 0;

    and

    $Excel->{DisplayAlerts}=1; to $Excel->{DisplayAlerts}=0;

    Unfortunately I currently don't have access to a Windows environment with these applications available for testing.

      Hi,

      Thanks for suggestion but its no working. Here is a simple code

      use warnings; use strict; # we are going be working with MS Word Objects use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; use Win32::OLE::Variant; $word->{Displayalerts} = 0; my $text = ""; my $directory = "foo"; opendir (DH, $directory) || die "can't opendir $directory: $!"; # we are working with Word application my $Word = Win32::OLE->new('Word.Application', 'Quit'); my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); my $excelfile = "E:\\assin\\foo\\sample.xlsx"; my $root = "E:\assin\foo"; my $doc = "E:\\assin\\foo\\Functional.doc"; $Word->Documents->Open("$doc") || die("Unable to open +$doc ", Win32::OLE->LastError()); $Word->{Visible}= 0; # we don't need to see Word in an + active window my $Book = $Excel->Workbooks->Open($excelfile); my $Sheet = $Book->Worksheets(1); my $row; my $col; my @text; # get the first table my $table = $Word->ActiveDocument->Tables(1); for($row=1;$row<3;$row++) { for($col=1;$col<3;$col++) { my $text = $table->Cell($row,$col)->Range->{Text}; $Sheet->Cells($row,$col)->{'Formula'}=$text; } closedir DH;

        Thanks for the correct formatting, this makes it much easier for people to read your code. I can see right away that this script isn't going to run properly. If you cut your example down to just:

        use warnings; use strict; # we are going be working with MS Word Objects use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; use Win32::OLE::Variant; $word->{Displayalerts} = 0;

        And run it you'lll see:

        Global symbol "$word" requires explicit package name at strict.pl line + 8. Execution of strict.pl aborted due to compilation errors.

        Basically, you've done this before you've created your Word OLE instance. So move this line to after declaring $Word. Also variable names are case sensitive. You have $word->{Displayalerts} = 0; but the word object is $Word. I've reworked the code so far, removed some blank lines:

        use warnings; use strict; # we are going be working with MS Word Objects use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Excel'; use Win32::OLE::Variant; my $text = ""; my $directory = "c:\\"; opendir (DH, $directory) || die "can't opendir $directory: $!"; # we are working with Word application my $Word = Win32::OLE->new('Word.Application', 'Quit'); $Word->{Displayalerts} = 0; # hide alerts $Word->{Visible}= 0; # we don't need to see Word in an active window my $Excel = Win32::OLE->GetActiveObject('Excel.Application') || Win32::OLE->new('Excel.Application', 'Quit'); $Excel->{Displayalerts} = 0; # hide alerts my $excelfile = "E:\\assin\\foo\\sample.xlsx"; my $root = "E:\\assin\\foo"; my $doc = "E:\\assin\\foo\\Functional.doc";

        I don't have the documents you're using. Much of what remains is an exercise for you to resolve. Your next problem is the for loops. You have:

        # get the first table my $table = $Word->ActiveDocument->Tables(1); for($row=1;$row<3;$row++) { for($col=1;$col<3;$col++) { my $text = $table->Cell($row,$col)->Range->{Text}; $Sheet->Cells($row,$col)->{'Formula'}=$text; }

        There are some problems here. Firstly, you are missing a closing brace, you have two for loops with their opening braces and one closing brace.

        for( $row = 1; $row < 3; $row++ ){ for( $col = 1; $col < 3; $col++ ){ my $text = $table->Cell($row,$col)->Range->{Text}; $Sheet->Cells($row,$col)->{'Formula'}=$text; } }

        I suggest you do some reading and some research, then make these changes to your code and test it again with the documents you have. You should get some warnings about variables being declared but never used (e.g. @test). Properly indenting your code and using an editor with Syntax_highlighting helps to see where problems are.

        "Thanks for suggestion but its no working."

        It's not working isn't a helpful reply, you didn't mention what happened when you ran your program, what errors and warnings you encountered. To learn some more about what you're working with, and how to improve your posts here I suggest you read the following: