Win32::OLE で Excel を操る perl スクリプト

えーつい最近、Spreadsheet::WriteExcel について聞かれました。ちょっとしたサンプルプログラムを教えたついでに Win32::OLE のサンプルも教えたのでどうせならブログのネタにと記事にしてまとめておきます。よく考えたら、以前 Spreadsheet::WriteExcel が 2.10 から便利になっている件について を書いたときに

ちなみに、Windows 上の ActivePerl なら、Win32::OLE 使う方法もあります。こちらについてはまた別途。

と宣言しながらほったらかしにしていたのでちょうどいい機会。

- スポンサーリンク -

まずは、Win32::OLE まわりで参考になるサイトまとめです。Win32::OLEモジュールだけでも目を通しておくと良いと思います。


さて、サンプルプログラムです。サンプルプログラムは前回の Spreadsheet::WriteExcel とほぼ同じ内容の処理です。ファイルの保存先をフルパスで書いてあげないと何故かマイドキュメント配下にファイルが生成されるという Win32::OLE の罠付き。フルパスじゃないと、アレ?ファイルはドコ?なんて事になりかねないのでご注意を。

#!/usr/bin/perl -w
use strict;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
$Win32::OLE::Warn = 3;

my $Excel;
eval {
    $Excel = Win32::OLE->GetActiveObject('Excel.Application')
        || Win32::OLE->new( 'Excel.Application', 'Quit' );
};
if ($@) {
    die qq{Excel Not Found! $@};
}

eval {
    my $Book  = $Excel->Workbooks->Add;
    my $Sheet = $Book->Worksheets(1);
    my $y = 1;
    while () {
        chomp;
        my @data = split( ',', $_ );
        my $x = 1;
        foreach (@data) {
            $Sheet->Cells( $y, $x++ )->{'Value'} = $_;
        }
        $y++;
    }
    $Book->SaveAs('c:\test.xls');
    #$Book->Save('c:\test.xls');
    $Excel->Quit;
};
if ($@) {
    die qq{error\n $@};
}

1;
__DATA__
ページ タイトル,固有の訪問数,ページビュー数,平均閲覧時間,離脱率,$ インデックス
おいしいパン&離乳食をつくるぞ日記。,74,95,50.41,69.47,0.00
ベーグル Archives :: おいしいパン&離乳食をつくるぞ日記。,12,23,26.08,43.48,0.00
甘くないパン Archives :: おいしいパン&離乳食をつくるぞ日記。,9,9,36.80,44.44,0.00
離乳食 Archives :: おいしいパン&離乳食をつくるぞ日記。,9,11,53.00,54.55,0.00

ところで Win32::OLE + Perl で Excel を扱うってことは Windows 上で Excel を操っているに等しいんです(たぶん・・・)。従って挙動も Excel のそれになります。たとえばファイルを保存する際に SaveAs() メソッド(=名前を付けて保存)と記述すると、既にファイルが存在している場合は Excel の上書き確認と同じく、

img01.jpg

なんてダイアログが表示されたりします。ちょっとビックリするかもしてません。上書保存の Save() メソッドなんてのがあるはずなんだけど何故かエラーがでます。事前にファイル消せばすむ話なので深追いしてません。

Win32::OLE(0.1703) error 0x8002000e: "パラメータの数
in METHOD/PROPERTYGET "Save" at t1.pl line 30

サーバサイドでの処理なら Spreadsheet::WriteExcel に決まりですが、クライアントサイドでの処理なら Win32::OLE も憶えておいて損はないかと思います。個人的には VBA 憶えるのまんどいなんて用途に使えるかも?と思っていたり。思っているだけで実は Spreadsheet::WriteExcel ばかり使っていたり。

- スポンサーリンク -