1.封装好的辅助类:

 using System;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.Windows.Forms; namespace RC.Finance
{
/// <summary>
/// 打印,打印预览
/// </summary>
public class PrintHelper
{
//以下用户可自定义
//当前要打印文本的字体及字号
private const int HeadHeight = ;
private static readonly Font TableFont = new Font("Verdana", , FontStyle.Regular);
private readonly SolidBrush _drawBrush = new SolidBrush(Color.Black);
//表头字体
private readonly Font _headFont = new Font("Verdana", , FontStyle.Bold);
//表头文字
private readonly int _yUnit = TableFont.Height * ;
public int TotalNum = ;
//以下为模块内部使用
private DataRow _dataRow;
private DataTable _dataTable;
private int _firstPrintRecordNumber;
private string _headText = string.Empty;
private int _pBottom;
private int _pHeigh;
//当前要所要打印的记录行数,由计算得到
private int _pageLeft;
private int _pRight;
private int _pageTop;
private int _pWidth;
private int _pageRecordNumber;
private PrintDocument _printDocument;
private PageSetupDialog _pageSetupDialog;
private int _printRecordComplete;
//每页打印的记录条数
private int _printRecordNumber;
private int _printingPageNumber = ;
//第一页打印的记录条数
//与列名无关的统计数据行的类目数(如,总计,小计......)
private int _totalPage;
private int[] _xUnit; /// <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
{
var printPriview = new PrintPreviewDialog
{
Document = CreatePrintDocument(dt, title),
WindowState = FormWindowState.Maximized
};
printPriview.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show("打印错误,请检查打印设置!");
}
}
public void PrintSetting()
{
try
{
_pageSetupDialog.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show("打印错误,请检查打印设置!");
}
}
/// <summary>
/// 创建打印文件
/// </summary>
private PrintDocument CreatePrintDocument(DataTable dt, string title)
{
_dataTable = dt;
_headText = title; var pageSetup = new PageSetupDialog(); _printDocument = new PrintDocument { DefaultPageSettings = pageSetup.PageSettings };
_printDocument.DefaultPageSettings.Landscape = true; //设置打印横向还是纵向
//PLeft = 30; //DataTablePrinter.DefaultPageSettings.Margins.Left;
_pageTop = _printDocument.DefaultPageSettings.Margins.Top;
//PRight = DataTablePrinter.DefaultPageSettings.Margins.Right;
_pBottom = _printDocument.DefaultPageSettings.Margins.Bottom;
_pWidth = _printDocument.DefaultPageSettings.Bounds.Width;
_pHeigh = _printDocument.DefaultPageSettings.Bounds.Height;
_xUnit = new int[_dataTable.Columns.Count];
_printRecordNumber = Convert.ToInt32((_pHeigh - _pageTop - _pBottom - _yUnit) / _yUnit);
_firstPrintRecordNumber = Convert.ToInt32((_pHeigh - _pageTop - _pBottom - HeadHeight - _yUnit) / _yUnit); if (_dataTable.Rows.Count > _printRecordNumber)
{
if ((_dataTable.Rows.Count - _firstPrintRecordNumber) % _printRecordNumber == )
{
_totalPage = (_dataTable.Rows.Count - _firstPrintRecordNumber) / _printRecordNumber + ;
}
else
{
_totalPage = (_dataTable.Rows.Count - _firstPrintRecordNumber) / _printRecordNumber + ;
}
}
else
{
_totalPage = ;
} _printDocument.PrintPage += PrintDocumentPrintPage;
_printDocument.DocumentName = _headText; return _printDocument;
} /// <summary>
/// 打印当前页
/// </summary>
private void PrintDocumentPrintPage(object sende, PrintPageEventArgs @event)
{
int tableWith = ;
string columnText;
var font = new StringFormat { Alignment = StringAlignment.Center };
var pen = new Pen(Brushes.Black, );//打印表格线格式 #region 设置列宽 foreach (DataRow dr in _dataTable.Rows)
{
for (int i = ; i < _dataTable.Columns.Count; i++)
{
int colwidth = Convert.ToInt32(@event.Graphics.MeasureString(dr[i].ToString().Trim(), TableFont).Width);
if (colwidth > _xUnit[i])
{
_xUnit[i] = colwidth;
}
}
} if (_printingPageNumber == )
{
for (int cols = ; cols <= _dataTable.Columns.Count - ; cols++)
{
columnText = _dataTable.Columns[cols].ColumnName.Trim();
int colwidth = Convert.ToInt32(@event.Graphics.MeasureString(columnText, TableFont).Width);
if (colwidth > _xUnit[cols])
{
_xUnit[cols] = colwidth;
}
}
}
for (int i = ; i < _xUnit.Length; i++)
{
tableWith += _xUnit[i];
} #endregion _pageLeft = (@event.PageBounds.Width - tableWith) / ;
int x = _pageLeft;
int y = _pageTop;
int stringY = _pageTop + (_yUnit - TableFont.Height) / ;
int rowOfTop = _pageTop; //第一页
if (_printingPageNumber == )
{
//打印表头
var arr = _headText.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
if (arr.Length > )
{
@event.Graphics.DrawString(arr[],
_headFont,
_drawBrush,
new Point(@event.PageBounds.Width / , _pageTop), font);
}
//副标题
var subtitleHeight = ;
for (int i = ; i < arr.Length; i++)
{
@event.Graphics.DrawString(arr[i],
new Font("Verdana", , FontStyle.Regular),
_drawBrush,
new Point(@event.PageBounds.Width / , _pageTop + _headFont.Height),
font);
subtitleHeight += new Font("Verdana", , FontStyle.Regular).Height;
} //设置为第一页时行数
if (_dataTable.Rows.Count < _firstPrintRecordNumber)
{
_pageRecordNumber = _dataTable.Rows.Count;
}
else
{
_pageRecordNumber = _firstPrintRecordNumber;
} rowOfTop = y = (_pageTop + _headFont.Height + subtitleHeight + );
stringY = _pageTop + _headFont.Height + subtitleHeight + + (_yUnit - TableFont.Height) / ;
}
else
{
//计算,余下的记录条数是否还可以在一页打印,不满一页时为假
if (_dataTable.Rows.Count - _printRecordComplete >= _printRecordNumber)
{
_pageRecordNumber = _printRecordNumber;
}
else
{
_pageRecordNumber = _dataTable.Rows.Count - _printRecordComplete;
}
} #region 列名 if (_printingPageNumber == || _pageRecordNumber > TotalNum) //最后一页只打印统计行时不打印列名
{
//得到datatable的所有列名
for (int cols = ; cols <= _dataTable.Columns.Count - ; cols++)
{
columnText = _dataTable.Columns[cols].ColumnName.Trim(); int colwidth = Convert.ToInt32(@event.Graphics.MeasureString(columnText, TableFont).Width);
@event.Graphics.DrawString(columnText, TableFont, _drawBrush, x, stringY);
x += _xUnit[cols];
}
} #endregion @event.Graphics.DrawLine(pen, _pageLeft, rowOfTop, x, rowOfTop);
stringY += _yUnit;
y += _yUnit;
@event.Graphics.DrawLine(pen, _pageLeft, y, x, y); //当前页面已经打印的记录行数
int printingLine = ;
while (printingLine < _pageRecordNumber)
{
x = _pageLeft;
//确定要当前要打印的记录的行号
_dataRow = _dataTable.Rows[_printRecordComplete];
for (int cols = ; cols <= _dataTable.Columns.Count - ; cols++)
{
@event.Graphics.DrawString(_dataRow[cols].ToString().Trim(), TableFont, _drawBrush, x, stringY);
x += _xUnit[cols];
}
stringY += _yUnit;
y += _yUnit;
@event.Graphics.DrawLine(pen, _pageLeft, y, x, y); printingLine += ;
_printRecordComplete += ;
if (_printRecordComplete >= _dataTable.Rows.Count)
{
@event.HasMorePages = false;
_printRecordComplete = ;
}
} @event.Graphics.DrawLine(pen, _pageLeft, rowOfTop, _pageLeft, y);
x = _pageLeft;
for (int cols = ; cols < _dataTable.Columns.Count; cols++)
{
x += _xUnit[cols];
@event.Graphics.DrawLine(pen, x, rowOfTop, x, y);
} _printingPageNumber += ; if (_printingPageNumber > _totalPage)
{
@event.HasMorePages = false;
_printingPageNumber = ;
_printRecordComplete = ;
}
else
{
@event.HasMorePages = true;
}
}
}
}

