ActiveXを使用したExcelデータの操作

一般的なWebアプリケーションからアクセスされるコンテンツはWebサーバーを通じたデータベース内のデータなどです。
しかしCurlはそれらの一般的なサーバーサイドにあるデータでなくローカルディスク上のデータにもアクセスすることができます。
通常のテキストデータやバイナリデータではなく(※)ローカルマシンにインストールされたアプリケーションに依存したファイルなどにアクセスする必定があり場合があります。例えば以下のようなコンテンツです。

  • Microsoft Excel ,Word ,PowerPoint ,VISIO
  • Flashムービー
  • CAD
  • Browserコンロール

上記のようなコンテンツにアクセスする場合は提供されているActiveXコントロールを使用してデータを読み込んだり、または再生したりすることができます。
今回はCurlアプリケーション上に表示されているRecordGrid(一覧形式のインタフェース)からExcelファイルに出力するサンプルを解説していきます。

activex.jpg

※ テキストファイルやバイナリファイルのアクセスについては以下を参照ください。

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
 }

 

注意事項

  • AcitveXの削除
    ActiveXObjectは削除しない場合はガベージコレクションでされない限りメモリ上に残ってしまいますので処理の終了時にActiveXObjectを削除することをお勧めします。
  • クライアントマシンに依存するActiveXコントロール
    またActiveXコントロールはクライアントマシンの環境に依存するためActiveXコントロールの有無やバージョンなども十分に考慮し使用することをお勧めします。
  • セキュリティについて
    ActiveXコンロールはクライアント資源の一つです。クライアント資源にアクセスするにはセキュリティレベルを解除する「特権」を 付与しなければなりません。

詳しくはこちらをご覧ください。
Curlのセキュリティモデルについて」(Curl Blog)
チュートリアル-開発準備編-セキュリティの設定(特権設定)」 

 

サンプルコードのダウンロード

関連ヘルプドキュメント

Curl開発者ガイド→グラフィカルユーザーインターフェイス→ActiveXコントロール