调用打印类并执行预览
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WinHis
{
public partial class TempleTable : Form
{
public TempleTable()
{
InitializeComponent();
}
private int currentPageIndex = 0;
private int rowCount = 0;
private int pageCount = 0;
private void TempleTable_Load(object sender, EventArgs e)
{
PrintPreviewDialog ppvw = new PrintPreviewDialog();
ppvw.PrintPreviewControl.Zoom = 1.0; //显示比例为100%
DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("name");
dt.Columns.Add("date");
for (int i = 0; i < 10; i++)
{
DataRow dr = dt.NewRow();
dr["id"] = i.ToString();
dr["name"] = "设置要打印的文档设置要打印的文档";
dr["date"] = "2023-12-21";
dt.Rows.Add(dr);
}
dt.Dispose();
ToPrint bll = new ToPrint();
System.Drawing.Printing.PrintDocument printDoc = bll.CreatePrintDocument(dt, "dd");
//System.Drawing.Printing.PrintDocument printDoc = new System.Drawing.Printing.PrintDocument();
PrintDialog MyDlg = new PrintDialog();
MyDlg.Document = printDoc;
printDoc.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("A4", 850, 1000);
printDoc.DefaultPageSettings.Margins = new System.Drawing.Printing.Margins(60, 60, 60, 60); //设置边距
ppvw.Document = printDoc; //设置要打印的文档
((Form)ppvw).WindowState = FormWindowState.Maximized; //最大化
printDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(printDoc_PrintPage); //打印事件
//printDoc.EndPrint += new System.Drawing.Printing.PrintEventHandler(printDoc_EndPrint);
//ppvw.Document.DefaultPageSettings.Landscape = true; // 设置打印为横向
ppvw.ShowDialog(); //打开预览
}
private void printDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Font titleFont = new Font("宋体", 11, System.Drawing.FontStyle.Regular);//标题字体
System.Drawing.Brush brush = new SolidBrush(System.Drawing.Color.Black);//画刷
System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Black, 1);
pageCount = 3; //定义页数
if (currentPageIndex == 0) //当为第一页时
{
// ShowSecond(e, titleFont, brush, pen);
ShowFirst(e, titleFont, brush, pen);
}
else if (currentPageIndex == 1) //当为第二页时
{
// ShowFirst(e, titleFont, brush, pen);
}
else if (currentPageIndex == 2) //当为第一页时
{
// ShowFirst(e, titleFont, brush, pen);
}
#region 分页控件
currentPageIndex++; //加新页
if (currentPageIndex < pageCount)
{
e.HasMorePages = true; //如果小于定义页 那么增加新的页数
}
else
{
e.HasMorePages = false; //停止增加新的页数
currentPageIndex = 0;
}
#endregion
}
#region 首页内容
private void ShowFirst(System.Drawing.Printing.PrintPageEventArgs e, Font titleFont3, System.Drawing.Brush brush, System.Drawing.Pen pen)
{
}
#endregion
}
}
绘制表格类:
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms;
using System.Data;
using System;
namespace WinHis
{
/// <summary>
/// 打印,打印预览
/// </summary>
public class ToPrint
{
//以下用户可自定义
//当前要打印文本的字体及字号
private static Font TableFont = new Font("Verdana", 10, FontStyle.Regular);
//表头字体
private Font HeadFont = new Font("Verdana", 20, FontStyle.Bold);
//表头文字
private string HeadText = string.Empty;
//表头高度
private int HeadHeight = 40;
//表的基本单位
private int[] XUnit;
private int YUnit = TableFont.Height * 2;
//以下为模块内部使用
private PrintDocument DataTablePrinter;
private DataRow DataGridRow;
private DataTable DataTablePrint;
//当前要所要打印的记录行数,由计算得到
private int PageRecordNumber;
//正要打印的页号
private int PrintingPageNumber = 1;
//已经打印完的记录数
private int PrintRecordComplete;
private int PLeft;
private int PTop;
private int PRight;
private int PBottom;
private int PWidth;
private int PHeigh;
//当前画笔颜色
private SolidBrush DrawBrush = new SolidBrush(Color.Black);
//每页打印的记录条数
private int PrintRecordNumber;
//第一页打印的记录条数
private int FirstPrintRecordNumber;
//总共应该打印的页数
private int TotalPage;
//与列名无关的统计数据行的类目数(如,总计,小计......)
public int TotalNum = 0;
/// <summary>
/// 打印
/// </summary>
/// <param name="dt">要打印的DataTable</param>
/// <param name="Title">打印文件的标题</param>
public void Print(DataTable dt, string Title)
{
try
{
CreatePrintDocument(dt, Title).Print();
}
catch (Exception ex)
{
MessageBox.Show("打印错误,请检查打印设置!");
}
}
/// <summary>
/// 打印预览
/// </summary>
/// <param name="dt">要打印的DataTable</param>
/// <param name="Title">打印文件的标题</param>
public void PrintPriview(DataTable dt, string Title)
{
try
{
PrintPreviewDialog PrintPriview = new PrintPreviewDialog();
PrintPriview.Document = CreatePrintDocument(dt, Title);
PrintPriview.WindowState = FormWindowState.Maximized;
PrintPriview.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show("打印错误,请检查打印设置!");
}
}
/// <summary>
/// 创建打印文件
/// </summary>
public PrintDocument CreatePrintDocument(DataTable dt, string Title)
{
DataTablePrint = dt;
HeadText = Title;
DataTablePrinter = new PrintDocument();
PageSetupDialog PageSetup = new PageSetupDialog();
PageSetup.Document = DataTablePrinter;
DataTablePrinter.DefaultPageSettings = PageSetup.PageSettings;
DataTablePrinter.DefaultPageSettings.Landscape = true;//设置打印横向还是纵向
//PLeft = 30; //DataTablePrinter.DefaultPageSettings.Margins.Left;
PTop = DataTablePrinter.DefaultPageSettings.Margins.Top;
//PRight = DataTablePrinter.DefaultPageSettings.Margins.Right;
PBottom = DataTablePrinter.DefaultPageSettings.Margins.Bottom;
PWidth = DataTablePrinter.DefaultPageSettings.Bounds.Width;
PHeigh = DataTablePrinter.DefaultPageSettings.Bounds.Height;
XUnit = new int[DataTablePrint.Columns.Count];
PrintRecordNumber = Convert.ToInt32((PHeigh - PTop - PBottom - YUnit) / YUnit);
FirstPrintRecordNumber = Convert.ToInt32((PHeigh - PTop - PBottom - HeadHeight - YUnit) / YUnit);
if (DataTablePrint.Rows.Count > PrintRecordNumber)
{
if ((DataTablePrint.Rows.Count - FirstPrintRecordNumber) % PrintRecordNumber == 0)
{
TotalPage = (DataTablePrint.Rows.Count - FirstPrintRecordNumber) / PrintRecordNumber + 1;
}
else
{
TotalPage = (DataTablePrint.Rows.Count - FirstPrintRecordNumber) / PrintRecordNumber + 2;
}
}
else
{
TotalPage = 1;
}
DataTablePrinter.PrintPage += new PrintPageEventHandler(DataTablePrinter_PrintPage);
DataTablePrinter.DocumentName = HeadText;
return DataTablePrinter;
}
/// <summary>
/// 打印当前页
/// </summary>
private void DataTablePrinter_PrintPage(object sende, PrintPageEventArgs Ev)
{
int tableWith = 0;
string ColumnText;
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
//打印表格线格式
Pen Pen = new Pen(Brushes.Black, 1);
#region 设置列宽
foreach (DataRow dr in DataTablePrint.Rows)
{
for (int i = 0; i < DataTablePrint.Columns.Count; i++)
{
int colwidth = Convert.ToInt32(Ev.Graphics.MeasureString(dr[i].ToString().Trim(), TableFont).Width);
if (colwidth > XUnit[i])
{
XUnit[i] = colwidth;
}
}
}
if (PrintingPageNumber == 1)
{
for (int Cols = 0; Cols <= DataTablePrint.Columns.Count - 1; Cols++)
{
ColumnText = DataTablePrint.Columns[Cols].ColumnName.ToString().Trim();
int colwidth = Convert.ToInt32(Ev.Graphics.MeasureString(ColumnText, TableFont).Width);
if (colwidth > XUnit[Cols])
{
XUnit[Cols] = colwidth;
}
}
}
for (int i = 0; i < XUnit.Length; i++)
{
tableWith += XUnit[i];
}
#endregion
PLeft = (Ev.PageBounds.Width - tableWith) / 2;
int x = PLeft;
int y = PTop;
int stringY = PTop + (YUnit - TableFont.Height) / 2;
int rowOfTop = PTop;
//第一页
if (PrintingPageNumber == 1)
{
//打印表头
Ev.Graphics.DrawString(HeadText, HeadFont, DrawBrush, new Point(Ev.PageBounds.Width / 2, PTop), sf);
//设置为第一页时行数
PageRecordNumber = FirstPrintRecordNumber;
rowOfTop = y = PTop + HeadFont.Height + 10;
stringY = PTop + HeadFont.Height + 10 + (YUnit - TableFont.Height) / 2;
}
else
{
//计算,余下的记录条数是否还可以在一页打印,不满一页时为假
if (DataTablePrint.Rows.Count - PrintRecordComplete >= PrintRecordNumber)
{
PageRecordNumber = PrintRecordNumber;
}
else
{
PageRecordNumber = DataTablePrint.Rows.Count - PrintRecordComplete;
}
}
#region 列名
if (PrintingPageNumber == 1 || PageRecordNumber > TotalNum)//最后一页只打印统计行时不打印列名
{
//得到datatable的所有列名
for (int Cols = 0; Cols <= DataTablePrint.Columns.Count - 1; Cols++)
{
ColumnText = DataTablePrint.Columns[Cols].ColumnName.ToString().Trim();
int colwidth = Convert.ToInt32(Ev.Graphics.MeasureString(ColumnText, TableFont).Width);
Ev.Graphics.DrawString(ColumnText, TableFont, DrawBrush, x, stringY);
x += XUnit[Cols];
}
}
#endregion
Ev.Graphics.DrawLine(Pen, PLeft, rowOfTop, x, rowOfTop);
stringY += YUnit;
y += YUnit;
Ev.Graphics.DrawLine(Pen, PLeft, y, x, y);
//当前页面已经打印的记录行数
int PrintingLine = 0;
while (PrintingLine < PageRecordNumber)
{
x = PLeft;
//确定要当前要打印的记录的行号
DataGridRow = DataTablePrint.Rows[PrintRecordComplete];
for (int Cols = 0; Cols <= DataTablePrint.Columns.Count - 1; Cols++)
{
Ev.Graphics.DrawString(DataGridRow[Cols].ToString().Trim(), TableFont, DrawBrush, x, stringY);
x += XUnit[Cols];
}
stringY += YUnit;
y += YUnit;
Ev.Graphics.DrawLine(Pen, PLeft, y, x, y);
PrintingLine += 1;
PrintRecordComplete += 1;
if (PrintRecordComplete >= DataTablePrint.Rows.Count)
{
Ev.HasMorePages = false;
PrintRecordComplete = 0;
}
}
Ev.Graphics.DrawLine(Pen, PLeft, rowOfTop, PLeft, y);
x = PLeft;
for (int Cols = 0; Cols < DataTablePrint.Columns.Count; Cols++)
{
x += XUnit[Cols];
Ev.Graphics.DrawLine(Pen, x, rowOfTop, x, y);
}
PrintingPageNumber += 1;
if (PrintingPageNumber > TotalPage)
{
Ev.HasMorePages = false;
PrintingPageNumber = 1;
PrintRecordComplete = 0;
}
else
{
Ev.HasMorePages = true;
}
}
}
}