Pregunta

EDITAR: si tienes un ejemplo en VBA, lo tomaré. Solo estoy tratando de entender cómo usar el objeto Range con la colección Tables para copiar y pegar múltiples tablas sin bucles. Dicho de otra manera, ¿cómo puedo especificar un rango de 1..última tabla usando la colección Tables? Si puedo ver un ejemplo de VBA que funcione, trabajaré en el VBA - > Conversión Perl.

Estoy tratando de usar el módulo Win32 :: OLE de Perl (vía El excelente libro de Dave Roth) para automatizar un par de tareas que necesito realizar repetidamente en algunos documentos de Word. Sin embargo, el libro (y la mayoría de los ejemplos web) tiende a usar Excel para los ejemplos, por lo que no estoy seguro de cómo copiar y pegar eficazmente con el objeto de colección Tables.

Aquí hay un fragmento de mi 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();

El código original usaba Párrafos, no Tablas, así que supongo que algunos de los errores son artefactos de ese código (o más probablemente mi no comprensión de ese código).

¿Fue útil?

Solución

Copiar y pegar tablas de una en una podría ser preferible:

#!/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 { 

Copiar y pegar tablas de una en una podría ser preferible:

<*>[0]->Quit }) or die "Oops, cannot start Word: ", Win32::OLE->LastError, "\n"; } return $word; }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top