2009-09-15 322 views
4

编辑:如果你有一个VBA的例子,我会接受它。我只是想了解如何将Range对象与Tables集合一起使用来复制和粘贴多个没有循环的表。换句话说,如何使用Tables集合来指定范围1..lastTable?如果我能看到一个有效的VBA示例,我将介绍VBA - > Perl转换。如何在Word中复制和粘贴一系列表格?

我正在尝试使用Perl的Win32::OLE模块(通过Dave Roth的优秀书籍)来自动完成一些需要在某些Word文档上重复执行的任务。然而,本书(以及大多数Web示例)倾向于使用Excel作为示例,所以我不确定如何有效地复制和粘贴Tables集合对象。

这里是我的代码片段:

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(); 

原来代码中使用段落,没有桌子,所以我想有些错误是文物从代码(或更可能我不理解码)。

+0

我的建议是尝试手动执行任务,同时录制宏,然后看所产生的VBA子程序。您应该能够将其推广并将其转换为Perlish,而不会有太多麻烦。 – 2009-09-16 15:51:44

+0

使用这种方法只是告诉我如何使用Selection来获得一个表格,而如果我尝试选择多个表格,宏写入的也是它们之间的文本,这不是我所追求的。 – romandas 2009-09-17 12:48:30

回答

5

复制和粘贴表一次一个可能可取:

#!/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 "[email protected]\n" if [email protected]; 

    unless(defined $word) { 
     $word = Win32::OLE->new('Word.Application', sub { $_[0]->Quit }) 
      or die "Oops, cannot start Word: ", 
        Win32::OLE->LastError, "\n"; 
    } 
    return $word; 
} 
+0

太棒了!尽管有一个问题..是否没有办法从集合对象中选择一系列对象?说,所有的表格对象,没有任何其他文字在一个操作?我只是在问这是否可能 - 我得到的印象并非如此,或者至少它不能像我认为的那样工作。 – romandas 2009-09-20 18:42:48

+0

@romandas我不这么认为。 'Tables'集合没有'Range'方法。 – 2009-09-20 19:17:53

+0

谢谢! +1并被接受。 – romandas 2009-09-22 01:12:05