其实使用GDI+画报表也比较简单,只要设定好坐标就行了
下面给个例子看看
View Code
1 private void button9_Click(object sender, EventArgs e) 2 { 3 printDialog1.ShowDialog(); //设置打印文档 4 printPreviewDialog1.Document = this.printDocument1; 5 printPreviewDialog1.PrintPreviewControl.Zoom = 1; 6 printPreviewDialog1.ClientSize = new Size(800, 800); 7 printPreviewDialog1.ShowDialog(); 8 } 9 10 private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) 11 { 12 //第一条竖线开始30,100 13 //第2条竖线坐标开始130,100 14 //第三条竖线开始230,linebegin,结束230,lineend 15 //第四条竖线开始340,linebegin,结束340,lineend 16 //第五条竖线开始460,linebegin,结束460,lineend 17 //第六条竖线开始670,linebegin,结束670,lineend 18 //最后一条竖线开始790,100 19 int y = 50; 20 int linebegin = 0; 21 int lineend = 0; 22 int end = 0; 23 Font font = new Font("宋体", 10, FontStyle.Regular); 24 Pen title_pen = new Pen(Color.Black, 1); 25 e.Graphics.DrawString("专家抽取列表", new Font("宋体", 20, FontStyle.Bold), Brushes.Black, 270, y); 26 y += 80; 27 e.Graphics.DrawLine(title_pen, 20, y, 690, y);//第一条横线 28 e.Graphics.DrawString("项目名称", font, Brushes.Black, (20 + (90 - GetWidth("项目名称", font)) / 2 - 5), y + 10); 29 e.Graphics.DrawString(this.txtname.Text.Trim(), font, Brushes.Black, (110 + (570 - GetWidth(this.txtname.Text.Trim(), font)) / 2 - 5), y + 10); 30 y += 40; 31 e.Graphics.DrawLine(title_pen, 20, y, 690, y);//第二条横线 32 e.Graphics.DrawString("招标单位", font, Brushes.Black, (20 + (90 - GetWidth("招标单位", font)) / 2 - 5), y + 10); 33 e.Graphics.DrawString(this.txtunit.Text.Trim(), font, Brushes.Black, (110 + (570 - GetWidth(this.txtunit.Text.Trim(), font)) / 2 - 5), y + 10); 34 y += 40; 35 e.Graphics.DrawLine(title_pen, 20, y, 690, y);//第三条横线 36 e.Graphics.DrawString("抽取时间", font, Brushes.Black, (20 + (90 - GetWidth("抽取时间", font)) / 2 - 5), y + 10); 37 e.Graphics.DrawString(this.txttime.Text.Trim(), font, Brushes.Black, (110 + (570 - GetWidth(this.txttime.Text.Trim(), font)) / 2 - 5), y + 10); 38 y += 40; 39 e.Graphics.DrawLine(title_pen, 20, y, 690, y);//第四条横线 40 41 linebegin = y; 42 //开始画列名 43 e.Graphics.DrawString("专业", font, Brushes.Black, (20 + (90 - GetWidth("专业", font)) / 2 - 5), y + 10); 44 e.Graphics.DrawString("姓名", font, Brushes.Black, (110 + (70 - GetWidth("姓名", font)) / 2 - 5), y + 10); 45 e.Graphics.DrawString("固定电话", font, Brushes.Black, (180 + (90 - GetWidth("固定电话", font)) / 2 - 5), y + 10); 46 e.Graphics.DrawString("手机", font, Brushes.Black, (270 + (110 - GetWidth("手机", font)) / 2 - 5), y + 10); 47 e.Graphics.DrawString("工作单位", font, Brushes.Black, (380 + (200 - GetWidth("工作单位", font)) / 2 - 5), y + 10); 48 e.Graphics.DrawString("职称", font, Brushes.Black, (580 + (110 - GetWidth("职称", font)) / 2 - 5), y + 10); 49 y += 40; 50 e.Graphics.DrawLine(title_pen, 20, y, 690, y);//第五条横线 51 //开始画table数据 52 foreach (DataGridViewRow dr in this.dataGridView2.Rows) 53 { 54 e.Graphics.DrawString(dr.Cells[1].Value.ToString(), font, Brushes.Black, (20 + (90 - GetWidth(dr.Cells[1].Value.ToString(), font)) / 2 - 5), y + 10); 55 e.Graphics.DrawString(dr.Cells[2].Value.ToString(), font, Brushes.Black, (110 + (70 - GetWidth(dr.Cells[2].Value.ToString(), font)) / 2 - 5), y + 10); 56 int phone = GetWidth(dr.Cells[3].Value.ToString(), font); 57 if (phone <= 90) 58 { 59 e.Graphics.DrawString(dr.Cells[3].Value.ToString(), font, Brushes.Black, (180 + (90 - phone) / 2 - 5), y + 10); 60 } 61 else 62 { 63 string _phone = dr.Cells[3].Value.ToString(); 64 _phone = _phone.Substring(0, 9) + "…"; 65 phone = GetWidth(_phone, font); 66 e.Graphics.DrawString(_phone, font, Brushes.Black, (180 + (90 - phone) / 2 - 5), y + 10); 67 } 68 int mobile = GetWidth(dr.Cells[4].Value.ToString(), font); 69 if (mobile <= 100) 70 { 71 e.Graphics.DrawString(dr.Cells[4].Value.ToString(), font, Brushes.Black, (270 + (110 - mobile) / 2 - 5), y + 10); 72 } 73 else 74 { 75 string _mobile = dr.Cells[4].Value.ToString(); 76 _mobile = _mobile.Substring(0, 11) + "…"; 77 phone = GetWidth(_mobile, font); 78 e.Graphics.DrawString(_mobile, font, Brushes.Black, (270 + (110 - phone) / 2 - 5), y + 10); 79 } 80 e.Graphics.DrawString(dr.Cells[5].Value.ToString(), font, Brushes.Black, (380 + (200 - GetWidth(dr.Cells[5].Value.ToString(), font)) / 2 - 5), y + 10); 81 e.Graphics.DrawString(dr.Cells[6].Value.ToString(), font, Brushes.Black, (580 + (110 - GetWidth(dr.Cells[6].Value.ToString(), font)) / 2 - 5), y + 10); 82 y += 40; 83 e.Graphics.DrawLine(title_pen, 20, y, 690, y); 84 } 85 lineend = y; 86 e.Graphics.DrawString("抽取人签字", font, Brushes.Black, (20 + (90 - GetWidth("抽取人签字", font)) / 2 - 5), y + 10); 87 y += 40; 88 e.Graphics.DrawLine(title_pen, 20, y, 690, y); 89 e.Graphics.DrawString("监督人签字", font, Brushes.Black, (20 + (90 - GetWidth("监督人签字", font)) / 2 - 5), y + 10); 90 y += 40; 91 e.Graphics.DrawLine(title_pen, 20, y, 690, y); 92 end = y; 93 94 //开始画竖线 95 //e.Graphics.DrawLine(title_pen, 20, 130, 20, y); 96 //e.Graphics.DrawLine(title_pen, 130, 130, 130, y); 97 //e.Graphics.DrawLine(title_pen, 210, linebegin, 210, lineend); 98 //e.Graphics.DrawLine(title_pen, 320, linebegin, 320, lineend); 99 //e.Graphics.DrawLine(title_pen, 440, linebegin, 440, lineend); 100 //e.Graphics.DrawLine(title_pen, 670, linebegin, 670, lineend); 101 //e.Graphics.DrawLine(title_pen, 800, 130, 800, y); 102 e.Graphics.DrawLine(title_pen, 20, 130, 20, y); 103 e.Graphics.DrawLine(title_pen, 110, 130, 110, y); 104 e.Graphics.DrawLine(title_pen, 180, linebegin, 180, lineend); 105 e.Graphics.DrawLine(title_pen, 270, linebegin, 270, lineend); 106 e.Graphics.DrawLine(title_pen, 380, linebegin, 380, lineend); 107 e.Graphics.DrawLine(title_pen, 580, linebegin, 580, lineend); 108 e.Graphics.DrawLine(title_pen, 690, 130, 690, y); 109 } 110 111 private int GetWidth(string str, Font myf) 112 { 113 Graphics g = Graphics.FromHwnd(this.Handle); 114 115 StringFormat sf = new StringFormat(StringFormat.GenericTypographic); 116 117 SizeF size = g.MeasureString(str, myf, 1000, sf); 118 119 return Convert.ToInt32(size.Width); 120 121 }
效果