ActiveXを使用したExcelデータ操作
続いて、CurlからActiveXを使用したExcelデータの操作方法について解説します。
一般的なWebアプリケーションからアクセスされるコンテンツはWebサーバーを通じたデータベース内のデータなどです。しかし、Curlはそれらの一般的なサーバーサイドにあるデータだけでなく、ローカルディスク上のデータにもアクセスできます。
通常のテキストデータやバイナリデータではなく(※注意)、ローカルマシンにインストールされたアプリケーションに依存したファイルなどにアクセスする必要がある場合もあります。例えば、以下のようなコンテンツです。
- Microsoft Excel、Word、PowerPoint、VISIO
- Flashムービー
- CAD
- Browserコンロール
上記のようなコンテンツにアクセスする場合は、提供されているActiveXコントロールを使用してデータを読み込んだり、再生したりできます。
今回はCurlアプリケーション上に表示されているRecordGrid(一覧形式のインタフェース)からExcelファイルに出力するサンプルを解説します。
テキストファイルやバイナリファイルのアクセスについては、以下を参照ください。
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 set {obj_Excel.Range "A2","C2"}.Borders.weight = 4 set {obj_Excel.Range "A2","C2"}.Interior.ColorIndex=12 ' Excel マクロの場合 Range("A2:C14").Borders.LineStyle = 1 Range("A2:C2").Borders.LineStyle = 4 Range("A2:C2").Interior.ColorIndex = 12
上記から、ほとんど同じ記述をしていることがわかります。このように、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 }
注意事項
ActiveXの削除
ActiveXObjectは、ガベージコレクションで解放されない限りメモリ上に残ってしまうため、処理の終了時にActiveXObjectを削除することをお勧めします。
クライアントマシンに依存するActiveXコントロール
ActiveXコントロールはクライアントマシンの環境に依存するため、ActiveXコントロールの有無やバージョンなども十分に考慮し使用してください。
セキュリティについて
ActiveXコンロールはクライアント資源の1つです。クライアント資源にアクセスするには、セキュリティレベルを解除する「特権」を付与しなければなりません。詳しくは、以下を参照ください。
また、ActiveXコントロール関連のヘルプドキュメントは、以下を参照ください。
まとめ
今回は、Curlの「バリデーションチェック」と「ActiveXを使用したExcelデータ操作」について紹介しましたが、CurlはAPIが豊富に提供されているので、業務系アプリケーション用に複雑なUIを作りたいときに、これらの部品を利用できます。まずは、サンプルを使って試してみてはいかがでしょうか。
参考資料
- 開発ガイド - グラフィカル ユーザーインターフェイス - ガイアログとコントロール - コントロールにおけるデータ検証
- APIリファレンス - CURL.GUI.CONTROL - VALIDATION - validate-with
- APIリファレンス - CURL.GUI.CONTROL - VALIDATION - validate-dialog
- APIリファレンス - CURL.GUI.CONTROL - VALIDATION - ValidationPattern
- 逆引きリファレンス-IO・ネットワーク-コンテンツの読込み・書き込み
- Curl開発者ガイド→外部リソースとの対話→ファイルやリソースへのアクセス→テキストファイルの読み取りと書き込み
- Curl開発者ガイド→テキスト書式→特別なテキスト書式→image
- Curl開発者ガイド→グラフィカルユーザーインターフェイス→ActiveXコントロール