Como posso copiar e colar um intervalo de tabelas no Word?
-
07-07-2019 - |
Pergunta
EDIT: Se você tem um exemplo em VBA, eu vou levá-la. Eu só estou tentando entender como usar o objeto Range com a coleção tabelas para copiar e colar várias tabelas sem loop. Dito de outra forma, como posso especificar um intervalo de 1..lastTable usando a coleção de tabelas? Se eu puder ver um exemplo VBA de trabalho deste, eu vou trabalhar no VBA -.> Conversão Perl
Eu estou tentando usar Win32 :: OLE módulo (via do Perl excelente livro de Dave Roth) para automatizar algumas tarefas que precisam ser executadas repetidamente em alguns documentos do Word. No entanto, o livro (e a maioria dos exemplos web) tende a usar o Excel para exemplos, por isso não estou certo de como copiar e colar de forma eficaz com o objeto da coleção Tables.
Aqui está um trecho do meu código:
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();
O código original usado parágrafos, não tabelas, assim que eu supor alguns dos erros são artefatos de que o código (ou mais provável minha não-compreensão do que o código).
Solução
Copiando e colando tabelas um de cada vez pode ser preferível:
#!/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 { $_[0]->Quit })
or die "Oops, cannot start Word: ",
Win32::OLE->LastError, "\n";
}
return $word;
}