Как я могу изменить цветовой индекс слова в строке для msword, используя Win32: OLE? - PullRequest
0 голосов
/ 17 марта 2010

Я на самом деле пытаюсь изменить индекс цвета для первого слова с фигурными скобками в массиве, чтобы они отображались в правильном цвете в Word 2003.

Например, если у меня есть такой массив:

@array="
        (This) is (perl),
         perl is a great (language),
         we can do anything with perl,
         (perl) feels us great."

Мне нужен цвет первого слова в скобках (), т.е. (This) и (perl), включая (), чтобы быть красным, а остальное содержимое черным. и распечатать все содержимое массива в MS Word 2003:

Я использую Win32 :: OLE и Windows XP. Этот массив является лишь примером того, что содержимое массива изменится, но первое слово с фигурными скобками должно быть напечатано красным.

1 Ответ

2 голосов
/ 17 марта 2010
#!/usr/bin/perl

use strict; use warnings;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Word';
$Win32::OLE::Warn = 3;

my $word = get_app('Word.Application');
$word->{Visible} = 1;

my $doc = $word->Documents->Add;

while ( my $line = <DATA> ) {
    my @chunks = split /(\(\w+\))/, $line;
    my $seen;
    for my $chunk ( @chunks ) {
        my $sel = $word->Selection;
        my $font = $sel->Font;
        if ( $chunk =~ /^\(/ and not $seen) {
            $font->{ColorIndex} = wdRed;
            $seen = 1;
        }
        else {
            $font->{ColorIndex} = wdBlack;
        }
        $sel->TypeText($chunk);
    }
}

sub get_app {
    my ($class) = @_;
    my $app;
    eval {
        $app = Win32::OLE->GetActiveObject($class);
    };

    if ( my $ex = $@ ) {
        die $ex, "\n";
    }

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

__DATA__
(This) is (perl),
perl is a great (language),
we can do anything with perl,
(perl) feels us great.
...