C#でReportファイルを直接印刷(rdlc)

11801 ワード

Visual Studioが持参するレポートファイル(rdlc、後述するレポート、いずれもrdlcレポートファイルを指す)は、機能が相対的に強くないが、一般的なレポート要件に対応するには余裕がある.rdlcレポートの使用と設計方法については、ここでは説明しません.本稿では、レポートプレビューコントロール(ReportViewer)を使用せずに、レポートの内容をプリンタに直接印刷する方法について説明します.
一般的に、レポートを設計した後、プログラムが実行されると、それをReprotViewerコントロールにロードしてプレビューして印刷しますが、レポートの内容をプレビューしたくない場合があり、プリンタに直接印刷する場合はどうすればいいのでしょうか.ダイレクトプリントの機能を実現するには、使用する必要があります.Netが提供する2つのオブジェクト、LocalReportとPrintDocument.LocalReportオブジェクトは、レポートファイルをロードして実際のレポートを生成し、レポートを既知のフォーマットで出力します.PrintDocumentオブジェクトは、LocalReportの出力内容をプリンタに送信して印刷します.具体的な実装手順は次のとおりです.
Step 1:LocalReportオブジェクトを宣言し、レポートファイルをロードします(PrintMe.rdlcという名前のレポートファイルを設計したとします).
   1: LocalReport report = new LocalReport();
   2: // 。
   3: report.ReportPath = @"c:\PrintMe.rdlc";
   4: // 
   5: ReportDataSource source = new ReportDataSource(SourceTalbe.TableName, SourceTalbe);
   6: report.DataSources.Add(source);
   7: // 
   8: report.Refresh();
Step 2:レポートの内容を指定形式のデータストリームとして出力する.
   1: string deviceInfo =
   2:   "<DeviceInfo>" +
   3:   "  <OutputFormat>EMF</OutputFormat>" +
   4:   "  <PageWidth>8.5in</PageWidth>" +
   5:   "  <PageHeight>11in</PageHeight>" +
   6:   "  <MarginTop>0.25in</MarginTop>" +
   7:   "  <MarginLeft>0.25in</MarginLeft>" +
   8:   "  <MarginRight>0.25in</MarginRight>" +
   9:   "  <MarginBottom>0.25in</MarginBottom>" +
  10:   "</DeviceInfo>";
  11: Warning[] warnings;
  12: // deviceInfo CreateStream Stream 。
  13: report.Render("Image", deviceInfo, CreateStream, out warnings);
ここではLocalReportオブジェクトのRendererメソッドを使用して、レポートの内容を指定したデータストリーム(Stream)に出力します.Renderメソッドの最初のパラメータは、出力されるストリームのフォーマットを指定し、ここではImageフォーマット(グラフィックフォーマット)を指定します.2番目のパラメータは、出力フォーマットの詳細を記述するためのXMLフォーマットの文字列です.3番目のパラメータはコールバック関数(CreateStreamCallback委任タイプ)です.このパラメータに関数を宣言する必要があります.Renderメソッドは、レポートの内容をこの関数が返すStreamオブジェクトのインスタンスに出力します.この関数は、次の宣言に似ています.
   1: // Stream 
   2: //LocalReport Render Stream 。
   3: private List<Stream> m_streams;
   4: // Stream , LocalReport Render 。
   5: private Stream CreateStream(string name, string fileNameExtension,
   6:   Encoding encoding, string mimeType, bool willSeek)
   7: {
   8:     // , FileStream 。
   9:     Stream stream = new MemoryStream();
  10:     m_streams.Add(stream);
  11:     return stream;
  12: }
この関数のパラメータを使用して、CreateStreamCallback依頼を参照してください.
4番目のパラメータは、レポート処理中に生成された警告情報を出力するために使用されます.
Step 3:PrintDocumentオブジェクトを使用して印刷を行います.
   1: // 
   2: private int m_currentPageIndex;
   3:  
   4: private void Print()
   5: {
   6:     m_currentPageIndex = 0;
   7:  
   8:     if (m_streams == null || m_streams.Count == 0)
   9:         return;
  10:     // PrintDocument 
  11:     PrintDocument printDoc = new PrintDocument();
  12:     // , "" 
  13:     printDoc.PrinterSettings.PrinterName = "";
  14:     // 
  15:     if (!printDoc.PrinterSettings.IsValid)
  16:     {
  17:         MessageBox.Show("Can't find printer");
  18:         return;
  19:     }
  20:     // PrintDocument PrintPage , 。
  21:     printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
  22:     // ,Print PrintPage 。
  23:     printDoc.Print();
  24: }
具体的なPrintPageイベントハンドラは以下の通りです.
   1: private void PrintPage(object sender, PrintPageEventArgs ev)
   2: {
   3:     //Metafile EMF WMF ,
   4:     // EMF 。

m_streams[m_currentPageIndex].Position = 0;

5: Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);

   6:     // 
   7:     ev.PageSettings.Landscape = false;
   8:     // Graphics 
   9:     ev.Graphics.DrawImage(pageImage, 0, 0);
  10:     m_streams[m_currentPageIndex].Close();
  11:     m_currentPageIndex++;
  12:     // 
  13:     ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
  14: }
これで、私たちのレポートデータはすでに印刷されました.この過程で、必要に応じて自分の印刷ロジックを追加することができます.