• 动态RDLC报表(六)


    动态RDLC报表类DynamicReport:显示报表和打印

           在前面已经人寿了一个空的报表文档,各种节点的数据也已经生成,现在只需把各种节点的数据放进报表文档里,然后加载到ReportViewer中就可以了。

           显示报表之前要先传入一个ReportViewer。

    1. private ReportViewer _report;
    2. public void SetReport(ReportViewer reportViewer, DisplayMode displayMode = DisplayMode.PrintLayout, ZoomMode zoomMode = ZoomMode.PageWidth)
    3. {
    4. reportViewer.Dock = System.Windows.Forms.DockStyle.Fill;
    5. reportViewer.SetDisplayMode(displayMode);
    6. reportViewer.ZoomMode = zoomMode;
    7. this._report = reportViewer;
    8. }

    生成RDLC报表并显示

    1. public void ShowReport()
    2. {
    3. //将每一个patter转换
    4. if (_reportItemPatterns.Count > 0)
    5. {
    6. var dataSetsString = new StringBuilder();
    7. var tablixString = new StringBuilder();
    8. foreach (var reportItemPattern in _reportHeadPatterns)
    9. {
    10. dataSetsString.Append(reportItemPattern.DataSetString);
    11. tablixString.Append(reportItemPattern.TablixString);
    12. }
    13. foreach (var reportItemPattern in _reportItemPatterns)
    14. {
    15. dataSetsString.Append(reportItemPattern.DataSetString);
    16. tablixString.Append(reportItemPattern.TablixString);
    17. }
    18. foreach (var reportRemarksPattern in reportRemarks)
    19. {
    20. tablixString.Append(reportRemarksPattern);
    21. }
    22. //是否显示签名签章
    23. if (isSignature)
    24. {
    25. if (isSignatureImg) tablixString.Append(signaturePattern.Replace("@TopPosition", tabelTopPosition.ToString()).Replace("@LeftPosition", (pageWidth - leftMargin - 9F).ToString()));
    26. }
    27. //把文档中的文字替换掉
    28. if (tablixString.ToString() == "") _docTemplate = _docTemplate.Replace("@Tablix", "");
    29. _docTemplate = _docTemplate.Replace("@DataSets", dataSetsString.ToString())
    30. .Replace("@Tablix", tablixString.ToString())
    31. .Replace("@HeaderHeight", headerHeight.ToString())
    32. .Replace("@FooterHeight", footerHeight.ToString())
    33. .Replace("29.7cm", "" + pageHeight.ToString() + "cm")
    34. .Replace("21.0cm", "" + pageWidth.ToString() + "cm");
    35. if (reportLogoString.ToString() == "")
    36. {
    37. if (reportLabelPatterns.Count > 0)
    38. {
    39. foreach (var reportLabelPattern in reportLabelPatterns)
    40. {
    41. reportLogoString.Append(reportLabelPattern);
    42. }
    43. foreach (var reportTitlePattern in _reportTitlePatterns)
    44. {
    45. reportLogoString.Append(reportTitlePattern);
    46. }
    47. _docTemplate = _docTemplate.Replace("@PageHeader", reportLogoString.ToString());
    48. }
    49. else
    50. {
    51. if (_reportTitlePatterns.Count > 0)
    52. {
    53. foreach (var reportTitlePattern in _reportTitlePatterns)
    54. {
    55. reportLogoString.Append(reportTitlePattern);
    56. }
    57. _docTemplate = _docTemplate.Replace("@PageHeader", reportLogoString.ToString());
    58. }
    59. else
    60. {
    61. _docTemplate = _docTemplate.Replace("@PageHeader", "");
    62. }
    63. }
    64. _docTemplate = _docTemplate.Replace("@LogoImageData", "");
    65. }
    66. else
    67. {
    68. foreach (var reportLabelPattern in reportLabelPatterns)
    69. {
    70. reportLogoString.Append(reportLabelPattern);
    71. }
    72. foreach (var reportTitlePattern in _reportTitlePatterns)
    73. {
    74. reportLogoString.Append(reportTitlePattern);
    75. }
    76. _docTemplate = _docTemplate.Replace("@PageHeader", reportLogoString.ToString());
    77. }
    78. foreach (var reportPageFooterPattern in _reportPageFooter)
    79. {
    80. reportPageFooter.Append(reportPageFooterPattern);
    81. }
    82. if (reportPageFooter.ToString() == "")
    83. {
    84. _docTemplate = _docTemplate.Replace("@PageFooter", "");
    85. }
    86. else
    87. {
    88. _docTemplate = _docTemplate.Replace("@PageFooter", reportPageFooter.ToString());
    89. }
    90. var doc = new XmlDocument();
    91. doc.LoadXml(_docTemplate);
    92. //doc.Save(System.AppDomain.CurrentDomain.BaseDirectory + "\\docTemplate.xml");
    93. Stream stream = GetRdlcStream(doc);
    94. //加载报表定义
    95. _report.LocalReport.LoadReportDefinition(stream);
    96. _report.LocalReport.DataSources.Clear();
    97. foreach (var reportItemPattern in _reportItemPatterns)
    98. {
    99. _report.LocalReport.DataSources
    100. .Add(new ReportDataSource(reportItemPattern.DataSetName + "Data",
    101. reportItemPattern.Data));
    102. }
    103. foreach (var reportItemPattern in _reportHeadPatterns)
    104. {
    105. _report.LocalReport.DataSources
    106. .Add(new ReportDataSource(reportItemPattern.DataSetName + "Data",
    107. reportItemPattern.Data));
    108. }
    109. _report.LocalReport.Refresh();
    110. if (onlyPrint) PrintStream(_report.LocalReport);
    111. }
    112. }
    113. protected Stream GetRdlcStream(XmlDocument xmlDoc)
    114. {
    115. Stream ms = new MemoryStream();
    116. XmlSerializer serializer = new XmlSerializer(typeof(XmlDocument));
    117. serializer.Serialize(ms, xmlDoc);
    118. ms.Position = 0;
    119. return ms;
    120. }

    可以选择是否直接打印出来 

    1. private Boolean onlyPrint = false;
    2. /// 用来记录当前打印到第几页了
    3. ///
    4. private int m_currentPageIndex;
    5. ///
    6. /// 声明一个Stream对象的列表用来保存报表的输出数据,LocalReport对象的Render方法会将报表按页输出为多个Stream对象。
    7. ///
    8. private IList m_streams;
    9. private bool isLandSapces = false;
    10. ///
    11. /// 用来提供Stream对象的函数,用于LocalReport对象的Render方法的第三个参数。
    12. ///
    13. ///
    14. ///
    15. ///
    16. ///
    17. ///
    18. ///
    19. private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
    20. {
    21. //如果需要将报表输出的数据保存为文件,请使用FileStream对象。
    22. Stream stream = new MemoryStream();
    23. m_streams.Add(stream);
    24. return stream;
    25. }
    26. ///
    27. /// 为Report.rdlc创建本地报告加载数据,输出报告到.emf文件,并打印,同时释放资源
    28. ///
    29. /// 参数:ReportViewer.LocalReport
    30. public void PrintStream(LocalReport rvDoc)
    31. {
    32. //获取LocalReport中的报表页面方向
    33. isLandSapces = rvDoc.GetDefaultPageSettings().IsLandscape;
    34. Export(rvDoc);
    35. PrintSetting();
    36. Dispose();
    37. }
    38. private void Export(LocalReport report)
    39. {
    40. string deviceInfo =
    41. @"
    42. EMF
    43. ";
    44. Warning[] warnings;
    45. m_streams = new List();
    46. //将报表的内容按照deviceInfo指定的格式输出到CreateStream函数提供的Stream中。
    47. report.Render("Image", deviceInfo, CreateStream, out warnings);
    48. foreach (Stream stream in m_streams)
    49. stream.Position = 0;
    50. }
    51. private void PrintSetting()
    52. {
    53. if (m_streams == null || m_streams.Count == 0)
    54. throw new Exception("错误:没有检测到打印数据流");
    55. //声明PrintDocument对象用于数据的打印
    56. PrintDocument printDoc = new PrintDocument();
    57. //获取配置文件的清单打印机名称,不设置则用默认打印机
    58. //printDoc.PrinterSettings.PrinterName = "Adobe PDF";
    59. //foreach (string sPrint in PrinterSettings.InstalledPrinters)//获取所有打印机名称
    60. //{
    61. //}
    62. printDoc.PrintController = new System.Drawing.Printing.StandardPrintController();//指定打印机不显示页码
    63. //判断指定的打印机是否可用
    64. if (!printDoc.PrinterSettings.IsValid)
    65. {
    66. throw new Exception("错误:找不到打印机");
    67. }
    68. else
    69. {
    70. //设置打印机方向遵从报表方向
    71. printDoc.DefaultPageSettings.Landscape = isLandSapces;
    72. //声明PrintDocument对象的PrintPage事件,具体的打印操作需要在这个事件中处理。
    73. printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
    74. m_currentPageIndex = 0;
    75. //设置打印机打印份数
    76. printDoc.PrinterSettings.Copies = 1;
    77. //执行打印操作,Print方法将触发PrintPage事件。
    78. printDoc.Print();
    79. }
    80. }
    81. ///
    82. /// 处理程序PrintPageEvents
    83. ///
    84. ///
    85. ///
    86. private void PrintPage(object sender, PrintPageEventArgs ev)
    87. {
    88. //Metafile对象用来保存EMF或WMF格式的图形,
    89. //我们在前面将报表的内容输出为EMF图形格式的数据流。
    90. Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
    91. //调整打印机区域的边距
    92. System.Drawing.Rectangle adjustedRect = new System.Drawing.Rectangle(
    93. ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
    94. ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY,
    95. ev.PageBounds.Width,
    96. ev.PageBounds.Height);
    97. //绘制一个白色背景的报告
    98. //ev.Graphics.FillRectangle(Brushes.White, adjustedRect);
    99. //获取报告内容
    100. //这里的Graphics对象实际指向了打印机
    101. ev.Graphics.DrawImage(pageImage, adjustedRect);
    102. //ev.Graphics.DrawImage(pageImage, ev.PageBounds);
    103. // 准备下一个页,已确定操作尚未结束
    104. m_currentPageIndex++;
    105. //设置是否需要继续打印
    106. ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
    107. }

    动态RDLC报表(一)

    动态RDLC报表(二)

    动态RDLC报表(三)

    动态RDLC报表(四)

    动态RDLC报表(五)

    动态RDLC报表(六)

    动态RDLC报表(七)

    动态RDLC报表完整实例下载

  • 相关阅读:
    基于STM32室内空气净化监测系统设计
    4. SQL语法中的一些基本概念
    在Mac上安装MongoDB 5.0
    【Luogu】 P4649 [IOI2007] training 训练路径
    mac图像查看器EdgeView for Mac
    Elasticsearch插件:elasticsearch-sql安装和使用
    SRAM与DRAM的区别
    建筑行业+办公领域低代码解决方案:创新、效率与商机的共赢
    二维码智慧门牌管理系统升级解决方案:高效运营,信息尽在掌握
    关于 arduino 中的 random()和randomSeed()的使用
  • 原文地址:https://blog.csdn.net/xgh815/article/details/126246974