.Net中 RDLC报表打印类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;
using System.Drawing.Printing;
using System.Drawing.Imaging;
using System.Diagnostics;

namespace PrintTest
{
    public class ReportPrint
    {
        private int m_currentPageIndex;

        private IList<Stream> m_streams;
       
        /// <summary>
        /// 创建流
        /// </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)
        {
            Stream stream = new FileStream(name + "." + fileNameExtension, FileMode.Create);
            m_streams.Add(stream);

            return stream;
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="report"></param>
        private void Export(LocalReport report)
        {
            string deviceInfo =
              "<DeviceInfo>" +
              "  <OutputFormat>EMF</OutputFormat>" +

              //"  <PageWidth>8.5in</PageWidth>" +

              //"  <PageHeight>11in</PageHeight>" +

              //"  <MarginTop>0.25in</MarginTop>" +

              //"  <MarginLeft>0.25in</MarginLeft>" +

              //"  <MarginRight>0.25in</MarginRight>" +

              //"  <MarginBottom>0.25in</MarginBottom>" +

              "</DeviceInfo>";

            Warning[] warnings;
            m_streams = new List<Stream>();

            try
            {
                report.Render("Image", deviceInfo, CreateStream, out warnings);
            }

            catch (Exception ex)
            {
                Exception innerEx = ex.InnerException;//get the  InnerException 

                while (innerEx != null)
                {
                    MessageBox.Show(innerEx.ToString());
                    innerEx = innerEx.InnerException;
                }

                throw innerEx;
            }
                       
            foreach (Stream stream in m_streams)

                stream.Position = 0;
        }
     
        /// <summary>
        /// Print the event handler function
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="ev"></param>
        private void PrintPage(object sender, PrintPageEventArgs ev)
        {

//<<<EDT


            //Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
            //ev.Graphics.DrawImage(pageImage, 0, 0);
            //m_currentPageIndex++;
            //ev.HasMorePages = (m_currentPageIndex < m_streams.Count);

//>>>EDT

 

            // 画面解像度(dpi)を取得
            Control ctrl = new Control();
            Graphics g = ctrl.CreateGraphics();
            float DisplayDpiX = g.DpiX;
            float DisplayDpiY = g.DpiY;
            // 印刷対象を取得
            PrintDocument p = (PrintDocument)sender;
            int DisplayPixelX = 0;
            int DisplayPixelY = 0;
            if (p.DefaultPageSettings.Landscape == true)
            {
                // 画面のピクセルを取得
                //横向きの帳票
                DisplayPixelX = (int)(297 * DisplayDpiX / 25.4 + 0.5);
                DisplayPixelY = (int)(210 * DisplayDpiY / 25.4 + 0.5);
            }
            else
            {
                //縦向きの帳票
                DisplayPixelX = (int)(210 * DisplayDpiX / 25.4 + 0.5);
                DisplayPixelY = (int)(297 * DisplayDpiY / 25.4 + 0.5);
            }

            Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
            ev.Graphics.DrawImage(pageImage, 0, 0, DisplayPixelX, DisplayPixelY);
            m_currentPageIndex++;
            ev.HasMorePages = (m_currentPageIndex < m_streams.Count);

        }

        /// <summary>
        /// Print dialog box to configure
        /// </summary>
        private void Print()
        {
            //const string printerName = "";//Printer Name 如果不指定打印机,则默认是当前系统的默认打印机
            if (m_streams == null || m_streams.Count == 0)
            {
                return;
            }

            PrintDocument printDoc = new PrintDocument();
            //printDoc.PrinterSettings.PrinterName = printerName; //Specify the printer name
            //printDoc.PrinterSettings.PaperSizes.
            if (!printDoc.PrinterSettings.IsValid)
            {
                string msg = "Can't find printer!";
                Debug.WriteLine(msg);
                return;
            }
           
            //Print the event handler function
            printDoc.PrintPage += new PrintPageEventHandler(PrintPage);

            //Show the Print Dialog Box
            PrintDialog printDia = new PrintDialog();
            printDia.AllowSomePages = true;
            printDia.ShowHelp = true;
            printDia.Document = printDoc;
            DialogResult result = printDia.ShowDialog();
            if (result == DialogResult.OK)
            {
                printDoc.Print(); //Print
            }

        }

        /// <summary>
        /// 执行打印(竖向)
        /// </summary>
        /// <param name="dDataTable">数据源(Datatable或list等)</param>
        /// <param name="RDLCName">rdlc名称</param>
        /// <param name="parameters">参数集合</param>
        public void Run(DataTable dDataTable, string RDLCName, ReportParameter[] parameters)
        {
            try
            {
                LocalReport report = new LocalReport();
                report.ReportPath = Application.StartupPath + "//" + RDLCName + ".rdlc";//Loading path report
                report.DataSources.Add(new ReportDataSource(dDataTable.TableName, dDataTable));//Add Data Source
                if (parameters != null)
                {
                    report.SetParameters(parameters);
                }
                report.Refresh();

                Export(report);
                m_currentPageIndex = 0;
                //run
                Print();
                Dispose();
            }
            catch (Exception e)
            {
                //Debug.Print(e.InnerException.Message);
                throw e;
            }
        }

        /// <summary>
        /// 执行打印(横向)
        /// </summary>
        /// <param name="dDataTable">数据源(Datatable或list等)</param>
        /// <param name="RDLCName">rdlc名称</param>
        /// <param name="parameters">参数集合</param>
        /// <param name="isLandscape">横向打印</param>
        public void Run(DataTable dDataTable, string RDLCName, ReportParameter[] parameters, bool isLandscape)
        {
            try
            {
                LocalReport report = new LocalReport();
                report.ReportPath = Application.StartupPath + "//" + RDLCName + ".rdlc";//Loading path report
                report.DataSources.Add(new ReportDataSource(dDataTable.TableName, dDataTable));//Add Data Source
                if (parameters != null)
                {
                    report.SetParameters(parameters);
                }
                report.Refresh();

                Export(report);
                m_currentPageIndex = 0;
                //run
                Print(isLandscape);
                Dispose();
            }
            catch (Exception e)
            {
                //Debug.Print(e.InnerException.Message);
                throw e;
            }
        }

        /// <summary>
        /// print
        /// </summary>
        /// <param name="isLandscape">横向设置</param>
        private void Print(bool isLandscape)
        {
            if (m_streams == null || m_streams.Count == 0)
            {
                return;
            }

            PrintDocument printDoc = new PrintDocument();
            //printDoc.PrinterSettings.PrinterName = printerName; //Specify the printer name
            //printDoc.PrinterSettings.PaperSizes.
            if (!printDoc.PrinterSettings.IsValid)
            {
                string msg = "Can't find printer!";
                Debug.WriteLine(msg);
                return;
            }
            printDoc.DefaultPageSettings.Landscape = isLandscape;
            printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
            printDoc.Print();
        }

        /// <summary>
        /// 释放buffer
        /// </summary>
        public void Dispose()
        {
            if (m_streams != null)
            {
                foreach (Stream stream in m_streams)
                    stream.Close();
                m_streams = null;
            }
        }

      
    }
}

 

 

***************************************************************

以下不属于打印类内容
 //添加并引用命名空间
        using Microsoft.Reporting.WinForms;

