C#实现三线表格格式打印
2015-09-08 15:47
525 查看
经过两天的调试终于达到让自己满足的效果,贴出部分程序,方便以后使用
效果图:
待改进地方:1、创建成类
2、所有行水平居中,特别是告警信息为多行时;
3、页面设置功能。
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、页面设置功能。
相关文章推荐
- 【C#基本功 控件的用法】 委托
- C#------访问修饰符
- Valid Parentheses C#
- C#学习笔记之——接口实例
- C#中的BackgroundWorker控件+Delegate.Invoke (委托同步调用)
- C#委托
- C# winform 上传文件、图片
- C# 重启程序本身
- C#------猜拳游戏
- C#版Websocket实例
- c# socket 获取本机的IP地址
- 正则表达式(c#)
- C#中的反射
- VC使用GSOAP调用C#WCF服务
- C# 获取当前路径方法
- c#中的delegate
- C#------在线支付案例
- C#求平均分和高于平均分的同学姓名。
- C#中随机生成指定长度的密码
- c#获取页面重定向url