您的位置:首页 > 编程语言 > C#

C#实现三线表格格式打印

2015-09-08 15:47 525 查看
经过两天的调试终于达到让自己满足的效果,贴出部分程序,方便以后使用

private int _pages = 0;//页码
private int _itemCount = 0; //项计数器
private bool _isFirstPage = true;
private  int _count = 0;//行计数器
/// <summary>
/// 打印,以三线制表格格式打印告警信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
Graphics g = e.Graphics;
float yPosition = 0;//绘制字符串的纵向位置
float leftmargin = e.MarginBounds.Left; //左边距
float topMargin = e.MarginBounds.Top;
float paperWidth = e.MarginBounds.Width;
Font printFont = new Font(new FontFamily("黑体"),9);
float fontHeight = printFont.GetHeight(g);
SizeF fontSize = g.MeasureString("告", printFont);//正文字体尺寸(高,宽)
SizeF titleFontSize = g.MeasureString("监", new Font(new FontFamily("黑体"),11));//标题字体尺寸
SolidBrush printBrush = new SolidBrush(Color.Black);
//一页所能打印行数
var linesPerPage = e.MarginBounds.Height/fontHeight-5;

if (_isFirstPage) {
//打印标题
g.DrawString("标题", new Font(new FontFamily("黑体"), 11), printBrush,
new PointF(paperWidth/2 - 4*titleFontSize.Width, topMargin));
//打印副标题
yPosition = topMargin + titleFontSize.Height;
g.DrawString(string.Format("ID: {0}\t告警等级: {1}", _printTrfId, _printAlarmLevel), printFont,printBrush, new PointF(leftmargin, yPosition));
yPosition = yPosition + 3 * fontSize.Height / 2;
_pages = 0;
_count = 0;
_isFirstPage = false;
}
//打印上边框,三线表格第一线
g.DrawLine(Pens.Black,new Point((int)leftmargin, (int)(yPosition)),new Point((int)paperWidth, (int)(yPosition)));
//打印表头,列标头
yPosition += fontSize.Height/2;
float x1 = leftmargin + g.MeasureString("2015/9/6 15:58:43", printFont).Width;
g.DrawString(_colHeader[0].Text, printFont, printBrush, new PointF((x1 + leftmargin) / 2 - 2 * fontSize.Width, yPosition));//告警时间
float x2 = x1 + fontSize.Width;
g.DrawString(_colHeader[1].Text, printFont, printBrush, new PointF(x2, yPosition));//ID
float x3 = x2 + g.MeasureString(_colHeader[1].Text, printFont).Width + fontSize.Width;
g.DrawString(_colHeader[2].Text, printFont, printBrush, new PointF(x3, yPosition));//告警等级
float x4 = x3 + g.MeasureString(_colHeader[2].Text, printFont).Width + 3 * fontSize.Width;
g.DrawString(_colHeader[3].Text, printFont, printBrush, new PointF(x4, yPosition));//告警参数
float x5 = x4 + g.MeasureString("最大参数值名", printFont).Width;//+ 4 * fontSize.Width;
g.DrawString(_colHeader[4].Text, printFont, printBrush, new PointF((x4 + paperWidth) / 2 - 2 * fontSize.Width, yPosition));
//打印表格线,三线表格第二线
yPosition += 3*fontSize.Height/2;
g.DrawLine(Pens.Black, new Point((int)leftmargin, (int)(yPosition)), new Point((int)paperWidth, (int)(yPosition)));
//打印表内容
yPosition += fontSize.Height/2;
float leftWidth = paperWidth - x5+8*fontSize.Width;//剩余宽度
while (yPosition/fontHeight < linesPerPage && _itemCount > 0) {
if (_listViewItems[_count].SubItems[1].Text == _printTrfId && _listViewItems[_count].SubItems[2].Text == _printAlarmLevel)
yPosition = DrawItems(g, _listViewItems, _count, printFont, printBrush, leftmargin, yPosition, fontSize, x2, x3, x4, leftWidth, x5);
else if (_printTrfId== "All"&& _listViewItems[_count].SubItems[2].Text == _printAlarmLevel)
yPosition = DrawItems(g, _listViewItems, _count, printFont, printBrush, leftmargin, yPosition, fontSize, x2, x3, x4, leftWidth, x5);
else if (_printAlarmLevel == "All"&& _listViewItems[_count].SubItems[1].Text == _printTrfId)
yPosition = DrawItems(g, _listViewItems, _count, printFont, printBrush, leftmargin, yPosition, fontSize, x2, x3, x4, leftWidth, x5);
else if (_printTrfId == "All" && _printAlarmLevel == "All")
yPosition = DrawItems(g, _listViewItems, _count, printFont, printBrush, leftmargin, yPosition, fontSize, x2, x3, x4, leftWidth, x5);
_count++;
_itemCount--;
}
//打印底边框,三线表格第三线
yPosition += fontSize.Height / 2;
g.DrawLine(Pens.Black, new Point((int)leftmargin, (int)(yPosition)), new Point((int)paperWidth, (int)(yPosition)));
//判断是否打印多页
if (_itemCount > 0) {
e.HasMorePages = true;
} else {
e.HasMorePages = false;
_isFirstPage = true;
//打印签字位置
yPosition += fontSize.Height;
g.DrawString(
string.Format("时间: {0}\t\t负责人___________", DateTime.Now.ToString(CultureInfo.CurrentCulture)),
printFont, printBrush, new PointF(leftmargin, yPosition));
}
//打印页数
_pages++;
g.DrawString(_pages.ToString(), printFont, printBrush, new PointF(paperWidth/2, e.MarginBounds.Height-5*fontSize.Height/2));
}
/// <summary>
/// 打印告警项
/// </summary>
/// <param name="g"></param>
/// <param name="listViewItem"></param>
/// <param name="count"></param>
/// <param name="printFont"></param>
/// <param name="printBrush"></param>
/// <param name="leftmargin"></param>
/// <param name="yPosition"></param>
/// <param name="fontSize"></param>
/// <param name="x2"></param>
/// <param name="x3"></param>
/// <param name="x4"></param>
/// <param name="leftWidth"></param>
/// <param name="x5"></param>
/// <returns></returns>
private static float DrawItems(Graphics g, ListView.ListViewItemCollection listViewItem, int count, Font printFont,
SolidBrush printBrush, float leftmargin, float yPosition, SizeF fontSize, float x2, float x3, float x4,
float leftWidth, float x5)
{
yPosition += fontSize.Height;
//告警时间
g.DrawString(listViewItem[count].SubItems[0].Text, printFont, printBrush,
new PointF(leftmargin, yPosition - 3*fontSize.Height/4));
//ID
var xPosition = x2 + 2*fontSize.Width/3; //绘制字符串的横向位置
g.DrawString(listViewItem[count].SubItems[1].Text, printFont, printBrush,
new PointF(xPosition, yPosition - 3*fontSize.Height/4));
//告警等级
if (listViewItem[count].SubItems[2].Text.Length == 4)
xPosition = x3;
else xPosition = x3 + fontSize.Width/2;
g.DrawString(listViewItem[count].SubItems[2].Text, printFont, printBrush,
new PointF(xPosition, yPosition - 3*fontSize.Height/4));
//告警参数
if (listViewItem[count].SubItems[3].Text.Length > 4)
xPosition = x4 - 3*fontSize.Width/2;
else xPosition = x4;
g.DrawString(listViewItem[count].SubItems[3].Text, printFont, printBrush,
new PointF(xPosition, yPosition - 3*fontSize.Height/4));
//告警信息
if (listViewItem[count].SubItems[4].Text.Length*fontSize.Width > leftWidth) {
g.DrawString(listViewItem[count].SubItems[4].Text.Substring(0, (int) (leftWidth/fontSize.Width)), printFont,
printBrush, new PointF(x5, yPosition - 3*fontSize.Height/4));
yPosition += fontSize.Height;
if (listViewItem[count].SubItems[4].Text.Length*fontSize.Width - leftWidth > leftWidth) {
g.DrawString(
listViewItem[count].SubItems[4].Text.Substring((int) (leftWidth/fontSize.Width),
(int) (leftWidth/fontSize.Width)), printFont, printBrush,
new PointF(x5, yPosition - 3*fontSize.Height/4));
yPosition += fontSize.Height;
g.DrawString(listViewItem[count].SubItems[4].Text.Substring((int) (leftWidth/fontSize.Width)*2), printFont,
printBrush, new PointF(x5, yPosition - 3*fontSize.Height/4));
} else {
g.DrawString(listViewItem[count].SubItems[4].Text.Substring((int) (leftWidth/fontSize.Width)), printFont,
printBrush, new PointF(x5, yPosition - 3*fontSize.Height/4));
}
} else {
g.DrawString(listViewItem[count].SubItems[4].Text, printFont, printBrush,
new PointF(x5, yPosition - 3*fontSize.Height/4));
}
return yPosition;
}


效果图:



待改进地方:1、创建成类

2、所有行水平居中,特别是告警信息为多行时;

3、页面设置功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: