Moin Moin!
Mal wieder ein Wald-und-Bäume-Problem:
Ich habe ein riesiges Word(2002)-Dokument mit knapp 600 Tabellen, jede Tabelle hat einen einleitenden Text und eine Überschrift, manchen Tabellen folgt auch noch etwas Text.
Die Tabellen kann ich über Automation ziemlich schmerzfrei finden, weil praktischerweise direkt am Document-Objekt eine Tables-Liste hängt. Die Liste mit den knapp 600 Table-Objekten kann ich durchlaufen und mir die Texte aus den einzelnen Zellen herausfummeln.
Ich finde aber keinen Weg, von der Tabelle zur Überschrift zu kommen, denn in der steckt noch eine Information, die ich unbedingt brauche. Mit dem HTML-DOM wäre das Problem mit tabelle.parentNode.getElementsByTagName("h2")[0]
erschlagen. Wie geht das mit Word?
Alexander
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use Win32::OLE;
$|=1;
sub enum
{
return Win32::OLE::Enum->new($_[0]);
}
my $filename='E:\\tables.doc';
my $word=Win32::OLE->CreateObject('Word.Application','Quit') or die $!;
$word->{'Visible'}=1;
my $doc=$word->Documents->Open($filename) or die "Can't open '$filename': ",Win32::OLE->LastError();
print "Word opened\n";
my $n=$doc->Tables->Count();
print "$n tables in the file\n";
my $tables=enum($doc->Tables);
my $i=0;
while (my $table=$tables->Next()) {
print "New Table\n";
my $rows=enum($table->Rows());
while (my $row=$rows->Next()) {
print "\tNew Row\n";
my $cells=enum($row->Cells());
while (my $cell=$cells->Next()) {
my $range=$cell->Range();
$range->{'End'}--; # a Range created from a cell contains a special end-of-cell marker. To access only the text in a cell, move the end of the range back one character.
print "\t\t (row=",$cell->{'RowIndex'},", col=",$cell->{'ColumnIndex'},") \"",$range->Text(),"\"\n";
}
}
last if ++$i>2; # for Debugging
}
$doc->Close();
$word->Quit();
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".