【问题标题】:Automating a Job at Work: Importing Powerpoint Bullet Text into an Excel Sheet将工作中的工作自动化:将 Powerpoint 项目符号文本导入 Excel 工作表
【发布时间】:2009-07-31 19:33:19
【问题描述】:

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

问题

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

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

我可以使用的技术

Perl、PHP 和 Java。

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

关键问题

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

更新

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

【问题讨论】:

  • 您可能需要清除标题。类似于:“将 Powerpoint 项目符号导入 Excel 工作表”
  • 谢谢Chacha,清理了标题。
  • 一些可能有助于我们微调答案的澄清...您需要处理大量的小 PPT 文件还是只需要处理大量项目符号的几个?
  • 几张PPT(20),有大量的要点。每个PPT文件大约30页,每页大约有5个要点。如果可能的话,可能会有一些图形和额外的文本(标题)可以被丢弃。

标签: java php perl implementation project-planning


【解决方案1】:

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

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

【讨论】:

  • 有意思,去看看这个!
  • 控制powerpoint的例子见Win32::Powerpoint on CPAN:search.cpan.org/dist/Win32-PowerPoint/lib/Win32/PowerPoint.pm
  • 如果你要做一些琐碎的事情,我会使用 VBA。如果您尝试将 Excel 绑定到您已经编写的某个程序中,OLE 会更好。
  • 再一次,如果他已经知道 Perl,对他来说听起来会更好。但是,在我看来,使用 VBA 编写 PowerPoint 插件更合适。您只需打开 power-point 文件,单击菜单按钮(您可以轻松添加),然后启动导出 VBA 插件。
  • @Juri,听起来这是一项重复的任务,必须定期完成。使用 Perl 的好处是它可以“单击”完成,甚至可以作为计划任务完成,因此完全不需要用户与 PowerPoint 或 Excel 进行交互。在 Perl 中做这件事并不痛苦。 Perl 会比 VBA 对他更友好,因为他更喜欢 PHP。
【解决方案2】:

这是使用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;
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 即使您对 VBA 一无所知,这也是迄今为止最好的工作工具。任何其他方法都可能是一个“痛苦的世界”。
    • 感谢 Juri 和 Don 的建议!
    • 我不得不对 Word 文档做一些类似的事情,如果你可以使用它,VBA 绝对是最好的方法。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          如果您有 Zend Framework 可用,它可以提供很大帮助。 See here 获取有用的文档。 See here 用于写入 excel 文件。

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-07-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-14
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多