为什么我不能始终以编程方式将.rpt文件导出到Excel或PDF?

2020-09-26 17:12发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我正在使用VS 2015版本14更新2

用于VS和运行时引擎的Crystal Reports(13.0.21.2533)

Windows窗体应用程序。 定位.Net Framework 4.5.2

我在尝试可靠地在 vb中导出水晶报表(到pdf或xls)时遇到了一个真正的问题。 .net 。 我基于现有报告(在Visual Studio中创建)以编程方式在代码中创建一个报告。 现有报告具有子报告(所有已验证且已确认数据源正在查看我的Visual Studio应用程序中的数据集中的数据表)。 我独立地从SQL Server检索数据并将此数据放入表中。 然后,我将子报表的数据源设置为带有已填充SQL数据的表。 (不确定这是否是最好的方法,但是就创建报告而言,它可以正常工作)。 导出后,我关闭并处理报表以及winform中的所有对象,然后关闭并处理winform本身。 然后,我重新创建winform并尝试再次导出-此过程最多可以运行几次,但是最终出现错误。 仅在导出功能上会出现此问题。 我可以重复加载报告而不会出现问题(如果我不尝试导出)。 我正在使用" .export"功能生成水晶报表:

Public Sub ExportToExcel()

昏暗d作为DateTime d = LabelShiftStart.Text.Trim

Dim s As String = d.ToString(" ddMMMyyyy_HHmm")

尝试

将CrExportOptions设置为ExportOptions

将CrDiskFileDestinationOptions设置为新_

DiskFileDestinationOptions()

将CrFormatTypeOptions设置为新的ExcelFormatOptions

ShiftReportNameAndPathExcel =" C:\ iLine Reports \ Report_"&s.Trim&" .xls"

CrDiskFileDestinationOptions.DiskFileName =" C:\ iLine Reports \ Report_"&s.Trim&" .xls" CrExportOptions = objRpt.ExportOptions

使用CrExportOptions .ExportDestinationType = ExportDestinationType.DiskFile .ExportFormatType = ExportFormatType.Excel .DestinationOptions = CrDiskFileDestinationOptions .FormatOptions = CrFormatTypeOptions

结尾为

'首先检查文件是否存在

如果不是File.Exists(ShiftReportNameAndPathExcel),则

'仅在文件名不存在时导出

objRpt.Export()

如果结束

例外捕获

TraceUpdate(TimeOfDay.Now.ToString(" dd/MMM/yy HH:mm:ss:fff")&"无法导出到Excel。"&ex.ToString.Trim)

结束尝试

结束

第一次导出始终有效。 但随后的(有时是第二个或更晚)导致了以下错误:

16/Sep/17 20:59:26:046SHIFT报告无法导出到pdf.CrystalDecisions.CrystalReports.Engine.DataSourceException:文件CrystalReportShift 4312_4644_ {0DFEA3E2-2AC7-4E57-AC88-FE9A3A722F51}中的错误。 找不到表格。 ---> System.Runtime.InteropServices.COMException:文件CrystalReportShift 4312_4644_ {0DFEA3E2-2AC7-4E57-AC88-FE9A3A722F51} .rpt中的错误:找不到该表。 在CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext)处的CrystalDecisions.ReportAppServer.Controllers.ReportSourceClass.Export(ExportOptions pExportOptions,RequestContext pRequestContext)-内部异常堆栈跟踪的末尾-在CrystalDecisions.ReportAppServer.ConvertDotNetToErom(ThrowDotNetToErom.ThrowDo 例外e)发生在CrystalDecisions.CrystalReports.CrystalReports.CrystalReports.Engine.FormatEngine.Export(ExportRequestContext reqContext)处的CrystalDecisions.CrystalReports.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext)处的CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext)。 在Crystal.Decisions.CrystalReports.Engine.ReportDocument.Export()在?。?()处的FormatEngine.Export()

当应用程序崩溃时,VS在输出屏幕中记录以下内容:

IlineSQLEngine.exe中的0x5D6ABCCF(clr.dll)引发异常:0xC0000005:访问冲突读取位置0x00000000。 公共语言运行时无法在此异常处停止。 常见原因包括:错误的COM互操作编组和内存损坏。 要进一步调查,请使用仅本机调试。 在未知模块中发生了类型为'System.ExecutionEngineException'的未处理异常。

每次我都使用相同的数据执行相同的代码,所以我不知道为什么它不起作用? 从本质上讲,我的代码的逻辑看起来不错,但是由于随后的尝试导出,正在导致它崩溃的原因。

我已经花了几天时间,但遇到了严重困扰,因此不胜感激。 问候,凯文

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

我正在使用VS 2015版本14更新2

用于VS和运行时引擎的Crystal Reports(13.0.21.2533)

Windows窗体应用程序。 定位.Net Framework 4.5.2

我在尝试可靠地在 vb中导出水晶报表(到pdf或xls)时遇到了一个真正的问题。 .net 。 我基于现有报告(在Visual Studio中创建)以编程方式在代码中创建一个报告。 现有报告具有子报告(所有已验证且已确认数据源正在查看我的Visual Studio应用程序中的数据集中的数据表)。 我独立地从SQL Server检索数据并将此数据放入表中。 然后,我将子报表的数据源设置为带有已填充SQL数据的表。 (不确定这是否是最好的方法,但是就创建报告而言,它可以正常工作)。 导出后,我关闭并处理报表以及winform中的所有对象,然后关闭并处理winform本身。 然后,我重新创建winform并尝试再次导出-此过程最多可以运行几次,但是最终出现错误。 仅在导出功能上会出现此问题。 我可以重复加载报告而不会出现问题(如果我不尝试导出)。 我正在使用" .export"功能生成水晶报表:

