マイクロソフト株式会社 デベロッパーマーケティング本部
デベロッパーエバンジェリスト 伊藤 英豪

最終更新日 2004 年 8 月 18 日

このコンテンツのポイント
  • Office アプリケーションから Web サービスの利用方法について理解する。



今回紹介するコード

<Service1.asmx.cs>

 

C#
[WebMethod]
public CustDS GetCustomers() 
{
	CustDS MyDS = new CustDS();
	sqlDataAdapter1.Fill(MyDS, "Customers");
	return MyDS;
}
 

<ThisWorkbook.cs>

C#
// Excel上のボタンの定義
  private MSForms.CommandButton MyButton;
  protected void ThisWorkbook_Open()
  {
     // Excel上のコマンドボタンコントロールを返却
     MyButton = 
        (MSForms.CommandButton) FindControl("CommandButton1"); 
     // ボタンにイベントハンドラを登録
     MyButton.Click += 
        new MSForms.CommandButtonEvents_ClickEventHandler(MyButton_Click); 
  }
  private void MyButton_Click ( )
  {
      // Excel上のコマンドボタン押下で、Web サービスを呼び出します
      localhost.Service1 MyWS = new localhost.Service1();
      localhost.CustDS MyDS = new localhost.CustDS();
      MyDS = MyWS.GetCustomers();
      // 既に設定済みの対応付けに基づいてセルにデータセットのデータを一括で貼り付けます
        ThisWorkbook.XmlMaps["CustDS_対応付け"].ImportXml(MyDS.GetXml(),true);
  }
 

 

目次
はじめに
作成するアプリケーションの概要
Web サービスの作成
Web サービス クライアントの作成
動作と解説
おわりに
補足情報

Visual Basic .NET の内容はこちらに掲載しています。
10 行でズバリ !! Office アプリケーションからの Web サービスの利用 (VB .NET)


  

はじめに

ビジネスロジックをサーバーサイドで Web サービス として実装することで、Windows フォームや Web フォーム、あるいは Office といった様々なクライアントでサーバーサイドのビジネスロジックを共有利用することが可能となります。

いわば、マルチクライアントの実現が Web サービスによって容易に実現可能になるといえます。

今回の 10 行シリーズでは、 簡単な Web サービスの作成と、それを利用する Office アプリケーションの作成を通じて、Web サービスの作成や利用が Visual Studio .NET 2003 によって容易に開発できることを見ていきます。

 

作成するアプリケーションの概要

Excel 2003 が Web サービスのクライアントとなり、Web サービスが返却する顧客の一覧 (型付 DataSet として返却) を Excel シート上に表示するといったものです。

 

Web サービスの作成

