在工作中自动化作业:将Powerpoint Bullet文本导入Excel工作表

我被要求在今天的工作中自动执行特定的任务,这占用了我们很多时间! 以下是需要完成的工作,如果可能的话,我将非常感谢能够在我的知识领域内完成此任务(实施建议)。

问题

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

所以,基本上:从ppt中提取 – >插入到Excel工作表中,每一行都是一个项目符号点。

技术可供我使用

Perl,PHP和Java。

更喜欢PHP ,因为这是我的主要语言,但我很高兴考虑你们/ gals认为最好的其他事情。 第二个是Perl,然后是Java。 我不想为此编译类和安装JDK! 🙂

关键问题

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

更新

我会考虑MS技术(VB等),如果它让生活更轻松,但我从未使用它,我鄙视MS技术! 希望我不被福音传道者焚烧! 🙂

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

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

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

Puh ……使用Perl,PHP或Java处理MS Office文件会很困难。 当我不得不为MS Office文件做自动化时,我经常使用VBA(Visual Basic for Applications)。 看看吧。 对于很多东西,你可以只记录一个宏,看一下生成的代码并了解如何引用它们。 然后获取生成的代码片段并创建自己的VBA模块和工具。 我可以想象这样的function可以完全适合作为Power Point的插件。

您不能使用Visual Basic for Applications吗? 这应该是Office内置的,因为你要办公室到办公室,它可能会更容易。

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

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

我想你可能想要查看从PPT转换为CSV文件的程序,可能中间有PDF? 一旦数据采用CSV格式,您就可以更轻松地通过php / perl处理它。

从头开始这样做将非常耗时,因为Office文档格式通常非常复杂。

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

这听起来很像我在工作中所做的,虽然我主要在Excel和Word中工作。 你最好的选择是使用PowerPoint中的VBA来查看每个页面并找到子弹。 然后写入CSV格式的文件,每个子弹在不同的行上,它将在Excel中打开,每个子弹都在它自己的行上。

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