2010-04-21 92 views

Respuesta

70

Esto es fácil de hacer, puede representar el informe como un PDF y guardar el conjunto de bytes resultante como un archivo PDF en el disco. Para hacer esto en segundo plano, se trata más bien de cómo se escribe su aplicación. Puede simplemente hacer girar un nuevo hilo, o utilizar un BackgroundWorker (si se trata de una aplicación de WinForms), etc. Allí, por supuesto, puede haber problemas de subprocesamiento múltiple para tener en cuenta.

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

byte[] bytes = reportViewer.LocalReport.Render(
    "PDF", null, out mimeType, out encoding, out filenameExtension, 
    out streamids, out warnings); 

using (FileStream fs = new FileStream("output.pdf", FileMode.Create)) 
{ 
    fs.Write(bytes, 0, bytes.Length); 
} 
+0

Así que no sólo tiene que utilizar un ReportViewer genérica (no uno en cualquier forma)? –

+9

Sí. De hecho, puede crear una instancia de un objeto 'LocalReport' (usar su constructor predeterminado luego establecer la propiedad' ReportPath' o 'ReportEmbeddedResource') y usarlo por sí mismo. Es muy común usar un ReportViewer que está solo en la memoria para aprovechar sus capacidades de exportación/renderizado –

+0

¿Por qué obtengo "No se ha especificado la definición del informe para el informe"? – bipartite

19

Puede utilizar siguiente código que generan archivos PDF en segundo plano como al igual que el botón de clic y luego se emergente en brwoser con GuardarComo y la opción de cancelar.

Warning[] warnings; 
     string[] streamIds; 
     string mimeType = string.Empty; 
     string encoding = string.Empty;`enter code here` 
     string extension = string.Empty; 
     DataSet dsGrpSum, dsActPlan, dsProfitDetails, 
      dsProfitSum, dsSumHeader, dsDetailsHeader, dsBudCom = null; 

    enter code here 

//This is optional if you have parameter then you can add parameters as much as you want 
ReportParameter[] param = new ReportParameter[5]; 
      param[0] = new ReportParameter("Report_Parameter_0", "1st Para", true); 
      param[1] = new ReportParameter("Report_Parameter_1", "2nd Para", true); 
      param[2] = new ReportParameter("Report_Parameter_2", "3rd Para", true); 
      param[3] = new ReportParameter("Report_Parameter_3", "4th Para", true); 
      param[4] = new ReportParameter("Report_Parameter_4", "5th Para"); 

      DataSet dsData= "Fill this dataset with your data"; 
      ReportDataSource rdsAct = new ReportDataSource("RptActDataSet_usp_GroupAccntDetails", dsActPlan.Tables[0]); 
      ReportViewer viewer = new ReportViewer(); 
      viewer.LocalReport.Refresh(); 
      viewer.LocalReport.ReportPath = "Reports/AcctPlan.rdlc"; //This is your rdlc name. 
      viewer.LocalReport.SetParameters(param); 
      viewer.LocalReport.DataSources.Add(rdsAct); // Add datasource here   
      byte[] bytes = viewer.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamIds, out warnings); 
      // byte[] bytes = viewer.LocalReport.Render("Excel", null, out mimeType, out encoding, out extension, out streamIds, out warnings); 
      // Now that you have all the bytes representing the PDF report, buffer it and send it to the client.   
      // System.Web.HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
      Response.Buffer = true; 
      Response.Clear(); 
      Response.ContentType = mimeType; 
      Response.AddHeader("content-disposition", "attachment; filename= filename" + "." + extension); 
      Response.OutputStream.Write(bytes, 0, bytes.Length); // create the file 
      Response.Flush(); // send it to the client to download 
      Response.End(); 
+0

¿has intentado enviar los parámetros? seguí recibiendo: 'Ha ocurrido un error durante Microsoft.Reporting.WebForms.LocalReport.EnsureExecutionSession informe processing.at local() en Microsoft.Reporting.WebForms.LocalReport.SetParameters (IEnumerable \' 1 Parámetros) ' – Rajan

4

El siguiente código funciona bien, de seguro, gracias por los comentarios anteriores. Puede añadir visor de informes y cambiar lo visible = false y utilizar el código de abajo en botón de envío:

protected void Button1_Click(object sender, EventArgs e) 
{ 
    Warning[] warnings; 
    string[] streamIds; 
    string mimeType = string.Empty; 
    string encoding = string.Empty; 
    string extension = string.Empty; 
    string HIJRA_TODAY = "01/10/1435"; 
    ReportParameter[] param = new ReportParameter[3]; 
    param[0] = new ReportParameter("CUSTOMER_NUM", CUSTOMER_NUMTBX.Text); 
    param[1] = new ReportParameter("REF_CD", REF_CDTB.Text); 
    param[2] = new ReportParameter("HIJRA_TODAY", HIJRA_TODAY); 

    byte[] bytes = ReportViewer1.LocalReport.Render(
     "PDF", 
     null, 
     out mimeType, 
     out encoding, 
     out extension, 
     out streamIds, 
     out warnings); 

    Response.Buffer = true; 
    Response.Clear(); 
    Response.ContentType = mimeType; 
    Response.AddHeader(
     "content-disposition", 
     "attachment; filename= filename" + "." + extension); 
    Response.OutputStream.Write(bytes, 0, bytes.Length); // create the file 
    Response.Flush(); // send it to the client to download 
    Response.End(); 
}  
8