        /// <summary>
        /// 给报表参数赋值(前提是RDLC报表中有这些参数)
        /// </summary>
        /// <returns></returns>
        private ReportParameter[] SetReportParameters()
        {
            string TTOrder = "";
            string TTOrderDate = "";
            string TTCustomerID = "";
            string TTCustomerName = "";
            string TTDirectSendName = "";
            string TTSendDate = "";
            string TTDayt = "";
            string TTSaffName = "";
            string TTArrivePlaceCode = "";
            string TTArrivePlaceName = "";
            string TTUseCartName = "";

            string TTPostCartKind = "";
            string TTMemo = "";

            ReportParameter[] parameters ={
                     new ReportParameter("TTOrder", TTOrder,true),
                     new ReportParameter("TTOrderDate", TTOrderDate,true),
                     new ReportParameter("TTSaffName", TTSaffName,true),
                     new ReportParameter("TTCustomerID", TTCustomerID,true),
                     new ReportParameter("TTCustomerName", TTCustomerName,true),
                     new ReportParameter("TTDirectSendName", TTDirectSendName,true),
                     new ReportParameter("TTSendDate", TTSendDate,true),
                     new ReportParameter("TTDay", TTDay,true),
                     new ReportParameter("TTArrivePlaceCode", TTArrivePlaceCode,true),
                     new ReportParameter("TTArrivePlaceName", TTArrivePlaceName,true),
                     new ReportParameter("TTUseCartName", TTUseCartName,true),
                     new ReportParameter("TTPostCartKind", TTPostCartKind,true),
                     new ReportParameter("TTMemo", TTMemo,true)
                                          };

            return parameters;

        }

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值