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. ModSecurity防御暴力破解

    http://www.modsecurity.org/ ModSecurity防御暴力破解 在阅读本文前,先简单了解下什么是ModSecurity,ModSecurity是一个入侵探测与阻止的引擎.它 ...

  2. angular自定义指令相关知识及代码

    原文地址 https://www.jianshu.com/p/0c015862156d 大纲 1.自定义指令之——属性指令 2.自定义属性指令的运行原理 3.自定义属性指令代码实践 4.自定义结构指令 ...

  3. ios开发网络学八:NSURLSession相关代理方法

    #import "ViewController.h" @interface ViewController ()<NSURLSessionDataDelegate> /* ...

  4. js进阶 11-20 弹出层如何制作

    js进阶 11-20 弹出层如何制作 一.总结 一句话总结:其实就是一个div,控制显示和隐藏即可.设置成绝对定位更好,就可以控制弹出层出现的位置.关闭的画质需要将display重新设置为none就好 ...

  5. javascript合并数组并且删除第二项

    var m1 = [5, 6, 2];    var m2 = [4, 2, 6];    var m3 = new Array();    m1 = m1.concat(m2);     for ( ...

  6. 微信测试号开发之四 获取access_token和jsapi_ticket

    原文:https://blog.csdn.net/qq_37936542/article/details/78549233 access_token:公众号的全局唯一接口调用凭据,公众号调用各接口时都 ...

  7. ios开发事件处理之:一:UIView的拖拽

    1.ios当中常⽤的事件?  触摸事件 ,加速计事件 ,远程控制事件 2.什么是响应者对象? 继承了UIResponds的对象我们称它为响应者对象 UIApplication.UIViewContro ...

  8. Android开发和測试实践 - 接入友盟统计

    这两年一直在做无线的測试,兴许还会继续去做无线的測试,可是之前由于时间的原因一直都没有非常细致的了解到代码层面. 最近抽出时间自己做了些app的开发,决定假设想把移动的測试做好做深入.有一定的app开 ...

  9. protobuf入门教程

    1.简介和安装 2.消息类型 3.proto3 与 proto2 的区别 4.常用序列化/反序列化接口 5.repeated限定修饰符 6.枚举(enum).包(package) 7.导入定义(imp ...

  10. 【codeforces 754D】Fedor and coupons

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