Всем, кому когда-либо приходилось заниматься генерацией и печатью отчетов, наверняка известно, насколько нетривиальна эта, казалось бы, несложная на первый взгляд задача. Как правило заказчик желает видеть хорошо отформатированную страницу отчета. Да, VB.NET позоляет печатать текст, но, к сожалению, plain text — это практически полное отсутствие какого-либо форматирования, не говоря уже о графических примитивах или изображениях. Хотя о графике я погорячился — платформа .NET имеет встроенные свойства для печати, но при этом разработчик обречен самостоятельно отслеживать расположение элементов на странице, учитывать параметры страницы, установливать переход на новую страницу (прошу прощения за тавтологию) и т.д. Но об этом позже.
Сейчас же я остановлюсь на главном: в интернете можно найти много библиотек и контролов (большей частью платных или условно-платных), позволяющих генерировать и печатать отчеты в различные форматы — PDF, Excel, HTML, RTF и т. д. Целесообразность использования таких библиотек должна определяться исходя из поставленной задачи. Зачастую данные контролы обладают гораздо большей функциональностью, чем та, что требуется для вашего приложения, а потому возникает вопрос — стоит ли переплачивать за то, что вам не нужно? Если вам надо просто сгенерировать и сохранить отчет, тогда вам ни к чему просмотрщик докуметов с множеством функций (viewer). Если вам надо напечатать данные в виде таблицы, то проще сгенерировать html-документ, чем делать привязку к MS Excel (и потом мучаться с ошибками, возникающими из-за различных версий этого продукта). Т.е. если формат строго не установлен, то надо стремиться решить задачу, следуя по пути наименьшего сопротивления.
Генерация и печать HTML-документов.
Пожалуй, на сегодняшний день нет такого программиста, который бы не знал про html. Язык гипертекстовый разметки преподают уже в школе на уроках информатики, потому позволю себе считать, что читатель с ним знаком. Итак, следующий код на VB генерирует простой отчет, получая данные из контрола DataGridView (тут может быть использован любой «табличный» контрол — и просто DataGrid, и DataTable, разница лишь в синтаксисе):
Public Function GenerateHTML(ByVal dgv As DataGridView) As String
Dim xml As New StringBuilder()
xml.Append("<HTML>")
xml.Append("<HEAD></HEAD>")
xml.Append("<BODY>")
xml.Append("<table width='100%' border='0'>")
xml.Append("<tr>")
xml.Append("<td>").Append("Direct").Append("</td>")
xml.Append("<td>").Append("Reverse").Append("</td>")
xml.Append("<td>").Append("Volume").Append("</td>")
xml.Append("<td>").Append("Instrument Type").Append("</td>")
xml.Append("<td>").Append("Book").Append("</td>")
xml.Append("<td>").Append("Page").Append("</td>")
xml.Append("<td>").Append("Filing Date").Append("</td>")
xml.Append("<td>").Append("Instrument Date").Append("</td>")
xml.Append("</tr>")
For Each dr As DataGridViewRow In dgv.Rows
xml.Append("<tr>")
For Each cell As DataGridViewCell In dr.Cells
xml.Append("<td>").Append(cell.Value).Append("</td>")
Next
xml.Append("</tr>")
Next
xml.Append("</table>")
xml.Append("</BODY>")
xml.Append("</HTML>")
return xml.toString
End Function
Как видно, в данном коде мы просто генерируем строку, разделяя данные нужными html-тэгами. Теперь остается лишь получить эту строку и записать ее в файл:
Public Sub SaveHTML(ByVal strHTML As String)
Dim htmlFile As New FileInfo("C:\report.html")
Dim sw As StreamWriter = htmlFile.CreateText()
sw.WriteLine(strHTML)
sw.Close()
End Sub
Для полноты картины отправляем получившийся файл на печать:
Public Sub PrintHTML()
Try
Dim MyProcess As New Process
MyProcess.StartInfo.CreateNoWindow = False
MyProcess.StartInfo.Verb = "print"
MyProcess.StartInfo.FileName = "C:\report.html"
MyProcess.Start()
MyProcess.WaitForExit()
Catch ex As Exception
MessageBox.Show("Printing error")
End Try
End Sub
Стоит отметить, что в данном случае для печати мы обращаемся к локальному системному процессу, вызывая у него действие «print». Приложение, которое будет запущено для печати, зависит от типа файла (например, для pdf запустится процесс acrord32.exe, если установлен Acrobat Reader), и определяется системой самостоятельно. Печать документа запустится на том компьютере, на котором исполняется этот код (документ будет послан на принтер по умолчанию), соответственно если у вас web-приложение, то целесообразней отправить документ в выходной поток (response) для сохранения на пользовательской машине.
Итак, на данном примере видно, что генерация отчета в виде html-документа — это очень простое и вместе с тем эффективное решение задачи. В следущих статьях я рассмотрю печать документов более сложных форматов.
Костя, человечество в лице MS давно изобрело ReportViewer. Попробуйте, это не больно :)
ReportViewer — это конечно хорошо, но насколько я понял у него ограничение: он доступен для фрэймворка версии .NET 2.0 ?
Стои заметить что необходимо импортировать билеотеку [b]Imports System.Text[/b]
[b]Imports System.Text
Public Class Form1
Public Function GenerateHTML(ByVal dgv As DataGridView) As String
Dim xml As New StringBuilder()
xml.Append("<HTML>")[/b]