Используйте pywin32 для перехода на указанную страницу в слове doc - PullRequest
0 голосов
/ 21 октября 2019

У меня длинный документ с более чем 100 таблицами. Я пытаюсь разрешить пользователям выбирать номер страницы через Python для ввода данных в таблицу на указанной странице в текстовом документе. Я могу ввести данные в таблицу с помощью следующего кода, но проблема в том, что документ такой длинный, что пользователю нелегко узнать, на каком номере таблицы они находятся, когда они составляют 80 страниц в документе word (некаждая страница имеет таблицу, а некоторые страницы имеют несколько таблиц).

import win32com.client as win32    
word = win32.Dispatch("Word.Application")
word.Documents.Open(my_document_path)
doc = word.ActiveDocument
table = doc.Tables(51) #random selection for testing purposes
table.Cell(Row = 7, Column = 2).Range.Text = "test"

Так что мне нужна помощь в извлечении номера таблицы на странице в текстовом документе, который указывается с помощью ввода пользователя (то есть пользователяуказывает, что они хотят добавить данные на страницу 13, поэтому код определит, что таблица 51 находится на странице 72).

Если я записываю макрос в слове для простого перехода на страницу, это код VB. ..

Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:="13"

Я пытался перевести это на Python, используя следующую строку кода, но он не переходит на правильную страницу.

doc.GoTo(win32.constants.wdGoToPage, win32.constants.wdGoToNext, "13")

1 Ответ

1 голос
/ 22 октября 2019

GoTo работает с объектом Selection, который является свойством приложения Word, а не документа. В указанном коде word представляет приложение Word, поэтому word.Selection.GoTo должно работать.

Обратите внимание на подстановку wdGoToAbsolute в вызове метода GoTo для wdGoToNext - это "безопаснее""для перехода к определенному номеру страницы.

Для получения всего Range для страницы можно использовать встроенное имя закладки "\Page". Это работает только для страницы, где есть выбор, поэтому необходимо сначала перейти на страницу. Затем можно получить первую таблицу (или любой другой индекс таблицы) на странице.

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

import win32com.client as win32    
word = win32.Dispatch("Word.Application")
word.Documents.Open(my_document_path)
doc = word.ActiveDocument
word.Selection.GoTo(win32.constants.wdGoToPage, win32.constants.wdGoToAbsolute, "13")
rngPage = doc.Bookmarks("\Page").Range
table = rngPage.Tables(1) #first table on the page
table.Cell(Row = 7, Column = 2).Range.Text = "test"

#rngToPage = doc.Content
#rngToPage.End = rngPage.End
#tableIndex = rngToPage.Tables.Count

Обратите внимание, что я не работаю с Python, поэтому я не могу протестировать код Python. Так что следите за синтаксическими ошибками. По этой причине я добавил код VBA, который использовал для проверки подхода.

Sub GetTableCountOnPage()
    Dim tbl As Word.Table
    Dim sPage As String
    Dim rngPage As Word.Range

    sPage = InputBox("On which page is the table?")
    Selection.GoTo What:=wdGoToPage, Name:=sPage
    Set rngPage = Selection.Document.Bookmarks("\Page").Range
    If rngPage.Tables.Count > 0 Then
        Set tbl = rngPage.Tables(1)
        tbl.Select

        Dim rngToTable As Word.Range
        Set rngToTable = Selection.Document.content
        rngToTable.End = rngPage.End
        Debug.Print rngToTable.Tables.Count & " to this point."
    End If
End Sub
...