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

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[] { ' '' ' }).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(1024768
);
                printPreviewDialog.PrintPreviewControl.Zoom
= 1
;
                printPreviewDialog.ShowDialog();
            }
           
catch

            {
               
// throw new Exception("Printer error." + e.Message);
            }
        }
    }
}

原文地址:https://www.cnblogs.com/wwwzzg168/p/3569975.html