2.调用方法:

打印:new PrintHelper().Print(dataTable,title);

预览:new PrintHelper().PrintPriview(dataTable,title);

3.效果:

C# PrintDocument 打印表格的更多相关文章

  1. C# 使用PrintDocument 绘制表格 完成 打印预览

    C# 使用PrintDocument 绘制表格 完成 打印预览 DataTable   经过不断的Google与baidu,最终整理出来的打印类 主要是根据两个参考的类组合而成,稍微修改了一下,参考代 ...

  2. C# 使用PrintDocument 绘制表格 完成 打印预览 DataTable

    经过不断的Google与baidu,最终整理出来的打印类 主要是根据两个参考的类组合而成,稍微修改了一下,参考代码及来源见最后(其中一份是VB语言的) 其中遇到的一些问题也已经得到了解决(分页,打印预 ...

  3. Lodop打印表格带页头页尾 自动分页每页显示头尾

    Lodop中有两种专门给超文本表格的方式,ADD_PRINT_TABLE和ADD_PRINT_TBURL,该方式只能用于单个表格,表格外的内容不显示,是专门用于打印html超文本表格的.使用这两个语句 ...

  4. Lodop打印表格带页头页尾 高度是否包含页头页尾

    通过设置TableHeightScope,可以实现对ADD_PRINT_TABLE,表格带页头页尾,查看本博客另一篇博文:Lodop打印表格带页头页尾 自动分页每页显示头尾 超文本超过打印项高度,会自 ...

  5. PrintDocument打印、预览、打印机设置和打印属性的方法

    WindowsForm 使用 PrintDocument打印.预览.打印机设置和打印属性的方法. private void Form1_Load(object sender, System.Event ...

  6. MVC打印表格,把表格内容放到部分视图打印

    假设在一个页面上有众多内容,而我们只想把该页面上的表格内容打印出来,window.print()方法会把整个页面的内容打印出来,如何做到只打印表格内容呢? 既然window.print()只会打印整页 ...

  7. Lodop打印表格带页头页尾 高度是否包含页头页尾 转载

    通过设置TableHeightScope,可以实现对ADD_PRINT_TABLE,表格带页头页尾,查看本博客另一篇博文:Lodop打印表格带页头页尾 自动分页每页显示头尾 超文本超过打印项高度,会自 ...

  8. Java Console/控制台 打印表格

    功能:控制台打印表格,支持字段动态长度,左对齐,右对齐,居中,设置最大列长,设置列间隔符,设置最多打印多少行. 类下载地址:http://download.csdn.net/download/j506 ...

  9. Python打印表格

    使用Python在终端打印表格 import prettytable table = PrettyTable(['Title1', 'Title2', 'Title3']) table.add_row ...

随机推荐

  1. python排序查找

    无序表查找 def seq_search(lst, key): found = False pos = 0 while pos < len(lst) and not found: if lst[ ...

  2. 摘录-MYSQL5.7版本sql_mode=only_full_group_by问题

    下载安装的是最新版的mysql5.7.x版本,默认是开启了 only_full_group_by 模式的,但开启这个模式后,原先的 group by 语句就报错,然后又把它移除了. 一旦开启 only ...

  3. [转载]netcore 使用surging框架发布到docker

    demo运行在windows的docker中,系统是win10,所以需要先下载Docker for Windows,安装完毕后系统会重启,然后桌面上可以找到Docker for Windows的快捷图 ...

  4. js进阶正则表达式10-分组-多行匹配-正则对象的属性(小括号作用:分组,将小括号里面的东西看成一个整体,因为量词只对前一个字符有效)(多行匹配:m)(属性使用:reg.global)

    js进阶正则表达式10-分组-多行匹配-正则对象的属性(小括号作用:分组,将小括号里面的东西看成一个整体,因为量词只对前一个字符有效)(多行匹配:m)(属性使用:reg.global) 一.总结 1. ...

  5. JavaEE分层知识点粗略解释

    JavaEE知识点总结 什么是分层开发? 一种化大为小,分而治之的软件开发方法. 分层的特点: 1.每一层都有自己的责任. 2.上一层不用关心下一层的实现细节,上一层通过下一层 提供的对外接口来使用其 ...

  6. PhpStorm常用快捷键(不多够用)

    PhpStorm常用快捷键(不多够用) 一.总结 一句话总结: 1.前进 解答:Ctrl+shift+ z 2.跳转到指定行数 解答:Ctrl+G 3.块注释 解答:ctrl + shift + / ...

  7. 自己动手编写一个VS插件(八)

    作者:朱金灿 来源:http://blog.csdn.net/clever101 利用业余时间继续开发一个VS插件.我要开发的插件是一个代码库插件,主要是用于积累我平时要使用的代码.在之前我已经实现了 ...

  8. 社会化登录分享-Android SDK的二次封装和使用

    本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤. 0 系列文章 系列一 Android SDK的二次封装和使用 系列二 源码解析 系列三 微信SDK接入 系 ...

  9. css3使用transform属性制作js弹性运动

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  10. 编辑框等控件边框美化(继承CEdit,然后覆盖OnMouseLeave, OnSetFocus, OnPaint函数即可。原来的CEdit虽然代码不可见,但它也是有句柄的,照样随便画)

    源码说明:美化能获取焦点控件的边框颜色,获取焦点后颜色不同(类似彗星小助手.QQ等软件),支持自定义颜色,支持单独设置各个控件颜色.实现方法:子类化,在WM_NCPAINT.WM_PAINT等消息自己 ...