• C# WinForm RDLC报表不预览直接连续打印


    用微软的RDLC报表直接打印不预览

    直接上代码。

     //打印清单
                        System.Data.DataTable dt = print_QD(dr);
                        ReportViewer rvDoc = new ReportViewer();
                        rvDoc.LocalReport.ReportEmbeddedResource = "SD_bcso.Report.rdlc";//加上报表的路径
                        rvDoc.LocalReport.DataSources.Add(new ReportDataSource(dt.TableName, dt));
                        PrintStream(rvDoc.LocalReport);
     /// <summary>
            /// 用来记录当前打印到第几页了
            /// </summary>
            private int m_currentPageIndex;
    
            /// <summary>
            /// 声明一个Stream对象的列表用来保存报表的输出数据,LocalReport对象的Render方法会将报表按页输出为多个Stream对象。
            /// </summary>
            private IList<Stream> m_streams;
    
            private bool isLandSapces = false;
    
            /// <summary>
            /// 用来提供Stream对象的函数,用于LocalReport对象的Render方法的第三个参数。
            /// </summary>
            /// <param name="name"></param>
            /// <param name="fileNameExtension"></param>
            /// <param name="encoding"></param>
            /// <param name="mimeType"></param>
            /// <param name="willSeek"></param>
            /// <returns></returns>
            private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek)
            {
                //如果需要将报表输出的数据保存为文件,请使用FileStream对象。
                Stream stream = new MemoryStream();
                m_streams.Add(stream);
                return stream;
            }
    
            /// <summary>
            /// 为Report.rdlc创建本地报告加载数据,输出报告到.emf文件,并打印,同时释放资源
            /// </summary>
            /// <param name="rv">参数:ReportViewer.LocalReport</param>
            public void PrintStream(LocalReport rvDoc)
            {
                //获取LocalReport中的报表页面方向
                isLandSapces = rvDoc.GetDefaultPageSettings().IsLandscape;
                Export(rvDoc);
                PrintSetting();
                Dispose();
            }
    
            private void Export(LocalReport report)
            {
                string deviceInfo =
                @"<DeviceInfo>
                     <OutputFormat>EMF</OutputFormat>
                 </DeviceInfo>";
                Warning[] warnings;
                m_streams = new List<Stream>();
                //将报表的内容按照deviceInfo指定的格式输出到CreateStream函数提供的Stream中。
                report.Render("Image", deviceInfo, CreateStream, out warnings);
                foreach (Stream stream in m_streams)
                    stream.Position = 0;
            }
    
            private void PrintSetting()
            {
                if (m_streams == null || m_streams.Count == 0)
                    throw new Exception("错误:没有检测到打印数据流");
                //声明PrintDocument对象用于数据的打印
                PrintDocument printDoc = new PrintDocument();
                //获取配置文件的清单打印机名称
                System.Configuration.AppSettingsReader appSettings = new System.Configuration.AppSettingsReader();
                printDoc.PrinterSettings.PrinterName = appSettings.GetValue("QDPrint", Type.GetType("System.String")).ToString();
                printDoc.PrintController = new System.Drawing.Printing.StandardPrintController();//指定打印机不显示页码 
                //判断指定的打印机是否可用
                if (!printDoc.PrinterSettings.IsValid)
                {
                    throw new Exception("错误:找不到打印机");
                }
                else
                {
                    //设置打印机方向遵从报表方向
                    printDoc.DefaultPageSettings.Landscape = isLandSapces;
                    //声明PrintDocument对象的PrintPage事件,具体的打印操作需要在这个事件中处理。
                    printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
                    m_currentPageIndex = 0;
                    //设置打印机打印份数
                    printDoc.PrinterSettings.Copies = 1;
                    //执行打印操作,Print方法将触发PrintPage事件。
                    printDoc.Print();
                }
            }
    
            /// <summary>
            /// 处理程序PrintPageEvents
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="ev"></param>
            private void PrintPage(object sender, PrintPageEventArgs ev)
            {
                //Metafile对象用来保存EMF或WMF格式的图形,
                //我们在前面将报表的内容输出为EMF图形格式的数据流。
                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(Brushes.White, adjustedRect);
    
                //获取报告内容
                //这里的Graphics对象实际指向了打印机
                ev.Graphics.DrawImage(pageImage, adjustedRect);
                //ev.Graphics.DrawImage(pageImage, ev.PageBounds);
    
                // 准备下一个页,已确定操作尚未结束
                m_currentPageIndex++;
    
                //设置是否需要继续打印
                ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
            }
    
            public void Dispose()
            {
                if (m_streams != null)
                {
                    foreach (Stream stream in m_streams)
                        stream.Close();
                    m_streams = null;
                }
            }
  • 相关阅读:
    201920201学期20192407《网络空间安全专业导论》第一周学习总结
    JavaEEJSP详解
    JavaEEJSP指令
    JavaSE类与对象
    JavaSE基础知识
    JavaEEEL表达式
    JavaSE关键字
    JavaSE抽象类、内部类、接口
    JavaSE面向对象
    绪论
  • 原文地址:https://www.cnblogs.com/junjie94wan/p/3337364.html
Copyright © 2020-2023  润新知