다음을 통해 공유


연습: 미리 보기 없이 로컬 보고서 인쇄

이 연습에서는 LocalReport 개체와 CreateStreamCallback 콜백 함수를 사용하여 보고서를 미리 보지 않고 프로그래밍 방식으로 인쇄하는 방법을 보여 줍니다.

필수 구성 요소

예제 보고서와 데이터 원본에 대한 액세스 권한이 있어야 합니다. 자세한 내용은 인쇄 연습을 위한 예제 데이터 및 보고서를 참조하십시오.

다음 단계에 따라 Microsoft Visual Studio 콘솔 응용 프로그램 프로젝트를 만듭니다.

새 콘솔 응용 프로그램 프로젝트 만들기

  1. 파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 선택합니다.

  2. 프로젝트 형식 창에서 Visual C# 또는 Visual Basic을 선택한 다음 Windows를 선택합니다.

  3. 템플릿 창에서 콘솔 응용 프로그램을 선택하여 Microsoft 콘솔 응용 프로그램을 만듭니다.

  4. 이름 입력란에 프로젝트 이름으로 PrintLocalReport를 입력합니다.

  5. 위치 입력란에 프로젝트를 저장할 디렉터리를 입력하거나 찾아보기를 클릭하여 해당 디렉터리를 찾습니다. 프로젝트가 열리고 코드 창에 Program 코드 파일이 표시됩니다.

참조 추가

  1. 프로젝트 메뉴에서 참조 추가를 선택합니다. 참조 추가 대화 상자가 나타납니다.

  2. .NET 탭에 표시된 목록 상자에서 System.Drawing, System.Windows.FormsMicrosoft.Reporting.Winforms를 선택합니다.

기존 파일 report.rdlc 및 data.xml 추가

  1. 프로젝트 메뉴에서 기존 항목 추가를 선택합니다. 기존 항목 추가 대화 상자가 나타납니다.

  2. report.rdlc 및 data.xml이 저장된 폴더로 이동합니다. 두 파일을 모두 선택합니다.

  3. 추가를 클릭합니다. 솔루션 탐색기에 프로젝트의 일부로 두 파일이 나타납니다.

코드 추가

  1. 편집을 위해 Program 코드 파일이 열려 있어야 합니다. 열려 있지 않으면 솔루션 탐색기 창에서 Program.cs 또는 Module1.vb 파일을 두 번 클릭합니다.

  2. 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
    

응용 프로그램 빌드 및 실행

  1. 빌드 메뉴에서 솔루션 빌드를 클릭하여 응용 프로그램을 빌드합니다. 빌드 프로세스의 일부로 보고서가 컴파일되며 보고서에 사용된 식의 구문 오류와 같은 발견된 모든 오류가 태스크 목록에 추가됩니다.

  2. F5 키를 눌러 응용 프로그램을 실행합니다.

참고 항목

참조

LocalReport
Microsoft.Reporting.WinForms.CreateStreamCallback
Microsoft.Reporting.WebForms.CreateStreamCallback

관련 자료

샘플 및 연습