独立に際して、FileMakerで顧客管理/タスク管理/請求書類を一括管理できるDBを作っています
これまではクライアントとの兼ね合いで、WindowsでFileMakerDBを構築していましたが
今回は自分のDBということで自分の環境に合わせてMacで構築することにしました。

こういうDBを構築するとき、FM自体や、FMから出力したデータをもとにHTMLベースで
帳票関連を出力する方が多いと思いますが
個人的には、その方法はあまり好きではないです。
これらの方法を使うと、出力した帳票が固定したフォーマットになってしまい、
運用で例外のフォーマットに対応ができなくなるためです。
僕は、DBはあくまでデータ管理に徹底して、
帳票関連はエクセルやOpenOffice.orgなどに出力して表示する方法をとります。


Windowsでは、なでしこプラグインを使ったり、
Event送信で、あらかじめ作っておいたWSHファイルを起動したりすれば、
比較的簡単にエクセルやOOoを操作できます。


Macはどうでしょうか。
さすが、FileMakerです。Appleの子会社なだけあって、
AppleScriptの操作体系はかなり完璧に操作できます。
FileMakerのスクリプトでAppleScriptを実行できるので、
http://karaiblog.blog45.fc2.com/blog-entry-201.html
この方法を使えば、比較的簡単に、エクセルへデータを流し込むことができます。

Mac素敵!


…なんですが…ここはドMなプログラマ根性を発揮して、
ShellとLLでどうにかできないか考えてしまいました。

いろいろ調べた結果、様々なLLでエクセルファイルをごにょごにょするライブラリは出てますが、
テンプレート読み込み→データ流しこみ→別ファイルへ出力
ということをやろうと思うと、
エクセル側のバージョンアップに追いついていなかったり、
日本語処理が十分でなかったりと、
使えるレベルのライブラリはありませんでした。
 


じゃあ、規格がオープンであるOpenOffice.orgならどうなんだろうということで調べたら、
Perlにライブラリがありました。
OpenOffice::OODocです。

ざっと読むと
テンプレート読み込み→データ流しこみ→別ファイルへ出力
ができるじゃないか!
 


というわけで、使ってみました。

!!っが!!

いろいろ問題が。

基本的な使い方は、CPANでOpenOffice::OODocをインストールしたうえで、

#!/usr/bin/perl -w
use strict;
use utf8;
use Encode;
use OpenOffice::OODoc;
 
my $doc = odfDocument( file => 'テンプレート.ods' );#テンプレートファイル読み込み
 
#A1へデータを流しこむ
$doc->updateCell( 'Sheet1', 1, 0, 'text' );
 
#A2へデータを流し込む
#数字の場合は型指定が必要
$doc->cellValueType( 'Sheet1', 2, 0, 'float' );#型指定
$doc->updateCell( 'Sheet1', 2, 0, 125 );
 
#ファイル出力
$doc->save('出力先.ods');

どうですか?なんかできそうです。
 
ところがで、OOo3.3で見てみると、
セル結合されているカラムのある行へは、
期待通りのセルへ値が入りません(T_T)
バグなのか、OOoの規格についていってないのかわかりませんが、
どのように値がはいるかいちいちトライしてみる必要があります。

どういうわけだが、何がなんでも値が入らないセルとか、
繰り返し値が入ってしまうセル番号もあります。。。
そういうときは、カラム挿入をしてズラしてやったりなどする必要があります。


まぁそんなこんなで何度となくトライして数時間。
期待通りの場所へ値が入るようになって、
FMから出力したCSVをパースして値を流しこんで帳票完成。

よかったよかった。
 
でも面倒!!Σ(ー◇ー;!!


あとは、FMのスクリプトからシェルを起動すれば、帳票データ完成です。

シェルは、AppleScriptで、

do shell script "perl スクリプトファイル"

とか、

do shell script "cd スクリプトファイルのディレクトリ;perl スクリプトファイル"

とかすればOK。
 
注意点として、AppleScriptからのシェル起動の場合、
@INCの中身がターミナルからの起動と差異がある場合があるので、
AppleScriptがエラーを吐き出す場合は、
use libなどしてモジュールを探すディレクトリを追加してやってください。

 
だったら全部AppleScriptでやれよ!Σ(ー◇ー;!!


そして、最後に作った帳票データをFMのスクリプトから自動起動しましょう。

AppleEventからファイルを指定して起動しようとしたところ、
どうもうまくいきません。
どうやらOOoにファイルパスがうまく渡っていないようです。

というわけで、こちらもシェルで。

do shell script "open /Applications/OpenOffice.org.app ファイルパス"

ってやれば、無事起動できました。



今日の教訓!
極力AppleScriptでやることを考えよ!!