ASP .NET - ReportViewer - gerando a exibição no formato PDF e XLS


Você pode gerar relatórios usando o add-in ReportViewer para o Visual Web Developer/Visual Basic.  Se você não sabe como fazer isso acompanhe os meus artigos sobre o assunto nas referências, pois neste artigo eu vou mostrar como gerar a visualização PDF  e XLS a partir do relatório criado no ReportViewer.

O link para download do ReportViewer atualizado(se você ainda não o têm) :  Download details: Microsoft Report Viewer Redistributable SP1 2008

Assumindo que você tenha conseguido fazer o download e ter instalado o ReportViewer, o relatório de exemplo que eu vou usar neste artigo em uma página web ASP .NET, exibe os dados da tabela Customers do banco de dados Northwind.mdf

Nota: Para este exemplo eu vou utilizar o SQL Server 2005 Express e a tabela Customers do banco de dados Northwind.mdf conforme a figura ao lado

Você pode criar o seu próprio banco de dados e tabelas e gerar relatórios para os seus dados. Para saber como criar um banco de dados, uma tabela e incluir dados no SQL Server 2005 Express leia os artigos:

 

Eu sei que você pode estar pensando : "Mas o Viewer do ReportViewer já apresenta a opção de exportar para PDF ?"

Eu sei mas o recurso que vamos implementar irá gerar a visualização PDF via código diretamente para o usuário com apenas um clique de botão:

Então abra o Visual Studio 2008 Express e crie um novo web site usando o template ASP .NET Web Site com o nome Gerar_PDF;

A  seguir selecione a página Default.aspx e a partir da ToolBox , na aba Reporting, arraste e solte o controle MicrosoftReportViewer para o descritor:

Clique no link Design a Report para ativar o assistente e siga a orientação do mesmo efetuando uma conexão com o banco de dados Northwind.mdf e selecionando a tabela Customers;

Selecione os campos CustomerID, CompanyName, City, Region e Country da tabela Customers gerando o DataSource conforme a figura a seguir:

A final informe você terá o relatório com a seguinte estrutura:

Agora volte para a página Default.aspx e inclua um botão de comando abaixo do relatório com o texto Gerar PDF;

Agora vamos incluir o código no evento Click do botão que vai fazer a mágica de gerar a visualização PDF, conforme abaixo:

Inclua a referência :  Imports Microsoft.Reporting.WebForms

e as seguintes variáveis:

Dim warnings As Warning() = Nothing
Dim
streamids As String() = Nothing
Dim
mimeType As String = Nothing
Dim
encoding As String = Nothing
Dim
fileNameExtension As String =
Nothing

e a seguir o código no evento Click:

 Protected Sub btnGerarPDF_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnGerarPDF.Click

        Dim exportBytes() As Byte = ReportViewer1.LocalReport.Render("PDF", Nothing, mimeType, encoding, fileNameExtension, streamids, warnings)
        HttpContext.Current.Response.Buffer = True
        HttpContext.Current.Response.Clear()
        HttpContext.Current.Response.ContentType = mimeType
        HttpContext.Current.Response.AddHeader("content-disposition", ("inline; filename=ExportedReport." + fileNameExtension))
        HttpContext.Current.Response.BinaryWrite(exportBytes)
        HttpContext.Current.Response.Flush()
        HttpContext.Current.Response.End()

    End Sub

Na verdade não existe mágica. O processo esta sendo executado pelo  método :

LocalReport.Render Method (String, String, out String, out String, out String, out String[], out Warning[]) 

que processa o relatório e o renderiza no formato especificado. 

A sintaxe usada é :

Public Overrides Function Render ( _
                          format As String, _
                          deviceInfo As String, _
                         <OutAttribute> ByRef mimeType As String, _
                         <OutAttribute> ByRef encoding As String, _
                         <OutAttribute> ByRef fileNameExtension As String, _
                         <OutAttribute> ByRef streams As String(), _
                         <OutAttribute> ByRef warnings As Warning() _
                          ) As Byte()

Os parâmetros usados são :

Format O formato no qual o relatório será renderizado. São suportados os formatos : Excel, PDF e Image;
deviceInfo Uma string XML que contém a especificação do dispositivo que é requerido para renderizar a extensão especificada no parâmetro format;
mineType O tipo MIME do relatório renderizado;
encoding O encoding usado quando da renderização do conteúdo do relatório;
fileNameExtension A extensão do nome do arquivo usado para o arquivo de saída;
streams O identificador stream;
warnings Um array de Warning;
 

Executando o web site iremos primeiro obter o relatório conforme a figura abaixo:

Clicando no botão Gerar PDF iremos obter a visualização PDF:

Se você quer gerar um arquivo Excel com extensão .xls com o conteúdo do relatório basta incluir mais um botão de comando com o texto - Excel,  e, um controle Label  na página Default.aspx:

Agora no evento Click do botão de comando Excel inclua o seguinte código:

  Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

        Dim bytes As Byte()
        bytes = ReportViewer1.LocalReport.Render("Excel", Nothing, mimeType, encoding, fileNameExtension, streamids, warnings)
        Dim fs As New FileStream("c:\dados\arquivoExcel.xls", FileMode.Create)
        fs.Write(bytes, 0, bytes.Length)
        fs.Close()
        Label1.Text = "Relatório exportado como Excel para o arquivo : c:\dados\arquivoExcel.xls"
    End Sub

Abrindo o arquivo Excel em  c:\dados\arquivoExcel.xls iremos obter:

Nota: Você pode definir o local que quiser para salvar o arquivo xls.

Pegue o projeto completo aqui :   ReportView_PDF.zip

Eu sei é apenas ASP .NET e  ReportViewer , mas eu gosto...

Referências:


José Carlos Macoratti