Public Sub ExportToExcel()

昏暗d作为DateTime d = LabelShiftStart.Text.Trim

Dim s As String = d.ToString(" ddMMMyyyy_HHmm")

尝试

将CrExportOptions设置为ExportOptions

将CrDiskFileDestinationOptions设置为新_

DiskFileDestinationOptions()

将CrFormatTypeOptions设置为新的ExcelFormatOptions

ShiftReportNameAndPathExcel =" C:\ iLine Reports \ Report_"&s.Trim&" .xls"

CrDiskFileDestinationOptions.DiskFileName =" C:\ iLine Reports \ Report_"&s.Trim&" .xls" CrExportOptions = objRpt.ExportOptions

使用CrExportOptions .ExportDestinationType = ExportDestinationType.DiskFile .ExportFormatType = ExportFormatType.Excel .DestinationOptions = CrDiskFileDestinationOptions .FormatOptions = CrFormatTypeOptions

结尾为

'首先检查文件是否存在

如果不是File.Exists(ShiftReportNameAndPathExcel),则

'仅在文件名不存在时导出

objRpt.Export()

如果结束

例外捕获

TraceUpdate(TimeOfDay.Now.ToString(" dd/MMM/yy HH:mm:ss:fff")&"无法导出到Excel。"&ex.ToString.Trim)

结束尝试

结束

第一次导出始终有效。 但随后的(有时是第二个或更晚)导致了以下错误:

16/Sep/17 20:59:26:046SHIFT报告无法导出到pdf.CrystalDecisions.CrystalReports.Engine.DataSourceException:文件CrystalReportShift 4312_4644_ {0DFEA3E2-2AC7-4E57-AC88-FE9A3A722F51}中的错误。 找不到表格。 ---> System.Runtime.InteropServices.COMException:文件CrystalReportShift 4312_4644_ {0DFEA3E2-2AC7-4E57-AC88-FE9A3A722F51} .rpt中的错误:找不到该表。 在CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext)处的CrystalDecisions.ReportAppServer.Controllers.ReportSourceClass.Export(ExportOptions pExportOptions,RequestContext pRequestContext)-内部异常堆栈跟踪的末尾-在CrystalDecisions.ReportAppServer.ConvertDotNetToErom(ThrowDotNetToErom.ThrowDo 例外e)发生在CrystalDecisions.CrystalReports.CrystalReports.CrystalReports.Engine.FormatEngine.Export(ExportRequestContext reqContext)处的CrystalDecisions.CrystalReports.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext)处的CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext)。 在Crystal.Decisions.CrystalReports.Engine.ReportDocument.Export()在?。?()处的FormatEngine.Export()

当应用程序崩溃时,VS在输出屏幕中记录以下内容:

IlineSQLEngine.exe中的0x5D6ABCCF(clr.dll)引发异常:0xC0000005:访问冲突读取位置0x00000000。 公共语言运行时无法在此异常处停止。 常见原因包括:错误的COM互操作编组和内存损坏。 要进一步调查,请使用仅本机调试。 在未知模块中发生了类型为'System.ExecutionEngineException'的未处理异常。

每次我都使用相同的数据执行相同的代码,所以我不知道为什么它不起作用? 从本质上讲,我的代码的逻辑看起来不错,但是由于随后的尝试导出,正在导致它崩溃的原因。

我已经花了几天时间,但遇到了严重困扰,因此不胜感激。 问候,凯文

付费偷看设置
发送
4条回答
Doze时光
1楼 · 2020-09-26 17:48.采纳回答

凯文,你好,

您是否还在关闭/处置数据源?

该错误表明该代码部分存在问题。

在这两行中,尝试对完整路径和文件名进行硬编码,而不要动态编码:

ShiftReportNameAndPathExcel =" C:\ iLine Reports \ Report_"&s.Trim&" .xls"

CrDiskFileDestinationOptions.DiskFileName =" C:\ iLine Reports \ Report_"&s.Trim&" .xls"

可能是文件仍然存在,还是一些临时文件等。

也可以在用户的​​temp文件夹中删除您的temp文件,可能是其中的剩余内容。

Don

灬番茄
2楼-- · 2020-09-26 17:50

Hi Don,

我最初使我的代码执行以下操作:

1。 从SQL Server检索数据。

2。 创建并填充表。

3。 在步骤2中将Crystal报表数据源设置为表。

4。 在步骤2中将Crystal Report Viewer源设置为表。

5。 处理数据源。

6。 从水晶报表导出。

我认为问题在于过早处理数据源。 水晶报表查看器数据(和导出)不受此早期处理的影响,但我认为尝试从报表导出是一个问题。

我已经更改了代码,以便在处置水晶报表之前不处置数据源。 到目前为止,我还没有看到这个问题再次发生。 您是否可以同意我的上述逻辑?

另一个问题:

我包装了所有代码(try/catch ex作为异常/end try)我遇到的错误没有被我自己的代码捕获。 此代码也将在Windows服务中运行。 您能否建议我如何在不导致应用程序崩溃的情况下捕获这些错误(为了使应用程序更健壮/以防万一)? 感谢您指出正确的方向。

关于

凯文

奄奄一息的小鱼
3楼-- · 2020-09-26 17:41

嗨凯文,

由于这是一项服务,因此您必须将错误记录到文本文件中。 尝试在每个调用上使用try catch,您可能想使用InnerException,只需测试它是否不为null,以免产生错误。

N-Moskvin
4楼-- · 2020-09-26 18:03

感谢唐,

我目前在尝试导出报告之前先检查该报告是否存在。

您能否通过"仅测试它是否不为空"来澄清您的意思。

您的意思是测试数据源-您能给我一个示例代码行来进行澄清吗?

凯文

一周热门 更多>