Dot-Net

列印不帶預覽的 ServerReport

  • February 12, 2020

我通過 ReportViewer 控制項部署了一個 SQLServer 2005 Reporting Services ServerReport,並經常被我的 Winforms 應用程序(Framework 2.0)使用。

我需要的是從應用程序的一種形式中提供一個一鍵式列印按鈕,該按鈕僅觸發列印對話框,而不啟動 ReportViewer。

我一直在嘗試將報告呈現為字節數組,但我無法通過它。

該報告有多個頁面,所以我不知道適用於本地報告的“圖像”渲染是否也適用於伺服器報告。

我一直在尋找 MSDN,但僅參考本地報告:

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

我可以在伺服器端報告中獲得的少量資訊是使用對 ReportServer Web 服務的 Web 引用,我不希望這樣。

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

有沒有辦法使用列印對話框列印伺服器報告,而不向使用者顯示報告查看器(我不介意它是否在幕後)?

好的,終於想通了。

該部落格文章幾乎包含我需要的所有內容,但我將在此處發布完整答案以供參考。

我最終在幕後使用了報表查看器對象,但這只是為了方便,因為它不是必需的。

第一步是詢問使用者列印機設置:

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

引用自:https://stackoverflow.com/questions/682188