Создание таблиц в Word программно - PullRequest
2 голосов
/ 21 сентября 2009

Я генерирую таблицы и записываю их в слова на лету. Я не знаю, сколько таблиц будет каждый раз, когда я записываю данные в слово, и проблема, с которой я сталкиваюсь, заключается в том, что вторая таблица записана в первой ячейке моей первой таблицы. Если был третий стол, он помещается в первую ячейку моего второго стола.

Есть ли способ переместить курсор из таблицы? Я попытался создать новый диапазон для каждой таблицы, но происходит то же самое.

Я также пробовал такие вещи, как tbl.Range.InsertParagraphAfter()

Самое близкое, что я нашел, - это метод Relocate, но он работал только для двух таблиц.

Ответы [ 3 ]

2 голосов
/ 22 сентября 2009

У меня возникла точно такая же проблема, и я узнал, что вам нужно свернуть Range до конца диапазона таблицы, затем вставить разрыв строки, снова свернуть и затем вставить новую таблицу.

Вот некоторый код, который использует таблицы и закладки - он предназначен для того, чтобы показать, как использовать родные и VSTO закладки хоста (и добавить обработчик кликов к VSTO), но вместо этого вам может понадобиться только часть кода. Ищите

With tbRange
.Collapse(Direction:=Word.WdCollapseDirection.wdCollapseEnd)
.InsertParagraphAfter()
.Collapse(Direction:=Word.WdCollapseDirection.wdCollapseEnd).Select()
End With

ниже - это то, что вам нужно, чтобы запретить вложение таблиц в таблице.

Sub Assign3TablesToNativeBookmarks()
        'this is the native Word bookmark
        Dim bm As Word.Bookmark
        Dim tb As Word.Table
        Dim tbRange As Word.Range
        Dim i As Integer
        For i = 1 To 3
            bm = Me.Bookmarks.Add(Name:="nestedBookmark" & CStr(i), _
                                  Range:=ThisApplication.Selection.Range)
            tb = bm.Range.Tables.Add(Range:=bm.Range, NumRows:=2, NumColumns:=2)
            With tb
                .Style = "Table Grid"
                tbRange = .Range
                With tbRange
                    .Collapse(Direction:=Word.WdCollapseDirection.wdCollapseEnd)
                    .InsertParagraphAfter()
                    .Collapse(Direction:=Word.WdCollapseDirection.wdCollapseEnd).Select()
                End With
                bm = Me.Bookmarks.Add(Name:="nestedbookmark" & CStr(i), Range:=.Range)
            End With
        Next
        Dim bmMain As Word.Bookmark
        Dim mainBookmarkRange As Word.Range
        Dim mainBookmarkRangeStart As Integer
        Dim mainBookmarkRangeEnd As Integer
        mainBookmarkRangeStart = Me.Bookmarks(1).Start
        mainBookmarkRangeEnd = Me.Bookmarks(Me.Bookmarks.Count).End
        mainBookmarkRange = Me.Range(Start:=mainBookmarkRangeStart, End:=mainBookmarkRangeEnd)
        bmMain = Me.Bookmarks.Add(Name:="mainBookmark", Range:=mainBookmarkRange)
    End Sub
    Sub Assign3TablesToHostControlBookmarks()
        'Word host control of Bookmark
        'bookmarks must be destroyed before resetting the object 
        'added handler
        Dim bm As Microsoft.Office.Tools.Word.Bookmark
        'different from the interop one 
        Dim tb As Word.Table
        Dim tbRange As Word.Range
        Dim i As Integer
        For i = 1 To 3
            bm = Me.Controls.AddBookmark(range:=ThisApplication.Selection.Range, _
                                         Name:="nestedBookmark" & CStr(i))
            tb = bm.Range.Tables.Add(Range:=bm.Range, NumRows:=2, NumColumns:=2)
            With tb
                .Style = "Table Grid"
                tbRange = .Range
                With tbRange
                    .Collapse(Direction:=Word.WdCollapseDirection.wdCollapseEnd)
                    .InsertParagraphAfter()
                    .Collapse(Direction:=Word.WdCollapseDirection.wdCollapseEnd).Select()
                End With
                bm.Delete()
                'this deletes the bookmark before it can be recreated
                bm = Me.Controls.AddBookmark(range:=.Range, Name:="nestedBookmark" & CStr(i))
                AddHandler bm.Selected, AddressOf bm_Selected
                'handler added 
            End With
        Next
        Dim bmMain As Microsoft.Office.Tools.Word.Bookmark
        Dim mainBookmarkRange As Word.Range
        Dim mainBookmarkRangeStart As Integer
        Dim mainBookmarkRangeEnd As Integer
        mainBookmarkRangeStart = Me.Bookmarks(1).Start
        mainBookmarkRangeEnd = Me.Bookmarks(Me.Bookmarks.Count).End
        mainBookmarkRange = Me.Range(Start:=mainBookmarkRangeStart, End:=mainBookmarkRangeEnd)
        bmMain = Me.Controls.AddBookmark(range:=mainBookmarkRange, Name:="mainBookmark")
    End Sub
    Private Sub bm_Selected(ByVal sender As Object, ByVal e As Microsoft.Office.Tools.Word.SelectionEventArgs)
        MessageBox.Show("Hey, you have selected bookmark: " & sender.Name & ". " & _
                        "You did this at " & FormatDateTime(Date.Now(), DateFormat.LongTime))
    End Sub
1 голос
/ 21 сентября 2009

Самый простой способ вставить таблицы в слово - это создать HTML-таблицы, а затем вставить их в файл в том месте, где находится курсор.

Это позволяет легко создавать произвольно сложные вложенные таблицы без использования большинства смехотворно сложных функций взаимодействия слов.

0 голосов
/ 21 сентября 2009

Где вы хотите поставить каждую новую таблицу? В конце документа? Начните новую таблицу в конце Document.Content.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...