ActiveReports for .NET 18.0J
HTMLの出力のカスタマイズ
ActiveReportsユーザーガイド > サンプルとチュートリアル > チュートリアル > セクションレポートのチュートリアル > エクスポート > HTMLの出力のカスタマイズ

ActiveReportsではASP.NET Webアプリケーションに対して、HTMLの出力をカスタマイズできます。

メモ:

このチュートリアルでは、以下の作業を行います。

HTML出力のカスタマイズのためにパブリッククラスを作成する

  1. Visual Studioで新規ASP.NET Webアプリケーションプロジェクトを作成します。
  2. [ソリューションエクスプローラー]で、プロジェクト名を右クリックし、[追加]を選択し、[新しい項目]を選択します。
  3. [新しい項目の追加]ダイアログで、[クラス]を選択します。
  4. クラスの名前を「MyCustomHtmlOutputter」に変更し、[追加]をクリックします。
  5. これにより、クラスファイルのコードが表示され、パブリッククラスを作成するためにコードを追加します。
  6. C#の場合、IOutputHtmlインタフェースをMyCustomHtmlOutputterクラスに追加します。

C#コード
コードのコピー
public class MyCustomHtmlOutputter: IOutputHtml

  1. プロジェクト名を右クリックし、[参照の追加]を選択します。
  2. [参照の追加]ダイアログで、GrapeCity.ActiveReports.Export.Html.v14のリファレンスを選択し、[OK]をクリックしてプロジェクトに追加します。 

Visual Basic

Visual Basicコード (クラスの上に貼り付けます)
コードのコピー
Imports System 
Imports System.IO 
Imports System.Web 
Imports System.Text
Imports GrapeCity.ActiveReports 
Imports GrapeCity.ActiveReports.Export.Html
Visual Basicコード (クラス内に貼り付けます)
コードのコピー
Implements IOutputHtml
'応答用HttpContextを作成します。
Private context As System.Web.HttpContext = Nothing
'HTML保存用のフォルダ作成用オブジェクトを作成します。このファイル名は、一意な名前を使います。
Private dirToSave As System.IO.DirectoryInfo = Nothing
Public mainPage As String = ""

Public Sub New(ByVal context As System.Web.HttpContext)
    If context Is Nothing Then
        Throw New ArgumentNullException("context")
    End If
    Me.context = context
    Dim dirName As String = context.Server.MapPath("ReportOutput")
    Me.dirToSave = New DirectoryInfo(dirName)
End Sub

#Region "Implementation of IOutputHtml"
Public Function OutputHtmlData(ByVal info As HtmlOutputInfoArgs) As String Implements IOutputHtml.OutputHtmlData
    Dim temp As String = ""
    Select Case info.OutputKind
        Case HtmlOutputKind.BookmarksHtml, HtmlOutputKind.FramesetHtml
            temp = Me.GenUniqueFileNameWithExtension(".html")
            Dim fs As New FileStream(temp, FileMode.CreateNew)
            Me.WriteStreamToStream(info.OutputStream, fs)
            fs.Close()
            Return temp
        Case HtmlOutputKind.HtmlPage
            'メインページをブラウザに通知できるように、作成したファイル名を保存します。
            Me.mainPage = Me.GenUniqueFileNameWithExtension(".html")
            Dim fs As New FileStream(Me.mainPage, FileMode.CreateNew)
            Me.WriteStreamToStream(info.OutputStream, fs)
            fs.Close()
            Return Me.mainPage
        Case HtmlOutputKind.ImageJpg
            '.jpg形式のファイル保存用のユニークファイル名を作成します
            temp = Me.GenUniqueFileNameWithExtension(".jpg")
            Dim fs As New FileStream(temp, FileMode.CreateNew)
            fs = File.Create(temp)
            Me.WriteStreamToStream(info.OutputStream, fs)
            fs.Close()
            Return temp
        Case HtmlOutputKind.ImagePng
            '.png形式のファイル保存用のユニークファイル名を作成します
            temp = Me.GenUniqueFileNameWithExtension(".png")
            Dim fs As New FileStream(temp, FileMode.CreateNew)
            Me.WriteStreamToStream(info.OutputStream, fs)
            fs.Close()
            Return temp
        Case Else
            'デフォルトのhtml
            temp = Me.GenUniqueFileNameWithExtension(".html")
            Dim fs As New FileStream(temp, FileMode.CreateNew)
            Me.WriteStreamToStream(info.OutputStream, fs)
            fs.Close()
            Return temp
    End Select
