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

Était-ce utile?

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; }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top