Win32::OLE で Excel を操る perl スクリプト
えーつい最近、Spreadsheet::WriteExcel について聞かれました。ちょっとしたサンプルプログラムを教えたついでに Win32::OLE のサンプルも教えたのでどうせならブログのネタにと記事にしてまとめておきます。よく考えたら、以前 Spreadsheet::WriteExcel が 2.10 から便利になっている件について を書いたときに
と宣言しながらほったらかしにしていたのでちょうどいい機会。
まずは、Win32::OLE まわりで参考になるサイトまとめです。Win32::OLEモジュールだけでも目を通しておくと良いと思います。
- Win32::OLEモジュール(日本語チョウ訳) Ver. 0.14
- Win32::OLE - OLE Automation extensions - search.cpan.org
- Win32 の Perl を使用している Excel を自動化する方法
- Perl講座 PerlからOLEを使用する
- 読書ノート - Perl から Win32 を使う
- 燈明日記 - PerlでEXCELブックからセルデータを読み込む
- おしえてBP! excelファイルをFAXしたい
さて、サンプルプログラムです。サンプルプログラムは前回の 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 の上書き確認と同じく、
なんてダイアログが表示されたりします。ちょっとビックリするかもしてません。上書保存の Save() メソッドなんてのがあるはずなんだけど何故かエラーがでます。事前にファイル消せばすむ話なので深追いしてません。
in METHOD/PROPERTYGET "Save" at t1.pl line 30
サーバサイドでの処理なら Spreadsheet::WriteExcel に決まりですが、クライアントサイドでの処理なら Win32::OLE も憶えておいて損はないかと思います。個人的には VBA 憶えるのまんどいなんて用途に使えるかも?と思っていたり。思っているだけで実は Spreadsheet::WriteExcel ばかり使っていたり。
コメントやシェアをお願いします!
drk
DQN さん>ご指摘有難う御座いました。そういう理由だったわけですね。
DQN
>ファイルの保存先をフルパスで書いてあげないと何故かマイドキュメント配下にファイルが生成されるという Win32::OLE の罠付き
これは、Win32::OLEの仕様ではなくて、Excelの仕様じゃないでしょうか?
VBAでプログラム動かしたときも同じ問題が起こります。
Excelのカーレントディレクトリは、デフォルトではマイドキュメントになっていて、メニューのツール>オプション>全般で変更できますよ。