2

我有一个包含 100 多个表格的长 Word 文档。我试图让用户通过 python 选择一个页码,以便将数据输入到 word 文档中指定页面上的表格中。我可以使用以下代码将数据输入到表格中,但是问题是文档太长了,当用户进入word文档80页时,用户不容易知道他们在哪个表号(不是每个页面都有一个表格,有些页面有多个表格)。

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"

因此,我需要帮助的是在通过用户输入指定的 word 文档中的页面上提取表号(即,用户指定他们想要将数据添加到第 13 页,因此代码将确定表 51 在第 72 页上)。

如果我在word中记录一个宏来简单地跳转到一个页面,这就是VB代码......

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

我尝试使用以下代码行将其翻译成 Python,但它没有跳转到正确的页面。

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

1 回答 1

3

GoTo使用Selection对象,它是 Word 应用程序的属性,而不是文档。在问题中的代码中,word代表 Word 应用程序,所以word.Selection.GoTo应该可以工作。

请注意方法调用wdGoToAbsolute中的替换- 这对于转到特定页码来说“更安全”。GoTowdGoToNext

为了获得整个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
于 2019-10-22T16:29:10.327 回答