Comment copier et coller une série de tableaux dans Word?
-
07-07-2019 - |
Question
EDIT: Si vous avez un exemple dans VBA, je le prendrai. J'essaie simplement de comprendre comment utiliser l'objet Range avec la collection Tables pour copier et coller plusieurs tables sans effectuer de boucle. En d'autres termes, comment puis-je spécifier une plage de 1..lastTable à l'aide de la collection Tables? Si je peux voir un exemple de travail de VBA, je travaillerai sur VBA - > Conversion Perl.
J'essaie d'utiliser le module Win32 :: OLE de Perl (via Excellent livre de Dave Roth) pour automatiser quelques tâches que je dois effectuer à plusieurs reprises sur certains documents Word. Cependant, le livre (et la plupart des exemples Web) ayant tendance à utiliser Excel comme exemple, je ne sais pas comment copier et coller efficacement avec l'objet de collection Tables.
Voici un extrait de mon code:
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();
Le code d'origine utilisait des paragraphes, pas des tableaux, donc je suppose que certains des bogues sont des artefacts de ce code (ou plus probablement de ma non-compréhension de ce code).
La solution
Copier et coller des tables une à la fois peut être préférable:
#!/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 { Copier et coller des tables une à la fois peut être préférable:
<*>[0]->Quit })
or die "Oops, cannot start Word: ",
Win32::OLE->LastError, "\n";
}
return $word;
}