none
exportar Report en PDF RRS feed

  • Pregunta

  • Hola a todos.

    Necesito vuestra ayuda. Vereis tengo unos informes de Reporting Services, que necesito mandar a pdf cuando el usuario seleccione un botón de pdf, sin necesidad de previsualizar el informe. El caso es que lo conseguí creando un reportviewer dinámico, y me fue perfecto, pero el problema es que solo funciona en local.

    En cuanto pongo la apliación en Web no me funciona y esque estoy intentando buscar una solución, pero no consigo encontrarla. Por favor, agradecería cualquier tipo de ayuda, o alguna página donde se muestre la solución.

    Gracias a todos.

    Saludos
    jueves, 11 de febrero de 2010 12:42

Respuestas

  • Hola:

    Intenta lo siguiente:

    1. Primero en tu pagina .aspx obviamente tienes el control de ReportViewer que estara oculto y el boton de pdf:

    <asp:Button ID="btnPDF" runat="server" Text="Print Report" Width="100%" 
        OnClick="btnImprimir_Click" CausesValidation="False"  />
    
    <rsweb:ReportViewer ID="rvMiReporteInvisible" runat="server" Visible="false" AsyncRendering="false">
    </rsweb:ReportViewer>


    2. Primero en tu codigo .aspx.cs el botón de PDF tienes que abrir una nueva ventana y llamar a una pagina la cual generara el reporte en pdf:

    Response.Write("<script>open('http:\\localhost\misitio\paginaPDF.aspx'); </script>");


    3. Por ultimo en el evento form_load de la pagina a la cual has llamado (paginaPDF.aspx), colocas el código de generar el reporte y envías la ventana de abrir o guardar: 

    Warning[] warnings;
    string[] streamids;
    string mimeType;
    string encoding;
    string extension;
    
    this.rvMiReporteInvisible.LocalReport.ReportPath = MapPath("~/Reports/reporte.rdlc");
    this.rvMiReporteInvisible.AsyncRendering = false;
             
    this.rvMiReporteInvisible.LocalReport.Refresh();
    
    byte[] bytes = rvMiReporteInvisible.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamids, out warnings);
    
    FileStream fs = new FileStream("c:\reportes\mireporte.pdf", FileMode.Create);
    fs.Write(bytes, 0, bytes.Length);
    fs.Close();
    
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", @"attachment; filename=c:\reportes\mireporte.pdf");
    Response.BinaryWrite(bytes);
    Response.End();


    Nota: La ruta donde guardas el PDF tiene que tener permisos de escritura.

    Saludos,

    Edgar Iván Hernández Mendoza
    Consultor en sistemas
    Panamá, Ciudad de Panamá


    • Marcado como respuesta titan_1 viernes, 12 de febrero de 2010 12:02
    jueves, 11 de febrero de 2010 20:59
  • hola

    algo que por ahi deberias poner es un return false
    asi evitas el postback del boton

    <script type="text/javascript">
        function openExport()
        {
            var url = prueba.aspx';
            window.open(url, 'Report', 'width=10,height=10,left=100,top=100');
            return false;
        }
    </script>

    por el resto parece estar correcto
    podrias poner un alert de javascript para validar que este pasando por alli

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta titan_1 viernes, 12 de febrero de 2010 12:02
    jueves, 11 de febrero de 2010 21:17

