独立に際して、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でやることを考えよ!!
コメントを残す