2015-07-24 32 views
5

Mam kod poniżej jego funkcją jest ładowanie danych z raportu na ekranie przy użyciu CrystalReports.Błąd pokaż pdf CrystalReport vb.net

Dim strExportFile As String 
      strExportFile = "ReportReajustesAplicados.pdf" 

      Dim s As System.IO.MemoryStream = relat.ExportToStream(ExportFormatType.PortableDocFormat) 
      With HttpContext.Current.Response 

       .ClearContent() 
       .ClearHeaders() 
       .ContentType = "application/pdf" 
       .AddHeader("Content-Disposition", "inline; filename=" & strExportFile) 
       .BinaryWrite(s.ToArray) 
       .End() 
      End With 

Kiedy wykonuję ekstrakcję danych.

mam następujący błąd

Nie można rzutować obiektu typu „FileStreamDeleteOnClose” wpisz „System.IO.MemoryStream”.

Próbowałem używać System.IO.Stream, ekstrakcji działa, ale nie wyświetla danych na ekranie, ponieważ ".BinaryWrite (s.ToArray)" nie przyjmuje metody ToArray.

Uwaga: Kiedy kładę

#if DEBUG Then 
      CrystalReportViewer1.ReportSource = relat 
      CrystalReportViewer1.DataBind() 
      Exit Sub 

If #End 

działa

Potrzebuję tego do pracy, ale w trybie Release.

Help me

Odpowiedz

0

Można zastąpić .BinaryWrite(s.ToArray) przez .BinaryWrite(CType(Session("myCrystalReport"), IO.MemoryStream).ToArray()).

Napisałem przykład poniżej, nie jestem pewien, czy to jest to, czego szukasz, ale mam nadzieję, że może ci pomóc. Działa to dla mnie, aby umożliwić użytkownikom pobieranie/przeglądanie raportów Crystal Reports przy użyciu formatu PDF.

Dim fileName As String = "ReportReajustesAplicados.pdf" 
Response.ContentType = "application/pdf" 
Response.Clear() 
Response.Buffer = True 
Response.AddHeader("Content-Disposition", "filename=" + fileName) 
Response.BinaryWrite(CType(Session("myCrystalReport"), IO.MemoryStream).ToArray()) 
Response.End() 

Włożyłem Crystal Report w sesji z tych opcji (RPT jest mój Crystal Reports):

Dim options = rpt.ExportOptions 
options.ExportFormatType = CrystalDecisions.Shared.ExportFormatType.PortableDocFormat 
Session!myCrystalReport= rpt.FormatEngine.ExportToStream(New CrystalDecisions.Shared.ExportRequestContext With { 
     .ExportInfo = options 
     }) 
rpt.Dispose() 

Jeśli moja odpowiedź jest jasne, czy nie jest to, czego szukaliśmy, proszę mi powiedzieć, i postaram się go zaktualizować tak szybko, jak tylko będę mógł.

2

znalazłem rozwiązanie na:

https://archive.sap.com/discussions/thread/3322762

Jak odpowiedział przez SAP faceta. „Jest to projekt, nigdy nie w pełni obsługiwany eksport do MemoryStream jedyną opcją jest nie używać MemoryStream, to nie zostaną zmienione. "

Więc rozwiązaniem jest zastąpienie MemoryStream z Stream i przesłać go w Byte tablicę, jak w:

Dim strExportFile As String 
strExportFile = "ReportReajustesAplicados.pdf" 
Dim s As System.IO.Stream = relat.ExportToStream(ExportFormatType.PortableDocFormat) 
Dim b(s.Length) As Byte 
s.Read(b, 0, CInt(s.Length)) 

With HttpContext.Current.Response 
    .ClearContent() 
    .ClearHeaders() 
    .ContentType = "application/pdf" 
    .AddHeader("Content-Disposition", "inline; filename=" & strExportFile) 
    .BinaryWrite(b) 
    .Flush() 
    .SuppressContent = True 
    HttpContext.Current.ApplicationInstance.CompleteRequest() 
End With 
+0

Miałem ten sam problem. W ten sposób pracuj dla mnie, dzięki. – Elizeu

0

miałem podobny problem, gdy uruchomiony lokalnie.Zamiast za pomocą strumienia, użyj tego:

using (CrystalDecisions.CrystalReports.Engine.ReportDocument oRpt = 
    new ReportDocument())  
{  
    oRpt.Load(Server.MapPath("../RptFiles/MyCReport.rpt")); 
    oRpt.SetDataSource(MyDataSource); 

    // ... other stuff you need, params, etc 

    Response.Clear();     
    Response.ClearHeaders(); 

    oRpt.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, false, 
     "MyReportName"); 

    oRpt.Close();  
} 
0

spróbuje użyć tego kodu, aby przekształcić się w strumieniu:

//MemoryStream oStream = (MemoryStream)reportDocument.ExportToStream(type); 
System.IO.Stream oStream = null; 
byte[] byteArray = null; 
oStream = reportDocument.ExportToStream(type); 
byteArray = new byte[oStream.Length]; 
oStream.Read(byteArray, 0, Convert.ToInt32(oStream.Length - 1)); 

tutaj jest pełny kod jako odniesienie:

private void ShowReports(ReportDocument reportDocument, string fileName) 
     { 
      string rptType = GetQsSValue("ReportType"); 
      ExportFormatType type = ExportFormatType.PortableDocFormat; 
      string rptTypeExt = string.Empty; 
      string contentType = string.Empty; 

      if (rptType == null || rptType == "PDF") 
      { 
       type = ExportFormatType.PortableDocFormat; 
       rptTypeExt = ".pdf"; 
       contentType = "application/pdf"; 
      } 
      else if (rptType == "Excel" || rptType == "Text") 
      { 
       type = ExportFormatType.Excel; 
       rptTypeExt = ".xls"; 
       contentType = "application/excel";    
      } 

      //MemoryStream oStream = (MemoryStream)reportDocument.ExportToStream(type); 
      System.IO.Stream oStream = null; 
      byte[] byteArray = null; 
      oStream = reportDocument.ExportToStream(type); 
      byteArray = new byte[oStream.Length]; 
      oStream.Read(byteArray, 0, Convert.ToInt32(oStream.Length - 1)); 

      reportDocument.Close(); 
      reportDocument.Dispose(); 
      reportDocument = null; 

      HttpContext.Current.Response.Clear(); 
      HttpContext.Current.Response.Buffer = true; 
      HttpContext.Current.Response.ContentType = contentType; 
      HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName + rptTypeExt); 
      //HttpContext.Current.Response.BinaryWrite(oStream.ToArray()); 
      HttpContext.Current.Response.BinaryWrite(byteArray); 
      HttpContext.Current.Response.Flush(); 
      HttpContext.Current.Response.Close(); 
      HttpContext.Current.Response.End(); 
      GC.Collect(); 
     }