码迷,mamicode.com
首页 > Windows程序 > 详细

C# RDLC报表不出现预览窗体直接输出到打印机

时间:2019-02-18 22:58:56      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:ini   oom   ble   except   nali   inf   coding   直接   pap   

        #region 直接打印区域
        /// <summary>
        /// 直接打印到打印机
        /// </summary>
        /// <param name="reportFullFileName"></param>
        /// <param name="reportTitle"></param>
        /// <param name="reportDSTable1"></param>
        /// <param name="reportDSTable2"></param>
        /// <param name="reportDSTable3"></param>
        /// <param name="reportDSTable4"></param>
        /// <param name="reportDSTable5"></param>
        /// <param name="hasSubReport"></param>
        /// <param name="subReportDSTable1"></param>
        /// <param name="subReportDSTable2"></param>
        /// <param name="tPageSettings"></param>
        /// <param name="tPrinterSettings"></param>
        /// <param name="logoFileName1"></param>
        /// <param name="logoFileName2"></param>
        /// <param name="logoFileName3"></param>
        public void PrintReportDrc(string reportFullFileName, string reportTitle, DataTable reportDSTable1,
    DataTable reportDSTable2 = null, DataTable reportDSTable3 = null, DataTable reportDSTable4 = null,
    DataTable reportDSTable5 = null, bool hasSubReport = false, DataTable subReportDSTable1 = null,
    DataTable subReportDSTable2 = null, System.Drawing.Printing.PageSettings tPageSettings = null, System.Drawing.Printing.PrinterSettings tPrinterSettings = null, string logoFileName1 = null, string logoFileName2 = null, string logoFileName3 = null)
        {
            if (!File.Exists(reportFullFileName))
            {
                MyMsg.Error("T.1201/指定的报表文件不存在,请检查!");
                this.Close();
                return;
            }
            this.Text += "(" + reportTitle + ")";

            this.RptvMain.Reset();
            this.RptvMain.ProcessingMode = ProcessingMode.Local;
            this.RptvMain.LocalReport.ReportPath = reportFullFileName;//必须在前面,否则出现The source of the report definition has not been specified错误
            this.RptvMain.LocalReport.EnableExternalImages = true;   // RDLC报表显示本地图片必须设置(默认是关闭)

            #region 处理参数
            ReportParameterInfoCollection reportParameterInfos = RptvMain.LocalReport.GetParameters();
            List<string> parasNames = new List<string>();
            foreach (ReportParameterInfo rpi in reportParameterInfos)
            {
                parasNames.Add(rpi.Name);
            }

            List<ReportParameter> reportParameters = new List<ReportParameter>();
            if (parasNames.Contains("LogoFile1"))
            {
                if (string.IsNullOrEmpty(logoFileName1))
                {
                    logoFileName1 = "RptLogoDft1.jpg";
                }
                logoFileName1 = AppInfo.GetPath(AppInfo.AppPath.Report) + @"\Images\" + logoFileName1;
                logoFileName1 = @"file:///" + logoFileName1.Replace(@"\", @"/");
                ReportParameter reportParameter = new ReportParameter("LogoFile1", logoFileName1);
                reportParameters.Add(reportParameter);
            }
            if (parasNames.Contains("LogoFile2"))
            {
                if (string.IsNullOrEmpty(logoFileName2))
                {
                    logoFileName2 = "RptLogoDft2.jpg";
                }
                logoFileName2 = AppInfo.GetPath(AppInfo.AppPath.Report) + @"\Images\" + logoFileName2;
                logoFileName2 = @"file:///" + logoFileName2.Replace(@"\", @"/");
                ReportParameter reportParameter = new ReportParameter("LogoFile2", logoFileName2);
                reportParameters.Add(reportParameter);
            }
            if (parasNames.Contains("LogoFile3"))
            {
                if (string.IsNullOrEmpty(logoFileName3))
                {
                    logoFileName3 = "RptLogoDft3.jpg";
                }
                logoFileName3 = AppInfo.GetPath(AppInfo.AppPath.Report) + @"\Images\" + logoFileName3;
                logoFileName3 = @"file:///" + logoFileName3.Replace(@"\", @"/");
                ReportParameter reportParameter = new ReportParameter("LogoFile3", logoFileName3);
                reportParameters.Add(reportParameter);
            }
            if (reportParameters.Count > 0)
            {
                this.RptvMain.LocalReport.SetParameters(reportParameters);
            }
            #endregion

            #region 处理Dataset
            this.RptvMain.LocalReport.DataSources.Clear();
            if (reportDSTable1 != null)
            {
                ReportDataSource rds1 = new ReportDataSource("DataSet1", reportDSTable1);
                this.RptvMain.LocalReport.DataSources.Add(rds1);
            }
            if (reportDSTable2 != null)
            {
                ReportDataSource rds2 = new ReportDataSource("DataSet2", reportDSTable2);
                this.RptvMain.LocalReport.DataSources.Add(rds2);
            }
            if (reportDSTable3 != null)
            {
                ReportDataSource rds3 = new ReportDataSource("DataSet3", reportDSTable3);
                this.RptvMain.LocalReport.DataSources.Add(rds3);
            }
            if (reportDSTable4 != null)
            {
                ReportDataSource rds4 = new ReportDataSource("DataSet4", reportDSTable4);
                this.RptvMain.LocalReport.DataSources.Add(rds4);
            }
            if (reportDSTable5 != null)
            {
                ReportDataSource rds5 = new ReportDataSource("DataSet5", reportDSTable5);
                this.RptvMain.LocalReport.DataSources.Add(rds5);
            }

            #endregion


            //定义子报表处理方法
            if (hasSubReport)
            {
                subDSTable1 = subReportDSTable1;
                subDSTable2 = subReportDSTable2;
                RptvMain.LocalReport.SubreportProcessing += new SubreportProcessingEventHandler(LocalReport_SubreportProcessing);
            }

            RptvMain.SetDisplayMode(DisplayMode.PrintLayout);
            RptvMain.ZoomMode = ZoomMode.Percent;
            RptvMain.ZoomPercent = 100;
            try
            {
                if (tPageSettings != null) RptvMain.SetPageSettings(tPageSettings);
                if (tPrinterSettings != null) RptvMain.PrinterSettings = tPrinterSettings;
            }
            catch (Exception)
            {

            }
            RptvMain.LocalReport.Refresh();
            RptvMain.RefreshReport();

            #region 直接打印定义
            m_streams = new List<Stream>();
            ReportPageSettings pageSettings = RptvMain.LocalReport.GetDefaultPageSettings();
            
            decimal pgWidth = decimal.Round(HpString.NZ2Decimal(pageSettings.PaperSize.Width * 2.54 / 100), 2);
            decimal pgHeight = decimal.Round(HpString.NZ2Decimal(pageSettings.PaperSize.Height * 2.54 / 100), 2);
            decimal mgTop = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Top * 2.54 / 100), 2);
            decimal mgLeft = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Left * 2.54 / 100), 2);
            decimal mgRight = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Right * 2.54 / 100), 2);
            decimal mgBottom = decimal.Round(HpString.NZ2Decimal(pageSettings.Margins.Bottom * 2.54 / 100), 2);

            string deviceInfo = "<DeviceInfo>" +
                "  <OutputFormat>EMF</OutputFormat>" +
                "  <PageWidth>"+ pgWidth + "cm</PageWidth>" +
                "  <PageHeight>" + pgHeight + "cm</PageHeight>" +
                "  <MarginTop>" + mgTop + "cm</MarginTop>" +
                "  <MarginLeft>" + mgLeft + "cm</MarginLeft>" +
                "  <MarginRight>" + mgRight + "cm</MarginRight>" +
                "  <MarginBottom>" + mgBottom + "cm</MarginBottom>" +
                "</DeviceInfo>";
            RptvMain.LocalReport.Render("Image", deviceInfo, CreateStream, out Warning[] warnings);
            //==================================================开始打印
            m_currentPageIndex = 0;
            if (m_streams == null || m_streams.Count == 0)
                return;
            //声明PrintDocument对象用于数据的打印 
            PrintDocument printDoc = new PrintDocument
            {
                DefaultPageSettings = RptvMain.GetPageSettings()
            };
            //如果没有指定打印机设置,则使用空字符串""来指定默认打印机
            if (RptvMain.PrinterSettings == null)
            {
                printDoc.PrinterSettings.PrinterName = "";
            }
            else
            {
                printDoc.PrinterSettings = RptvMain.PrinterSettings;
            }
            //判断指定的打印机是否可用 
            if (!printDoc.PrinterSettings.IsValid)
            {
                MyMsg.Warning("没有找到指定的打印机:" + printDoc.PrinterSettings.PrinterName);
                return;
            }
            printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
            //执行打印操作,Print方法将触发PrintPage事件。
            printDoc.Print();

            //释放资源
            foreach (Stream stream in m_streams)
            {
                stream.Dispose();
                stream.Close();
            }
            m_streams = null;
            #endregion
        }

        //声明一个Stream对象的列表用来保存报表的输出数据 
        //LocalReport对象的Render方法会将报表按页输出为多个Stream对象。
        private List<Stream> m_streams;
        //用来提供Stream对象的函数,用于LocalReport对象的Render方法的第三个参数。
        private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)

        {
            //如果需要将报表输出的数据保存为文件,请使用FileStream对象。
            Stream stream = new MemoryStream();
            m_streams.Add(stream);
            return stream;
        }

        //用来记录当前打印到第几页了 
        private int m_currentPageIndex;

        #region 打印页面
        private void PrintPage(object sender, PrintPageEventArgs ev)
        {
            m_streams[m_currentPageIndex].Position = 0;
            Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);

            System.Drawing.Rectangle adjustedRect = new System.Drawing.Rectangle(
                ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX,
                ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY, ev.PageBounds.Width, ev.PageBounds.Height);

            ev.Graphics.FillRectangle(System.Drawing.Brushes.White, adjustedRect);

            ev.Graphics.DrawImage(pageImage, adjustedRect);

            m_streams[m_currentPageIndex].Close();
            m_currentPageIndex++;
            
            ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
        }
        #endregion
        #endregion

 

C# RDLC报表不出现预览窗体直接输出到打印机

标签:ini   oom   ble   except   nali   inf   coding   直接   pap   

原文地址:https://www.cnblogs.com/imes/p/10398279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!