Silverlight 4 Excel連携


Silverlight 4が正式リリースとなりました!

Silverlight 4 の様々な新機能に加え、Windows phone 7のSilverlight 対応など、楽しい話題が盛りだくさんですね。

現在Silverlightの普及率は60%、日本では70%以上に上昇しているとのこと。昨年のPDC09(2009/11)時点では45%ということで、短期間での注目度アップが伺えます。

Silverlight 4 のたくさんある新機能の一つとして、COMオートメーション機能を使ったExcel連携を試してみましたので、以下簡単な使い方を載せました。

まず、いくつかポイントを挙げます。

●権限昇格モードのOut-of-browser実行します。

●beta版からの変更あり。
 ComAutomationFactory Class
 名前空間:System.Windows.Interop

 
 AutomationFactory Class
 名前空間:System.Runtime.InteropServices.Automation

●dynamic変数を使うため、Microsoft.CSharp.dllを追加します。
(デフォルトでインストールすると、C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Libraries\Clientあたりにある)

●COMオブジェクトのリソースの解放をしないとプロセスが残ってしまうので、使い終わったCOMオブジェクトはDispose()を忘れずに。

それでは、簡単なExcelの操作方法を挙げてみます。

・Excelオブジェクト生成して表示
dynamic excel = AutomationFactory.CreateObject(”Excel.Application”);
excel.Visible = true;

・ワークブック追加
dynamic workbooks = excel.Workbooks;
workbooks.Add();

・アクティブなシートを取得
dynamic sheet = excel.ActiveSheet;

・[1,1]のセルを取得して文字列を入れる
dynamic cell = sheet.Cells[1,1];
cell.Value = “名前”;

・Excel側の変更イベントをSilverlight側で受け取れるようにする
delegate void SheetChangeDelegate(dynamic excelSheet, dynamic rangeArgs);

excel.SheetChange += new SheetChangeDelegate(SheetChangedEventHandler);

//イベントハンドラでExcel情報を受け取る例
private void SheetChangedEventHandler(dynamic excelSheet, dynamic rangeArgs)
{
  string sheetName = excelSheet.Name; //シート名の取得
  int row = rangeArgs.Row; //変更されたセルの列を取得
  int col = rangeArgs.Column; //変更されたセルの行を取得
}

・チャートを追加
dynamic shapes = sheet.Shapes;
shapes.AddChart(4, 300, 10, 400, 300); //AddChart(Type, Left, Top, Width, Height)

その他、Excel操作ではありませんが、動作状況を確認する方法です。

・Out-of-browserで実行されているか確認
if ( !App.Current.IsRunningOutOfBrowser ){…}

・COMオートメーションが利用可能か確認
if ( !AutomationFactory.IsAvailable ){…}

以上、簡単な使い方の例でしたが、これでSilverlightのDataGridコントロールなどで表示しているデータと、Excel上のデータを簡単に連動させられるようになります。特に業務系のアプリケーションなどでの活躍に期待大です!

Silverlightアプリ

Excelボタンを押すとExcelを起動し、その際SilverlightのDataGridが持つデータをExcelへ渡しています。
この例では、AddChartの第1引数に”-4102″を指定して、3D円グラフを表示させました。