ReportViewer WebコントロールでSSRSからのレポートダウンロード時の利便性を高める

既存ダウンロード機能の処理

ReportViewer Webコントロールが元々備えている既存ダウンロード機能を使うには

1.レポートを表示
2.表示後のダウンロードボタンからダウンロード

の2ステップを踏む必要があるため、画面表示せず直ぐダウンロードしたい場合に不向きです。
2のダウンロード時に再度SSRSへのリクエストを行うため、実質フォーマット違いで2回レポートを取得していることになります。

f:id:ihisa:20150113185232p:plain

手順

Report.aspx

1. Registerディレクティブに宣言追加
<%@ Register assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" namespace="Microsoft.Reporting.WebForms" tagprefix="rv" %>
2. ReportViewer Webコントロールの配置

OnPreRenderイベントとOnSubmittingParameterValuesイベントを指定します。

<asp:UpdatePanel ID="updatepanel" runat="server">
    <ContentTemplate>
        <rv:ReportViewer 
            ID="reportviewer" 
            runat="server"
            SizeToReportContent="false" 
            AsyncRendering="true"
            InteractiveDeviceInfos="(コレクション)" 
            ProcessingMode="Remote" 
            KeepSessionAlive="true" 
            ShowPrintButton="false"
            ShowRefreshButton="false"
            OnPreRender="reportviewer_OnPreRender"
            OnSubmittingParameterValues= "reportviewer_OnSubmittingParameterValues" >
    </ContentTemplate>
</asp:UpdatePanel>

Report.aspx.cs

3. OnPreRenderイベントの作成

コントロールへのレポート本文表示を行わせない様処理を追加します。

protected void reportviewer_OnPreRender(object sender, EventArgs e)
{
    this.reportviewer.ShowReportBody = false;
}
4. OnSubmittingParameterValuesイベントの作成

SSRSへレポートの取得を行い、取得したレポートを別ページで表示します。

protected void reportviewer_OnSubmittingParameterValues(object sender, ReportParametersEventArgs e)
{
    string mimeType;
        string encoding;
        string extension;
        string deviceInfo;
        string[] streamids; Microsoft.Reporting.WebForms.Warning[] warnings;
        string format = "Excel";
        deviceInfo = null;

    // パラメータセットが必要な場合はSetParametersでセットする
    this.reportviewer.ServerReport.SetParameters(e.Parameters);

    // byte配列でレポート取得                
    bytes = this.reportviewer.ServerReport.Render(format, deviceInfo, out mimeType, out encoding, out extension, out streamids, out warnings);

    // dummyページへの引き渡しパラメータ
    Session.Add("downloaddata", bytes);
    Session.Add("downloadname", "xxx.xls");
    
    // dummyページでダウンロードさせる
    string clientScript = "window.open('download.aspx','_self', 'resizable=yes,menubar=no,status=no,location=no,toolbar=no,width=0,height=0,top=-100,')";
    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "windowdummy", clientScript, true);
}

download.aspx.cs

5. ダウンロード処理

ダウンロードさせます。

protected void Page_Load(object sender, EventArgs e)
{
    byte[] bytes = Session["downloaddata"] as byte[];
    string filename = Session["downloadname"] as string;

    // Response情報クリア
    Response.ClearContent();

    // HTTPヘッダー情報設定
    Response.AddHeader("Content-Disposition", "attachment;filename=" + filename);
    Response.ContentType = "application/msexcel";

    // ファイル書込
    Response.BinaryWrite(bytes);

    // レスポンス終了
    Response.End();
}

これで[レポートの表示]ボタン押下で画面にレポート表示せずダウンロードされる様になります。

参考

ReportViewr コントロール
http://msdn.microsoft.com/ja-jp/library/ms251671.aspx

SSRSについて(SQL Server Reporting Services)
http://msdn.microsoft.com/ja-jp/library/ms159106.aspx

動作環境

SQL Server 2008 R2
IIS 7.0
.NET Framework 4.0