多功能DataGridView打印类(WinForm C#)

来源:互联网 发布:mysql 查询最小值记录 编辑:程序博客网 时间:2024/05/01 08:42

论坛里的朋友要DataGridView的打印类,所以把这个版本的也发出来和大家共享!!

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Printing;
using System.Data;
using System.Windows.Forms;

namespace WeightSystem
{
 public class cutePrinter2
 {
  private DataGridView dataGridView1;
  private PrintDocument printDocument;
  private PageSetupDialog pageSetupDialog;
  private PrintPreviewDialog printPreviewDialog;

  private string title="";

  int currentPageIndex=0;
  int rowCount=0;
  int pageCount=0;

  int titleSize=20;
  bool isCustomHeader=false;

  Brush alertBrush=new SolidBrush(Color.Red);

  string[] header=null;//如果自定义就填入字符串,如果需要斜线分隔,就用/表示,例如:个数#名字 其中#为splitChar
  string[] uplineHeader=null;//上行文字数组
  int[] upLineHeaderIndex=null;//上行的文字index,如果没有上行就设为-1;

  public bool isEveryPagePrintTitle=true;//是否每一页都要打印标题。
  public int headerHeight=30;//标题高度。
  public int topMargin=30; //顶边距
  public int cellTopMargin=6;//单元格顶边距
  public int cellLeftMargin=4;//单元格左边距
  public char splitChar='#';//当header要用斜线表示的时候
  public string falseStr="×";//如果传进来的DataGridView中有 false,把其转换得字符。
  public string trueStr="√";//如果传进来的DataGridView中有 true,把其转换得字符。
  public int pageRowCount=30;//每页行数
  public int rowGap = 28;//行高
  public int colGap = 5;//每列间隔
  public int leftMargin = 45;//左边距
  public Font titleFont=new Font("黑体",24,FontStyle.Bold);//标题字体
  public Font font = new Font("宋体", 10);//正文字体
  public Font headerFont = new Font("黑体", 11, FontStyle.Bold);//列名标题
  public Font footerFont=new Font("Arial",8);//页脚显示页数的字体
  public Font upLineFont=new Font("Arial",9, FontStyle.Bold);//当header分两行显示的时候,上行显示的字体。
  public Font underLineFont=new Font("Arial",8);//当header分两行显示的时候,下行显示的字体。
  public Brush brush = new SolidBrush(Color.Black);//画刷
  public bool isAutoPageRowCount=true;//是否自动计算行数。
  public int buttomMargin=80;//底边距
  public bool needPrintPageIndex=true;//是否打印页脚页数
        public bool setTongji = false;       //设置是否显示统计

        string sTitle = "";          //显示标题
        string sTongJi01 = "";           //统计01
        string sTongJi02 = "";          //统计02
        string sTongJi03 = "";          //统计03
        bool isTongji = false;     //是否显示统计  

        string time01;         //具体时间标题
        string time02;

        Font tongJiFont = new Font("宋体", 14);     //统计
        Font dateFont = new Font("宋体", 12, FontStyle.Bold);     //日期标题

       
        /// <summary>
        /// 日统计报表打印
        /// </summary>
        /// <param name="dGView">DataGridView</param>
        /// <param name="title">标题</param>
        /// <param name="times01">起始时间</param>
        /// <param name="times02">中止时间</param>
        /// <param name="tj01">统计01</param>
        /// <param name="tj02">统计02</param>
        /// <param name="tj03">统计03</param>
        /// <param name="tj">确认是否打印统计</param>
        /// <param name="iPrintType">打印样式选择,默认2</param>
        public cutePrinter2(DataGridView dGView, string title, string times01, string times02, string tj01, string tj02, string tj03, bool tj)
        {
            this.title = title;
            this.sTongJi01 = tj01;
            this.sTongJi02 = tj02;
            this.sTongJi03 = tj03;

            this.time01 = times01;
            this.time02 = times02;

            this.setTongji = tj;

            this.dataGridView1 = dGView;
            printDocument = new PrintDocument();
            printDocument.PrintPage += new PrintPageEventHandler(this.printDocument_PrintPage);

        }
       

  public bool setTowLineHeader(string[] upLineHeader,int[] upLineHeaderIndex)
  {
   this.uplineHeader=upLineHeader;
   this.upLineHeaderIndex=upLineHeaderIndex;
   this.isCustomHeader=true;
   return true;
  }
  public bool setHeader(string[] header)
  {
   this.header=header;
   return true;

  }

  private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
  {

            #region 打印 --- 统计报表(年报表)
                int width = e.PageBounds.Width;
                int height = e.PageBounds.Height;
                this.leftMargin = 40;   //重新设置左边距

                if (this.isAutoPageRowCount)
                {
                    pageRowCount = (int)((height - this.topMargin - titleSize - 25 - this.headerFont.Height - this.headerHeight - this.buttomMargin) / this.rowGap);
                }

                pageCount = (int)(rowCount / pageRowCount);
                if (rowCount % pageRowCount > 0)
                    pageCount++;

                if (this.setTongji && pageCount == 1)
                {
                    pageRowCount = (int)((height - this.topMargin - titleSize - 25 - this.headerFont.Height - this.headerHeight - this.buttomMargin - 25) / this.rowGap);
                    pageCount = (int)(rowCount / pageRowCount);
                    if (rowCount % pageRowCount > 0)
                        pageCount++;
                }


                string sDateTitle = time01 + " — " + time02;

                int xoffset = (int)((width - e.Graphics.MeasureString(this.title, this.titleFont).Width) / 2);
                int xoffset2 = (int)((width - e.Graphics.MeasureString(sDateTitle, dateFont).Width) / 2);

                int colCount = 0;
                int x = 0;
                int y = topMargin;
                string cellValue = "";

                int startRow = currentPageIndex * pageRowCount;
                int endRow = startRow + this.pageRowCount < rowCount ? startRow + pageRowCount : rowCount;
                int currentPageRowCount = endRow - startRow;

               

                if (this.currentPageIndex == 0 || this.isEveryPagePrintTitle)
                {
                   
                    e.Graphics.DrawString(this.title, titleFont, brush, xoffset, y);
                    e.Graphics.DrawString(sDateTitle, dateFont, brush, xoffset2, y + 40);
                    y += titleSize + 20;
                }

                try
                {

                    colCount = dataGridView1.ColumnCount;

                    y += rowGap;
                    x = leftMargin;


                    DrawLine(new Point(x, y), new Point(x, y + currentPageRowCount * rowGap + this.headerHeight), e.Graphics);//最左边的竖线

                    int lastIndex = -1;
                    int lastLength = 0;
                    int indexj = -1;

                    for (int j = 0; j < colCount; j++)
                    {
                        int colWidth = dataGridView1.Columns[j].Width;
                        if (colWidth > 0)
                        {
                            indexj++;
                            if (this.header == null || this.header[indexj] == "")
                                cellValue = dataGridView1.Columns[j].Name;
                            else
                                cellValue = header[indexj];

                            if (this.isCustomHeader)
                            {
                                if (this.upLineHeaderIndex[indexj] != lastIndex)
                                {

                                    if (lastLength > 0 && lastIndex > -1)//开始画上一个upline
                                    {
                                        string upLineStr = this.uplineHeader[lastIndex];
                                        int upXOffset = (int)((lastLength - e.Graphics.MeasureString(upLineStr, this.upLineFont).Width) / 2);
                                        if (upXOffset < 0)
                                            upXOffset = 0;
                                        e.Graphics.DrawString(upLineStr, this.upLineFont, brush, x - lastLength + upXOffset, y + (int)(this.cellTopMargin / 2));

                                        DrawLine(new Point(x - lastLength, y + (int)(this.headerHeight / 2)), new Point(x, y + (int)(this.headerHeight / 2)), e.Graphics);//中线
                                        DrawLine(new Point(x, y), new Point(x, y + (int)(this.headerHeight / 2)), e.Graphics);
                                    }
                                    lastIndex = this.upLineHeaderIndex[indexj];
                                    lastLength = colWidth + colGap;
                                }
                                else
                                {
                                    lastLength += colWidth + colGap;
                                }
                            }

                            //int currentY=y+cellTopMargin;


                            int Xoffset = 10;
                            int Yoffset = 20;
                            int leftWordIndex = cellValue.IndexOf(this.splitChar);
                            if (this.upLineHeaderIndex != null && this.upLineHeaderIndex[indexj] > -1)
                            {

                                if (leftWordIndex > 0)
                                {
                                    string leftWord = cellValue.Substring(0, leftWordIndex);
                                    string rightWord = cellValue.Substring(leftWordIndex + 1, cellValue.Length - leftWordIndex - 1);
                                    //上面的字
                                    Xoffset = (int)(colWidth + colGap - e.Graphics.MeasureString(rightWord, this.upLineFont).Width);
                                    Yoffset = (int)(this.headerHeight / 2 - e.Graphics.MeasureString("a", this.underLineFont).Height);


                                    Xoffset = 6;
                                    Yoffset = 10;
                                    e.Graphics.DrawString(rightWord, this.underLineFont, brush, x + Xoffset - 4, y + (int)(this.headerHeight / 2));
                                    e.Graphics.DrawString(leftWord, this.underLineFont, brush, x + 2, y + (int)(this.headerHeight / 2) + (int)(this.cellTopMargin / 2) + Yoffset - 2);
                                    DrawLine(new Point(x, y + (int)(this.headerHeight / 2)), new Point(x + colWidth + colGap, y + headerHeight), e.Graphics);
                                    x += colWidth + colGap;
                                    DrawLine(new Point(x, y + (int)(this.headerHeight / 2)), new Point(x, y + currentPageRowCount * rowGap + this.headerHeight), e.Graphics);
                                }
                                else
                                {

                                    e.Graphics.DrawString(cellValue, headerFont, brush, x, y + (int)(this.headerHeight / 2) + (int)(this.cellTopMargin / 2));
                                    x += colWidth + colGap;
                                    DrawLine(new Point(x, y + (int)(this.headerHeight / 2)), new Point(x, y + currentPageRowCount * rowGap + this.headerHeight), e.Graphics);
                                }

                            }
                            else
                            {
                                if (leftWordIndex > 0)
                                {
                                    string leftWord = cellValue.Substring(0, leftWordIndex);
                                    string rightWord = cellValue.Substring(leftWordIndex + 1, cellValue.Length - leftWordIndex - 1);
                                    //上面的字
                                    Xoffset = (int)(colWidth + colGap - e.Graphics.MeasureString(rightWord, this.upLineFont).Width);
                                    Yoffset = (int)(this.headerHeight - e.Graphics.MeasureString("a", this.underLineFont).Height);

                                    e.Graphics.DrawString(rightWord, this.headerFont, brush, x + Xoffset - 4, y + 2);
                                    e.Graphics.DrawString(leftWord, this.headerFont, brush, x + 2, y + Yoffset - 4);
                                    DrawLine(new Point(x, y), new Point(x + colWidth + colGap, y + headerHeight), e.Graphics);
                                    x += colWidth + colGap;
                                    DrawLine(new Point(x, y), new Point(x, y + currentPageRowCount * rowGap + this.headerHeight), e.Graphics);
                                }
                                else
                                {
                                    e.Graphics.DrawString(cellValue, headerFont, brush, x, y + cellTopMargin);
                                    x += colWidth + colGap;
                                    DrawLine(new Point(x, y), new Point(x, y + currentPageRowCount * rowGap + this.headerHeight), e.Graphics);
                                }

                            }

                        }
                    }
                    ////循环结束,画最后一个的upLine
                    if (this.isCustomHeader)
                    {

                        if (lastLength > 0 && lastIndex > -1)//开始画上一个upline
                        {
                            string upLineStr = this.uplineHeader[lastIndex];
                            int upXOffset = (int)((lastLength - e.Graphics.MeasureString(upLineStr, this.upLineFont).Width) / 2);
                            if (upXOffset < 0)
                                upXOffset = 0;
                            e.Graphics.DrawString(upLineStr, this.upLineFont, brush, x - lastLength + upXOffset, y + (int)(this.cellTopMargin / 2));

                            DrawLine(new Point(x - lastLength, y + (int)(this.headerHeight / 2)), new Point(x, y + (int)(this.headerHeight / 2)), e.Graphics);//中线
                            DrawLine(new Point(x, y), new Point(x, y + (int)(this.headerHeight / 2)), e.Graphics);
                        }

                    }

                    int rightBound = x;

                    DrawLine(new Point(leftMargin, y), new Point(rightBound, y), e.Graphics); //最上面的线

                    //DrawLine(new Point(leftMargin,y+this.headerHeight),new Point(rightBound,y+this.headerHeight),e.Graphics);//列名的下面的线

                    y += this.headerHeight;


                    //print all rows
                    for (int i = startRow; i < endRow; i++)
                    {

                        x = leftMargin;
                        for (int j = 0; j < colCount; j++)
                        {
                            if (dataGridView1.Columns[j].Width > 0)
                            {
                                cellValue = dataGridView1.Rows[i].Cells[j].Value.ToString();
                                if (cellValue == "False")
                                    cellValue = falseStr;
                                if (cellValue == "True")
                                    cellValue = trueStr;

                                e.Graphics.DrawString(cellValue, font, brush, x + this.cellLeftMargin, y + cellTopMargin);
                                x += dataGridView1.Columns[j].Width + colGap;
                                y = y + rowGap * (cellValue.Split(new char[] { '/r', '/n' }).Length - 1);
                            }
                        }
                        DrawLine(new Point(leftMargin, y), new Point(rightBound, y), e.Graphics);
                        y += rowGap;
                    }
                    DrawLine(new Point(leftMargin, y), new Point(rightBound, y), e.Graphics);

                    currentPageIndex++;

                    if (this.setTongji && currentPageIndex == pageCount)
                        this.isTongji = true;

                    if (this.isTongji)
                    {
                        int xoffsetTongJi = (int)((width - e.Graphics.MeasureString(sTongJi01, dateFont).Width) / 2);
                        e.Graphics.DrawString(this.sTongJi01, this.tongJiFont, brush, xoffsetTongJi, y + 25);          //统计01

                        e.Graphics.DrawString(this.sTongJi02, this.tongJiFont, brush, xoffsetTongJi, y + 50);          //统计03
                        e.Graphics.DrawString(this.sTongJi03, this.tongJiFont, brush, xoffsetTongJi + 340, y + 50);         //统计04
                    }

                    if (this.needPrintPageIndex)
                    {
                        if (pageCount != 1)
                        {
                            e.Graphics.DrawString("共 " + pageCount.ToString() + " 页,当前第 " + this.currentPageIndex.ToString() + " 页", this.footerFont, brush, width - 200, (int)(height - this.buttomMargin / 2 - this.footerFont.Height));
                        }
                    }

                    string s = cellValue;
                    string f3 = cellValue;

 

                    if (currentPageIndex < pageCount)
                    {
                        e.HasMorePages = true;
                    }
                    else
                    {
                        e.HasMorePages = false;
                        this.currentPageIndex = 0;

                    }
                    //iPageNumber+=1;

                }
                catch
                {

                }

                #endregion
        
  }
  private void DrawLine(Point sp,Point ep,Graphics gp)
  {
   Pen pen=new Pen(Color.Black);
   gp.DrawLine(pen,sp,ep);
  }

  public PrintDocument GetPrintDocument()
  {
   return printDocument;
  }

 

  public void Print()
  {
   rowCount=0;
            try
            { 
                if (dataGridView1.DataSource.GetType().ToString() == "System.Data.DataSet")
       {
                    rowCount = ((DataSet)dataGridView1.DataSource).Tables[0].Rows.Count;
       }
                else if (dataGridView1.DataSource.GetType().ToString() == "System.Data.DataView")
       {
                    rowCount = ((DataView)dataGridView1.DataSource).Count;
       }

                pageSetupDialog = new PageSetupDialog();
                pageSetupDialog.AllowOrientation = true;
                pageSetupDialog.Document = printDocument;
                pageSetupDialog.Document.DefaultPageSettings.Landscape = true;        //    设置打印为横向
                pageSetupDialog.ShowDialog();
    printPreviewDialog = new PrintPreviewDialog();        
    printPreviewDialog.Document = printDocument;
    printPreviewDialog.Height = 600;
    printPreviewDialog.Width = 800;
                printPreviewDialog.ClientSize = new System.Drawing.Size(1024, 768);
                printPreviewDialog.PrintPreviewControl.Zoom = 1;
    printPreviewDialog.ShowDialog();
   }
   catch
   {
                //throw new Exception("Printer error." + e.Message);
   }

  }
 }
}


 

原创粉丝点击