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).

È stato utile?

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; }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top