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. NoSql中的B-tree、B+tree和LSM-tree 分类: B7_HBASE 2015-03-15 18:27 85人阅读 评论(0) 收藏

    总结: 1.B+树将数据完全排序,读数据时很快,但当要修改数据时,就需要将新入数据下面的数据重新排位,特别是当写入的数据排在较高的位置时,需要大量的移位操作才能完成写入. 2.SLM牺牲部分的读性能, ...

  2. Nutch的日志系统 分类: H3_NUTCH 2015-02-17 20:14 261人阅读 评论(0) 收藏

    一.Nutch日志实现方式 1.Nutch使用slf4j作为日志接口,使用log4j作为具体实现.关于二者的基础,请参考 http://blog.csdn.net/jediael_lu/article ...

  3. 数据结构与算法实验题 7.1 M 商人的求救

    问题描述: A 国正面临着一场残酷的战争,城市被支持不同领导的两股势力占据,作为一个商人,M先生并不太关心政治,但是他知道局势很严重,他希望你能救他出去.M 先生说:"为了安全起见,我们的路 ...

  4. Hadoop入门经典:WordCount 分类: A1_HADOOP 2014-08-20 14:43 2514人阅读 评论(0) 收藏

    以下程序在hadoop1.2.1上测试成功. 本例先将源代码呈现,然后详细说明执行步骤,最后对源代码及执行过程进行分析. 一.源代码 package org.jediael.hadoopdemo.wo ...

  5. C++ 中的 const 类型变量

    之前总感觉C/C++中有const 限定的变量是个很头痛的问题,一会儿能够变.一会儿不能够变,一会儿把const赋给nonconst,一会儿又把nonconst赋给const,头都被它搞大了.今天刚好 ...

  6. [Grid Layout] Place grid items on a grid using grid-column and grid-row

    It’s possible to position a grid item anywhere on a grid track. To do this, let’s specify some grid- ...

  7. 前端切图:一个好看的表格css样式

    <!DOCTYPE html><html>        <head>        <meta charset="UTF-8">  ...

  8. [Angular] Some performance tips

    The talk from here. 1. The lifecycle in Angular component: constructor vs ngOnInit: Constructor: onl ...

  9. 20171028洛谷NOIP模拟

    传送门 题目分析: A:对一个初始值全部为0的序列进行一系列的区间修改(加)和询问(某一区间中满足\(min \le a_i * i \% mod \le max\)的元素个数). 第一眼看第一题怎么 ...

  10. Gini 系数与熵的关系

    首先来看二者的基本定义: ⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪H(X)=−∑k=1KpklnpkGini(X)=∑k=1Kpk(1−pk) 将 f(x)=−lnx 在 x=1 处进行一阶泰勒展开(忽略高阶无穷小 ...