例如,我的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/;
}
}
答案 0 :(得分:4)
尝试使用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/;
}
}
答案 1 :(得分:0)
我对perl一无所知。 但你看办公室开放xml
您可以将.docx文件视为zip文件,并进行简单的搜索和替换,其工作速度比互操作快一百万倍。而你也不必担心可能出现问题的百万件事。
将您的.docx文件重命名为.zip并打开它,您将看到我的意思。