显示pdf CrystalReport vb.net时出错

显示pdf CrystalReport vb.net时出错,vb.net,visual-studio-2010,crystal-reports,Vb.net,Visual Studio 2010,Crystal Reports,我有下面的代码 它的功能是使用CrystalReports从屏幕上的报告加载数据 Dim strExportFile As String strExportFile = "ReportReajustesAplicados.pdf" Dim s As System.IO.MemoryStream = relat.ExportToStream(ExportFormatType.PortableDocFormat) With H

我有下面的代码 它的功能是使用CrystalReports从屏幕上的报告加载数据

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
当我提取数据时

我有以下错误

无法将“FileStreamDeleteOnClose”类型的对象强制转换为“System.IO.MemoryStream”类型。

我尝试使用System.IO.Stream,提取工作正常,但不会在屏幕上显示数据,因为“.BinaryWrite(s.ToArray)”不接受ToArray方法

注:当我把

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

If #End
工作

我需要这个工作,但在释放模式


“帮助我”

您可以用
替换
.BinaryWrite(s.ToArray)
。BinaryWrite(CType(会话(“myCrystalReport”)、IO.MemoryStream.ToArray())

我在下面写了一个例子,我不确定这是否是你想要的,但我希望它能帮助你。对于我来说,这可以让用户使用PDF格式下载/查看Crystal报告

 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()
我将Crystal report与这些选项放在会话中(rpt是我的Crystal report):


如果我的答案不清楚或不是您想要的答案,请告诉我,我会尽快更新它。

我在以下网站上找到了解决方案:

正如SAP guy所回答的: “这是出于设计,我们从未完全支持导出到MemoryStream。 唯一的选择是不使用MemoryStream,这将不会更改。“

因此,解决方案是将内存流替换为,并将其发送到字节数组中,如下所示:

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

在本地运行时,我遇到了类似的问题。不要使用流,而是使用以下内容:

使用(CrystalDecisions.CrystalReports.Engine.ReportDocument oRpt)=
新建ReportDocument())
{    
Load(Server.MapPath(“../RptFiles/MyCReport.rpt”);
oRpt.SetDataSource(MyDataSource);
//…你需要的其他东西,params,等等
Response.Clear();
Response.ClearHeaders();
oRpt.ExportToHttpResponse(ExportFormatType.PortableDocFormat,Response,false,
“MyReportName”);
oRpt.Close();
}

尝试使用此代码在流中转换:

//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));
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();
        }
以下是完整的代码作为参考:

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

对于那些不使用web服务器并且只需要保存的用户:

Dim myStream As New System.IO.MemoryStream

'ExportToStream acutally produces type: FileStreamDeleteOnClose -- not Stream.  Can't implicitly convert it to MemoryStream   
Dim myTempStream As System.IO.Stream
myTempStream = oRpt.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat)

'Now copy the data to a MemoryStream before closing the report and destroying the stream.
myTempStream.CopyTo(myStream)

'Clean up and close the temp stream and report.
oRpt.Close()

我也有同样的问题。这样对我有用,谢谢。