CodeZine(コードジン)

特集ページ一覧

5分でわかるActiveReports帳票(2013年度版)-Webアプリケーションとエクスポート

ActiveReports for .NET 7.0Jで作るサンプル帳票(8)

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 ActiveReportsは、Webアプリケーションでも使用することができ、ブラウザ上にレポートを表示することなどが実現できます。今回はWebアプリケーションの作成方法と、それと関係するエクスポート機能について解説します。

備考

 本稿は、連載『5分でわかるActiveReports帳票(2007年度版)』(渡辺俊史・宮本奈紗 著)の増補改訂版です。

WebViewerコントロールを使ったWebアプリケーション
(Professionalエディションのみ)

 ActiveReportsでWebアプリケーションを作成する場合、WebViewerコントロールを使う方法が簡単です。

 なお、WebViewerコントロールは、Professionalエディションのみの機能です。Standardエディションには付属していません。StandardエディションでWebアプリケーションを作成する方法については後述します。

WebViewerコントロールの配置

 Webアプリケーションを作成し、Webフォーム上に、WebViewerコントロールを配置します。WebViewerコントロールはツールボックスから配置しますが、もしツールボックスにWebViewerコントロールが存在しない場合は、製品ヘルプの[クイックスタート]-[ActiveReportsコントロールを追加する]を参照の上、ツールボックスにWebViewerコントロールを追加してください。

WebViewerコントロール(ツールボックス)
WebViewerコントロール(ツールボックス)

 WebViewerコントロールをWebフォーム上にドラッグ&ドロップします。配置後、コントロールを適当なサイズに調整します。

ViewerTypeプロパティの設定

 WebViewerコントロールには4つのビューワ形式が用意されており、ViewerTypeプロパティでどの形式で表示するか設定します。それぞれの形式の概要は、以下のとおりです。

HtmlViewer

 HTMLの機能を利用したビューワです。レポートはWebViewerコントロールの領域の枠の中に表示されます。ページ移動、検索などの処理をするボタンが用意されています。

RawHtml

 HtmlViewer形式と同様、こちらの形式もHTMLの機能を利用して表示しますが、HtmlViewer形式と異なり、ページ移動などのボタンは付いていません。単純にWebフォーム上にレポートの内容が表示されるだけです。複数ページのレポートは、ブラウザ上に一続きになって表示されます。

AcrobatReader

 PDF形式でレポートを表示します。Webフォーム上のWebViewerコントロールの領域に、PDF化したレポートが表示されます。実際の表示処理は、クライアントのブラウザに組み込まれたPDFリーダー(Adobe Readerなど)が行います。そのためクライアントのリーダーの設定によって、ツールバーが表示されたりされなかったりするなど、外観に影響を受けることがあります。

FlashViewer

 Adobe Flash Playerの機能を利用したビューワです。印刷、検索、表示形式の変更、拡大、縮小など、さまざまな機能を提供する形式です。この形式を使用する場合、クライアントにはAdobe Flash Playerがインストールされている必要があります。

 上記4つのうちから、使いたい形式にあわせてWebViewerコントロールのViewerTypeプロパティに設定しておきます。

FlashViewerを使う場合の.swfファイルの追加

 FlashViewerを使う場合、.swfファイルをWebアプリケーションの中に組み込んでおく必要があります。

 ActiveReportsをインストールしたディレクトリ内のDeployment\Flashフォルダから、以下の2ファイルを、Webアプリケーションのプロジェクト(Webフォームと同じフォルダ)にコピーしておきます。

  • Grapecity.ActiveReports.Flash.v7.swf 
  • Grapecity.ActiveReports.Flash.v7.Resources.swf

 また、FlashViewerにはいくつかのテーマ(外観)が用意されています。それらを適用したい場合には、Deployment\Flashフォルダの中にあるThemesフォルダをフォルダごと、上記.swfと同じ場所にコピーしておきます。

 なお、デフォルトでは上記のようにWebフォームと同じフォルダに配置しますが、WebViewerコントロールのFlashViewerOptions.Urlプロパティ、FlashViewerOptions.ResourceUrlプロパティ、FlashViewerOptions.ThemeUrlプロパティなどから、これらのファイル・フォルダの配置場所を設定することも可能です。

