使用pywin32转到word文档中的指定页面
Use pywin32 to go to specified page in word doc
我有一个超过 100 tables 的长 word 文档。我正在尝试允许用户通过 python select 页码将数据输入到 word 文档中指定页面上的 table 中。我可以使用以下代码将数据输入到 table 中,但问题是文档太长了,用户不容易知道他们在哪个 table 号码上word文档80页(不是每一页都有一个table,有些页面有多个table)。
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 文档页面上的 table 编号(即,用户指定他们想要将数据添加到第 13 页,因此代码将确定 table 51 在第 72 页)。
如果我在word中录制一个简单跳转页面的宏,这就是VB代码...
Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:="13"
我尝试使用以下代码行将其翻译成 Python,但它没有跳转到正确的页面。
doc.GoTo(win32.constants.wdGoToPage, win32.constants.wdGoToNext, "13")
GoTo
使用 Selection
对象,它是 Word 应用程序的 属性,而不是文档。在问题的代码中,word
代表 Word 应用程序,因此 word.Selection.GoTo
应该可以工作。
请注意 GoTo
方法调用中对 wdGoToNext
的 wdGoToAbsolute
替换 - 即 "safer" 用于转到特定页码。
为了获取页面的整个 Range
,可以使用内置书签名称 "\Page"
。这仅适用于选择所在的页面,这就是为什么必须先转到该页面的原因。然后就可以获得页面上的第一个 table(或任何其他 table 索引)。
如果还需要table在文档中的索引号,可以通过获取文档的范围,然后将结束点设置为页面范围的末尾来计算。
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
我有一个超过 100 tables 的长 word 文档。我正在尝试允许用户通过 python select 页码将数据输入到 word 文档中指定页面上的 table 中。我可以使用以下代码将数据输入到 table 中,但问题是文档太长了,用户不容易知道他们在哪个 table 号码上word文档80页(不是每一页都有一个table,有些页面有多个table)。
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 文档页面上的 table 编号(即,用户指定他们想要将数据添加到第 13 页,因此代码将确定 table 51 在第 72 页)。
如果我在word中录制一个简单跳转页面的宏,这就是VB代码...
Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:="13"
我尝试使用以下代码行将其翻译成 Python,但它没有跳转到正确的页面。
doc.GoTo(win32.constants.wdGoToPage, win32.constants.wdGoToNext, "13")
GoTo
使用 Selection
对象,它是 Word 应用程序的 属性,而不是文档。在问题的代码中,word
代表 Word 应用程序,因此 word.Selection.GoTo
应该可以工作。
请注意 GoTo
方法调用中对 wdGoToNext
的 wdGoToAbsolute
替换 - 即 "safer" 用于转到特定页码。
为了获取页面的整个 Range
,可以使用内置书签名称 "\Page"
。这仅适用于选择所在的页面,这就是为什么必须先转到该页面的原因。然后就可以获得页面上的第一个 table(或任何其他 table 索引)。
如果还需要table在文档中的索引号,可以通过获取文档的范围,然后将结束点设置为页面范围的末尾来计算。
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