End Function

Public Sub Finish() Implements IOutputHtml.Finish
End Sub
#End Region

Private Sub WriteStreamToStream(ByVal sourceStream As Stream, ByVal targetStream As Stream)
    'ソースストリームのサイズを確認します
    Dim size As Integer = CType(sourceStream.Length, Integer)
    'ソースストリームと同じサイズのバッファを作成します。
    Dim buffer(size) As Byte
    'ストリームのシークポインタを先頭に移動します。
    sourceStream.Seek(0, SeekOrigin.Begin)
   'ストリームの内容をバッファにコピーします。
    sourceStream.Read(buffer, 0, size)
    '出力ストリームにストリームの内容をコピーします。
    targetStream.Write(buffer, 0, size)
End Sub

Private Function GenUniqueFileNameWithExtension(ByVal extensionWithDot As String) As String
    Dim r As New System.Random()
    Dim unique As Boolean = False
    Dim filePath As String = ""
    Dim iRandom As Integer = 0
    'ランダムな名前を一意になるまで生成します。
    While Not unique
        iRandom = r.Next()
        'ファイル名を作成します。
        Dim sb = New StringBuilder()
        sb.Append(Me.dirToSave.FullName)
        sb.Append(Path.DirectorySeparatorChar)
        sb.Append(iRandom.ToString())
        sb.Append(extensionWithDot)
        filePath = sb.ToString()
        If File.Exists(filePath) = False Then
            unique = True
        Else
            unique = False
        End If
    End While
    Return filePath
End Function
                                                

C#

C#コード (クラスの上に貼り付けます)
コードのコピー
using System; 
using System.IO; 
using System.Web; 
using System.Text; 
using GrapeCity.ActiveReports; 
using GrapeCity.ActiveReports.Export.Html;
C#コード (クラス内に貼り付けます)
コードのコピー
//応答用HttpContextを作成します。
private System.Web.HttpContext context = null; //HTML保存用のフォルダ作成用オブジェクトを作成します。このファイル名は、一意な名前を使います。 private System.IO.DirectoryInfo dirToSave = null; public string mainPage = ""; public MyCustomHtmlOutputter(System.Web.HttpContext context) { if(context == null) { throw new ArgumentNullException("context"); } this.context = context; string dirName = context.Server.MapPath("ReportOutput"); this.dirToSave = new DirectoryInfo(dirName); } #region Implementation of IOutputHtml public string OutputHtmlData(HtmlOutputInfoArgs info) { string temp = ""; switch(info.OutputKind) { case HtmlOutputKind.BookmarksHtml: case HtmlOutputKind.FramesetHtml: { temp = this.GenUniqueFileNameWithExtension(".html"); FileStream fs = File.Create(temp); this.WriteStreamToStream(info.OutputStream, fs); fs.Close(); return temp; } case HtmlOutputKind.HtmlPage: { //メインページをブラウザに通知できるように、作成したファイル名を保存します。 this.mainPage = this.GenUniqueFileNameWithExtension(".html"); FileStream fs = File.Create(this.mainPage); this.WriteStreamToStream(info.OutputStream, fs); fs.Close(); return this.mainPage; } case HtmlOutputKind.ImageJpg: { // .jpg形式のファイル保存用のユニークファイル名を作成します。 temp = this.GenUniqueFileNameWithExtension(".jpg"); FileStream fs = File.Create(temp); this.WriteStreamToStream(info.OutputStream, fs); fs.Close(); return temp; } case HtmlOutputKind.ImagePng: { // .png形式のファイル保存用のユニークファイル名を作成します。 temp = this.GenUniqueFileNameWithExtension(".png"); FileStream fs = File.Create(temp); this.WriteStreamToStream(info.OutputStream, fs); fs.Close(); return temp; } default: { // デフォルトのhtml temp = this.GenUniqueFileNameWithExtension(".html"); FileStream fs = File.Create(temp); this.WriteStreamToStream(info.OutputStream, fs); fs.Close(); return temp; } } } public void Finish() { } #endregion private void WriteStreamToStream(Stream sourceStream, Stream targetStream) { // ソースストリームのサイズを確認します int size = (int)sourceStream.Length; // ソースストリームと同じサイズのバッファを作成します。 byte[] buffer = new byte[size]; // ストリームのシークポインタを先頭に移動します。 sourceStream.Seek(0, SeekOrigin.Begin); // ストリームの内容をバッファにコピーします。 sourceStream.Read(buffer, 0, size); // 出力ストリームにストリームの内容をコピーします。 targetStream.Write(buffer, 0, size); } private string GenUniqueFileNameWithExtension(string extensionWithDot) { System.Random r = new Random(); bool unique = false; string filePath = ""; int iRandom = 0; //ランダムな名前を一意になるまで生成します。 while(!unique) { iRandom = r.Next(); //ファイル名を作成します。
System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append(this.dirToSave.FullName); sb.Append(Path.DirectorySeparatorChar); sb.Append(iRandom.ToString()); sb.Append(extensionWithDot); filePath = sb.ToString(); unique = !File.Exists(filePath); } return filePath; }

