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

I am trying to create a simple report using OLE and MS/Word. This report will consist of a Report Header, followed by a table of data. I can find plenty of examples how to place the Header on the doc and plenty of examples of how to place a table at the beginning of the doc, but no examples how to place them both on one page, one following the other. When I use the following to place the table on the doc, it places it on the top of the report, where I dont want it.
my $MyRange = $Word->ActiveDocument->Content; $Word->ActiveDocument->Tables->Add({ Range => $MyRange, NumRows => 5, NumColumns => 4, });
I am seeking advise on how to insert the table AFTER the header. Your advise would be sincerely appreciated.

edited: Tue Aug 6 13:16:57 2002 by jeffa - code tags

Replies are listed 'Best First'.
Re: MSWord and OLE
by cacharbe (Curate) on Aug 06, 2002 at 11:55 UTC
    I guess there a few different ways you can attack this. First let's get all the basic stuff out of the way.
    use strict; use Win32::OLE qw(in with); use Win32::OLE::Const 'Microsoft Word'; $Win32::OLE::Warn = 3; # Die on Errors my $Word = Win32::OLE->GetActiveObject('Word.Application') || Win32::OLE->new('Word.Application', 'Quit'); $Word->Documents->Add || die("Unable to create document ", Win32::OLE- +>LastError()); my @Data = ("Data ONE", "Data TWO", "Data THREE" , "Data FOUR");
    Those are some necessary Evils, but always important to include.

    If you just want to add plain header text, and then add a table below it, I would do this:

    $Word->Selection->TypeText ({ Text => "This is plain header text"}); $MyRange->Collapse({Direction=>wdCollapseEnd}); $Word->Selection->TypeText ({ Text => "\n\n" }); #add the table 2 li +nes below $Word->Selection->MoveDown({Count => 2});
    If you want TABLE headers, you might want to try something like what follows. If not, just use the text above, and the table creation method from below and add your data:
    my @headers = ("Header ONE", "Header TWO", "Header THREE" , "Header FOUR"); my $MyRange = $Word->ActiveDocument->Content; # Add a table at the end of the content. $Word->ActiveDocument->Tables->Add({ Range => $MyRange, NumRows => 1, NumColumns => ($#headers+1), }); #put headers In foreach my $str (0..$#headers){ my $Cell = $Word->ActiveDocument->Tables(1)->Cell(1,($str+1))->Sel +ect; $Word->Selection->TypeText ({ Text => $headers[$str]}); } #Do some simple styling with the header row. my $Row = $Word->ActiveDocument->Tables(1)->Rows(1); $Row->Shading->{BackgroundPatternColor} = wdColorGray40; my @borders = (wdBorderBottom, wdBorderTop, wdBorderLeft, wdBorderRigh +t); foreach my $bord (@borders){ with (my $Borders = $Row->Borders->Item($bord), LineStyle=>wdLineStyleSingle, LineWidth=>wdLineWidth300pt);} my $table = $Word->ActiveDocument->Tables(1); my $lastrow = $table->Rows->{Count}; # Put the data in, based on the number of header columns while ($lastrow < 15){ my $color; $table->Rows($lastrow)->Select(); $Word->Selection->InsertRowsBelow(1); $lastrow++; my $test = $lastrow%2; if (!$test){$color = wdColorWhite;}else{$color = wdColorGray40;} $Word->ActiveDocument->Tables(1)->Rows($lastrow)->Shading->{Backgr +oundPatternColor} = $color; foreach my $str (0..$#headers){#put Headers In my $Cell = $Word->ActiveDocument->Tables(1)->Cell($lastrow,($s +tr+1))->Select; $Word->Selection->TypeText ({ Text => $Data [$str]}); } } with (my $Borders = $Row->Borders->Item(wdBorderBottom), LineStyle=>wdLineStyleSingle, LineWidth=>wdLineWidth300pt); my $Doc= $Word->{ActiveDocument}; $Doc->SaveAs('c:\perl\projects\testtable.doc');

    C-.

    ---
    Flex the Geek