-- 作者:程兴刚
-- 发布时间:2011/1/3 0:48:00
-- [分享] 专业报表设计巧用rows.Count
专业报表中,设计时很多狐友都在引用行或单元格时,都直接指定行数,比如:rt.cells(0,0)或rt.rows(0),由于专业报表设计过程就像贺老师说的“就像堆积木一样 ”,当您在设计时,需要在前面的某一位置插入一行,或者增加一个分组行,或者后来想嵌套更多层次的分组行,那么,这种直接以树枝形式引用行位置的地方都必须一个一个进行修改,某些时候容易出错,调试也麻烦,在这里介绍一个巧用rows.Count解决的办法,这样您可以在设计的时候从任意位置插入行,而不需要修改其他代码:
\'\'\' Dim doc As New PrintDoc() \'定义一个报表 \'doc.PageSetting.Width = 210 \'纸张宽度为210毫米 \'doc.PageSetting.Height = 120 \'纸张高度为120毫米 \'doc.AutoRotate = False \'禁止自动旋转打印内容 \'doc.PageSetting.Landscape = True \'横向打印 Doc.PageSetting.LeftMargin = 25 \'设置左边距 Doc.PageSetting.RightMargin = 15 \'设置右边距 Doc.PageSetting.TopMargin = 0 \'设置上边距 Doc.PageSetting.BottomMargin = 0 \'设置下边距 Dim rt As New prt.RenderTable() \'定义一个表格对象 rt.Style.GridLines.All = New prt.LineDef \'将网格线类型设为默认类型 rt.Style.TextAlignHorz = prt.AlignHorzEnum.Center \'水平居中 rt.Style.TextAlignVert = prt.AlignVertEnum.Center \'垂直居中 rt.Style.Spacing.Top = 4 \'表格和前面对象的垂直间隔为4毫米 rt.Style.Spacing.Bottom = 10 \'表和和后续对象的垂直间隔为10毫米 rt.Style.Spacing.All = 1 报表所有网格线为1mm rt.y = "20mm" rt.Style.GridLines.All = New Prt.LineDef(0.5,Color.Black) rt.Style.GridLines.Horz = new Prt.LineDef(Color.Black) rt.Style.GridLines.Vert = new Prt.LineDef(Color.Black) rt.Rows.Count = 1 \'设置行数,需要注意的是,新增报表总行数设置为1行 rt.Cols.Count = 7 \'设置列数,列数根据您的需要 rt.cells(rt.Rows.Count-1,0).Text ="北京燕化集资建房幸福新村1#楼工程班组结算单",因为总行数为1行,所以首次设置内容的时候,引用行位置为rt.Rows.Count-1
rt.Rows(rt.Rows.Count-1).Height = 13 & "mm" ‘设置首行高度为13mm rt.Rows(rt.Rows.Count-1).Style.GridLines.All = new Prt.LineDef(0,Color.Black) ’设置首行所有网格线为0——无网格线 rt.rows(rt.Rows.Count-1).Style.Font = New Font("隶书", 18,FontStyle.bold) \'设置文本对象的字体 rt.Cells(rt.Rows.Count-1,0).SpanCols = 7 \'第1行第所有单元格为一个完整单元格。
rt.cells(rt.Rows.Count,0).Text = "部门或姓名:" & e.Form.Controls("ComboBox1").Value & "结算清单"
\'关键在于上面这一行,这里设置内容引用行位置的时候,直接rt.Rows.Count,这样专业报表也就自动增加了1行,因为引用位置没有减一,也就是抓住了专业报表设置内容自动增加行的特性。 rt.Cells(rt.Rows.Count-1,0).SpanCols = 7 \'第2行第1个单元格向右合并7列,
\'而到了这里,直接给最后行设置内容而不需要增加行,所以在这里必须减1,所以引用行位置因为rt.Rows.Count-1,再往下面的代码我就不需要解释,大家只需要区别需要增加行时,引用行位置的为rt.Rows.Count,不需要增加行的时候为rt.Rows.Count-1,这样您在设计报表的过程中您可以从任意位置插入行,也可以从任意位置嵌套多级分组统计行,您只需要在插入相应代码即可。
rt.rows(rt.Rows.Count-1).Style.Font = New Font("黑体",12) \'设置文本对象的字体 rt.Rows(rt.Rows.Count-1).Height = 6 & "mm" rt.rows(rt.Rows.Count-1).Style.TextAlignHorz = prt.AlignHorzEnum.left \'水平居左 rt.Rows(rt.Rows.Count-1).Style.GridLines.left = new Prt.LineDef(0,Color.Black) rt.Rows(rt.Rows.Count-1).Style.GridLines.Right =new Prt.LineDef(0,Color.Black) rt.cells(rt.Rows.Count,0).Text = "序号" rt.cells(rt.Rows.Count-1,1).Text = "凭证号" rt.cells(rt.Rows.Count-1,2).Text = "附件编号" rt.cells(rt.Rows.Count-1,3).Text = "摘 要" rt.cells(rt.Rows.Count-1,4).Text = "金 额" rt.cells(rt.Rows.Count-1,5).Text = "日 期" rt.cells(rt.Rows.Count-1,6).Text = "备 注" rt.Rows(rt.Rows.Count-1).Height = 12 & "mm" rt.rows(rt.Rows.Count-1).Style.Font = New Font("宋体", 12,FontStyle.bold) \'设置文本对象的字体 rt.Rows(rt.Rows.Count-1).Style.BackColor = Color.LightGray \'第一行背景颜色设为灰色. rt.rows(rt.Rows.Count-1).Style.TextAlignHorz = prt.AlignHorzEnum.Center \'水平居中 rt.RowGroups(0,3).Header = prt.TableHeaderEnum.All \'将前三行作为表头. rt.Cols(0).Width = 12 & "mm" rt.Cols(1).Width = 35 & "mm" rt.Cols(2).Width = 16 & "mm" rt.Cols(3).Width = 60 & "mm" rt.Cols(4).Width = 40 & "mm" rt.Cols(5).Width = 30 & "mm" rt.Cols(6).Width = 20 & "mm" rt.cells(rt.Rows.Count,0).text = "一、应付金额大写:" & CUMoney(DataTables("成本明细帐").Compute("Sum(金额)", "科目 = \'应付款\' and 部门或单位 = \'" & e.Form.Controls("ComboBox1").Value & "\'")) & "(小写:" & format(DataTables("成本明细帐").Compute("Sum(金额)", "科目 = \'应付款\' and 部门或单位 = \'" & e.Form.Controls("ComboBox1").Value & "\'"),"0.00") & "元)" rt.rows(rt.Rows.Count-1).Style.TextAlignHorz = prt.AlignHorzEnum.left \'水平居左 rt.Cells(rt.Rows.Count-1,0).SpanCols = 7 \'第4行第1个单元格向右合并7列 rt.rows(rt.Rows.Count-1).Style.Font = New Font("宋体", 12,FontStyle.bold) \'设置文本对象的字体 rt.Rows(rt.Rows.Count-1).Height = 12 & "mm" Dim drs As List(Of DataRow) drs = DataTables("成本明细帐").Select("科目 = \'应付款\' and 部门或单位 = \'" & e.Form.Controls("ComboBox1").Value & "\'") For i As Integer = 0 To drs.Count-1 rt.cells(rt.Rows.Count,0).text = Format(i+1,"00") rt.cells(rt.Rows.Count-1,1).text = drs(i)("凭证号") rt.cells(rt.Rows.Count-1,2).text = drs(i)("单据编号") rt.cells(rt.Rows.Count-1,3).text = drs(i)("摘要") rt.cells(rt.Rows.Count-1,4).text = format(drs(i)("金额"),"0.00") rt.cells(rt.Rows.Count-1,5).text = drs(i)("日期") rt.cells(rt.Rows.Count-1,6).text = drs(i)("备注") rt.Rows(rt.Rows.Count-1).Height = 8 & "mm" rt.cells(rt.Rows.Count-1,3).Style.TextAlignHorz = prt.AlignHorzEnum.left \'水平居左 rt.cells(rt.Rows.Count-1,4).Style.TextAlignHorz = prt.AlignHorzEnum.Right \'水平靠右 Next rt.cells(rt.Rows.Count,0).text = "二、已付金额大写:" & CUMoney(DataTables("成本明细帐").Compute("Sum(金额)", "科目 = \'已付款\' and 部门或单位 = \'" & e.Form.Controls("ComboBox1").Value & "\'")) & "(小写:" & format(DataTables("成本明细帐").Compute("Sum(金额)", "科目 = \'已付款\' and 部门或单位 = \'" & e.Form.Controls("ComboBox1").Value & "\'"),"0.00") & "元)" rt.Cells(rt.Rows.Count-1,0).SpanCols = 7 \'第N行第1个单元格向右合并7列,到这里我也不知道是多少行,代码自动根据前面的筛选结果和添加的行来决定位置,只知道截止当前为最后一行。 rt.rows(rt.Rows.Count-1).Style.TextAlignHorz = prt.AlignHorzEnum.left \'水平居左 rt.rows(rt.Rows.Count-1).Style.Font = New Font("宋体", 12,FontStyle.bold) \'设置文本对象的字体 rt.Rows(rt.Rows.Count-1).Height = 10 & "mm" drs = DataTables("成本明细帐").Select("科目 = \'已付款\' and 部门或单位 = \'" & e.Form.Controls("ComboBox1").Value & "\'") For i As Integer = 0 To drs.Count-1 rt.cells(rt.Rows.Count,0).text = Format(i+1,"00") rt.cells(rt.Rows.Count-1,1).text = drs(i)("凭证号") rt.cells(rt.Rows.Count-1,2).text = drs(i)("单据编号") rt.cells(rt.Rows.Count-1,3).text = drs(i)("摘要") rt.cells(rt.Rows.Count-1,4).text = format(drs(i)("金额"),"0.00") rt.cells(rt.Rows.Count-1,5).text = drs(i)("日期") rt.cells(rt.Rows.Count-1,6).text = drs(i)("备注") rt.Rows(rt.Rows.Count-1).Height = 8 & "mm" rt.cells(rt.Rows.Count-1,3).Style.TextAlignHorz = prt.AlignHorzEnum.left \'水平居左 rt.cells(rt.Rows.Count-1,4).Style.TextAlignHorz = prt.AlignHorzEnum.Right \'水平靠右 Next Dim y As Integer = DataTables("成本明细帐").Compute("Sum(金额)", "科目 = \'应付款\' and 部门或单位 = \'" & e.Form.Controls("ComboBox1").Value & "\'") - DataTables("成本明细帐").Compute("Sum(金额)", "科目 = \'已付款\' and 部门或单位 = \'" & e.Form.Controls("ComboBox1").Value & "\'") If y > 0 rt.cells(rt.Rows.Count,0).text = "三、应结余额大写:" & CUMoney(y) & "(小写:" & format(y,"0.00") & "元)" Else rt.cells(rt.Rows.Count,0).text = "三、应结余额大写:负" & CUMoney( Math.Abs(y)) & "(小写:" & format(y,"0.00") & "元)" rt.cells(rt.Rows.Count-1,0).Style.BackColor = Color.red End If rt.Cells(rt.Rows.Count-1,0).SpanCols = 7 \'第N行第0个单元格向右合并7列,这里同样只知道为最后一行
rt.rows(rt.Rows.Count-1).Style.TextAlignHorz = prt.AlignHorzEnum.left \'水平居左 rt.rows(rt.Rows.Count-1).Style.Font = New Font("宋体", 12,FontStyle.bold) \'设置文本对象的字体 rt.Rows(rt.Rows.Count-1).Height = 10 & "mm" rt.cells(rt.Rows.Count,0).text = "备注" rt.rows(rt.Rows.Count-1).Style.Font = New Font("宋体", 12,FontStyle.bold) \'设置文本对象的字体 rt.Cells(rt.Rows.Count-1,1).SpanCols = 6 \'第2行第2个单元格向右合并3列 rt.Rows(rt.Rows.Count-1).Height = 20 & "mm" rt.cells(rt.Rows.Count,0).text = " 审 核: 记 帐: 经手人: 年 月 日" rt.rows(rt.Rows.Count-1).Style.Font = New Font("宋体", 12,FontStyle.bold) \'设置文本对象的字体 rt.Cells(rt.Rows.Count-1,0).SpanCols = 7 \'第N行第0个单元格向右合并7列,这里同样只知道为最后一行 rt.Rows(rt.Rows.Count-1).Style.GridLines.All = new Prt.LineDef(0,Color.Black) rt.Rows(rt.Rows.Count-1).Style.GridLines.top = new Prt.LineDef(0.5,Color.Black) rt.Rows(rt.Rows.Count-1).Height = 15 & "mm" doc.Body.Children.Add(rt) \'将表格对象加入到报表中 Doc.Preview() \'预览报表
[此贴子已经被作者于2014-5-15 0:14:27编辑过]
|