コードによるレポートの設定

 Page(Webフォーム)のLoadイベントや、ボタンのClickイベントで、WebViewerコントロールに表示したいレポートを設定します。セクションレポートとページレポートで若干違います。以下のようになります。

セクションレポート(VB.NET)
Dim rpt As New SectionReportSample
Me.WebViewer1.Report = rpt
セクションレポート(C#)
GrapeCity.ActiveReports.SectionReport rpt = new SectionReportSample();
this.WebViewer1.Report = rpt;
ページレポート(VB.NET)
Dim rpt As New GrapeCity.ActiveReports.PageReport
rpt.Load(New System.IO.FileInfo("レイアウトファイル.rdlx"))
Me.WebViewer1.Report = rpt
ページレポート(C#)
GrapeCity.ActiveReports.PageReport rpt 
    = new GrapeCity.ActiveReports.PageReport();
rpt.Load(new System.IO.FileInfo("レイアウトファイル.rdlx"));
this.WebViewer1.Report = rpt;

表示

 ここまでの設定・実装を行い、プロジェクトを実行すると、Webフォーム上に配置したWebViewerコントロールの領域にレポートが表示されます。

HtmlViewer
HtmlViewer
RawHtml
RawHtml
AcrobatReader
AcrobatReader
FlashViewer
FlashViewer

Flashビューワによる直接印刷

 これまで説明したようにWebViewerコントロールを使用することで、ブラウザ上にさまざまな形式でレポートを表示することが容易に実現できます。

 しかしながら、実際のWebアプリケーションでは、「プレビューを表示せず、クライアント側のプリンタに印刷させたい」場合もあります。こうした要件は、FlashViewerを使用することで実現可能です。

 具体的には、WebViewerコントロールのFlashViewerOptions.PrintOptions.StartPrintプロパティをTrueに設定するだけです。このように設定したWebViewerコントロール(FlashViewer形式)にレポートが読み込まれると、自動的に印刷設定ダイアログが表示されるようになります。

 以下のように、WebViewerコントロールのプロパティを設定します。

  1. ViewerTypeプロパティをFlashViewerに設定する。
  2. FlashViewerOptionsプロパティを展開する。
  3. PrintOptionsを展開する。
  4. StartPrintプロパティをTrueに設定する。
  5. WebViewerコントロールのサイズを幅0×高さ0とし、実質的に見えなくなるようにする(なお、WebViewerコントロールのVisibleプロパティをFalseに設定した場合、WebViewerコントロール自体が動作しないため、印刷も行われません)。
FlashViewerのStartPrintプロパティ
FlashViewerのStartPrintプロパティ

 上記のように設定したWebViewerコントロールにレポートを設定すると、WebViewerコントロールへのレポートの読み込みが完了するのと同時に印刷設定ダイアログが表示され、印刷できるようになります。

WebViewerコントロールを使用した
Webアプリケーションの運用環境への配置

 Webアプリケーションを運用環境に配置する場合、一般的に仮想ディレクトリの作成などの作業が必要ですが、WebViewerコントロールを使用している場合、IISに対して固有の設定を行う必要があります。

 具体的な設定内容・手順については、製品ヘルプの[ActiveReportsを使用するための準備]-[Webアプリケーションの実行前に必要な設定]を参照してください。

 また、もしWebViewerコントロールにレポートが表示されないといった問題が生じる場合は、こちらのナレッジ文書も確認してください。

Webアプリケーションでは実現できないこと

 これまで紹介したように、FlashViewerを使用することで、プレビューすることなく印刷を実行できます。しかしながら、以下のような動作はWebViewerコントロールでは実現できません。

  • 印刷設定ダイアログを表示させることなく、クライアント側のプリンタに印刷する。
  • クライアント側のプリンタに印刷する時の印刷先プリンタや印刷部数、用紙サイズなどをあらかじめ設定する。

 FlashViewerはAdobe Flash Player上で動作するビューワですが、こうした動作を実現できないのは、Flash Playerのセキュリティ上の制約によって、このような処理をコードから制御することが禁止されているためです。

 もし、こうした動作が可能な場合、ページを開くと同時に大量のページをプリンタに強制的に印刷するような悪意を持ったページを構成することが可能となってしまいます。

 印刷設定ダイアログを表示せずに印刷したい場合や、印刷部数をあらかじめ設定する必要がある場合には、Webアプリケーションではなく、印刷用のWindowsフォームアプリケーションを別途作成する方法をご検討ください。

 このときはClickOnce機能を使用することで、Windowsフォームアプリケーションの配布とWebアプリケーションからの呼び出しを実現できます。こちらのナレッジ文書でサンプルが公開されていますので、参照してください。

レポートのエクスポート

 WebViewerコントロールはProfessionalエディション固有の機能なので、Standardエディションでは利用できません。

 StandardエディションでWebアプリケーションにActiveReportsを組み込みたい場合、エクスポート機能を使用します。

 エクスポート機能をWebアプリケーションに組み込む方法は後ほど説明することにして、まずは、エクスポート機能の概要を説明します。

エクスポート

 ActiveReportsで作成したレポートは、PDFやExcelなどの形式に変換できます。このようにレポートを変換して出力することを「エクスポート」といいます。

エクスポート可能な形式・組み合わせ

 ActiveReportsではさまざまな形式へのエクスポートが可能ですが、セクションレポートとページレポートそれぞれでエクスポートできる形式に違いがあります。以下の表やこちらのナレッジ文書を参照してください。

表:エクスポート可能な形式
  セクションレポート ページレポート
HTML
PDF
RTF
Microsoft Word(doc) ×
TEXT
イメージ(bmp、emf、gif、jpg、png) △(別の手段で可能)
Excel(xls、xlsx)
XML ×
TIFF

エクスポートの処理

 エクスポートを実行する場合、大きく分けて2つの方法があります。

 1つめは、「エクスポートフィルタ」を使って実行する方法。もう一つは、ページレポートでPageDocumentクラスのRenderメソッドと形式毎の拡張機能クラスを使用する方法です。まずは、前者の方法から説明します。

エクスポートフィルタを使用する方法

 セクションレポート、ページレポートの両方で、HTML、PDF、RTF、Text、Tiff、Excelの各形式にエクスポートすることができます。

 使用方法はどの形式でも基本的に同じなので、ここではPDF形式へのエクスポートを例に説明します。手順は以下のようになります。

  1. セクションレポートを生成する。
  2. レポートを実行し、SectionReport.Documentオブジェクト(SectionDocument型)を生成する。
  3. エクスポートフィルタのオブジェクトを宣言する。
  4. エクスポートフィルタのExportメソッドでエクスポートを行う。
セクションレポートのエクスポート(VB.NET)
Dim rpt As New SectionReportSample
rpt.Run()
Dim exp As New GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport
exp.Export(rpt.Document, "出力ファイル名")
セクションレポートのエクスポート(C#)
GrapeCity.ActiveReports.SectionReport rpt = new SectionReportSample();
rpt.Run();
GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport exp =
    new GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport();
exp.Export(rpt.Document, "出力ファイル名");

 ページレポートの場合も基本的には同じですが、SectionDocumentのかわりにPageDocumentを使用する点が異なります。

ページレポートのエクスポート(VB.NET)
Dim pageReport As New GrapeCity.ActiveReports.PageReport _
    (New System.IO.FileInfo( "ページレポート.rdlx"))
Dim pageDocument As _
    New GrapeCity.ActiveReports.Document.PageDocument(pageReport)
Dim exp As New GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport
exp.Export(pageDocument, "出力ファイル名")
ページレポートのエクスポート(C#)
GrapeCity.ActiveReports.PageReport pageReport =
    new GrapeCity.ActiveReports.PageReport
    (new System.IO.FileInfo( " ページレポート.rdlx"));
GrapeCity.ActiveReports.Document.PageDocument pageDocument =
    new GrapeCity.ActiveReports.Document.PageDocument(pageReport);
GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport exp =
    new GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport();
exp.Export(pageDocument, "出力ファイル名");

描画拡張機能を使用したエクスポート

 描画拡張機能は、ページレポートについてのみ使用可能な機能であり、以下のような手順になります。

  1. ページレポートを生成する。
  2. PageDocumentオブジェクトを得る。
  3. 拡張描画機能のためのオブジェクトと、描画に必要な、FileInfo、Settings(オプション)などのオブジェクトを得る。
  4. PageDocument.Renderメソッドでエクスポートを行う。
描画拡張機能を使用したページレポートのエクスポート(VB.NET)
Dim pageReport As New GrapeCity.ActiveReports.PageReport _
    (New System.IO.FileInfo("レイアウトファイル.rdlx"))
Dim pageDocument As _
    New GrapeCity.ActiveReports.Document.PageDocument(pageReport)

Dim exp As New GrapeCity.ActiveReports.Export.Pdf.Page.PdfRenderingExtension
Dim provider As New GrapeCity.ActiveReports.Rendering.IO.FileStreamProvider _
    (New System.IO.DirectoryInfo("出力フォルダ名"), "出力ファイル名")
pageDocument.Render(exp, provider)
描画拡張機能を使用したページレポートのエクスポート(C#)
GrapeCity.ActiveReports.PageReport pageReport =
    new GrapeCity.ActiveReports.PageReport
    (new System.IO.FileInfo( "ページレポート.rdlx"));
GrapeCity.ActiveReports.Document.PageDocument pageDocument =
    new GrapeCity.ActiveReports.Document.PageDocument(pageReport);

GrapeCity.ActiveReports.Export.Pdf.Page.PdfRenderingExtension 
    exp = new GrapeCity.ActiveReports.Export.Pdf.Page.PdfRenderingExtension();
GrapeCity.ActiveReports.Rendering.IO.FileStreamProvider provider = 
    new GrapeCity.ActiveReports.Rendering.IO.FileStreamProvider
    (new System.IO.DirectoryInfo("出力フォルダ名"), "出力ファイル名");
pageDocument.Render(ex, provider);

 なお、エクスポート機能にはエクスポート結果に対してさまざまな設定を行うためのプロパティが用意されています。例えば、PDFエクスポート機能にはPDFファイルにパスワードを設定するプロパティや、印刷禁止などの属性を設定するプロパティが用意されています。これらの設定については製品ヘルプの[概念]-[エクスポート]-[エクスポートフィルタ]や、該当するクラスのクラスライブラリリファレンスを参照してください。

エクスポートの再現性の限界

 エクスポートが可能な形式の中で、Viewerコントロールにプレビューした時と近い表示が可能な形式は、PDF、Tiff、Imageなどです。その他の形式は、ファイル形式自体の制限や、出力されないコントロールがあることにより、Viewerコントロールにプレビューした結果とは、レイアウト的に異なる点が生じます。

 例えば、ページレポートのWord形式へのエクスポートは、Matrixデータ領域の出力に対応していないため、Matrixの部分は空白になります。またHTMLエクスポートは、LineやShapeコントロールが出力されません。こうした制限事項については、製品付属のリリースノートにある[制限事項と注意点]-[エクスポート]を参照してください。

 また、Excel形式へのエクスポートでは、仕様的な制限から、エクスポートした結果とViewerコントロールなどにプレビューした結果に違いが生じる場合があります。例えば、不要な行や列が入ることや、文字列が複数のセルに分割される、文字列の一部しか出力されないといった違いも生じます。これは、自由にレイアウトされたレポートをExcelのセルにあわせて自動的に変換するためであり、人間がExcelを使用して、直接レイアウトするほどの精度はありません。

 製品ヘルプの[よくある質問]-[セクションレポート]-[エクスポート]の「Excelエクスポートの結果がずれる」のトピックにあるように、レイアウトを調整することでExcelへのエクスポート結果をViewerコントロールのプレビュー結果に近づけることは可能なので、そうした方法も検討してください。

エクスポートの結果を配信するWebアプリケーション

 これまでに説明したサンプルコードでは、レポートをファイルとして出力しておりましたが、エクスポートを行うメソッド(ExportやRenderメソッド)は、レポートをファイルだけではなく、ストリームへ出力することも可能です。

 エクスポートで得られたデータをMemoryStreamに保存すれば、そのデータをクライアント側に配信してブラウザに表示できます。この方法を用いることで、StandardエディションでもWebアプリケーションを構成できます。手順は以下のとおりです。

  1. MemoryStreamを生成する。
  2. レポートを生成する。
  3. レポートをエクスポートしてMemoryStreamに格納する。
  4. WebアプリケーションのResponseオブジェクトの機能を利用してクライアントに配信する。

 セクションレポートをPDFの形式で配信するコードは、以下のようになります。WebページのPage.Loadイベントや、ボタンのButton.Clickイベント等に記述します。

PDF形式でエクスポートしたファイルをクライアントに配信する処理(VB.NET)
Dim m_stream As New System.IO.MemoryStream()
Dim rpt As New SectionReportSample
rpt.Run()
Dim PdfExport1 As New GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport
PdfExport1.Export(rpt.Document, m_stream)
m_stream.Position = 0
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "inline;filename=MyExport.pdf")
Response.BinaryWrite(m_stream.ToArray())
Response.End()
PDF形式でエクスポートしたファイルをクライアントに配信する処理(C#)
System.IO.MemoryStream m_stream = new System.IO.MemoryStream();
GrapeCity.ActiveReports.SectionReport rpt = new SectionReportSample();
rpt.Run();
GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport pdfExport1 =
    new GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport();
pdfExport1.Export(rpt.Document, m_stream);
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "inline;filename=ExportSample.pdf");
Response.BinaryWrite(m_stream.ToArray());
Response.End();

 この処理を実行すると、Internet Explorerなどのブラウザ上にPDFが表示されます。上記の処理はセクションレポートを使っていますが、ページレポートでも基本的には同様です。

 なお、上記のコードの後半部分にあるResponseを使った処理は、ActiveReportsとは直接関係はありません。例えば、サーバー上に配置されたPDFファイルについてもその内容をMemoryStreamへ格納すれば、同様の方法でクライアントに配信できます。

 "Content-Disposition"などの書式は、RFC2183などで規定されているのでそちらを参考にしてください。

 「ブラウザ内で表示するのではなく、クライアントにダウンロードしてから表示する」場合には、Response.AddHeaderメソッドに指定する文字列の中で、inlineのかわりにattachmentと記述します。

エクスポートしたファイルを配信する処理(ファイルをダウンロードする)(VB.NET)
Response.AddHeader("content-disposition", "attachment;filename=ExportSample.pdf")
エクスポートしたファイルを配信する処理(ファイルをダウンロードする)(C#)
Response.AddHeader("content-disposition","attachment;filename=ExportSample.pdf");

 また、Excelファイルを配信する場合は、ContentTypeを"application/vnd.ms-excel"(.xls)もしくは"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"(.xlsx)とします。ContentTypeはMIMEタイプに準ずるものなので、各ファイル形式に適合するMIMEタイプを設定してください。

まとめ

 今回はActiveReportsを使ったWebアプリケーションの構成方法について解説しました。またエクスポート機能は、Windowsフォームアプリケーションでもご利用いただけます。アプリケーションの要件にあわせてご活用ください。

 全8回にわたって、ActiveReports for .NET 7.0Jの使用方法や新機能の一部を紹介いたしました。簡単な紹介ではございましたが、帳票開発の一助になれば幸いです。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5