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シートに表示させています。</p>
<table align="center" border="0" cellpadding="0" cellspacing="0" style="width: 636px;"> <tbody> <tr> <td> <p class="rtecenter"><img alt="" src="/sites/default/files/articles/158406.png" /></p> </td> </tr> <tr> <td class="rtecenter"><strong><span style="font-size: 12px; color: rgb(255, 140, 0);">図6: ブラウザ外実行で、Think Itの記事情報がExcelワークシート内に表示されている</span></strong></td> </tr> </tbody>
</table>
<p> </p>
<h2>ExcelでRSSフィードを表示するサンプルを作成する</h2>
<p>これまでと同様の手順で、新規Silverlight 4プロジェクト(プロジェクト名は「SL4_Excel_RSS」)を作成し、プロジェクト依存関係も設定しておきます。</p>
<p>また、RSS形式のデータを処理するため、「Project/Add Reference」からSystem.Xml.Linqを追加しておきます。</p>
<p>ToolboxからTextBlockとButtonを1個ずつレイアウトして、ButtonのContentプロパティに「Think ItのRSSをExcelに表示」と指定しておきます(図7)。</p>
<table align="center" border="0" cellpadding="0" cellspacing="0" style="width: 636px;"> <tbody> <tr> <td> <p class="rtecenter"><img alt="" src="/sites/default/files/articles/158407.png" /></p> </td> </tr> <tr> <td class="rtecenter"><strong><span style="font-size: 12px; color: rgb(255, 140, 0);">図7: Buttonコントロールをレイアウトした</span></strong></td> </tr> </tbody>
</table>
<p> </p>
<p>このサンプルは信頼されたTrustedモードのブラウザ外実行で動作させます。ブラウザ外実行を設定する詳しい手順および、デバッグの手順については、以前の記事を参照してください。以上の操作で書き出されるXAMLコードは省略します。</p>
<p>ロジック・コードはリスト4のようになります。</p>
<h3>リスト4: RSSフィードの内容をExcelに表示するロジック・コード(MainPage.xaml.vb)</h3>
<p><code><font color="blue">■名前空間の読み込み<br /> LINQ to XMLでXMLを処理するクラスの含まれるSystem.Xml.Linq名前空間をインポートします。ネットワークに関して使用されるプロトコルのためのプログラミング・インターフェースを提供するクラスの含まれる、System.Net名前空間をインポートします。COMオートメーションに関するクラスの含まれる、System.Runtime.InteropServices.Automation名前空間をインポートします。<br /> </font> Imports System.Xml.Linq<br /> Imports System.Net<br /> Imports System.Runtime.InteropServices.Automation<br /> <br /> <font color="blue"> ■[Think ITのRSSをExcelに表示]ボタンをクリックしたときの処理<br /> AutomationFactoryクラスのIsAvailableプロパティで、Silverlightにおけるオートメーション機能が、アプリケーションで利用可能かどうかをチェックします。同時に、HasElevatedPermissionsプロパティで、実行するアプリケーションが高い信頼性に基づいたブラウザ外で実行されているかどうかを判定して、利用可能であり(Trueの場合)高い信頼性に基づいている場合(Trueの場合)は、以下の処理を実行します。利用不可の場合は、「インストールしてTrustedモードのブラウザ外実行で試してください。」というメッセージを表示します。<br /> <br /> UriクラスでRSSフィードへのアクセスを行います。絶対Uriでアクセスして、新しいWebClientのインスタンスmyWebClientオブジェクトを生成します。WebClientクラスは、インターネットリソースへのアクセスを提供するクラスです。DownloadStringAsyncメソッドで、指定したUriにあるリソースを文字列としてダウンロードします。非同期のリソースダウンロード操作の完了時に発生するイベント、DownloadStringCompletedで、client_DownloadCompletedイベントを実行します。<br /> </font><br /> Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click<br /> If AutomationFactory.IsAvailable = True AndAlso Application.Current.HasElevatedPermissions = True Then<br /> Dim myUri As New Uri("http://thinkit.jp/rss/rss20.xml", UriKind.Absolute)<br /> Dim myWebClient As New WebClient<br /> myWebClient.DownloadStringAsync(myUri)<br /> AddHandler myWebClient.DownloadStringCompleted, AddressOf Me.client_DownloadCompleted<br /> Else<br /> MessageBox.Show("インストールしてTrustedモードのブラウザ外実行で試してください。")<br /> Exit Sub<br /> End If<br /> End Sub<br /> <br /> <font color="blue"> ■非同期のリソース・ダウンロード操作の完了時に発生するイベント<br /> ダウンロードされたリソースを変数myDataに格納します。<br /> XElement.ParseメソッドでmyDataに格納されてデータを読み取ります。読み取った文字列データから、<item>要素のコレクションを取得するクエリを定義します。<br /> 登録されたオートメーション・サーバーへのアクセスを行うAutomationFactoryクラスのCreateObjectメソッドでProgID(Excel.Application)に指定されたアプリケーションにアクセスします。VisibleプロパティでExcelを表示状態にし、ExcelのWorkBooksとActiveSheetを宣言します。Excelの1行目の各列に項目名をセットします。<br /> queryコレクション内を変数myItemで反復処理しながら、各行と列に<title>と<link>要素の値をセットにしていきます。<br /> myExcelやmyCellオブジェクトに対しては、インテリセンスは機能しません。<br /> </font><br /> Private Sub client_DownloadCompleted(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)<br /> Dim myData As String = e.Result<br /> Dim xmldoc As XElement = XElement.Parse(myData)<br /> Dim query = From c In xmldoc.Descendants("item") Select c<br /> Dim myExcel As Object = AutomationFactory.CreateObject("Excel.Application")<br /> myExcel.Visible = True<br /> Dim workbook As Object = myExcel.WorkBooks<br /> workbook.Add()<br /> Dim mySheet As Object = myExcel.ActiveSheet<br /> Dim myCell As Object = Nothing<br /> <br /> myCell = mySheet.Cells(1, 1)<br /> myCell.Value = "記事タイトル"<br /> myCell = mySheet.Cells(1, 2)<br /> myCell.Value = "記事URI"<br /> <br /> Dim i As Integer = 2<br /> For Each myItem In query<br /> myCell = mySheet.Cells(i, 1)<br /> myCell.Value = myItem.Element("title").Value<br /> myCell.ColumnWidth = 80<br /> <br /> myCell = mySheet.Cells(i, 2)<br /> myCell.Value = myItem.Element("link").Value<br /> myCell.ColumnWidth = 50<br /> i = i + 1<br /> Next<br /> End Sub<br /> </code></p>
<p> </p>
<p>次回は、Silverlight 4からサポートされたPathListBoxコントロールを使ったアニメーションの作り方を紹介します。</p>
</body></html>