スライドの下準備にWin32::PowerPointを使う

2010-12-16

16日目の今日は頭がPな覆面ライターがPなネタをお送りします。Pで始まるWin32ネタといえばPPMが定番ですが、今日はOLEの紹介もかねてWin32::PowerPointを使ってみましょう。MS Officeもバージョンや設定によって微妙に挙動が異なる部分がありますが、ひとまずこんな感じのコードを書くと「foo」と書いてあるスライド1枚のプレゼンテーションが保存されます。簡単ですね。

use strict;
use warnings;
use Win32::PowerPoint;

my $pp = Win32::PowerPoint->new;
$pp->new_presentation;
$pp->new_slide;
$pp->add_text('foo');
$pp->save_presentation('foo.ppt');
$pp->close_presentation;

Win32::PowerPointにはスライドの下準備をするのに最低限必要なメソッドしか用意されていませんが、裏ではWin32::OLEを使っていますので、OLE経由で可能なことであれば何でもできます。

簡単なところでは「$pp->application->Version」などとすればPowerPointのバージョンが取れますし、ドキュメントにも書いてあるように、

$pp->slide->Shapes(1)->TextFrame->TextRange
   ->Characters(2, 1)->Font->{Bold} = $pp->c->True;

と書けば、いま編集対象となっているスライドの最初のテキストの2文字目がボールドになります。詳しいことはお使いのPowerPointのヘルプを見るか、PowerPoint上で適当な操作をマクロに記録して、その内容とつきあわせてみてください。たいていの操作はそのままPerl風に書き直すだけで動作しますが、場合によってはWin32::OLEに用意されているInvokeメソッドやSetPropertyメソッドを使った方がわかりやすい場合もあるかもしれません。

$pp->slide->Invoke('Shapes', 1)
          ->Invoke('TextFrame')
          ->Invoke('TextRange')
          ->Invoke('Characters', 2, 1)
          ->Invoke('Font')
          ->SetProperty('Bold', $pp->c->True);

また、Win32::PowerPointではおまけとして基本的な定数は$pp->c->...でアクセスできるようになっています。この手の情報は、MSDNのほか、Visual Basic Editorの表示メニューから呼び出せるオブジェクトブラウザを利用すると簡単に調べられます―というのは窓使いのみなさんなら先刻ご存じでしょう。

もちろんWin32::OLEで操作できるのはPowerPointだけではありません。WordでもExcelでも、あるいはInternetExplorerでも、とっかかりさえわかってしまえば、あとは同じような方法で操作できます。

大量のExcelファイル、大量のWordファイルに対してちょっとした定型処理をしたいときなど、Visual Basic Editorを立ち上げて標準モジュールやクラスモジュールにごりごり処理を書くのも悪くはないですが、OLEの使い方をマスターしておくと読み込みたいファイルの選択や途中のテキスト処理などはPerlで済ませて、必要な部分だけOLE経由でVisual Basic的な処理を行う、といったことが簡単にできるようになります。これを機会にみなさんもぜひVisual Basicの世界にうわ何をする(ry

はい、お見苦しいところをお見せしました。このように、Win32::OLEを使えばPerlでも簡単にVisual Basicもどきが使えます。Visual Basicをご存じのみなさんはこの機会にぜひPerlも覚えてみてください!

次はどなたになるのかな?