调用打印类并执行预览

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];}#endregionPLeft = (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];}}#endregionEv.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;}}}
}

c# winform 绘制表格填充数据并且打印预览表格相关推荐

  1. vue-excel不规则表格编写且可以打印预览

    效果图: 一.打印预览引入两个依赖文件 ref="exportPdf" 指向只能指向div这些dom原生元素,不然会报Element is not attached to a Do ...

  2. php 输出内容到表格,phpexcel 输出表格到页面(在线预览表格),导出excel

    php导出excel我们经常采用phpexcel方便,可是在开发过程中,没修过一次就点击下载一个excel文件着实麻烦,而且还不容易调试错误.其实phpexcel 还可以输出表格到页面,方便调试 实例 ...

  3. 将Excel中一个表格的数据关联到另一个表格

    将Excel中一个表格的数据关联到另一个表格 1.表1样例,表1和表2有关联字段工号 2.表2样例 3.表1中选中B2单元格---公式---函数---查找与引用---VLOOKUP---确定 4.lo ...

  4. 纯手写table展示树形数据,实现浏览器打印预览功能

    更新: 略显尴尬,在测试进行了各种数据测试之后,发现处理数据还是有些问题,有问题才能进步嘛,哈哈哈,还好发现及时,今天下午又进行了修改,对合并数据的地方修改了很多,详细内容见新的dealData方法: ...

  5. excel打印预览在哪里_Excel如何打印表格,每页纸都有标题?

    Excel如何打印表格,每页纸都有标题? 在设置之前,打印预览效果如下 第一页是有标题的,第二页就没有标题了. 实现Excel打印每页有标题,方法如下 页面设置-打印标题 在顶端标题行选择第一行,如下 ...

  6. excel打印预览在哪里_别再浪费A4纸了,Excel按下这个键,一张纸可以打印全部表格内容...

    我们在工作和生活中,经常需要打印Excel表格,可是有时表格太宽了,无法打印在一张A4纸上,今天就来教大家几种方法,只需按下一个键,就可以打印全部表格内容. 一.表格打印一页 1.设置分页 首先点击[ ...

  7. 手机wps怎么设置打印横竖_WPS表格打印预览在哪如何设置横向和纵向打印方式

    WPS表格打印预览在哪如何设置横向和纵向打印方式 时间:2013-12-31   作者:snow   来源:互联网 wps的打印预览在哪? 页面左上角的几个常见功能按钮当中第4个(按钮是一张四方纸中间 ...

  8. html文档打印不全表格,Excel打印预览时,表格有一部分不完整,如何调整?

    回答: 解决办法是新建一个Word文档,插入要打印的图片,调整Word表格尺寸打印即可. 操作步骤: 1.将需要打印的图片,设置名称,保存到电脑桌面上. 2.新建一个Word表格.鼠标右击桌面,点击& ...

  9. html打印预览出现重叠,求高手解答:在WORD 中插入EXCEL表格,打印出现字重叠的问题...

    求高手解答:在WORD 中插入EXCEL表格,打印出现字重叠的问题以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 求高手 ...

最新文章

  1. 正则表达式的常用方法和属性
  2. hadoop可以解决什么问题_快速解决皮带机轴磨损问题可以这样做
  3. php文件访问不到数据,PHP 5.x同步文件访问(无数据库)
  4. 计算机图形学知识点整理(一)
  5. 荣耀鸿蒙os2.0公测版,鸿蒙OS 2.0他来了!华为HarmonyOS 2.0开发者公测版正式推送
  6. [论文阅读] Self-supervised Correction Learning for Semi-supervised Biomedical Image Segmentation
  7. 从Android应用程序访问Internet需要什么权限?
  8. 7号团队-团队任务5:项目总结
  9. Windows server 2012体验之活动目录回收站
  10. unity简单的粒子特效的制作
  11. 《5分钟商学院》--读书笔记
  12. vue-router 三级路由
  13. 2022-04-行为经济学-光华管理学院-孟涓涓
  14. Windows添加开机和关闭开机启动项
  15. 中国气象局国家气候中心
  16. 超详细的张飞硬件90天读书笔记01
  17. 使命召唤16计算机内存不足,《COD16》占用内存过大?官方教你清理空间
  18. matlab 二阶低通滤波器,二阶无源RC滤波的MATLAB仿真
  19. 复杂社会网络传播模式研究项目申报书
  20. 合并报表编制采用的理论_合并报表编制理论知识(必读)

热门文章

  1. 机械臂——六轴机械臂逆解
  2. mysql+清理undo_undo清理 redo 持久化
  3. 南京python培训周末班
  4. Android按比例动态显示图片大小
  5. Nginx报错:Sorry,thepageyouarelookingforiscurrentlyunavailable.Pleasetryagainlater._马立杰_新浪博客...
  6. 国际c语言乱码大赛图片,国际C语言乱码大赛(IOCCC)经典之作
  7. JavaScript-正则表达式邮箱验证
  8. 如何做好一个程序员——摘自水木清华BBS
  9. Electron+React高仿bilibili客户端
  10. SDUT实验七编程题7-4 计算圆柱体的体积