[C#] 多功能DataGridView打印类

来源:http://blog.csdn.net/pfworld/archive/2008/01/22/2058746.aspx

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);
}
}
}
}
原文地址:https://www.cnblogs.com/hcbin/p/1688924.html