Web サービス自体は 『10 行でズバリ !! Windows アプリケーションからの Web サービスの利用 (C#)』 で説明したものと同じものを使用します。

詳細な作成方法は前述の 『10 行でズバリ !! Windows アプリケーションからの Web サービスの利用 (C#)』 をご覧下さい。

 

Web サービス クライアントの作成

Web サービス クライアント として、今回は Office (具体的には Excel 2003) のアプリケーションを VSTO (Visual Studio Tools for Office) を使用して作成します。

Visual Studio Tools for Office は、Visual Studio .NET 2003 を使用する開発者が、Excel 2003 および Word 2003 ベースのアプリケーションの背後で動作するコードを記述するためのテクノロジーです。これを使用すると Excel 2003 および Word 2003 においてデータベースや XML データを容易に操作することができます。

ソリューション エクスプローラーでソリューション SolutionCS を選択し、マウス右クリックの[プロジェクトの追加] [新しいプロジェクト]を選択し、[Microsoft Office System Projects] の中の、[Visual C# プロジェクト] を選択し、テンプレートとして [Excel ワークブック] を使用します。[プロジェクト名] テキストボックスに名称を入力したら "OK" ボタンをクリックします。

図1. Office ワークブックの選択

Microsoft Office プロジェクト ウィザード] ダイアログで "Excel ワークブック" の作成で [新規作成] オプションをオンにし [OK] をクリックします。

図2. Visual Studio Tools for Office の Excel プロジェクトウィザード

ExcelClient のプロジェクトの参照設定をマウスで右クリックし、プルダウンメニューの [Web 参照の追加]を選択し、既に作成済みの Web サービス Service1 への参照を追加します。

図3. Web 参照の追加

図4. Web 参照の追加

このタイミングで、Web サービスへのあたかもローカルのクラスへのアクセスのように透過的に行うためのプロキシクラスが生成されます。プロキシクラスに関しては前回の 『10 行でズバリ !! Web サービス カスタムデータの受け渡し (C#)』 をご覧下さい。

この段階で、ソリューション エクスプローラー上部の全てのファイルの表示ボタンを押すと、CustDS.xsd というファイルが生成されているのが分かります。

図5. 全てのファイルの表示

これは Web サービスが返却する型付 DataSet のスキーマ定義になります。今回は、Excel 上のセルとのマッピングを XML スキーマによって一括に行いますが、このスキーマファイルを、マッピング時に使用します。具体的な手順は後述します。

それでは、Excel シート上にデータを表示する部分と、Web サービスを呼び出すボタンを配置します。今の段階で Excel アプリケーションのプロジェクトを スタートアップ プロジェクトに設定し、F5 キーを押してデバック実行します。そうすると Excel が起動されてくるので、先ほどの XML スキーマファイルをセルにマッピングします。

Excel のメニューの [データ] → [XML] → [XMLソース] を選択します。

図6. XML ソースの選択

[XML ソース] 作業ウィンドウの [XML 対応付け] ボタンをクリックします。

[XML 対応付け] ダイアログの [追加] ボタンをクリックします。

プロジェクトフォルダ内にある Web 参照で生成された "CustDS.xsd" ファイルを選択し [OK] ボタンをクリックします。(ここまでの手順通り進んでいる場合は、C:\Work\SolutionCS\ExcelClient\Web References\localhost に存在します)

※本来は型付 DataSet 作成時に名前空間の指定を行い、他のスキーマ定義との名前の衝突を避ける必要がありますが、今回はテスト用のテンポラリの名前空間のままとしています。

図7. XML の対応付け

[XML ソース] ウィンドウからデータを表示したいワークシートの場所にスキーマをドラッグ アンド ドロップします。

図8. XML スキーマとセルとのマッピング

続いて、コマンドボタンを貼り付けます。Excel のコントロールツールボックスのツールバーからコマンドボタンを選択し、下図のような位置に貼り付けます。

図9. コマンドボタンの配置

ここまでで、"ExcelClient.xls" ファイルを上書き保存し、Excelを閉じます。

以上でUIとしての Excel シートの準備が完了しました。次に Excel の背後で動作するコードを記述します。ソリューション エクスプローラーから "ThisWorkbook.cs" を選択し、ダブルクリックしてコードを表示させます。

次に、以下の赤字で書かれているコードを記述します。

C#
protected Excel.WorkbookEvents_OpenEventHandler openEvent;
  protected Excel.WorkbookEvents_BeforeCloseEventHandler beforeCloseEvent;
  // Excel上のボタンの定義
  private MSForms.CommandButton MyButton;
 
C#
protected void ThisWorkbook_Open()
 {
   // Excel上のコマンドボタンコントロールを返却
   MyButton = 
     (MSForms.CommandButton) FindControl("CommandButton1"); 
   // ボタンにイベントハンドラを登録
   MyButton.Click += 
     new MSForms.CommandButtonEvents_ClickEventHandler(MyButton_Click); 
 }
 
C#
protected void MyButton_Click ( )
 {
   // Excel上のコマンドボタン押下で、Web サービスを呼び出します
   localhost.Service1 MyWS = new localhost.Service1();
   localhost.CustDS MyDS = new localhost.CustDS();
   MyDS = MyWS.GetCustomers();
   // 既に設定済みの対応付けに基づいてセルにデータセットのデータを一括で貼り付けます
   ThisWorkbook.XmlMaps["CustDS_対応付け"].ImportXml(MyDS.GetXml(),true);
 }
 

動作と解説

Web サービス クライアントである Excel のプロジェクトを スタートアップ プロジェクトに設定し、デバック実行します。

Excel が起動するので、コマンドボタンをクリックします。

図10. Excel アプリケーション 実行結果

Excel のボタンをクリックした際に、Web サービスがプロキシ経由で呼び出されます。そして、型付 DataSet が XML (DiffGram 形式) にシリアライズされて、それが再び型付 DataSet にデシリアライズされて、クライアント側に渡るといった動作となります。(シリアライズ、デシリアライズに関しては、前回の 『10 行でズバリ !! Web サービス カスタムデータの受け渡し (C#)』 をご覧下さい)

Excel 上では、XMLMap オブジェクトの ImportXML メソッドの引数に設定済みの XML スキーマとの対応付け情報を渡すことにより Web サービスから取得した XML データを該当のマッピング情報を基にセルに一括で貼り付けています。これ以外にも For 文などを使用して一つ一つデータを Range オブジェクトを使用して入れていくことも可能ですが、XMLMap オブジェクトの ImportXML メソッドの使用の方が、コードも簡潔になり、動作性能も向上します (動作性能はセル数に比例してその差が大きくなっていきます)。

 

おわりに

今回の場合は、ビジネスロジックと言うにはあまりにも単純なものでしたが、Web サービスとしてサーバーサイドのビジネスロジックを実装し、様々なユーザーインターフェイスの要件に応じて Windows フォームや Web フォームや Office といったユーザーインターフェイスを最適なものを選択し、サーバーサイドのビジネスロジックは再利用することが可能になります。ともすれば Web サービスは B2B とか EAI といった感覚を持たれている方もいらっしゃるとは思いますが、ノード (物理的なティア) が分散するときの接続手順として、あるいはマルチプラットフォームを意識したサービスとしてのソフトウェアの再利用方法として、有効に活用することが可能な技術であるといえます。

マルチ UI の実現、あるいはビジネスロジックのサービスとしての再利用のために Web サービスをご活用下さい。

 

補足情報

クライアントとサーバー間のデータ転送容量は、設計段階で見積もりが可能となります。また、クライアントサイドでは、定められたデータ形式 (今回の場合は 型付 DataSet) のハンドリング (表示及びデータ加工、編集) が主な仕事になります。つまり、クライアントサイドとサーバーサイドの役割を明確に分離し、インターフェイスが変わらなければ相手側の実装には依存しないといった疎な関係をクライアントとサーバー間で取ることが可能です。

なお、今回はクライアントとサーバー間の転送形態としては DataSet を採用していますが、それ以外にも前回ご紹介したカスタムオブジェクト等、様々な表現形式があります。特にマルチプラットフォームでの相互運用を意識する場合は、XML スキーマを意識し、XML ドキュメント交換であるといった考え方が重要になります。

なお、Excel をクライアントとした Web サービス経由のデータ更新のサンプルとしては、VB.NET のサンプルですが、下記のサンプル中の在庫更新が参考になります (データ転送量軽減のために Excel 上の更新のあった行を判別するためのテクニックや、XML ドキュメント交換のスタイルでの実装となっています)。

スマート クライアント ソリューション サンプル


Code Recipe .NET Framework デベロッパー センター

ページのトップへ