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

I am writing a perl script to create a table in a MS Word document. I can get the table generated and data in the table but can't seem to set the Heading Row. I have created a word macro and looked at the VB code but still can't the header row to repeat when the table spans more than one page. The following code does not generate any errors.
my $table = $doc1->Tables->Add($word->Selection->Range,$t_row, $t_co +l); $table->Rows->{HeadingFormat} = 1;

Replies are listed 'Best First'.
Re: Win32:: OLE MS Word Table
by InfiniteSilence (Curate) on Sep 22, 2005 at 15:32 UTC
    Looks like you are writing the wrong value to the HeadingFormat property:

    #!/usr/bin/perl -w use strict; use Win32::OLE; my ($t_row, $t_col) = (4,2); my $word = Win32::OLE->CreateObject("Word.Application"); $word->{Visible} = 1; my $doc = $word->Documents->Add; my $table = $doc->Tables->Add($word->Selection->Range,$t_row, $t_col); $table->Select(); $table->AutoFormat(3,1,1,1,1,1,0,1,0,1); $word->Selection->MoveUp(5,4); $table->Rows->{HeadingFormat} = -1; 1;

    Looking it up after manually setting it in Word reveals that it is a -1 and not a 1. Also, from the interface, the property does not appear to be settable unless the selection (or the cursor position) is in/on one of the cells of the first row of the table.

    Macros are only 1/2 of the problem with writing Office automation scripts because the stupid Macro Recorder stops you from doing very simple things like selecting cells, etc. You have to do the following:

  • Become familiar with the application's object model
  • Make educated guesses as to which properties some GUI property forms may be setting
  • Experiment to see if you are correct
  • Get used to the fact that M$Soft CHANGES things from version to version so today's Word 2000 script will likely BREAK in the future for no good/apparent reason

    Celebrate Intellectual Diversity

      Thanks for the help. I was able to set the heading row using your code. But, the heading row does not actually print or display on the second page. I modifed your code a bit to have the table span across two pages. Any ideas?
      #!/usr/bin/perl -w use strict; use Win32::OLE; my ($t_row, $t_col) = (70,2); my $word = Win32::OLE->CreateObject("Word.Application"); $word->{Visible} = 1; my $doc = $word->Documents->Add; my $table = $doc->Tables->Add($word->Selection->Range,$t_row, $t_col); $table->Select(); $table->AutoFormat(3,1,1,1,1,1,0,1,0,1); $word->Selection->MoveUp(5,4); $table->Cell(1,1)->Range->{Text} = "heading1"; $table->Cell(1,2)->Range->{Text} = "heading2"; $table->Rows->{HeadingFormat} = -1;
Re: Win32:: OLE MS Word Table
by marto (Cardinal) on Sep 22, 2005 at 15:48 UTC
Re: Win32:: OLE MS Word Table
by planetscape (Chancellor) on Sep 22, 2005 at 21:44 UTC

    To supplement marto's great links, you may also have on your machine something called "OLE Browser" or "Type Library Browser" if you installed Win32-OLE-0.1403 or upgraded from that to a later version. You might find it in C:\Perl\html\OLE-Browser or C:\Perl\html\lib\site\Win32\OLE depending on your install.

    Something else I've found to be very handy indeed is West Wind Technology's GetConstants utility, which allows you to look at all those cryptic constants MS Office uses. (A short snippet of output is below.) Note that they do shuffle the links around occasionally, so it may be necessary to do some searching. :-)

    *** Constant Group: WdTableFieldSeparator #define wdSeparateByParagraphs 0 #define wdSeparateByTabs 1 #define wdSeparateByCommas 2 #define wdSeparateByDefaultListSeparator 3

    HTH,

    planetscape