自动执行工作:将Powerpoint项目符号文本导入Excel工作表

腹肌:

今天,有人要求我将工作中的特定任务自动化,这会占用我们很多时间!以下是需要做的事情,如果可能的话,我将尽我所能在我的知识范围内为您提供帮助(实施建议)。

问题

我有一个PowerPoint文档(.ppt)。我想从那里提取文本(文本为项目符号格式)。我想将这些项目符号点插入Excel工作表中,每个项目符号点应为一行。我也想将要点文本的来源页面放在相邻的列中。

因此,基本上是:从ppt中提取->将插入到Excel表中的每一行作为一个项目符号。

我可用的技术

Perl,PHP和Java。

希望PHP是诚实的,因为这是我的主要语言,但我很乐意考虑其他人认为最好的任何事情。其次是Perl,然后是Java。我不想为此而编译类并安装JDK!:)

关键问题

  • 您如何引用要点?
  • 我可能最终只能在Excel工作表中加载大量非结构化文本吗?
  • 从ppt文件读取是否有任何障碍?

更新资料

如果可以简化生活,我会考虑使用MS技术(例如VB等),但我从未使用过它,而鄙视MS技术!希望我不会被传福音的人惹恼!:)

思南·乌努尔(Sinan Unur):

这是使用Win32 :: OLE的示例脚本

顺便说一句,一旦将幻灯片转换为可以处理的格式,就可以在非MS系统上使用Spreadsheet :: WriteExcel写入输出。因此,我推荐两个程序:一个用于转换PowerPoint文档,另一个用于生成Excel文件。

请注意,对象浏览器是Microsoft Office应用程序的绝佳信息来源。您可以通过工具→宏→Visual Basic编辑器访问它。进入编辑器后,单击F2以浏览Microsoft Office应用程序提供的界面,方法和属性。

#!/usr/bin/perl

use strict;
use warnings;

use FindBin qw( $Bin );
use File::Spec::Functions qw( catfile );

use Win32::OLE;
use Win32::OLE::Const 'Microsoft PowerPoint';
$Win32::OLE::Warn = 3;

my $ppt = get_ppt();
$ppt->{Visible} = 1;

my $ppt_file = catfile $Bin, 'test.ppt';
my $doc = $ppt->Presentations->open( $ppt_file );
my $slides = $doc->Slides;
my $num_slides = $slides->Count;

for my $slide_idx (1 .. $num_slides) {
    print "=== Begin Slide $slide_idx ===\n";

    my $slide = $doc->Slides->Item( $slide_idx );
    my $shapes = $slide->Shapes;
    my $num_shapes = $shapes->Count;

    for my $shape_idx (1 .. $num_shapes) {
        my $shape = $shapes->Item($shape_idx);
        next unless $shape->HasTextFrame;

        my $pars = $shape->TextFrame->TextRange->Paragraphs;
        my $num_pars = $pars->Count;
        for my $par_idx (1 .. $num_pars) {
            my $par = $pars->Paragraphs($par_idx,1);
            print_par( $par );
        }
    }

    print "=== End Slide $slide_idx ===\n\n";
}

sub print_par {
    my ($par) = @_;
    my @bullets = qw( - * > + = @ );

    my $bullet_format = $par->ParagraphFormat->Bullet;
    my $bullet_type = $bullet_format->Type;

    my $bullet_char = '';

    if ($bullet_type == ppBulletNumbered) {
        $bullet_char = $bullet_format->Number . "\t";
    }
    elsif( $bullet_type == ppBulletUnnumbered ) {
        # Need a Unicode => ASCII mapping if you want to use
        # $bullet_format->Character
        my $indent = $par->IndentLevel % scalar @bullets;
        $bullet_char = $bullets[$indent] . "\t";
    }

    my $text = $par->Text;
    $text =~ s/\s+$//;

    print $bullet_char, $text,"\n";
}

sub get_ppt {
    my $app;
    eval {
        $app = Win32::OLE->GetActiveObject('PowerPoint.Application');
    };

    die "$@\n" if $@;

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章