打印没有预览的ServerReport

时间:2009-03-25 15:48:51

标签: .net sql-server reporting-services printing

我有一个SQLServer 2005 Reporting Services ServerReport,我的Winforms应用程序(Framework 2.0)通过ReportViewer控件部署并经常使用它。

我需要的是从应用程序的一种形式提供一键式打印按钮,该按钮仅触发打印对话框,而不会启动ReportViewer。

我一直在尝试将报表呈现为字节数组,但我无法通过它。

此报告有多个页面,因此我不知道适用于本地报告的“图像”呈现是否也适用于服务器报告。

我一直在寻找MSDN,但只提到本地报道:

http://msdn.microsoft.com/en-us/library/ms252091(VS.80).aspx

我可以在服务器端报告上获得的小信息是使用对ReportServer Web服务的Web引用,我不希望这样。

http://blogs.msdn.com/bryanke/articles/71491.aspx

有没有办法使用打印对话框打印服务器报告,而不向用户显示报告查看器(我不介意它是否在幕后)?

4 个答案:

答案 0 :(得分:11)

好的,终于想通了。

检查此链接:  Printing Reporting Services 2005 Reports

该博客文章几乎包含了我需要的所有内容,但我将在此发布完整的答案以供参考。

我最终在幕后使用报表查看器对象,但仅为方便起见,因为它不是必需的。

第一步是询问用户打印机设置:

Dim doc As New Printing.PrintDocument()
AddHandler doc.PrintPage, AddressOf PrintPageHandler
Dim dialog As New PrintDialog()
dialog.Document = doc
Dim print As DialogResult
print = dialog.ShowDialog()
doc.PrinterSettings = dialog.PrinterSettings

有了这个,我们继续配置我们的报告电话: 修改此字符串,您可以打印任何纸张大小和任何方向(切换横向高度和宽度),但报告本身必须在相同的页面布局中配置。

Dim deviceInfo As String = _
"<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>"

Dim warnings() As Warning
Dim streamids() As String
Dim mimeType, encoding, filenameExtension, path As String
mimeType = "" : encoding = "" : filenameExtension = ""

最后,我们使用其所有页面呈现报告。

请注意,如果报告只有一个页面,则永远不会使用renderStream方法。

rpt_control是以前配置并针对服务器报告的报告查看器控件。

请注意,在此代码中,我们将页面添加到列表中。此列表是一个全局变量,因为它在PrintPageHandler方法中是必需的。

Dim data() As Byte
rpt_control.ServerReport.SetParameters(_parametros)
data = rpt_control.ServerReport.Render("Image", deviceInfo, mimeType, encoding, filenameExtension, streamids, warnings)
pages.Add(New Metafile(New MemoryStream(data)))

For Each pageName As String In streamids
    data = rpt_control.ServerReport.RenderStream("Image", pageName, deviceInfo, mimeType, encoding)
    pages.Add(New Metafile(New MemoryStream(data)))
Next
doc.Print()

到目前为止,我们还没有完成任何打印,这实际上是由我们之前引用的PrintPageHandler方法处理的。

Dim pages As New List(Of Metafile)
Dim pageIndex As Integer = 0
Private Sub PrintPageHandler(ByVal sender As Object, ByVal e As PrintPageEventArgs)
    Dim page As Metafile = pages(pageIndex)
    pageIndex += 1
    e.Graphics.DrawImage(page, 0, 0, page.Width, page.Height)
    e.HasMorePages = pageIndex < pages.Count
End Sub

答案 1 :(得分:1)

大卫上面给出的答案有2个警告: -

1)在SQL2005上返回流标签的顺序通常是从第二页到最后一页,但是在负载很重的机器上(例如生产环境),它们很可能以任意顺序返回。

流ID采用&lt; reportname&gt; _nn形式,其中nn是数字。这使得排序有点棘手,因为报告名称将是字母并且数字只是简短形式,因此页面“myreport_2”将在页面“myreport_10”之后排序。导致我的第二个警告

2)在SQL 2005上,报告后缀从2开始,在SQL 2008上从1开始(第2页)

答案 2 :(得分:1)

尝试将此代码与SQL Server 2008 R2一起使用的人会发现它只打印多页报告的第一页。有一个新的“行为”,其中返回到streamid的数组是空的。请让微软知道你在这里关心:

https://connect.microsoft.com/SQLServer/feedback/details/573997/with-ssrs-2008-r2-microsoft-reporting-winforms-serverreport-render-method-returns-no-stream-identifiers-for-image-format#

答案 3 :(得分:0)

我看到了这个示例,但不知道它是否符合您的需求:http://www.gotreportviewer.com/EMFPrint.zip