4

我被要求在今天的工作中自动执行一项特定任务,这占用了我们很多时间!以下是需要做的事情,如果可能的话,我将不胜感激在我的知识范围内如何做到这一点(实施建议)的任何帮助。

问题

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

所以,基本上:从 ppt 中提取 --> 插入 Excel 工作表中的每一行都是一个要点。

我可以使用的技术

Perl、PHP 和 Java。

老实说,我更喜欢 PHP,因为这是我的主要语言,但我很乐意考虑你们认为最好的其他任何东西。其次是 Perl,然后是 Java。我不想为此编译类和安装 JDK!:)

关键问题

  • 你如何引用一个要点?
  • 我最终可能会在 Excel 工作表中得到一堆非结构化文本吗?
  • 从 ppt 文件中读取是否有任何障碍?

更新

如果 MS 技术(VB 等)让生活更轻松,我会考虑它,但我从未使用过它,我鄙视 MS 技术!希望我不会被传教士喷火!:)

4

8 回答 8

8

可以用 Perl 来完成。你可以用 VBA 做的几乎所有事情都可以通过 Win32::OLE 用 Perl 来完成。我使用 Win32::OLE 模块来处理 MS-Office 文档,包括提取和创建内容。不过已经有一段时间了。从这里开始,http://win32.perl.org/wiki/index.php?title=Win32_Perl_Modules大约在页面中间。

每个对象的 VBA 文档对于参考、查找存在哪些对象以及它们上可用的方法和属性都很有用。

于 2009-07-31T20:17:46.833 回答
7

噗……你将很难使用 Perl、PHP 或 Java 处理 MS Office 文件。当我不得不对 MS Office 文件进行自动化处理时,我最常使用 VBA(Visual Basic for Applications)。看看它。对于很多东西,您可以只录制一个宏,查看生成的代码并了解事物是如何被引用的。然后获取生成的代码片段并创建您自己的 VBA 模块和工具。我可以想象这样的功能可以完美地作为 Power Point 的插件。

于 2009-07-31T19:37:37.557 回答
7

这是使用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;
}
于 2009-07-31T23:25:08.517 回答
1

您无法使用 Visual Basic for Applications 吗?这应该内置在 Office 中,并且由于您要使用 Office 到 Office,它可能会更容易。

于 2009-07-31T19:37:27.727 回答
1

您可以使用 OpenOffice.org 的演示应用程序 (Impress) 来导入 Powerpoint 文件。然后,您可以将其导出为原生 OpenOffice.org 格式,即 XML。然后,您应该能够使用您选择的语言解析纯文本 XML。

正如其他人指出的那样,如果您想直接使用 Powerpoint 格式,您确实需要使用 Microsoft 语言(VB、VBA、C# 等)。

于 2009-07-31T19:39:27.317 回答
1

我想您可能想研究将 PPT 转换为 CSV 文件的程序,中间可能有 PDF?一旦数据为 CSV 格式,您可以更轻松地通过 php/perl 处理它。

从头开始执行此操作将非常耗时,因为 Office 文档格式通常非常复杂。

于 2009-07-31T19:39:44.227 回答
1

如果您有 Zend Framework 可用,它可以提供很大帮助。有关有用的文档,请参见此处 。有关写入 excel 文件的信息,请参见此处。

于 2009-07-31T19:46:44.853 回答
1

这听起来很像我在工作中所做的,尽管我主要在 Excel 和 Word 中工作。最好的办法是在 PowerPoint 中使用 VBA 来查看每一页并找到项目符号。然后写入 CSV 格式的文件,每个项目符号在不同的行上,这将在 Excel 中打开,每个项目符号在它自己的行上。

找出什么是子弹,什么不是子弹可能是把戏。尝试录制一些宏选择,添加和删除项目符号,并可能更改一些级别。这应该为您提供有关要查找哪些对象以及如何使用它们的足够信息。

于 2009-07-31T20:03:09.843 回答