C#でReportファイルを直接印刷(rdlc)
11801 ワード
Visual Studioが持参するレポートファイル(rdlc、後述するレポート、いずれもrdlcレポートファイルを指す)は、機能が相対的に強くないが、一般的なレポート要件に対応するには余裕がある.rdlcレポートの使用と設計方法については、ここでは説明しません.本稿では、レポートプレビューコントロール(ReportViewer)を使用せずに、レポートの内容をプリンタに直接印刷する方法について説明します.
一般的に、レポートを設計した後、プログラムが実行されると、それをReprotViewerコントロールにロードしてプレビューして印刷しますが、レポートの内容をプレビューしたくない場合があり、プリンタに直接印刷する場合はどうすればいいのでしょうか.ダイレクトプリントの機能を実現するには、使用する必要があります.Netが提供する2つのオブジェクト、LocalReportとPrintDocument.LocalReportオブジェクトは、レポートファイルをロードして実際のレポートを生成し、レポートを既知のフォーマットで出力します.PrintDocumentオブジェクトは、LocalReportの出力内容をプリンタに送信して印刷します.具体的な実装手順は次のとおりです.
Step 1:LocalReportオブジェクトを宣言し、レポートファイルをロードします(PrintMe.rdlcという名前のレポートファイルを設計したとします).
4番目のパラメータは、レポート処理中に生成された警告情報を出力するために使用されます.
Step 3:PrintDocumentオブジェクトを使用して印刷を行います.
一般的に、レポートを設計した後、プログラムが実行されると、それを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: }
これで、私たちのレポートデータはすでに印刷されました.この過程で、必要に応じて自分の印刷ロジックを追加することができます.