[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);
}
}
}
}

你可能感兴趣的:(datagridview)