Использование OLE для вывода текста из Powerpoint - PullRequest
4 голосов
/ 09 сентября 2010

Я пытаюсь использовать Win32 :: OLE , чтобы получить список слайдов и их заголовков из текущей презентации.

Пока я могу получить

    my $powerpoint = Win32::OLE->GetActiveObject('Powerpoint.Application')
    my $ap = $$powerpoint { ActivePresentation } ;
    my $slides = $$ap { slides } ;

Но $slides обладает только свойствами Application Count Parent Может ли кто-нибудь указать мне, чтобы я взял это далее.

Я понимаю, что очевидный ответ - не использовать Powerpoint.Корпоративный диктат и все такое.

1 Ответ

5 голосов
/ 09 сентября 2010

См. Также мой ответ на Автоматизация работы на работе: импорт текста маркера Powerpoint в лист Excel .

Слайды PowerPoint не имеют определенного свойства Title. У них есть свойство Name, но это не одно и то же. Свойство типа заполнителя формы может сказать вам, является ли оно заголовком:

#!/usr/bin/perl

use strict; use warnings;
use Try::Tiny;
use Win32::OLE;
use Win32::OLE::Const qw( Microsoft.PowerPoint );
use Win32::OLE::Enum;

$Win32::OLE::Warn = 3;

my $ppt = get_ppt();

my $presentation = $ppt->Presentations->Open('test.ppt', 1);
my $slides = Win32::OLE::Enum->new( $presentation->Slides );

SLIDE:
while ( my $slide = $slides->Next ) {
    printf "%s:\t", $slide->Name;
    my $shapes = Win32::OLE::Enum->new( $slide->Shapes );
    SHAPE:
    while ( my $shape = $shapes->Next ) {
        my $type = $shape->PlaceholderFormat->Type;
        if ( $type == ppPlaceholderTitle
                or $type == ppPlaceholderCenterTitle
                or $type == ppPlaceholderVerticalTitle
        ) {
            print $shape->TextFrame->TextRange->text;
            last SHAPE;
        }
    }
    print "\n";
}

$presentation->Close;

sub get_ppt {
    my $ppt;

    try {
        $ppt = Win32::OLE->GetActiveObject('PowerPoint.Application');
    }
    catch {
        die $_;
    };

    unless ( $ppt ) {
        $ppt = Win32::OLE->new(
            'PowerPoint.Application', sub { $_[0]->Quit }
        ) or die sprintf(
            'Cannot start PowerPoint: %s', Win32::OLE->LastError
        );
    }

    return $ppt;
}

Выход:

Slide1: Title Page Title
Slide2: Page with bullets
Slide3: Page with chart
Slide4:

Очевидно, что на Slide4 заголовка не было.

...