Perl 如何在Word中复制和粘贴一系列表格?
编辑:如果你在VBA中有一个例子,我就选它。我只是想了解如何在Tables集合中使用Range对象来复制和粘贴多个表,而无需循环。换句话说,如何使用Tables集合指定1..lastTable的范围?如果我能看到一个工作的VBA示例,我将处理VBA->Perl转换 我正试图通过Dave Roth的优秀著作使用Perl的模块来自动化一些需要在某些Word文档上重复执行的任务。但是,本书和大多数web示例倾向于使用Excel作为示例,因此我不确定如何使用Tables集合对象有效地复制和粘贴 以下是我的代码片段:Perl 如何在Word中复制和粘贴一系列表格?,perl,ms-word,range,copy-paste,win32ole,Perl,Ms Word,Range,Copy Paste,Win32ole,编辑:如果你在VBA中有一个例子,我就选它。我只是想了解如何在Tables集合中使用Range对象来复制和粘贴多个表,而无需循环。换句话说,如何使用Tables集合指定1..lastTable的范围?如果我能看到一个工作的VBA示例,我将处理VBA->Perl转换 我正试图通过Dave Roth的优秀著作使用Perl的模块来自动化一些需要在某些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();
原始代码使用的是段落,而不是表格,因此我假设一些bug是该代码中的工件,或者更可能是我不理解该代码。一次复制和粘贴一个表格可能更好:
#!/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;
}
我的建议是在录制宏时尝试手动执行任务,然后查看生成的VBA子例程。您应该能够将其推广,并将其转换为Perlish,而不需要太多麻烦。使用此方法只是向我展示了如何使用选择来获取一个表,而如果我尝试选择多个表,则编写宏也是为了获取它们之间的文本,这不是我想要的。太好了!但有一个问题。。是否无法从集合对象中选择一系列对象?比如说,所有表对象,在一次操作中没有任何其他文本?我只是想问这是否可能——我得到的印象是不可能,或者至少它没有按照我认为的方式工作。@romandas我不这么认为。Tables集合没有Range方法。