既存ダウンロード機能の処理
ReportViewer Webコントロールが元々備えている既存ダウンロード機能を使うには
1.レポートを表示
2.表示後のダウンロードボタンからダウンロード
の2ステップを踏む必要があるため、画面表示せず直ぐダウンロードしたい場合に不向きです。
2のダウンロード時に再度SSRSへのリクエストを行うため、実質フォーマット違いで2回レポートを取得していることになります。
手順
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