Htmlエクスポートオブジェクトを作成してレポートをエクスポートする

  1. プロジェクトにActiveReportを追加し、「rptCustHTML」名を付けます。
  2. ASPXのデザインビューをダブルクリックします。これにより、WebフォームのPage Loadイベントのイベント処理メソッドが作成されます。
  3. Page Loadイベントに次のコードを追加します。

 

Visual Basic

Visual Basicコード (Page Loadイベント内に貼り付けます)
コードのコピー
Dim rpt As New rptCustHTML()
Try
rpt.Run(False)
Catch eRunReport As Exception
' レポートの実行に失敗した場合は、ユーザーにエラーを通知する。
Response.Clear()
Response.Write("<h1>Error running report:</h1>")
Response.Write(eRunReport.ToString())
Return
End Try
' レポート出力が準備できるまでバッファを使用します。
Response.Buffer = True
' すでにバッファリングされているデータをクリアします。
Response.ClearContent()
' すでにバッファリングされているヘッダーをクリアします。(例えばHTMLページのコンテントタイプ)
Response.ClearHeaders() Response.Cache.SetCacheability(HttpCacheability.NoCache) Response.ContentType = "text/HTML"
' HTMLエクスポートオブジェクトを作成します。

Dim HtmlExport1 As New GrapeCity.ActiveReports.Export.Html.Section.HtmlExport()

' HTMLにエクスポートします。
Dim outputter As New MyCustomHtmlOutputter(Me.Context)
HtmlExport1.Export(rpt.Document, outputter, "")
Response.Redirect("ReportOutput" + "/" + System.IO.Path.GetFileName(outputter.mainPage))

C#

C#コード (Page Loadイベント内に貼り付けます)
コードのコピー
rptCustHTML rpt = new rptCustHTML();
try
{
   rpt.Run(false);
}
catch (Exception eRunReport)
{
   //レポートの実行に失敗した場合は、ユーザーにエラーを通知する。
   Response.Clear();
   Response.Write("<h1>Error running report:</h1>");
   Response.Write(eRunReport.ToString());
   return;
}
//レポート出力が準備できるまでバッファを使用します。
Response.Buffer = true;
        
//すでにバッファリングされているデータをクリアします。
Response.ClearContent();

//すでにバッファリングされているヘッダーをクリアします。(例えばHTMLページのコンテントタイプ)
Response.ClearHeaders(); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.ContentType = "text/html"; //Htmlエクスポートオブジェクトを作成します。 GrapeCity.ActiveReports.Export.Html.Section.HtmlExport htmlExport1 = new GrapeCity.ActiveReports.Export.Html.Section.HtmlExport(); //HTMLにエクスポートします。 MyCustomHtmlOutputter outputter = new MyCustomHtmlOutputter(this.Context); htmlExport1.Export(rpt.Document, outputter, ""); Response.Redirect("ReportOutput" + "/" + System.IO.Path.GetFileName(outputter.mainPage));

レポートの出力のためにフォルダーを追加する

  1. [ソリューションエクスプローラー]で、プロジェクトの名前を右クリックし、[追加]を選択した後、[新しいフォルダー]を選択します。
  2. 名前を「ReportOutput」に変更します。
  3. このフォルダーに対して書き込み権限があることを確認します。
  4. Webブラウザで結果を表示するには、プロジェクトを実行します。