Office 2010とSilverlight 4の連携
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)」で確認してください。このサンプルでは、
図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で反復処理しながら、各行と列に
myExcelやmyCellオブジェクトに対しては、インテリセンスは機能しません。
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コントロールを使ったアニメーションの作り方を紹介します。