Todas las respuestas

  • hola

    si en la mismo pagina donde tienes el control reportviewer colocas estas lienas

    <script type="text/javascript">
       window.open(document.getElementById('ReportViewer1').ClientController.m_exportUrlBase + "Excel", '', 'width=10,height=10,left=100,top=100');
        window.close();
    </script>

    de forma automatica te mostrsra el cuadro para exportar a excel

    yo tenia la apgina de esta forma

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title></title>

        <script src="../Javascript/jquery-1.3.2.min.js" type="text/javascript"></script>
       
        <script type="text/javascript">

            $().ready(function() {
                $("#imageloader").show('fast');
            });
       
        </script>
       
    </head>
    <body>
        <form id="form1" runat="server">
        <div id="imageloader" style="width:100%;height:100%">
            <img alt="" src="../App_Themes/Default/Images/loader.gif" width="31Px" height="31px"/>
        </div>
        <div style="display:none;">
       
            <rsweb:ReportViewer ID="ReportViewer1" runat="server" Height="100%"
                Width="100%" AsyncRendering="False">
            </rsweb:ReportViewer>
       
        </div>
        </form>
    </body>
        <script type="text/javascript">
            window.open(document.getElementById('ReportViewer1').ClientController.m_exportUrlBase + "Excel", '', 'width=10,height=10,left=100,top=100');
            window.close();
        </script>
    </html>

    esta era una apginad e nombre ReportExport.aspx
    que la llamba desde otra de esta forma

    var url = 'Export/ReportExport.aspx';
    window.open(url, 'Report', 'width=10,height=10,left=100,top=100');


    si en lugar de usar Excel usas PDF te sera de utilidad

    document.getElementById('ReportViewer1').ClientController.m_exportUrlBase + "PDF"

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 11 de febrero de 2010 13:02
  • Hola Leandro, gracias por la respuesta tan rápida.

    no me quedo muy claro, mira segui tus pasos y corrigeme si los entendí mal:

    1º paso en la página donde sencuentra el reportviewer colocar la funcion javascript de la siguiente manera:

    <rsweb:ReportViewer ID="ReportViewer2" runat="server" Font-Names="Verdana"
          Font-Size="8pt" ProcessingMode="Remote"
          style="z-index: 1; left: 9px; top: 75px; position: absolute; width: 1238px; height: 580px"
          Width
    ="1238px">
             <ServerReport
    ReportPath=""
                                 ReportServerUrl="" /> 
    </rsweb:ReportViewer
    >

    <script type
    ="text/javascript">
            window.open(document.getElementById('ReportViewer2').ClientController.m_exportUrlBase + "PDF", '',
                             'width=10,height=10,left=100,top=100');
            window.close();
    </script
    >



    2º Paso es desde la página donde se encuentra el botón de Importar a PDF, tengo que realizar la llamada a la función javascript?
    esta parte es la que no me ha quedado clara. Como llamo a la funcion y desde donde?

    var url = 'Export/ReportExport.aspx';
    window.open(url, 'Report', 'width=10,height=10,left=100,top=100');

    Gracias Leandro, espero que me puedas ayudar.

    Saludos


     

     

    jueves, 11 de febrero de 2010 14:10
  • hola

    la primer parte esta correcta

    la segunda en realdiad no es una llamda a una funcion sino que suas el window.open()
    en el boton de exportar, esto es porque la ventana que tendra el reporte se cerrara


    esto

    <script ...>

    function openExport()
    {
        var url = 'Export/ReportExport.aspx';
        window.open(url, 'Report', 'width=10,height=10,left=100,top=100');
    }
    </script>


    lo llamas desde el botn de exportar de tu pagina
    pero no es la pagina dodne esta el control reportviewer es la otra pagina

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 11 de febrero de 2010 14:19
  • A vale, Leandro, ya te entendí.

    Seguí los pasos:

    1º Pagína prueba.aspx

    <rsweb:ReportViewer ID="ReportViewer2" runat="server" Font-Names="Verdana" 
                    Font-Size="8pt" ProcessingMode="Remote" 
                    style="z-index: 1; left: 9px; top: 75px; position: absolute; width: 1238px; height: 580px" 
                    Width="1238px">
               <ServerReport ReportPath=""
                            ReportServerUrl="" />
    </rsweb:ReportViewer>
                   
    <script type="text/javascript">
            window.open(document.getElementById('ReportViewer2').ClientController.m_exportUrlBase + "PDF", '', 'width=10,height=10,left=100,top=100');
             window.close();
    </script>


    2º Página prueba2.aspx tengo un botón que se llama Importar, donde tengo un metodo click que al hacer click llama a la función javascript:

        Protected Sub Button8_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button8.Click
            Button8.Attributes.Add("onclick", "openExport();")
        End Sub

        <script type="text/javascript">
            function openExport()
            {
                var url = prueba.aspx';
                window.open(url, 'Report', 'width=10,height=10,left=100,top=100');
            }
        </script>

    Lo único que he conseguido es que se me abra una ventana nueva de explorer con el informe aunque me da un error pero nada de importarlo al escritorio.

    Gracias
    jueves, 11 de febrero de 2010 14:43
  • Hola:

    Intenta lo siguiente:

    1. Primero en tu pagina .aspx obviamente tienes el control de ReportViewer que estara oculto y el boton de pdf:

    <asp:Button ID="btnPDF" runat="server" Text="Print Report" Width="100%" 
        OnClick="btnImprimir_Click" CausesValidation="False"  />
    
    <rsweb:ReportViewer ID="rvMiReporteInvisible" runat="server" Visible="false" AsyncRendering="false">
    </rsweb:ReportViewer>


    2. Primero en tu codigo .aspx.cs el botón de PDF tienes que abrir una nueva ventana y llamar a una pagina la cual generara el reporte en pdf:

    Response.Write("<script>open('http:\\localhost\misitio\paginaPDF.aspx'); </script>");


    3. Por ultimo en el evento form_load de la pagina a la cual has llamado (paginaPDF.aspx), colocas el código de generar el reporte y envías la ventana de abrir o guardar: 

    Warning[] warnings;
    string[] streamids;
    string mimeType;
    string encoding;
    string extension;
    
    this.rvMiReporteInvisible.LocalReport.ReportPath = MapPath("~/Reports/reporte.rdlc");
    this.rvMiReporteInvisible.AsyncRendering = false;
             
    this.rvMiReporteInvisible.LocalReport.Refresh();
    
    byte[] bytes = rvMiReporteInvisible.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamids, out warnings);
    
    FileStream fs = new FileStream("c:\reportes\mireporte.pdf", FileMode.Create);
    fs.Write(bytes, 0, bytes.Length);
    fs.Close();
    
    Response.ContentType = "application/pdf";
    Response.AddHeader("content-disposition", @"attachment; filename=c:\reportes\mireporte.pdf");
    Response.BinaryWrite(bytes);
    Response.End();


    Nota: La ruta donde guardas el PDF tiene que tener permisos de escritura.

    Saludos,

    Edgar Iván Hernández Mendoza
    Consultor en sistemas
    Panamá, Ciudad de Panamá


    • Marcado como respuesta titan_1 viernes, 12 de febrero de 2010 12:02
    jueves, 11 de febrero de 2010 20:59
  • hola

    algo que por ahi deberias poner es un return false
    asi evitas el postback del boton

    <script type="text/javascript">
        function openExport()
        {
            var url = prueba.aspx';
            window.open(url, 'Report', 'width=10,height=10,left=100,top=100');
            return false;
        }
    </script>

    por el resto parece estar correcto
    podrias poner un alert de javascript para validar que este pasando por alli

    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta titan_1 viernes, 12 de febrero de 2010 12:02
    jueves, 11 de febrero de 2010 21:17
  • oooole!!! me ha servido, ahora ya puedo descargarme los informes...

    Mil gracias Edgar, me sirvió de gran ayuda tu código.

    También muchas gracias a ti Leandro por la ayuda prestada y el tiempo, gracias.

    Una últimas cosa, que no entiendo muy bien:

    1º ¿Porque exactamente hay que hacer una llamada a una nueva página? ¿Para que genere el reporte que después irá a pdf?

    2º ¿La llamada a la página que genera el reporte, se puede realizar por medio de un Response.Redirect?

    3º Se me descuadra la página donde tengo el botón de exportar, es decir, tengo la página con el boton exportar, que hace la llamada a la pagina donde se genera el reporte, pues bien donde tengo el boton de exportar, tras cliquear sobre él se me descuadra un poco la página. Sabrías decirme el motivo? Quizás un postback? Quizás usando el codigo de Leandro sobre abrir la página desde javascript me pueda servir para no descuadrar la página, de cualquier modo voy a revisarlo.

    En definitiva, muchas gracias a los dos!
    Saludos
    viernes, 12 de febrero de 2010 12:02
  • Hola:

    Con respecto tu primera pregunta el problema es la linea de código Response.End(); cuando esta linea se ejecuta todos los response quedan desabilitados (por ejemplo el reponse click de un botón asp.net)
    lo puedes hacer también como lo planteas en tu segunda pregunta. Realizas Response.Redirect a otra pagina que te genere el pdf y le agregas algún mensaje como "el reporte se ha generado con éxito" o algo así. 

    Con respecto a tu tercera pregunta puede ser por que este botón abre el pop-up no estoy muy seguro. no e tenido un comportamiento similar al implementarlo de esa forma.  Definitivamente el código que proporciono Leandro  es mas directo ( creerme que también ya estoy haciendo mis pruebas de concepto con este código ).

    saludos,

    Edgar Iván Hernández Mendoza
    Consultor en sistemas
    Panamá, Ciudad de Panamá
    viernes, 12 de febrero de 2010 13:39
  • he revisado tu aporte y me sirvio mucho, gracias.

     

    pero ahora tengo un problema que cuando lo corro en el servidor me abre la pagina y despues se cierra, sabes que podra ser lo que este sucediendo, o se tiene que hacer una configuracion en el IIS 7.0

     

    Saludos!

    miércoles, 23 de noviembre de 2011 18:47