Office 2010とSilverlight 4の連携

2010年6月17日(木)
PROJECT KySS

RSSフィードの内容をExcelに表示する

最後に、Excelを使ったサンプルを紹介します。

これは、COMオートメーションを用いて、信頼されたTrustedモードのブラウザ外実行で、Think ItのRSSフィードから情報を取得して、Excelに表示するというものです(図5、図6)。

プロジェクト・ファイルは、こちらからダウンロードできます。

図5: Think ItのRSSを表示したところ

今回サンプル・データとして用いるThink ItのRSSフィードの構造は、ブラウザでhttp://thinkit.co.jp/rss/rss20.xmlを表示して、右クリックで表示されるショートカット・メニューの「ソースの表示(V)」で確認してください。このサンプルでは、要素の子要素(と<link />の内容)を取得して、Excelシートに表示させています。

図6: ブラウザ外実行で、Think Itの記事情報がExcelワークシート内に表示されている

ExcelでRSSフィードを表示するサンプルを作成する

これまでと同様の手順で、新規Silverlight 4プロジェクト(プロジェクト名は「SL4_Excel_RSS」)を作成し、プロジェクト依存関係も設定しておきます。

また、RSS形式のデータを処理するため、「Project/Add Reference」からSystem.Xml.Linqを追加しておきます。

ToolboxからTextBlockとButtonを1個ずつレイアウトして、ButtonのContentプロパティに「Think ItのRSSをExcelに表示」と指定しておきます(図7)。

図7: Buttonコントロールをレイアウトした

このサンプルは信頼されたTrustedモードのブラウザ外実行で動作させます。ブラウザ外実行を設定する詳しい手順および、デバッグの手順については、以前の記事を参照してください。以上の操作で書き出されるXAMLコードは省略します。

ロジック・コードはリスト4のようになります。

リスト4: RSSフィードの内容をExcelに表示するロジック・コード(MainPage.xaml.vb)

■名前空間の読み込み
LINQ to XMLでXMLを処理するクラスの含まれるSystem.Xml.Linq名前空間をインポートします。ネットワークに関して使用されるプロトコルのためのプログラミング・インターフェースを提供するクラスの含まれる、System.Net名前空間をインポートします。COMオートメーションに関するクラスの含まれる、System.Runtime.InteropServices.Automation名前空間をインポートします。
Imports System.Xml.Linq
Imports System.Net
Imports System.Runtime.InteropServices.Automation

■[Think ITのRSSをExcelに表示]ボタンをクリックしたときの処理
AutomationFactoryクラスのIsAvailableプロパティで、Silverlightにおけるオートメーション機能が、アプリケーションで利用可能かどうかをチェックします。同時に、HasElevatedPermissionsプロパティで、実行するアプリケーションが高い信頼性に基づいたブラウザ外で実行されているかどうかを判定して、利用可能であり(Trueの場合)高い信頼性に基づいている場合(Trueの場合)は、以下の処理を実行します。利用不可の場合は、「インストールしてTrustedモードのブラウザ外実行で試してください。」というメッセージを表示します。

UriクラスでRSSフィードへのアクセスを行います。絶対Uriでアクセスして、新しいWebClientのインスタンスmyWebClientオブジェクトを生成します。WebClientクラスは、インターネットリソースへのアクセスを提供するクラスです。DownloadStringAsyncメソッドで、指定したUriにあるリソースを文字列としてダウンロードします。非同期のリソースダウンロード操作の完了時に発生するイベント、DownloadStringCompletedで、client_DownloadCompletedイベントを実行します。

  Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    If AutomationFactory.IsAvailable = True AndAlso Application.Current.HasElevatedPermissions = True Then
      Dim myUri As New Uri("http://thinkit.jp/rss/rss20.xml", UriKind.Absolute)
      Dim myWebClient As New WebClient
      myWebClient.DownloadStringAsync(myUri)
      AddHandler myWebClient.DownloadStringCompleted, AddressOf Me.client_DownloadCompleted
    Else
      MessageBox.Show("インストールしてTrustedモードのブラウザ外実行で試してください。")
      Exit Sub
    End If
  End Sub

■非同期のリソース・ダウンロード操作の完了時に発生するイベント
ダウンロードされたリソースを変数myDataに格納します。
XElement.ParseメソッドでmyDataに格納されてデータを読み取ります。読み取った文字列データから、要素のコレクションを取得するクエリを定義します。
登録されたオートメーション・サーバーへのアクセスを行うAutomationFactoryクラスのCreateObjectメソッドでProgID(Excel.Application)に指定されたアプリケーションにアクセスします。VisibleプロパティでExcelを表示状態にし、ExcelのWorkBooksとActiveSheetを宣言します。Excelの1行目の各列に項目名をセットします。
queryコレクション内を変数myItemで反復処理しながら、各行と列にと<link />要素の値をセットにしていきます。<br /> myExcelやmyCellオブジェクトに対しては、インテリセンスは機能しません。<br />

  Private Sub client_DownloadCompleted(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
    Dim myData As String = e.Result
    Dim xmldoc As XElement = XElement.Parse(myData)
    Dim query = From c In xmldoc.Descendants("item") Select c
    Dim myExcel As Object = AutomationFactory.CreateObject("Excel.Application")
    myExcel.Visible = True
    Dim workbook As Object = myExcel.WorkBooks
    workbook.Add()
    Dim mySheet As Object = myExcel.ActiveSheet
    Dim myCell As Object = Nothing

    myCell = mySheet.Cells(1, 1)
    myCell.Value = "記事タイトル"
    myCell = mySheet.Cells(1, 2)
    myCell.Value = "記事URI"

    Dim i As Integer = 2
    For Each myItem In query
      myCell = mySheet.Cells(i, 1)
      myCell.Value = myItem.Element("title").Value
      myCell.ColumnWidth = 80

      myCell = mySheet.Cells(i, 2)
      myCell.Value = myItem.Element("link").Value
      myCell.ColumnWidth = 50
      i = i + 1
    Next
  End Sub

次回は、Silverlight 4からサポートされたPathListBoxコントロールを使ったアニメーションの作り方を紹介します。

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています