一般的なWebアプリケーションからアクセスされるコンテンツはWebサーバーを通じたデータベース内のデータなどです。
しかしCurlはそれらの一般的なサーバーサイドにあるデータでなくローカルディスク上のデータにもアクセスすることができます。
通常のテキストデータやバイナリデータではなく(※)ローカルマシンにインストールされたアプリケーションに依存したファイルなどにアクセスする必定があり場合があります。例えば以下のようなコンテンツです。
- Microsoft Excel ,Word ,PowerPoint ,VISIO
- Flashムービー
- CAD
- Browserコンロール
上記のようなコンテンツにアクセスする場合は提供されているActiveXコントロールを使用してデータを読み込んだり、または再生したりすることができます。
今回はCurlアプリケーション上に表示されているRecordGrid(一覧形式のインタフェース)からExcelファイルに出力するサンプルを解説していきます。
※ テキストファイルやバイナリファイルのアクセスについては以下を参照ください。
- 逆引リファレンス-IO・ネットワーク-コンテンツの読込み・書き込み
- Curl開発者ガイド→外部リソースとの対話→ファイルやリソースへのアクセス→テキストファイルの読み取りと書き込み
- Curl開発者ガイド→テキスト書式→特別なテキスト書式→image
ActiveXObjectの作成
サンプルソースの7行目に以下のような記述があります。
let obj_Excel:ActiveXObject = {ActiveXObject ProgId = “Excel.Application” } |
Excelのような外部コンテンツとやり取りを行うにはまず、ActiveXObjectクラスを使用してExcelアプリケーションのActiveXObjectのインスタンスを生成します。
ちなみにMicrosoft Office 2003、Microsoft Office 2007で確認しましたがExcelのプログラムIDは”Excel.Application”です。
ActiveXObjectのメソッドやプロパティの使用
ActiveXオブジェクトのインスタンスが生成されたらあとはそのメソッドやプロパティを使用してコンテンツを制御することができます。
11行目から32行目までの処理はExcelのマクロの処理をCurlで記述しただけです。
ちなみ以下のセルのボーダーの設定をしている部分を
Curlで記述してる部分とExcelマクロで書いてる部分を比較してみましょう。
|| Curlの場合 set {obj_Excel.Range “A2″,”C14”}.Borders.LineStyle = 1 |
‘ Excel マクロの場合 Range(“A2:C14”).Borders.LineStyle = 1 |
ほとんど同じ記述をしていることがわかります。
このようにActiveXObjectを使用して外部コンテンツをコントロールすることができます。
CurlからExcelファイルの生成とデータの出力
サンプルソースは以下の流れになっています。
1.ボタンを押し出力ファイルを選択する
80行目のCommandButtonの部分で実装しています。84行目のchoose-fileプロシージャを使用してファイル選択ダイアログを出力し、
choose-fileプロシージャの返却値(Url)を6行目で定義されたrecords-to-excelプロシージャに渡しています。
{CommandButton label=”Excel出力”, {on Action do let file-url:#Url {if-non-null file-url={choose-file style = FileDialogStyle.save-as, filters={{Array-of FileDialogFilter} {FileDialogFilter “Microsoft Office Excel ブック”, {new {Array-of FileDialogTypeFilter}, {FileDialogTypeFilter “xls”} } } } } then {records-to-excel file-url.name,”海外ドラマ「HEROS」のキャスト”,rg.records} } } } |
2.Excelファイルが生成され保存される。
Excelファイルを生成し、データを出力する部分がrecords-to-excelプロシージャです。このプロシージャはパラメータとして以下を受け取っています。
- ファイル名(String)
- タイトル名(String)
- レコードデータ(RecordView)
define-proc {records-to-excel str_FileName:String,title:String,records:RecordView}:void |
メインの処理は3番目のレコードデータを35行目のロープ処理で1行づつ出力しているところです。それ以外は罫線や背景を設定しています。
let i:int=3 {for r in records do set {obj_Excel.Cells i,1}.Value = {r.get “First”} set {obj_Excel.Cells i,2}.Value = {r.get “Last”} set {obj_Excel.Cells i,3}.Value = {r.get “Power”} set {obj_Excel.Cells 1,3}.ColumnWidth = 40 set i = i + 1 } |
注意事項
- AcitveXの削除
ActiveXObjectは削除しない場合はガベージコレクションでされない限りメモリ上に残ってしまいますので処理の終了時にActiveXObjectを削除することをお勧めします。 - クライアントマシンに依存するActiveXコントロール
またActiveXコントロールはクライアントマシンの環境に依存するためActiveXコントロールの有無やバージョンなども十分に考慮し使用することをお勧めします。 - セキュリティについて
ActiveXコンロールはクライアント資源の一つです。クライアント資源にアクセスするにはセキュリティレベルを解除する「特権」を 付与しなければなりません。
詳しくはこちらをご覧ください。
「Curlのセキュリティモデルについて」(Curl Blog)
「チュートリアル-開発準備編-セキュリティの設定(特権設定)」