2010-04-21 11 views
37

Mam uruchomiony proces na koniec miesiąca i chcę, aby automatycznie tworzył on niektóre raporty, które należy utworzyć w tym czasie. Używam raportów rdlc. Czy istnieje sposób automatycznego tworzenia pliku PDF z raportu RDLC w tle?Tworzenie pliku PDF z raportu RDLC w tle

Odpowiedz

70

To jest łatwe do zrobienia, możesz wyrenderować raport jako PDF i zapisać wynikową tablicę bajtów jako plik PDF na dysku. Aby zrobić to w tle, bardziej chodzi o to, jak napisano twoją aplikację. Możesz po prostu zakręcić nowy wątek lub użyć BackgroundWorker (jeśli jest to aplikacja WinForm), itd. Oczywiście, mogą istnieć wielowątkowe problemy, o których należy pamiętać.

+0

Więc mogę tylko używać rodzajowe ReportViewer (a nie jedna na dowolnej formie)? –

+9

Tak. W rzeczywistości można po prostu utworzyć instancję obiektu 'LocalReport' (użyć domyślnego konstruktora, a następnie ustawić właściwość' ReportPath' lub 'ReportEmbeddedResource') i użyć go samodzielnie. Bardzo często używa się ReportViewer, który jest właśnie w pamięci, aby skorzystać z jego funkcji eksportu/renderowania. –

+0

Dlaczego otrzymuję komunikat "Definicja raportu dla raportu nie została określona"? – bipartite

19

Możesz użyć następującego kodu, który generuje plik PDF w tle, jak na przycisku, a następnie wyskoczy w oknie z opcją SaveAs i anuluj.

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

próbowałeś wysłać parametry? Ciągle otrzymuję: 'Wystąpił błąd podczas lokalnego raportu przetwarzania.at Microsoft.Reporting.WebForms.LocalReport.EnsureExecutionSession() w Microsoft.Reporting.WebForms.LocalReport.SetParameters (IEnumerable \' 1 parametry) ' – Rajan

4

Poniższy kod działa dobrze ze mną, dzięki za powyższe komentarze. Możesz dodać Report Viewer i zmienić widoczne = false i użyć poniższy kod na przedstawienia przycisk:

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

Nie trzeba mieć kontrolę ReportViewer wszędzie - można utworzyć LocalReport w locie:

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

Można również dodać parametry: (lr.SetParameter()), obsadzenie podraportów: (lr.SubreportProcessing+=YourHandler), lub prawie wszystko, co można wymyślić.

+0

Potrzebujemy raportu przeglądarka, jeśli chcesz uzyskać sformatowany plik PDF. Powiedzmy na przykład ... muszę uzyskać dokładną kopię mojej strony w formacie pdf, włączając format, kolor i wyświetlacz, a następnie najpierw utworzyć szablon, a następnie wypełnić go zestawem danych. – 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

Można 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(); 
Powiązane problemy