はじめての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

ちなみに、RubyのWin32OLEについては Rubyist Magazine に詳細な解説がある。
言語を問わず参考になる。