ReportViewer – Bericht als PDF aufrufen

Innerhalb einer Anwendung wollte ich gerne einen Report direkt exportiert als PDF-Datei aufrufen. Ich habe lange im Internet gesucht und habe viele nützliche Beiträge gefunden, allerdings habe ich kein Beispiel für meine Problemstellung gefunden. Da ich etwas unter zeitdrunk stand, musste ich mir etwas „einfaches“ einfallen lassen.

Das Problem lag darin, dass der ReportViewer die Daten/den Bericht erst einmal laden muss, bevor man ihn exportieren kann. Also klicke ich mit Hilfe von Javascript auf einen Button, der nachdem die Seite geladen wurde betätigt wird und den Bericht exportiert. Ich kann mir gut vorstellen, dass es eine wesentlich hübschere und bessere Methode dafür gibt, diese konnte ich aber leider nicht auf die schnelle finden.

Hier das HTML-Markup:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="reportPreview.aspx.cs" Inherits="reportPreview" %>

<%@ Register Assembly="Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
    Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Berichtsvorschau</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="cmdPrint" runat="server" Text="Drucken" OnClick="cmdPrint_Click" />
    </div>
    <div>
        <rsweb:ReportViewer ID="ReportViewer1" runat="server" BorderColor="Silver" BorderStyle="Solid" BorderWidth="1px"
            Font-Names="Verdana" Font-Size="8pt" Height="100%" ShowFindControls="False" ShowParameterPrompts="False"
            Width="100%">
            <LocalReport ReportPath="reports\testreport.rdlc">
                <DataSources>
                    <rsweb:ReportDataSource DataSourceId="ObjectDataSource1" Name="DataSet1_vwreport" />
                </DataSources>
            </LocalReport>
        </rsweb:ReportViewer>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}"
            SelectMethod="GetData" TypeName="WebReportTest.dsTestTableAdapters.vwreportTableAdapter">
            <SelectParameters>
                <asp:QueryStringParameter DefaultValue="0" Name="id" QueryStringField="id" Type="Int32" />
            </SelectParameters>
        </asp:ObjectDataSource>
    </div>

    <script type="text/javascript">
    <!--
        document.getElementById('cmdPrint').click();
        -->
    </script>

    </form>
</body>
</html>

Serverseitiger Code (C#):

using System;
using Microsoft.Reporting.WebForms;

namespace reportPreview
{
    public partial class reportPreview : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void cmdPrint_Click(object sender, EventArgs e)
        {
            this.print();
        }

        private void print()
        {
            string reportType = "PDF";
            string mimeType;
            string encoding;
            string fileNameExtension;

            //The DeviceInfo settings should be changed based on the reportType
            //http://msdn2.microsoft.com/en-us/library/ms155397.aspx
            string deviceInfo =
                    "<DeviceInfo>" +
                    "  <OutputFormat>PDF</OutputFormat>" +
                    "  <DpiX>300</DpiX>" +
                    "  <DpiY>300</DpiY>" +
                    "  <PageWidth>8.5in</PageWidth>" +
                    "  <PageHeight>11in</PageHeight>" +
                    "  <MarginTop>0in</MarginTop>" +
                    "  <MarginLeft>0in</MarginLeft>" +
                    "  <MarginRight>0in</MarginRight>" +
                    "  <MarginBottom>0in</MarginBottom>" +
                    "</DeviceInfo>";

            Warning[] warnings;
            string[] streams;
            byte[] renderedBytes;

            //Render the report
            renderedBytes = this.ReportViewer1.LocalReport.Render(
                reportType,
                deviceInfo,
                out mimeType,
                out encoding,
                out fileNameExtension,
                out streams,
                out warnings);

            //Clear the response stream and write the bytes to the outputstream
            //Set content-disposition to "attachment" so that user is prompted to take an action
            //on the file (open or save)
            Response.Clear();
            Response.ContentType = mimeType;
            Response.AddHeader("content-disposition", "inline; filename=reportPreview." + fileNameExtension);
            Response.BinaryWrite(renderedBytes);
            Response.End();
        }
    }
}

Hilfreiche Links zum Thema:

GotReportViewer

Get ASP.NET Report Viewer to Occupy 100% Height and Width

How to render client report definition files (.rdlc) directly to the Response stream without preview

Eine Antwort auf „ReportViewer – Bericht als PDF aufrufen“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.