3

例如,我的 docx 文件包含以下句子:

这是一个 Perl 示例
这是一个 Python 示例
这是另一个 Perl 示例

我想将粗体样式应用于“Perl”一词的所有出现,如下所示:

这是一个Perl示例
这是一个 Python 示例
这是另一个Perl示例

到目前为止,我已经想出了以下脚本:

use strict; use warnings;
use Win32::OLE::Const 'Microsoft Word';

my $file = 'E:\test.docx';

my $Word = Win32::OLE->new('Word.Application', 'Quit');
$Word->{'Visible'} = 0;
my $doc = $Word->Documents->Open($file);
my $paragraphs = $doc->Paragraphs() ;
my $enumerate = new Win32::OLE::Enum($paragraphs);


while(defined(my $paragraph = $enumerate->Next())) {

    my $text = $paragraph->{Range}->{Text};
    my $sel = $Word->Selection;
    my $font = $sel->Font;

    if ($text =~ /Perl/){
        $font->{Bold} = 1;              
    }   
    $sel->TypeText($text);          
}

$Word->ActiveDocument->Close ;
$Word->Quit;

但是它对整个段落应用了粗体样式,并且没有在原始位置编辑句子。它给了我修改后的版本和原始版本,如下所示:

这是一个 Perl 示例
这是一个 Python 示例
这是另一个 Perl 示例
这是一个 Perl 示例
这是一个 Python 示例
这是另一个 Perl 示例

我应该如何解决我的问题。任何指针?一如既往地感谢:)

更新

问题解决了!非常感谢@Zaid@cjm :)

这是工作得很好的代码:

while ( defined (my $paragraph = $enumerate->Next()) ) {

    my $words = Win32::OLE::Enum->new( $paragraph->{Range}->{Words} );

    while ( defined ( my $word = $words->Next() ) ) {

        my $font = $word->{Font};
        $font->{Bold} = 1 if $word->{Text} =~ /Perl/;
    }
}
4

2 回答 2

5

尝试使用该Words方法而不是Text.

未经测试:

while ( defined (my $paragraph = $enumerate->Next()) ) {

    my $words = Win32::OLE::Enum->new( $paragraph->{Range}->{Words} );

    while ( defined ( my $word = $words->Next() ) ) {

        my $font = $word->{Font};
        $font->{Bold} = 1 if $word->{Text} =~ /Perl/;
    }
}
于 2010-09-23T05:34:01.250 回答
0

我对perl一无所知。但是你看看office open xml

您可以将 .docx 文件视为 zip 文件,并进行简单的搜索和替换,这比互操作快一百万倍。而且您也不必担心可能会出错的数百万件事情。

将您的 .docx 文件重命名为 .zip 并打开它,您就会明白我的意思。

于 2010-09-23T01:43:41.800 回答