Come posso copiare e incollare un intervallo di tabelle in Word?
-
07-07-2019 - |
Domanda
MODIFICA: Se hai un esempio in VBA, lo prenderò. Sto solo cercando di capire come utilizzare l'oggetto Range con la raccolta Tables per copiare e incollare più tabelle senza loop. In altre parole, come posso specificare un intervallo di 1..lastTable usando la raccolta Tabelle? Se riesco a vedere un esempio VBA funzionante di questo, lavorerò su VBA - > Conversione Perl.
Sto cercando di utilizzare il modulo Win32 :: OLE di Perl (tramite L'eccellente libro di Dave Roth) per automatizzare un paio di compiti che devo eseguire ripetutamente su alcuni documenti di Word. Tuttavia, il libro (e la maggior parte degli esempi Web) tende a utilizzare Excel come esempio, quindi non sono sicuro su come copiare e incollare in modo efficace con l'oggetto della raccolta Tabelle.
Ecco un frammento del mio codice:
my $originalDoc = $MSWord->Documents->Open('C:\Perl\testDocument.doc');
my $newDoc = $MSWord->Documents->Add;
my $selection = $MSWord->Selection(); # this may be spurious
my $Count = int( $originalDoc->Tables()->{Count} );
my $range = $originalDoc->Tables()->Range( { Start => $originalDoc->Tables(1)->{Range}->{Start},
End => $originalDoc->Tables($Count)->{Range}->{End}
} );
$range->Copy();
$newDoc->Range()->Paste();
Il codice originale utilizzava i paragrafi, non le tabelle, quindi suppongo che alcuni dei bug siano artefatti di quel codice (o più probabilmente la mia non comprensione di quel codice).
Soluzione
Potrebbe essere preferibile copiare e incollare le tabelle una alla volta potrebbe :
#!/usr/bin/perl
use strict;
use warnings;
use File::Spec::Functions qw( catfile );
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Word';
$Win32::OLE::Warn = 3;
my $word = get_word();
$word->{Visible} = 1;
my $doc = $word->{Documents}->Open(catfile $ENV{TEMP}, 'test.doc');
my $newdoc = $word->Documents->Add;
my $n_tables = $doc->Tables->Count;
for my $table_i ( 1 .. $n_tables ) {
my $table = $doc->Tables->Item($table_i);
$table->Select;
$word->Selection->Copy;
my $end = $newdoc->GoTo(wdGoToLine, wdGoToLast);
$end->InsertBefore("\n");
$end = $newdoc->GoTo(wdGoToLine, wdGoToLast);
$end->Select;
$word->Selection->Paste;
}
$doc->Close(0);
$newdoc->SaveAs('test-output.doc');
sub get_word {
my $word;
eval {
$word = Win32::OLE->GetActiveObject('Word.Application');
};
die "$@\n" if $@;
unless(defined $word) {
$word = Win32::OLE->new('Word.Application', sub { Potrebbe essere preferibile copiare e incollare le tabelle una alla volta potrebbe :
<*>[0]->Quit })
or die "Oops, cannot start Word: ",
Win32::OLE->LastError, "\n";
}
return $word;
}