perlでExcelを叩く
面倒!から始まったWin32スクリプト生活。
テスト環境や実験レポートの処理では、画像ファイル・テキストファイルの処理を行うものですが、その他にExcelの連携が必要になったので、Officeのマクロを覚えることにしました。・・・とは言ってもOfficeの中身を覚えるのは仕方ないとして、VBAの構文を覚えるのが面倒です。ただでさえシェルやらスクリプトやらCADの類の組み込み言語やらの間を行ったり来たりしているのに、
そこにVBAまで加えたくありません。そこで妥協案としてPerlからOfficeを叩くことにしました。
とりあえず、資料作りで必要なことは以下のとおり。
・office(特にExcel)を開く云々
・セルに字を書く、式を書く、幅、高さ調整
・線を引いて矢印
・テキストボックスを貼る
・画像ファイルを貼り付ける。
・罫線を引く
こんなところでしょうか?あとは若干の整形ができれば十分です。
Perlは当然必要ですが、PerlでOLEを叩く場合、Win32::OLEモジュールをインポートする必要があります。以下の環境でインポートができることを確認しました。
・Active Perl
・cygwinのperlとperl-libwin32
とりあえず試し
#!/bin/env perl
#
# ExcelをPerlから操作するサンプル
#
use strict;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';
my $Excel = Win32::OLE->new("Excel.Application");
$Excel->{Visible} = 1;
my $Book = $Excel->Workbooks->Add;
my $Sheet = $Book->Worksheets(1);
##### 表を作る #####
#値、式
my $Range=$Sheet->Range("B4:D9");
$Range->{Value} =
[['パルス数', '分割数', '回転数'],
[ 12, 4, '=B5/C5'],
[ 48, 8, '=B6/C6'],
[ 384, 32, '=B7/C7'],
[ 2048, 64, '=B8/C8'],
[ 16384, 128, '=B9/C9']];
###罫線
$Range->Borders(xlInsideHorizontal)->{weight} = xlThin;
$Range->Borders(xlInsideVertical)->{weight} = xlThin;
$Range->Borders(xlEdgeTop)->{weight} = xlMedium;
$Range->Borders(xlEdgeBottom)->{weight} = xlMedium;
$Range->Borders(xlEdgeLeft)->{weight} = xlMedium;
$Range->Borders(xlEdgeRight)->{weight} = xlMedium;
$Sheet->Range("B4:D4")->Borders(xlEdgeBottom)->{LineStyle} = xlDouble;
###背景色
$Sheet->Range("D5:D9")->Interior->{Color} = 0xFFFF88;
###セルをコピー、値だけペースト
$Sheet->Range("D5:D9")->Copy();
$Sheet->Range("F5")->PasteSpecial(xlPasteValues);
###2行目の高さとF列目の幅を変える
$Sheet->Rows("2")->{RowHeight}=10;
$Sheet->Columns("F")->{ColumnWidth}=5;
##### 矢印とテキスト ####
my $Textbox=$Sheet->Shapes->AddTextbox(1,400,60,200,70);
$Textbox->TextFrame->Characters->{Text} = "水色の部分は式\nその右は値だけコピーしています。";
my $Line=$Sheet->Shapes->AddLine(330,80,380,80)->Line;
$Line->{BeginArrowheadStyle}=xlArrowHeadStyleOpen ;
$Line->{BeginArrowheadWidth}=xlArrowHeadWidthNarrow ;
$Line->{Weight}=xlThick;
$Line->ForeColor->{RGB} =0xFF0000;
##### 画像を貼り付ける #####
$Sheet->Shapes->AddPicture("D:\\ole\\shiroi_yatsu_03.jpg",0,1,150,200,150,113);
##### セーブして終了 #####
$Excel->{DisplayAlerts} = 'False'; # 警告非表示
$Book->SaveAs("D:\\ole\\test.xls"); #フルパスでないとMyDocumentにできる
$Excel->Quit();
他にも方法があるかもしれないが、現段階で私は「Excelオブジェクトの階層構造」から順に追っている。キーワードで"Excel オブジェクト"と入れると5つか6つ目ぐらいで出てくる。