Jump to content
ViniciusRafael

[Resolvido] Gerar PDF através do Report Viewer antes de abri-lo (

Recommended Posts

Olá pessoal =D

 

Estou com o seguinte problema:

 

Preciso gerar um PDF baseado num relatório do Report Viewer na máquina sem precisar abrir o Report Viewer. A aplicação será Windows Forms.

 

Até agora o código está assim:

 

DataTable Dt = new DataTable();
           ReportViewer Rv = new ReportViewer();

           DataRow Dr = Dt.NewRow() ;

           Dt.Columns.Add("Name", typeof(string));
           Dt.Columns.Add("Age", typeof(string));
           Dt.Columns.Add("Phone", typeof(string));

           Dr["Name"] = "Vini";
           Dr["Age"] = "12";
           Dr["Phone"] = "2134";

           Dt.Rows.Add(Dr);

           Rv.ProcessingMode = ProcessingMode.Local;
           Rv.LocalReport.ReportPath = @"\report1.rdlc";
           Rv.LocalReport.DataSources.Add(new ReportDataSource("Employee", Dt));


           Warning[] warnings;
           string[] streamids;
           string mimeType;
           string encoding;
           string extension;

              byte[] bytes = Rv.LocalReport.Render(
              "Pdf", null, out mimeType, out encoding,
               out extension,
              out streamids, out warnings);

               FileStream fs = new FileStream(@"c:\output\output.pdf",
                  FileMode.Create);
               fs.Write(bytes, 0, bytes.Length);
               fs.Close()

 

 

O problema é que está dando erro no byte[]. Alega que não foi possível fazer o processamento com o relatório.

 

Mensagem: "Ocorreu um erro durante o processamento de relatórios local."

 

Então, alguém com dicas?

Share this post


Link to post
Share on other sites

Tente usar o método ReadBytes() do ReportViewer.

Olá.

 

Não achei o método ReadBytes() do ReportViewer, joguei no Google e nada, também.

 

Acho que o problema está no processo que pega o fonte de dados e o arquivo do relatório, pois fui defininir alguns parâmetros e, também deu o mesmo problema.

 

 

Rv.LocalReport.SetParameters( Rp );  

 

Você já chegou um relatório PDF dessa forma em WinForm?

Share this post


Link to post
Share on other sites

Bom, consegui gerar o PDF, mas ele está em branco.

 

Tive que adicionar parâmetros antes de usar o Rv.LocalReport.Render(). Daí foi, mas infelizmente ele não está associando meu DataTable com o relatório.

 

Segue abaixo o código (um pouco modificado, estou no trabalho e não tenho o mesmo projeto que usei em casa)

 

 private void ExportPdf()
       {
           DataTable Dt = new DataTable("Teste");
           ReportViewer Rv = new ReportViewer();
           ReportParameter[] Rp = new ReportParameter[3];
           BindingSource Bs = new BindingSource();
           ReportDataSource Rds = new ReportDataSource(); 

           Rp[0] = new ReportParameter("Name", "Name", true);
           Rp[1] = new ReportParameter("Age", "Age", true);
           Rp[2] = new ReportParameter("Phone", "Phone", true);

           DataRow Dr = Dt.NewRow() ;

           Dt.Columns.Add("Name", typeof(string));
           Dt.Columns.Add("Age", typeof(string));
           Dt.Columns.Add("Phone", typeof(string));

           Dr["Name"] = "Vini";
           Dr["Age"] = "12";
           Dr["Phone"] = "2134";

           Dt.Rows.Add(Dr);

           Bs.DataSource = Dt;
           Rds.Name = Dt.TableName;
           Rds.Value = Bs;

           Rv.ProcessingMode = ProcessingMode.Local;
           Rv.LocalReport.ReportPath = @"c:\users\vinicius\desktop\RP_PDFTESTE\RP_PDFTESTE\Report1.rdlc";
           Rv.LocalReport.SetParameters( Rp );  
           Rv.LocalReport.DataSources.Add( Rds);


           Rv.LocalReport.Refresh(); 

           Warning[] warnings;
           string[] streamids;
           string mimeType;
           string encoding;
           string extension;

              byte[] bytes = Rv.LocalReport.Render(
              "Pdf", null, out mimeType, out encoding,
               out extension,
              out streamids, out warnings);

               FileStream fs = new FileStream(@"c:\output\output.pdf",
                  FileMode.Create);
               fs.Write(bytes, 0, bytes.Length);
               fs.Close();
       }

Share this post


Link to post
Share on other sites

Problema resolvido =D

 

Abaixo o código funcional (Lembrando que tem que adicionar um DataSet ao Report (Report Viewer).

private void ExportPdf()
       {

           ReportViewer Rv = new ReportViewer();
           ReportParameter[] Rp = new ReportParameter[3];
           BindingSource Bs = new BindingSource();
           ReportDataSource Rds = new ReportDataSource();
           DataTable Dt = new DataTable("Teste");
           DataRow Dr;

           Rp[0] = new ReportParameter("Name", "Name", true);
           Rp[1] = new ReportParameter("Age", "Age", true);
           Rp[2] = new ReportParameter("Phone", "Phone", true);

           Dt.Columns.Add( "Name", typeof( string ) );
           Dt.Columns.Add( "Age", typeof( string ) );
           Dt.Columns.Add( "Phone", typeof( string ) );

           for ( int i = 0; i < 5; i++ )
           {
               Dr = Dt.NewRow(); 
               Dr["Name"] = "Vini " + i * i+2;
               Dr["Age"] = "12 " + i + i + Math.PI;
               Dr["Phone"] = "2134 " + i + i / 0.5;

               Dt.Rows.Add( Dr );
           }
           Bs.DataSource = Dt;
           Rds.Name = Dt.TableName;
           Rds.Value = Bs.DataSource;

           Rv.ProcessingMode = ProcessingMode.Local;
           Rv.LocalReport.ReportPath = @"Report1.rdlc";
           Rv.LocalReport.SetParameters( Rp );  
           Rv.LocalReport.DataSources.Add( Rds);

           Warning[] warnings;
           string[] streamids;
           string mimeType;
           string encoding;
           string extension;

              byte[] bytes = Rv.LocalReport.Render(
              "Pdf", null, out mimeType, out encoding,
               out extension,
              out streamids, out warnings);

               FileStream fs = new FileStream(@"c:\output\output.pdf",FileMode.Create);
               fs.Write(bytes, 0, bytes.Length);
               fs.Close();

               System.Diagnostics.Process.Start(@"c:\output\output.pdf");
       }

       private void button1_Click( object sender, EventArgs e )
       {
           ExportPdf(  );
           label1.Text = "Exportado com sucesso!";  
       }

 

Pra quem não conseguir rodar vou deixar o font aqui embaixo.

 

Download --> https://skydrive.live.com/redir?resid=930E14C1CBA22D2B!157

Share this post


Link to post
Share on other sites

Meu amigo, valeu! Valeu mesmo!

 

Eu precisava mesmo deste comando: "System.Diagnostics.Process.Start(@"c:\output\output.pdf");", o único problema é que ele não funciona no cliente porque o Windows não deixa qualquer um gravar no c:.

Share this post


Link to post
Share on other sites

Boa tarde.

 

Tenho um relatório que está sendo exportado para .pdf mas sem os dados, somente com o layout.

 

Gostaria de saber se alguém poderia me orientar, pois o código está exatamente igual ao último postado como resolvido.

Share this post


Link to post
Share on other sites
9 hours ago, Rodrigo Malagodi said:

Boa tarde.

 

Tenho um relatório que está sendo exportado para .pdf mas sem os dados, somente com o layout.

 

Gostaria de saber se alguém poderia me orientar, pois o código está exatamente igual ao último postado como resolvido.

Descobri o motivo do report em branco.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.