연습: 미리 보기 없이 로컬 보고서 인쇄
이 연습에서는 LocalReport 개체와 CreateStreamCallback 콜백 함수를 사용하여 보고서를 미리 보지 않고 프로그래밍 방식으로 인쇄하는 방법을 보여 줍니다.
필수 구성 요소
예제 보고서와 데이터 원본에 대한 액세스 권한이 있어야 합니다. 자세한 내용은 인쇄 연습을 위한 예제 데이터 및 보고서를 참조하십시오.
다음 단계에 따라 Microsoft Visual Studio 콘솔 응용 프로그램 프로젝트를 만듭니다.
새 콘솔 응용 프로그램 프로젝트 만들기
파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 선택합니다.
프로젝트 형식 창에서 Visual C# 또는 Visual Basic을 선택한 다음 Windows를 선택합니다.
템플릿 창에서 콘솔 응용 프로그램을 선택하여 Microsoft 콘솔 응용 프로그램을 만듭니다.
이름 입력란에 프로젝트 이름으로 PrintLocalReport를 입력합니다.
위치 입력란에 프로젝트를 저장할 디렉터리를 입력하거나 찾아보기를 클릭하여 해당 디렉터리를 찾습니다. 프로젝트가 열리고 코드 창에 Program 코드 파일이 표시됩니다.
참조 추가
프로젝트 메뉴에서 참조 추가를 선택합니다. 참조 추가 대화 상자가 나타납니다.
.NET 탭에 표시된 목록 상자에서 System.Drawing, System.Windows.Forms 및 Microsoft.Reporting.Winforms를 선택합니다.
기존 파일 report.rdlc 및 data.xml 추가
프로젝트 메뉴에서 기존 항목 추가를 선택합니다. 기존 항목 추가 대화 상자가 나타납니다.
report.rdlc 및 data.xml이 저장된 폴더로 이동합니다. 두 파일을 모두 선택합니다.
추가를 클릭합니다. 솔루션 탐색기에 프로젝트의 일부로 두 파일이 나타납니다.
코드 추가
편집을 위해 Program 코드 파일이 열려 있어야 합니다. 열려 있지 않으면 솔루션 탐색기 창에서 Program.cs 또는 Module1.vb 파일을 두 번 클릭합니다.
Program 파일에 있는 기존 코드를 선택한 프로그래밍 언어에 따라 다음 코드로 바꿉니다.
Visual C#인 경우 다음 코드를 사용합니다.
using System; using System.IO; using System.Data; using System.Text; using System.Drawing.Imaging; using System.Drawing.Printing; using System.Collections.Generic; using System.Windows.Forms; using Microsoft.Reporting.WinForms; public class Demo : IDisposable { private int m_currentPageIndex; private IList<Stream> m_streams; private DataTable LoadSalesData() { // Create a new DataSet and read sales data file // data.xml into the first DataTable. DataSet dataSet = new DataSet(); dataSet.ReadXml(@"..\..\data.xml"); return dataSet.Tables[0]; } // Routine to provide to the report renderer, in order to // save an image for each page of the report. private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) { Stream stream = new FileStream(@"..\..\" + name + "." + fileNameExtension, FileMode.Create); m_streams.Add(stream); return stream; } // Export the given report as an EMF (Enhanced Metafile) file. private void Export(LocalReport report) { string deviceInfo = "<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>"; Warning[] warnings; m_streams = new List<Stream>(); report.Render("Image", deviceInfo, CreateStream, out warnings); foreach (Stream stream in m_streams) stream.Position = 0; } // Handler for PrintPageEvents private void PrintPage(object sender, PrintPageEventArgs ev) { Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]); ev.Graphics.DrawImage(pageImage, ev.PageBounds); m_currentPageIndex++; ev.HasMorePages = (m_currentPageIndex < m_streams.Count); } private void Print() { const string printerName = "Microsoft Office Document Image Writer"; if (m_streams == null || m_streams.Count == 0) return; PrintDocument printDoc = new PrintDocument(); printDoc.PrinterSettings.PrinterName = printerName; if (!printDoc.PrinterSettings.IsValid) { string msg = String.Format( "Can't find printer \"{0}\".", printerName); MessageBox.Show(msg, "Print Error"); return; } printDoc.PrintPage += new PrintPageEventHandler(PrintPage); printDoc.Print(); } // Create a local report for Report.rdlc, load the data, // export the report to an .emf file, and print it. private void Run() { LocalReport report = new LocalReport(); report.ReportPath = @"..\..\Report.rdlc"; report.DataSources.Add( new ReportDataSource("Sales", LoadSalesData())); Export(report); m_currentPageIndex = 0; Print(); } public void Dispose() { if (m_streams != null) { foreach (Stream stream in m_streams) stream.Close(); m_streams = null; } } public static void Main(string[] args) { using (Demo demo = new Demo()) { demo.Run(); } } }
Visual Basic인 경우 다음 코드를 사용합니다.
Imports System.IO Imports System.Data Imports System.Text Imports System.Drawing.Imaging Imports System.Drawing.Printing Imports System.Collections.Generic Imports Microsoft.Reporting.WinForms Public Class Demo Implements IDisposable Private m_currentPageIndex As Integer Private m_streams As IList(Of Stream) Private Function LoadSalesData() As DataTable Dim dataSet As New DataSet() dataSet.ReadXml("..\..\data.xml") Return dataSet.Tables(0) End Function Private Function CreateStream(ByVal name As String, _ ByVal fileNameExtension As String, _ ByVal encoding As Encoding, ByVal mimeType As String, _ ByVal willSeek As Boolean) As Stream Dim stream As Stream = _ New FileStream("..\..\" + _ name + "." + fileNameExtension, FileMode.Create) m_streams.Add(stream) Return stream End Function Private Sub Export(ByVal report As LocalReport) 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 = Nothing m_streams = New List(Of Stream)() report.Render("Image", deviceInfo, AddressOf CreateStream, _ warnings) Dim stream As Stream For Each stream In m_streams stream.Position = 0 Next End Sub Private Sub PrintPage(ByVal sender As Object, _ ByVal ev As PrintPageEventArgs) Dim pageImage As New Metafile(m_streams(m_currentPageIndex)) ev.Graphics.DrawImage(pageImage, ev.PageBounds) m_currentPageIndex += 1 ev.HasMorePages = (m_currentPageIndex < m_streams.Count) End Sub Private Sub Print() Const printerName As String = _ "Microsoft Office Document Image Writer" If m_streams Is Nothing Or m_streams.Count = 0 Then Return End If Dim printDoc As New PrintDocument() printDoc.PrinterSettings.PrinterName = printerName If Not printDoc.PrinterSettings.IsValid Then Dim msg As String = String.Format( _ "Can't find printer ""{0}"".", printerName) Console.WriteLine(msg) Return End If AddHandler printDoc.PrintPage, AddressOf PrintPage printDoc.Print() End Sub Private Sub Run() Dim report As LocalReport = New LocalReport() report.ReportPath = "..\..\Report.rdlc" report.DataSources.Add(New ReportDataSource("Sales", _ LoadSalesData())) Export(report) m_currentPageIndex = 0 Print() End Sub Public Overloads Sub Dispose() Implements IDisposable.Dispose If Not (m_streams Is Nothing) Then Dim stream As Stream For Each stream In m_streams stream.Close() Next m_streams = Nothing End If End Sub Public Shared Sub Main(ByVal args As String()) Using demo As Demo = New Demo() demo.Run() End Using End Sub End Class
응용 프로그램 빌드 및 실행
빌드 메뉴에서 솔루션 빌드를 클릭하여 응용 프로그램을 빌드합니다. 빌드 프로세스의 일부로 보고서가 컴파일되며 보고서에 사용된 식의 구문 오류와 같은 발견된 모든 오류가 태스크 목록에 추가됩니다.
F5 키를 눌러 응용 프로그램을 실행합니다.
참고 항목
참조
LocalReport
Microsoft.Reporting.WinForms.CreateStreamCallback
Microsoft.Reporting.WebForms.CreateStreamCallback