Usted no necesita tener un control ReportViewer en cualquier lugar - se puede crear el LocalReport sobre la marcha:

var lr = new LocalReport 
{ 
    ReportPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? @"C:\", "Reports", "PathOfMyReport.rdlc"), 
    EnableExternalImages = true 
}; 

lr.DataSources.Add(new ReportDataSource("NameOfMyDataSet", model)); 

string mimeType, encoding, extension; 

Warning[] warnings; 
string[] streams; 
var renderedBytes = lr.Render 
    (
     "PDF", 
     @"<DeviceInfo><OutputFormat>PDF</OutputFormat><HumanReadablePDF>False</HumanReadablePDF></DeviceInfo>", 
     out mimeType, 
     out encoding, 
     out extension, 
     out streams, 
     out warnings 
    ); 

var saveAs = string.Format("{0}.pdf", Path.Combine(tempPath, "myfilename")); 

var idx = 0; 
while (File.Exists(saveAs)) 
{ 
    idx++; 
    saveAs = string.Format("{0}.{1}.pdf", Path.Combine(tempPath, "myfilename"), idx); 
} 

using (var stream = new FileStream(saveAs, FileMode.Create, FileAccess.Write)) 
{ 
    stream.Write(renderedBytes, 0, renderedBytes.Length); 
    stream.Close(); 
} 

lr.Dispose(); 

También puede agregar parámetros: (lr.SetParameter()), subinformes de controles: (lr.SubreportProcessing+=YourHandler), o casi cualquier cosa que se le ocurra.

+0

Necesitamos informe espectador si quiere obtener un archivo pdf formateado. Digamos por ejemplo ... necesito obtener una réplica exacta de mi página web en formato inclinado, color y visualización, luego necesito crear primero una plantilla y luego llenarla con un conjunto de datos. – mschoudhary

3
private void PDFExport(LocalReport report) 
    {   
     string[] streamids; 
     string minetype; 
     string encod; 
     string fextension; 
     string deviceInfo = 
      "<DeviceInfo>" + 
      " <OutputFormat>EMF</OutputFormat>" + 
      " <PageWidth>8.5in</PageWidth>" + 
      " <PageHeight>11in</PageHeight>" + 
      " <MarginTop>0.25in</MarginTop>" + 
      " <MarginLeft>0.25in</MarginLeft>" + 
      " <MarginRight>0.25in</MarginRight>" + 
      " <MarginBottom>0.25in</MarginBottom>" + 
      "</DeviceInfo>"; 
     Warning[] warnings; 
     byte[] rpbybe = report.Render("PDF", deviceInfo, out minetype, out encod, out fextension, out streamids, 
      out warnings); 
     using(FileStream fs=new FileStream("E:\\newwwfg.pdf",FileMode.Create)) 
     { 
      fs.Write(rpbybe , 0, rpbybe .Length); 
     } 

}

0

Usted puede instanciar LocalReport

   FicheInscriptionBean fiche = new FicheInscriptionBean(); 
       fiche.ToFicheInscriptionBean(inscription);List<FicheInscriptionBean> list = new List<FicheInscriptionBean>(); 
       list.Add(fiche); 
       ReportDataSource rds = new ReportDataSource(); 
       rds = new ReportDataSource("InscriptionDataSet", list); 
       // attachement du QrCode. 
       string stringToCode = numinscription + "," + inscription.Nom + "," + inscription.Prenom + "," + inscription.Cin; 
       Bitmap BitmapCaptcha = PostulerFiche.GenerateQrCode(fiche.NumInscription + ":" + fiche.Cin, Brushes.Black, Brushes.White, 200); 
       MemoryStream ms = new MemoryStream(); 
       BitmapCaptcha.Save(ms, ImageFormat.Gif); 
       var base64Data = Convert.ToBase64String(ms.ToArray()); 
       string QR_IMG = base64Data; 
       ReportParameter parameter = new ReportParameter("QR_IMG", QR_IMG, true); 

       LocalReport report = new LocalReport(); 
       report.ReportPath = Page.Server.MapPath("~/rdlc/FicheInscription.rdlc"); 
       report.DataSources.Clear(); 
       report.SetParameters(new ReportParameter[] { parameter }); 
       report.DataSources.Add(rds); 
       report.Refresh(); 

       string FileName = "FichePreinscription_" + numinscription + ".pdf"; 
       string extension; 
       string encoding; 
       string mimeType; 
       string[] streams; 
       Warning[] warnings; 
       Byte[] mybytes = report.Render("PDF", null, 
           out extension, out encoding, 
           out mimeType, out streams, out warnings); 
       using (FileStream fs = File.Create(Server.MapPath("~/rdlc/Reports/" + FileName))) 
       { 
        fs.Write(mybytes, 0, mybytes.Length); 
       } 
       Response.ClearHeaders(); 
       Response.ClearContent(); 
       Response.Buffer = true; 
       Response.Clear(); 
       Response.Charset = ""; 
       Response.ContentType = "application/pdf"; 
       Response.AddHeader("Content-Disposition", "attachment;filename=\"" + FileName + "\""); 
       Response.WriteFile(Server.MapPath("~/rdlc/Reports/" + FileName)); 

       Response.Flush(); 
       File.Delete(Server.MapPath("~/rdlc/Reports/" + FileName)); 
       Response.Close(); 
       Response.End(); 
Cuestiones relacionadas