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. 【u123】最大子段和

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 给出一段序列,选出其中连续且非空的一段使得这段和最大. [输入格式] 输入文件maxsum1.in的第 ...

  2. [Recompose] Set the HTML Tag of a Component via a Prop using Recompose

    Learn how to user the ‘componentFromProp’ helper and ‘defaultProps’ higher order component to swap t ...

  3. Android中的消息机制:Handler消息传递机制 分类: H1_ANDROID 2013-10-27 22:54 1755人阅读 评论(0) 收藏

    参考<疯狂android讲义>第2版3.5 P214 一.背景 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为 ...

  4. WP8.1:onedrive操作

    小梦今天给大家分享一下windows phone 8.1开发 onedrive中的一些操作: Windows phone 8.1 中 onedrive 登录 Windows phone 8.1 中 o ...

  5. 【30.49%】【codeforces 569A】Music

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  6. 前端开发必备调试工具(Chrome的F12自带的功能和firebug插件差不多)

    前端开发必备调试工具(Chrome的F12自带的功能和firebug插件差不多) 一.总结 Chrome的F12自带的功能和firebug插件差不多 二.前端开发必备调试工具 在前端开发中我们经常会要 ...

  7. 小强的HTML5移动开发之路(52)——jquerymobile中的触控交互

    当使用移动设备进行触控操作时,最常用的就是轻击.按住屏幕或者手势操作,jQuery Mobile可以通过绑定的触控事件来响应使用者的特定触控行为. 一.轻击与按住 直接上代码(一切皆在代码中,细细品吧 ...

  8. 【codeforces 750A】New Year and Hurry

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. Erlang中日志管理

    http://blog.sina.com.cn/s/blog_96b8a1540101317g.html 一.基本概念 在Erlang中,通过两个概念管理错误事情:事件管理器(event manage ...

  10. 使用PowerDesigner15在win7下的系统MySQL p相反roject(一)

    使用PowerDesigner15在win7下的系统MySQL 相反project 1.首先.安装下面的驱动 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv ...