Печать ServerReport без предварительного просмотра - PullRequest
10 голосов
/ 25 марта 2009

У меня SQLServer 2005 Reporting Services ServerReport, развернутый и часто используемый моим приложением Winforms (Framework 2.0) через элемент управления ReportViewer.

Мне нужно предоставить кнопку печати одним щелчком мыши в одной из форм приложения, которая запускает только диалоговое окно печати, без вызова ReportViewer.

Я экспериментировал с рендерингом отчета в байтовый массив, но я не могу его передать.

Этот отчет имеет несколько страниц, поэтому я не знаю, будет ли работать рендеринг "Изображение", который работает для локальных отчетов, и для отчетов сервера.

Я искал бросить MSDN, но есть только ссылки на локальные отчеты:

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

И небольшая информация, которую я могу получить в отчетах на стороне сервера, использует веб-ссылки на веб-службу ReportServer, и я не хочу этого.

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

Есть ли способ напечатать отчет сервера, используя диалоговое окно печати, не показывая пользователю средство просмотра отчетов (я не против, если оно за кадром)?

Ответы [ 4 ]

11 голосов
/ 26 марта 2009

ок, наконец разобрался.

проверьте эту ссылку: Печать отчетов Служб Reporting Services 2005

В этом посте есть почти все, что мне было нужно, но я собираюсь опубликовать полный ответ здесь для справок.

Я закончил тем, что использовал объект просмотра отчета за кулисами, но только для удобства, так как это не требуется.

Первый шаг - запросить настройки принтера у пользователя:

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 голос
/ 09 июля 2010

Люди, пытающиеся использовать этот код с SQL Server 2008 R2, обнаружат, что он печатает только первую страницу многостраничных отчетов. Существует новое «поведение», при котором массив, возвращаемый в streamids, пуст. Пожалуйста, дайте Microsoft знать, что вы заботитесь здесь:

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#

1 голос
/ 08 декабря 2009

2 предостережения от ответа, данного Давидом выше: -

1) Порядок, в котором метки потоков возвращаются в SQL2005, обычно находится со второй страницы до последней, но при сильно загруженной обработке (например, в производственной среде) их вполне можно вернуть в произвольном порядке.

Идентификаторы потока имеют вид _nn, где nn - число. Это немного усложняет сортировку, поскольку имя отчета будет буквенным, а цифры - просто краткой формой, поэтому страница «myreport_2» будет отсортирована после страницы «myreport_10». Ведущий ко второму предостережению

2) В SQL 2005 суффиксы отчетов начинаются с 2, в SQL 2008 они начинаются с 1 (для страницы 2)

0 голосов
/ 26 марта 2009

Я вижу этот образец, но не знаю, подходит ли он вашим потребностям: http://www.gotreportviewer.com/EMFPrint.zip

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...