以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  专业报表合并  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=2991)

--  作者:狐哥
--  发布时间:2009/6/2 14:18:00
--  专业报表合并

哪位老师帮我看看如下公式,我想让前六列(按照第一列内容 "工作号" 相同) 相同内容合并,公式不会做.

For c As Integer = 0 To tb.Cols.Count -1 
        Dim FirstRow As Integer = 1
        For r As integer = 0 To tb.Rows.Count -1
                If tb(r,c) Is Nothing Then
                    Continue for
                End if
                If r > 0 AndAlso tb.Cols(c).IsString AndAlso tb(r,c) = tb(r - 1,c) Then
                    rt.Cells(FirstRow,c).SpanRows =  rt.Cells(FirstRow,c).SpanRows  + 1
                Else
                    rt.Cells(r + 1, c).Text = tb(r,c)
                    FirstRow = r + 1
                End if
            Next
    Next

[此贴子已经被作者于2009-6-2 14:24:34编辑过]

--  作者:yangming
--  发布时间:2009/6/2 14:41:00
--  
不太明白,是前六列的什么合并?单元格?
--  作者:狐哥
--  发布时间:2009/6/2 14:48:00
--  
比如:

工作号        列1         列2     列3   ...  列7
001             M            N        S           A1
001             M            N        S           A2
002             M            V        P           A3
002             M            V        P           A4

合并后为:

工作号        列1         列2     列3 ....  列7
001             M            N        S          A1
                                                        A2
002             M            V        P          A3
                                                        A4


--  作者:yangming
--  发布时间:2009/6/2 15:11:00
--  
我给你的代码加了头和尾,是可以按你的要求打印的啊
Dim doc As New PrintDoc
Dim tb as Table = Tables("表A")
Dim rt As New prt.RenderTable() \'定义一个表格对象
rt.Style.GridLines.All = New prt.Linedef \'设置网格线
For c As Integer = 0 To tb.Cols.Count -1
        Dim FirstRow As Integer = 1
        For r As integer = 0 To tb.Rows.Count -1
                If tb(r,c) Is Nothing Then
                    Continue for
                End if
               If r > 0 AndAlso tb.Cols(c).IsString AndAlso tb(r,c) = tb(r-1,c) Then
                    rt.Cells(FirstRow,c).SpanRows = rt.Cells(FirstRow,c).SpanRows  + 1
                Else
                    rt.Cells(r + 1, c).Text = tb(r,c)
                    FirstRow = r + 1
                End if
            Next
   Next
doc.Body.Children.Add(rt) \'将表格对象加入到报表中
doc.Preview()

[此贴子已经被作者于2009-6-2 15:12:03编辑过]

--  作者:狐哥
--  发布时间:2009/6/2 15:28:00
--  
姐姐,我是只要求合并前6列,根据第一列内容来合并.不是所有列.

For c As Integer = 0 To tb.Cols.Count -1
这个公式如何改为:

For c As Integer = 0 To 6,前6列
[此贴子已经被作者于2009-6-2 15:28:10编辑过]

--  作者:yangming
--  发布时间:2009/6/2 15:35:00
--  
你第七列的数据不是每行都不一样吗?这就不会合并了啊
--  作者:yangming
--  发布时间:2009/6/2 16:14:00
--  

看红色部分
Dim doc As New PrintDoc
Dim tb as Table = Tables("表A")
Dim rt As New prt.RenderTable() \'定义一个表格对象
Dim ColNames As New List(Of String)
For Each cl As Col In tb.Cols \'排除隐藏列
    If cl.Visible Then
        ColNames.Add(cl.Name)
    End If
Next
rt.Style.GridLines.All = New prt.Linedef \'设置网格线
For c As Integer = 0 To tb.Cols.Count -1
        Dim FirstRow As Integer = 1
        For r As integer = 0 To tb.Rows.Count -1
                If tb(r,c) Is Nothing Then
                    Continue for
                End if
         If r > 0 AndAlso c <= 5 AndAlso tb.Cols(c).IsString AndAlso tb(r,c) = tb(r-1,c) Then

                    rt.Cells(FirstRow,c).SpanRows = rt.Cells(FirstRow,c).SpanRows + 1

                Else
                    rt.Cells(r + 1, c).Text = tb(r,c)
                    FirstRow = r + 1
                End if
            Next
   Next

doc.Body.Children.Add(rt) \'将表格对象加入到报表中
doc.Preview()

[此贴子已经被作者于2009-6-2 16:14:10编辑过]

--  作者:狐哥
--  发布时间:2009/6/2 16:23:00
--  

感谢MING姐,我试试


--  作者:狐哥
--  发布时间:2009/6/2 16:26:00
--  
成功了,感谢MING姐.
--  作者:狐哥
--  发布时间:2009/6/2 19:10:00
--  
If r > 0 AndAlso c <= 5 AndAlso tb.Cols(c).IsString AndAlso tb(r,c) = tb(r-1,c) Then

将上面红色部分改的列C改成实际列名,就可以按条件合并了.如:   tb(r,"工作号") = tb(r-1,"工作号") 就可以工作号条件将相同的列合并,而避免报关不美观.
再次感谢热心MING姐.