2010-04-21 46 views
37

Sto eseguendo un processo di fine mese e voglio che venga creato automaticamente alcuni dei report che devono essere creati in quel momento. Sto usando i rapporti di rdlc. C'è un modo per creare automaticamente un PDF da un report RDLC in background?Creazione di un PDF da un report RDLC in background

risposta

70

Questo è facile da eseguire, è possibile eseguire il rendering del report come PDF e salvare l'array di byte risultante come file PDF su disco. Per fare ciò in background, è più una questione su come è scritta la tua app. Puoi semplicemente creare un nuovo thread, o usare un BackgroundWorker (se si tratta di un'app WinForms), ecc. Ovviamente, potrebbero esserci problemi di multithreading.

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

Quindi posso solo usare un ReportViewer generica (non uno qualsiasi forma)? –

+9

Sì. In effetti, puoi semplicemente istanziare un oggetto 'LocalReport' (usa il suo costruttore di default quindi imposta la proprietà' ReportPath' o 'ReportEmbeddedResource') e usalo da solo. È molto comune utilizzare un ReportViewer che è appena in memoria per sfruttare le funzionalità di esportazione/rendering –

+0

Perché ottengo "La definizione del report per il report non è stata specificata"? – bipartite

19

È possibile utilizzare seguente codice che generano file PDF in background come come il pulsante di scatto e poi sarebbe compare in brwoser con SaveAs ed annullare l'opzione.

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

hai provato a inviare i parametri? ho continuato a ottenere: 'Si è verificato un errore durante la Microsoft.Reporting.WebForms.LocalReport.EnsureExecutionSession rapporto processing.at locale() a Microsoft.Reporting.WebForms.LocalReport.SetParameters (IEnumerable \' 1 parametri) ' – Rajan

4

Il codice seguente funziona bene con me di sicuro grazie per i commenti sopra. È possibile aggiungere visualizzatore di report e modificare il visibile = false e utilizzare il codice qui sotto sul pulsante di invio:

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

Non è necessario disporre di un controllo ReportViewer ovunque - è possibile creare il LocalReport al volo:

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(); 

È inoltre possibile aggiungere parametri: (lr.SetParameter()), gestire i sottoreport: (lr.SubreportProcessing+=YourHandler) o quasi tutto ciò che si può pensare.

+0

Abbiamo bisogno di rapporto spettatore se vuoi ottenere un file PDF formattato. Ad esempio, per esempio ... ho bisogno di ottenere la replica esatta della mia pagina web in formato PDF, colore, display, quindi devo prima creare un modello e poi riempirlo con il set di dati. – 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

Puoi instanciate 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(); 
Problemi correlati