2010-09-09 39 views
3

我试图使用Win32::OLE从当前演示文稿中获取幻灯片及其标题列表。使用OLE从Powerpoint中获取文本

到目前为止,我可以得到

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

$slides只有性能Application Count Parent 任何人都能指出我借此futher。

我意识到一个明显的答案就是不要使用Powerpoint。公司决定和所有这一切。

回答

5

另请参阅我对Automating a Job at Work: Importing Powerpoint Bullet Text into an Excel Sheet的回答。

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没有标题。

+0

是的,这给了我一些有用的提示。奇怪的是它没有出现在我的搜索尝试中。谢谢 – justintime 2010-09-09 17:34:22

+0

只有预防我的事情是我没有看到它的事实:-)。昨天晚上忙于工作,白天工作。 – justintime 2010-09-10 20:05:42

+0

@justintime好的,谢谢。 – 2010-09-10 20:18:42

相关问题