将SSRS 2008报告导出为Excel时出现错误

3
我有一个返回大约90000行数据的报告。但是当我从asp.net页面将其导出到Excel时,会出现以下错误:
报表呈现期间发生错误
但是,相同的报告可以成功地从报表服务器导出到Excel。
如果我从Web页面传递更多参数以将记录数减少到100,则可以从Web页面本身导出到Excel。 编辑-1
堆栈跟踪: [异常:有关此错误的更多信息,请导航到本地服务器计算机上的报表服务器,或启用远程错误]
[异常:报表呈现期间发生错误。] Microsoft.Reporting.WebForms.ServerReport.ServerUrlRequest(Boolean isAbortable, String url, Stream outputStream, String& mimeType, String& fileNameExtension) +574 Microsoft.Reporting.WebForms.ServerReport.InternalRender(Boolean isAbortable, String format, String deviceInfo, NameValueCollection urlAccessParameters, Stream reportStream, String& mimeType, String& fileNameExtension) +905 Microsoft.Reporting.WebForms.ServerReport.Render(String format, String deviceInfo, NameValueCollection urlAccessParameters, Stream reportStream, String& mimeType, String& fileNameExtension) +28 Microsoft.Reporting.WebForms.ServerReport.Render(String format, String deviceInfo, NameValueCollection urlAccessParameters, String& mimeType, String& fileNameExtension) +88 Microsoft.Reporting.WebForms.ServerReportControlSource.RenderReport(String format, String deviceInfo, NameValueCollection additionalParams, String& mimeType, String& fileExtension) +123 Microsoft.Reporting.WebForms.ExportOperation.PerformOperation(NameValueCollection urlQuery, HttpResponse response) +153 Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext context) +585 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +901 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +76
8个回答

2
我可以建议您采取以下解决方法:在报告中,您可以放置一个链接到 Force SSRS Report,以创建文件而不是在屏幕上呈现。

该链接应包含以下内容:

http://localhost/ReportServer/Pages/ReportViewer.aspx?
%2fSample+Report&rs:Format=excel

报告在屏幕上显示正确。当我将该报告导出为Excel格式时,出现了此错误。 - Surinder
@Surinder,ASP.NET会将屏幕上的内容呈现到Excel中。Gil建议的链接将跳过此步骤,直接将请求发送到报表服务器。当您需要时,屏幕仅显示您想要的内容,因此每个页面在请求时都会单独呈现。通过查看器控件导出到Excel会强制一次性请求所有内容,可能会超时。 - glh
@gil peretz 由于安全问题无法执行此操作。 - Surinder

2

SSRS 2008只能导出到XLS(MS Office 2003)。XLS文件的行数限制为65k

您看过从报告管理器导出的行数吗?除非您使用自定义或第三方工具允许导出到XLSX,否则该文件应该只有约65k行。

我认为报告管理器通过执行类似于从报告中选择前65k个的操作来解决超出行长度的问题。您的asp.net界面可能没有考虑到这个限制,并强制将太多的行放入Excel导出中。

您的选项是:

1.) 使用允许导出到XLSX的SSRS 2012。 XLSX文件可以处理更多的行。

2.) 在导出到XLS之前,更改您的asp.net代码以切分掉前65k行。

3.) 考虑使用第三方或自定义解决方案来解决SSRS 2008导出限制问题(我知道Aspose)。

4.) 导出为CSV,然后让最终用户将CSV转换为Excel。


2
正文:
如dev_etter所提到的,SSRS 2008本身不支持这样大的Excel报告,但可以使用第三方工具如SoftArtisans OfficeWriter来设计和导出OOXML(.xlsx/.xlsm)格式的报告。
免责声明:我为SoftArtisans工作。

1
也许在 ReportViewer 控件中出现了超时错误? 尝试使用以下方法解决:
ViewerControl.ServerReport.Timeout

因为报表服务器也使用 ReportViewer 控件,而且可能与您的配置不同。超时的默认值为 600000 毫秒。
顺便说一下:看到您的 StackTrace 将会很有帮助,这可以帮助我们给出更好的答案。

它不应该超时,因为报告在网页中显示没有任何错误。我遇到的错误是当我将其导出到Excel时。我已经在问题中添加了错误的堆栈跟踪。 - Surinder
@Surinder,您可以通过到达最后一页来检查此内容。由于ssrs 2008只能一次执行一页,这是唯一的检查方式。 - glh
@glh 我已经到达报告的最后一页,网页没有超时错误。我生成了报告的 CSV 文件,没有任何错误,但是将其导出到 Excel 时会出现“在我的问题中提到的报告呈现期间发生错误”的错误。如果我从报告服务器本身导出此报告,则不会出现任何格式问题。 - Surinder
微软放了一个好玩的错误。:( 很高兴为您找到了解决方法。我建议@GilPeretz是答案。我会尝试在您的报告中添加一个按钮或链接作为解决方法。 - glh

0

如果问题是超过Excel的65k限制,您可以为您的Tablix添加一个父组,并添加以下代码作为组表达式

=CEILING(RowNumber(Nothing)/65500)

然后在每个组的实例之间添加分页符...

这将为超过65500行的tablix在Excel文件中创建多个选项卡...


0

服务器上的RAM可能是一个问题。这里有很多高容量报告没有传递的问题,而RAM似乎可以解决它们,至少从回应来看是这样。


但是报告服务器上还有另一个报告返回了5倍的行数,并成功将其导出到Excel。 - Surinder
哇,这个有更多的列还是更复杂的查询? - glh
它们具有相同的列数。我在那里更改了一个参数以增加行数。 - Surinder
我想知道是否超时是您的问题,就像@RomanBadiornyi建议的那样。从上面的堆栈跟踪来看,这似乎是最合理的解释。 - glh
1
我同意你的看法,似乎RAM是问题所在。 - Surinder

0

我的解决方法是移除我们报告中的印章(图片)。我不确定这是否仅限于png格式,但移除后,报告成功导出到Excel。


0

我在SSRS 2014中导出Oracle SSRS报告时遇到了一个问题,这个报告使用了分层连接查询。报告能够正常显示,但速度比我预期的要快。我怀疑它在后台超时了,但仍然显示了一些行。我将报告设置为永不超时,问题得到了解决。虽然运行时间变长了,但在完成后可以将其导出到Excel。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接