はじめてのWin32::OLE(word2txt.vbsをperlに移植してみた)
PerlのWin32::OLEを使って、word2txt.vbs を Perl に移植してみた。
これまで、Win32::OLE を使ったことがなかったので、WordやExcelのファイルをバッチ処理したいときは、いったんテキストに変換してPerlで処理していた。VBAは生産性が低いのであまりすきじゃない。
WordやExcelのファイルをテキストに落とすときには、ここのexcel2txt.vbsやword2txt.vbsにお世話になっていたのだが、PerlからOLEを使えばいいじゃんといういうことにようやく気づいた。
このあたり(PerlからのOLE使用法)の情報を参考に word2txt.vbs を perl に移植してみた。ドラッグしたファイルを対象にするのではなく、カレントディレクトリの全docファイルを処理対象にしている。
#!/usr/bin/perl use strict; use Win32::OLE; use Win32::OLE::Const 'Microsoft Word'; use Cwd; # ワークディレクトリにカレントディレクトリを設定 my $wd = Cwd::getcwd()."/"; print STDERR "$wd\n"; # ワードファイルをテキスト形式で保存 while(my $filename = <*.doc>){ # ファイル名から拡張子を削除 $filename =~ s/\.doc$//; print STDERR "$filename.txt -> $filename.txt\n"; my $Word = Win32::OLE->new('Word.Application', 'Quit'); $Word->Documents->Open($wd."$filename.doc") || die("Unable to open document ", Win32::OLE->LastError()); $Word->ActiveDocument->SaveAs($wd."$filename.txt", 2); $Word->Documents->Close; }
基本的には、PerlからのOLE使用法にあるとおり、VBAのコードを以下のように変換するだけ。簡単。もっと早く気づいていればよかった。
VBA(Visual Basic for Applications)では、文法は以下のようになっています。: object.method(argument).property = value Perlでは、以下のようになります。 object->method(argument)->{property} = value; つまり、次のVBAのサンプルコードは: ActiveChart.Axes(xlCategory, xlPrimary).CategoryType = xlCategoryScale Perlでは以下のようになります。: $Chart->Axes(xlCategory, xlPrimary)->{CategoryType} = xlCategoryScale;
参考URL
- perlwin32faq12 - PerlからのOLE使用法
http://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq12j.html - Win32::OLEモジュール
http://homepage3.nifty.com/hippo2000/perltips/Win32/OLE.htm
ちなみに、RubyのWin32OLEについては Rubyist Magazine に詳細な解説がある。
言語を問わず参考になる。
- Win32OLE 活用法 【第 1 回】 Win32OLE ことはじめ
http://jp.rubyist.net/magazine/?0003-Win32OLE - Win32OLE 活用法 【第 2 回】 Excel
http://jp.rubyist.net/magazine/?0004-Win32OLE