調用打印類並執行預覽
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;
}
}
}
}