【问题标题】:Use pywin32 to go to specified page in word doc使用pywin32转到word doc中的指定页面
【发布时间】:2019-10-21 17:47:34
【问题描述】:

我有一个包含 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")

【问题讨论】:

    标签: python ms-word pywin32 pywin


    【解决方案1】:

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

    注意 GoTo 方法调用中 wdGoToAbsolute 的替换 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多