Foxtable(狐表)用户栏目专家坐堂 → 用代码直接在word中生成表格


  共有1937人关注过本帖树形打印复制链接

主题:用代码直接在word中生成表格

帅哥哟,离线,有人找我吗?
12397522011
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:91 积分:715 威望:0 精华:0 注册:2019/10/20 0:27:00
用代码直接在word中生成表格  发帖心情 Post By:2019/10/27 0:18:00 [只看该作者]

目的是用代码直接在word中生成如图1所示的表格,结果生成了图2的样子,求指点问题出在哪块
图1

图片点击可在新窗口打开查看此主题相关图片如下:qq截图20191027000546.png
图片点击可在新窗口打开查看
图2 

图片点击可在新窗口打开查看此主题相关图片如下:qq截图20191027000419.png
图片点击可在新窗口打开查看

//////////////////生成表格的代码
Dim app As New MSWord.Application
try
    Dim doc = app.Documents.Open(ProjectPath & "\Reports\病害整理.doc")
    If app.ActiveWindow.Selection.Find.Execute("test") Then '查找word插入文本
        '插入表格,方法1
        '////////////////生成临时表
        Dim dt As New DataTableBuilder("test1")
        dt.AddDef("桥梁名称", Gettype(String),32)
        dt.AddDef("构件编号", Gettype(String),32)
        dt.AddDef("评定项目", Gettype(String),32)
        dt.AddDef("缺损情况病害描述", Gettype(String),255)
        dt.TableVisible=True
        dt.Build()
        MainTable= Tables("test1")
        '/////////////////////////////////////////////////
        Dim tbl As Table = Tables("病害统计表") '定义一个表
        Dim Regions As List(Of String()) = tbl.DataTable.GetValues("桥梁名称|桥梁代码|部件名称")  '从指定列中,获取不重复的值,以集合的形式返回.
        For Each Region As String() In Regions
            
            
            Dim Rows As List(Of DataRow)  '定义行集合
            Rows = tbl.DataTable.Select("[桥梁名称] = '" & Region(0) & "'and [部件名称] = '" & Region(2) & "'")
            For Each drr As DataRow In Rows
                Dim dr1 As DataRow = DataTables("test1").AddNew()
                dr1("桥梁名称") = drr("桥梁名称")
                dr1("构件编号") = drr("构件编号")
                dr1("评定项目") = drr("评定项目")
                dr1("缺损情况病害描述") = drr("缺损情况病害描述")
            Next
            '////////////////////////////////////////////
            doc.Tables.Add(Range:=app.Selection.Range,NumRows:=1, NumColumns:= 4) '返回一个 Table 对象,该对象代表添加至文档中的空白新表格
            '///定义表格格式
            With app.Selection.Tables(1)
                .ApplyStyleHeadingRows = True
                .ApplyStyleLastRow = True
                .ApplyStyleFirstColumn = True
                .ApplyStyleLastColumn = True
                .Style = "网格型"
            End With
            'For Each dc As DataCol In dt.DataCols
            For Each dc As DataCol In DataTables("test1").DataCols
                app.Selection.TypeText(Text:=dc.Name)
                app.Selection.MoveRight(Unit:=12)
            Next
            ' For Each dr As DataRow In dt.DataRows
            For Each dr As DataRow In DataTables("test1").DataRows
                ' For Each dc As DataCol In dt.DataCols
                For Each dc As DataCol In DataTables("test1").DataCols
                    app.Selection.TypeText(Text:=dr(dc.Name))
                    app.Selection.MoveRight(Unit:=12)
                Next
            Next
        Next
    End If
    '//////////////////////////////////////////////
    app.Visible = True
catch ex As exception
    msgbox(ex.message)
    app.Quit
finally
End try

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107754 积分:548109 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/10/27 20:30:00 [只看该作者]

            For Each dr As DataRow In DataTables("test1").DataRows
                ' For Each dc As DataCol In dt.DataCols
                For Each dc As DataCol In DataTables("test1").DataCols
                    ‘app.Selection.TypeText(Text:=dr(dc.Name)) 这一句去掉
                    app.Selection.MoveRight(Unit:=12)
                Next
            Next

 回到顶部
帅哥哟,离线,有人找我吗?
12397522011
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:幼狐 帖子:91 积分:715 威望:0 精华:0 注册:2019/10/20 0:27:00
  发帖心情 Post By:2019/10/27 22:15:00 [只看该作者]

找见问题了,循环位置有问题。谢谢
[此贴子已经被作者于2019/10/27 22:37:15编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107754 积分:548109 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/10/27 22:31:00 [只看该作者]

Dim app As New MSWord.Application
try
    Dim doc = app.Documents.Open(ProjectPath & "\Reports\病害整理.doc")
    If app.ActiveWindow.Selection.Find.Execute("test") Then '查找word插入文本
        '插入表格,方法1
        '////////////////生成临时表
        Dim dt As New DataTableBuilder("test1")
        dt.AddDef("桥梁名称", Gettype(String),32)
        dt.AddDef("构件编号", Gettype(String),32)
        dt.AddDef("评定项目", Gettype(String),32)
        dt.AddDef("缺损情况病害描述", Gettype(String),255)
        dt.TableVisible=True
        dt.Build()
        MainTable= Tables("test1")
        '/////////////////////////////////////////////////
        Dim tbl As Table = Tables("病害统计表") '定义一个表
        Dim Regions As List(Of String()) = tbl.DataTable.GetValues("桥梁名称|桥梁代码|部件名称")  '从指定列中,获取不重复的值,以集合的形式返回.
        Dim  WdLine = MSWord.WdUnits.wdLine
        Dim tcount = 2
        For Each Region As String() In Regions
            
            
            Dim Rows As List(Of DataRow)  '定义行集合
            Rows = tbl.DataTable.Select("[桥梁名称] = '" & Region(0) & "'and [部件名称] = '" & Region(2) & "'")
            For Each drr As DataRow In Rows
                Dim dr1 As DataRow = DataTables("test1").AddNew()
                dr1("桥梁名称") = drr("桥梁名称")
                dr1("构件编号") = drr("构件编号")
                dr1("评定项目") = drr("评定项目")
                dr1("缺损情况病害描述") = drr("缺损情况病害描述")
            Next
            '////////////////////////////////////////////
            doc.Tables.Add(Range:=app.Selection.Range,NumRows:=1, NumColumns:= 4) '返回一个 Table 对象,该对象代表添加至文档中的空白新表格
            '///定义表格格式
            With app.Selection.Tables(1)
                .ApplyStyleHeadingRows = True
                .ApplyStyleLastRow = True
                .ApplyStyleFirstColumn = True
                .ApplyStyleLastColumn = True
                .Style = "网格型"
            End With
            'For Each dc As DataCol In dt.DataCols
            For Each dc As DataCol In DataTables("test1").DataCols
                app.Selection.TypeText(Text:=dc.Name)
                app.Selection.MoveRight(Unit:=12)
            Next
            ' For Each dr As DataRow In dt.DataRows
            For Each dr As DataRow In DataTables("test1").DataRows
                ' For Each dc As DataCol In dt.DataCols
                For Each dc As DataCol In DataTables("test1").DataCols
                    app.Selection.TypeText(Text:=dr(dc.Name))
                    app.Selection.MoveRight(Unit:=12)
                Next
            Next
            app.Selection.MoveDown(WdLine , tcount, Nothing)
            app.Selection.TypeParagraph()
        Next
    End If
    '//////////////////////////////////////////////
    app.Visible = True
catch ex As exception
    msgbox(ex.message)
    app.Quit
finally
End try

 回到顶部