ActiveReportsとは
ActiveReportsはグレープシティから発売されている帳票コンポーネントです。単なるレポーティングツールではなく、日本発祥の帳票という工夫がいろいろ詰まった凝ったレイアウトの印刷物が思い通りに作成できるという特徴があります。
本記事では、執筆時点で最新(2012年8月29日リリース)の「ActiveReports for .NET 6.0J(SP5)」を使っています。
WebMatrix 2とは
WebMatrix 2はMicrosoftが無償提供しているWebアプリの開発環境です。ローカル実行は自マシンのIIS ExpressやIISで行い、リモート実行はASP.NETホスティングサービスやWindows Azure Webサイトにデプロイして行います。WebMatrix 2を利用するにはマイクロソフトのWebサイトにある[Free Download]ボタンをクリックしてダウンロードします。
ダウンロード時にMicrosoftアカウントとの紐付けや個人情報の登録なども不要なので、気軽にダウンロードしてみてください。
WebMatrix 2のよる空のWebサイト作成
WebMatrix 2にはさまざまなテンプレートやギャラリーがあり、目的にあったWebアプリを手軽に作ることができます。この辺りはOffice製品のテンプレートやOfficeギャラリーに近いものがあります。
今回は残念ながらフィットするものがありませんでしたし、ActiveReportsとの合わせ技と考えたときに必要最小限のコードで見通しよくしたいというのもあり、「空のWebサイト」のテンプレートを使い、そこにコードや設定を追加していくことにしました。
空のWebサイト構築手順
空のWebサイトを作成するには、WebMatrix 2を起動して起動画面から「テンプレート」アイコンをクリックし、「空のサイト」を選択してサイト名に「CZ1210ActiveReports」と入力してから[次に進む]ボタンをクリックします。
この操作により[ドキュメント]‐[My Web Sites]フォルダの下に空のサイトに必要なファイルやフォルダが設定された[CZ1210ActiveReports]フォルダが作成されます。
もし、WebMatrix 2を一度終了してからWebサイトを再度編集するときには、WebMatrix 2の起動画面で「サイトを開く」アイコンをクリックして「サイトとしてのフォルダー」メニューを選択して[ドキュメント]‐[My Web Sites]‐[CZ1210ActiveReports]フォルダを開いてください。
空のWebサイトのローカル実行確認
空のWebサイトが作成できたら、まずは実行してみましょう。
WebMatrix 2のリボンの一番左にある[実行]アイコンをクリックします。
ブラウザが起動されて「マイサイトのタイトル」とタイトルがついた空白のページが表示されれば正常です。
ActiveReportsをWebMatrix 2で使う
空のWebサイトができたら、ActiveReportsを使って環境変数の一覧をPDF出力するサンプルを作ってみましょう。
帳票定義体の作成
ActiveReportsのProfessional版にはランタイムデザイナーというサンプルが付属しています。このサンプルを使うとActiveReportsの帳票定義体ファイルを作成することができます。
「CZ1210ActiveReports」フォルダに「Context」フォルダを追加し、そこに環境変数名と環境変数値をペアで出力するように設定した帳票定義を作成して、CustomersReport.rpxという名前で保存しましょう。
Binフォルダへの追加
ActiveReportsはWindowsやWebMatrix 2に付属しているコンポーネントではないので、初期状態ではActiveReportsのDLLはWebMatrix 2に組み込まれていません。
WebMatrix 2ではDLLはBinフォルダに格納することになるので、最初に必要なのはActiveReportsのDLLをBinフォルダに格納することです。
DLLファイルの追加は、Binフォルダを右クリックして[既存のファイルの追加]メニューを選択し、開いたダイアログでActiveReportsのインストールフォルダにある「Bin\v6.5.4530.1」フォルダの中から必要なDLLを指定して行います。
今回のサンプルで必要なのは次のファイルです。
- ActiveReports.Document.dll
- ActiveReports.Document.xml
- ActiveReports.PdfExport.dll
- ActiveReports.PdfExport.xml
- ActiveReports.Viewer6.dll
- ActiveReports.Viewer6.xml
- ActiveReports6.dll
- ActiveReports6.xml
- Ja\ActiveReports.Document.resources
- Ja\ActiveReports.PdfExport.resources
- Ja\ActiveReports.Viewer6.resources
- Ja\ActiveReports6.resources
ASP.NET Webページの追加
ActiveReportsを使う準備ができたので、PDF出力するASP.NET Webページを作成します。
WebMatrix 2でサイト名を右クリックして「新しいファイルの追加」メニューを選択し、ダイアログを表示します。
左側のメニューの「すべて」をクリックし「VBHTML」アイコンを選択して「index.vbhtml」と名前を付けて[OK]ボタンをクリックします。
ActiveReports操作用コードを記述
Index.vbhtmlに、CustomersReport.rpxに情報を埋め込んでPDF出力するコードを記述します。Index.vbhtmlはRazor形式という書式でASP.NET Webページを記述します。
@Imports DataDynamics.ActiveReports @Imports DataDynamics.ActiveReports.Export.Pdf @Imports System.Data @Code Dim pdfStream() As Byte pdfStream = GetPdfDatas() ' ブラウザに対してPDFドキュメントの適切なビューワを使用するように指定します。 Response.ContentType = "application/pdf" Response.AddHeader("content-disposition", "inline; filename=ActiveReports.PDF") ' 出力ストリームにPDFのストリームを出力します。 Response.BinaryWrite(pdfStream) ' バッファリングされているすべての内容をクライアントへ送信します。 Response.End() End Code @Functions Private block As Object = Nothing ''' <summary> ''' PDFデータを取得する ''' </summary> Public Function GetPdfDatas() As Byte() Dim memStream As System.IO.MemoryStream Dim ds As DataSet = GetRecords() Using rpt As New ActiveReport Dim report As New DataDynamics.ActiveReports.ActiveReport() Using xtr As New System.Xml.XmlTextReader(Server.MapPath("~/Content/CustomersReport.rpx")) rpt.LoadLayout(xtr) xtr.Close() End Using rpt.Document.Printer.PrinterName = "" rpt.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.A4 rpt.PageSettings.Orientation = Document.PageOrientation.Portrait rpt.PageSettings.Margins.Top = ActiveReport.CmToInch(0.5F) rpt.PageSettings.Margins.Bottom = ActiveReport.CmToInch(0.5F) 'データを割り当てる rpt.DataSource = ds.Tables("Enviroment") ' レポートを作成します。 rpt.Run(False) ' PDFの出力用のメモリストリームを作成します。 memStream = New System.IO.MemoryStream ' PDFエクスポートオブジェクトを生成します。 Using _pdf = New PdfExport ' メモリストリームにPDFエクスポートを行います。 _pdf.Security.Use128Bit = True _pdf.Security.OwnerPassword = "hatsune" _pdf.Security.Permissions = PdfPermissions.AllowPrint _pdf.Security.Encrypt = True _pdf.Export(rpt.Document, memStream) End Using End Using Return memStream.ToArray() End Function Private Function GetRecords() As DataSet Dim ds As New DataSet With block ds.Tables.Add("Enviroment") ds.Tables("Enviroment").Columns.Add("Name", GetType(String)) ds.Tables("Enviroment").Columns.Add("Value", GetType(String)) End With For Each env In Environment.GetEnvironmentVariables Dim row As DataRow = ds.Tables("Enviroment").NewRow row("name") = env.key row("value") = env.value ds.Tables("Enviroment").Rows.Add(row) Next Return ds End Function End Functions
RazorなASP.NET Webページでは、@code~End Codeの間に記述したコードがVisual Basicのコードとして認識されJITコンパイルされて実行されます。その中で使っているプロシージャは@Functions~End Functionsの間に記述します。
大まかな処理の流れは、GetRecordsで作成したデータセットをGetPdfDatasで帳票定義体と合成してメモリ上のバイナリーデータとしてPDF化し、それをindex.vbhtmlがリクエストされたときのレスポンスデータとして返却します。
WebMatrix 2での実行
Index.vbhtmlにコードが記述できたのでさっそく実行してみましょう。
WebMatrix 2のリボンの一番左にある[実行]アイコンをクリックします。
ブラウザにはDefault.cshtmlの内容である空白ページが表示されるのでURL欄に「index」と『後ろに追記』して[Enter]キーを押してページを移動します。
残念ながら「ライセンスがない状態でビルドされたため実行できません」とエラーが表示されて正常に動作しませんでした。
ライセンスエラー対策
ActiveReportsは開発環境のライセンス認証が必要です。その他にビルド時にlicenses.licxファイルに使用しているコンポーネントを記述してビルドする必要があります。
licenses.licxファイルの作成
WebMatrix 2でWebサイトにlicenses.licxファイルを次のように記述します。
DataDynamics.ActiveReports.ActiveReport, ActiveReports6 DataDynamics.ActiveReports.Viewer.Viewer, ActiveReports.Viewer6 DataDynamics.ActiveReports.Export.Pdf.PdfExport, ActiveReports.PdfExport
WebMatrix 2での実行
Licenses.licxファイルの準備ができたら実行してみましょう。
結果は残念ながら「ライセンスがない状態でビルドされたため実行できません」という状態から変わりませんでした。
冷静に考えてみれば実行が始まってJITコンパイルされて動作するためWebMatrix 2には「ビルド」という概念が存在しません。
それではどのように対応すればよいでしょうか。
残念ながらWebMatrix 2単体では解決ができずVisual Studio 2010(Express版でも可)の力を借りなければなりません。
Visual Studioでビルド
WebMatrix 2のリボンから[起動]‐[Visual Studio]アイコンをクリックしてVisual Studio 2010を起動します。
このままVisual Studioで実行すればlicenses.licxファイルからApp_Licenses.dllファイルがビルドされます。あとは、Visual Studioを終了してWebMatrix 2に戻ってきてください。
App_Licenses.dll生成後のWebMatrix 2での実行
Visual Studioでのビルドが終わってWebMatrix 2に戻ってきたら、WebMatrix 2でも実行してみましょう。今までと同じ手順でリボンから実行すると、今度は正しく動作しPDFファイルのダウンロードダイアログが表示されます。
Windows Azure Webサイトでの動作
ローカル環境での実行が確認できたら、いよいよWindows Azure Webサイトにデプロイしてクラウドでの実行を確認してみましょう。
そのためにはWindows Azure管理ポータルで「Web Sites」の設定から始めます。
空のWindows Azure Webサイトの作成
Windows Azure Webサイトは日本語では「Webサイト」と区別なく説明することが多いですが、Windows Azure管理ポータルの表記では「Web Sites」の中に「Web Site」を設定するようになっています。つまり、Windows Azure Webサイト機能は複数のWebサイトが格納できます。例えば、Free版であっても10個のWebサイトを作成できます。
WebMatrix 2からWebサイトを発行するには事前にWindows Azure上にWebサイトを定義します。もし、まだWebサイトを作成していないようであれば、Windows Azure管理ポータルを使って空のWebサイトをつくりましょう。
[Web Sites]‐[WEB SITE]‐[QUICK CREATE]メニューを選択して、URLを指定したら[CREATE WEB SITE]ボタンをクリックします。これで数十秒もしないで指定したURLでWebサイトが公開できます。
接続情報のローカル保存
作成したWebサイトにデプロイするための接続情報をWindows Azure管理ポータルから保存できます。
[Web Sites]メニューを選択してからWebサイト名をクリックすると該当Webサイトの詳細が表示されます。少し下にスクロールすると「quick guide」があるので[Download publish profile]ボタンをクリックして設定情報ファイルをダウンロードしてください。
WebMatrix 2での発行設定
Webサイトの設定情報ファイルがダウンロードできたら、WebMatrix 2に設定情報ファイルの内容を反映します。
「CZ1210ActiveReports」をWebMatrix 2で開いた状態でリボンの[リモート]‐[設定]アイコンをクリックします。するとサイトの発行ダイアログが開くので[発行プロファイルのインポート]ボタンをクリックします。
ファイル選択ダイアログで先ほどダウンロードしたファイル(既定の設定ではダウンロードフォルダに保存されている)を指定し、[開く]ボタンをクリックします。
サイトの発行ダイアログに設定ファイルの内容が反映されるので、[保存]ボタンをクリックして保存します。
WebMatrix 2からの発行
発行用設定が完了したら[発行]アイコンをクリックしてWindows Azureへの発行を開始しします。
変更されたファイルの一覧が表示されたら[続行]ボタンをクリックします。
あとは大体1分間くらい「発行しています - 発行しました」と表示されるのを待つだけです。
Windows AzureのWebロールなどにデプロイして十数分待たされたことがある人にとっては驚愕の速さだと思います。
WebMatrix 2からの発行を確認
Windows Azureで動作確認する前にWebMatrix 2の発行がどのようなファイルをWindows Azureに転送しているのか「ログファイルを開く」をクリックして確認してみましょう。
嬉しいことにActiveReports関連のDLLもWindows Azureに転送されています。Windows Azure WebサイトでActiveReportsが動作する期待が俄然高まります。
Windows Azureでの動作
それではWindows Azure WebサイトのURLにアクセスし、空白ページが表示されたらブラウザのURL欄に「index」と追加して[Enter]キーを入力しましょう。
ローカル実行の時と同じようにWindows Azure上でもPDFのダウンロードができました。
まとめ
残念ながらグレープシティの市販コンポーネントでWebMatrix 2を開発環境とした時やWindows Azureを運用環境とした時の動作保証はありません。そのためライセンス問題の回避方法も含めて今回の方式もグレープシティからの正式サポートはありません。使用する際には十分に検証していただき自己責任での使用になってしまいます。
しかしWebMatrix 2とWindows Azure Webサイトの親和性の高さは、ActiveReportsが相乗りしたとしても失われることはありません。ライセンス周りで多少の手間は必要ですがそれ以上に手間も費用も削減できるでしょう。特にWindows Azure Webサイトで小規模サイトを開発するときに利便性は特筆すべきものがあります。
つまり、自己責任での使用に尻込みすることなく、「手軽に」「日本の帳票品質」の「PDF」を「クラウド」で得られるActiveReports+WebMatrix 2+Windows Azure Webサイトをぜひ試していただきたいと思います。