わいえむねっと

Contents
Categories
Calendar
2009/03
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Monthly Archives
~2000/01
Recent Entries
RSS1.0
Templates
Information
Processed: 0.073 sec
Chashed: -
2009/03/31 Tue
リリース準備完了。4時。
寝よう。
会議室で3時間睡眠。
本年度も今日で終わりですか。
今日で16連勤目なのですが。
もげそう。 PerlのWin32::OLEで

use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';

Win32::OLE->GetActiveObject('Excel.Application');
$excel = Win32::OLE->new('Excel.Application', 'Quit');
$book = $excel->WorkBooks->Add;
$sheet = $book->WorkSheets(1);
$sheet->Cells(1, 1)->{Value} = 'FF';
$sheet->Cells(1, 2)->{Value} = '=HEX2DEC(A1)';
$book->SaveAs('foo.xls');
$book->Close();
$excel->Quit;

とかしてアドイン関数を挿入しようとすると


とかなってしまうのをねじふせるメモ。
原因は

CreateObject コマンドを使用した場合、Excel でアドインが読み込まれない
http://support.mi​crosoft.co​m/kb/213489/ja
' If you need to register the functions and commands
' contained in a resource (XLL), use the RegisterXLL method.
' In the example below, all functions of Analys32.xll are
' registered.
' XL.RegisterXLL "Analys32.xll"

の絡み。アドインが読み込まれていない状態で関数を挿入しようとしていることでエラーになってしまうと。
でも、上記内容を参考に

$excel->RegisterXLL('Analys32.xll');

としても変化なし。というか、0が返却される。
これを、

$excel->RegisterXLL($excel->{LibraryPath}.'\Analysis\Analys32.xll');

のようにフルパスにすると


期待する動作をするように。
ただ、$Win32::OLE::Warn が 2以上だと

Win32::OLE(0.1707) error 0x80010105: "サーバーによって例外が返されました。"
    in METHOD/PROPERTYGET "RegisterXLL" at foo.pl line 7

とか例外を吐かれてしまう。
なんで!
とりあえず、evalで誤魔化すとか、$Win32::OLE::Warn を下げるとか。お茶を濁す。