Как применить форматирование к определенному слову в файле docx, используя Win32 :: Ole в Perl? - PullRequest
2 голосов
/ 23 сентября 2010

Например, мой файл 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/;
    }
}

Ответы [ 2 ]

4 голосов
/ 23 сентября 2010

Попробуйте использовать метод 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/;
    }
}
0 голосов
/ 23 сентября 2010

Я ничего не знаю о Perl.Но вы смотрите на office open xml

. Вы можете использовать файл .docx как zip-файл и выполнять простой поиск и замену, который работает в миллион раз быстрее, чем взаимодействие.и вам не нужно беспокоиться о миллионах вещей, которые также могут пойти не так.

Переименуйте ваш файл .docx в .zip и откройте его, и вы поймете, что я имею в виду.

...