2

我正在为 MS Word 开发 C# 插件。我可以抓取当前文档的所有单词 - 它是这样的:

app = (Word._Application )Application; // Application object comes on addin's connection
foreach(Word.Word word in app.Application.Words)
{
     doSmth(word);
}

我的问题是,如何不是从整个文档中而是从当前活动(用户可见)页面中获取所有单词?

换句话说,我需要定义 app.Application.ActiveDocument 的活动页面/段落,并用“活动”词做一些事情。

4

1 回答 1

5

有趣的问题。[见最后更新]

Word 的对象模型实际上并没有“页面”对象,因为文档的分页会随着您添加和删除内容(或更改字体大小、纸张大小等)而不断变化。因此,没有“ActiveDocument.Pages(1)”之类的东西。

更重要的是,没有简单的方法来判断当前显示的页面。部分原因是用户不一定一次只能看到一页。他可能正在查看一页的结尾和下一页的开头,或者可能显示几页 - 取决于他的查看设置。

如果我能让这个问题稍微简单一点,那么也许我可以用对你有帮助的方式来回答它。让我将“当前活动(用户可见)页面”重新定义为选择所在的页面。(实际上,由于选择可以跨越多个页面,我们将其定义为“选择的活动端所在的页面”)。

我还将使用 VBA 进行回答,因为在 VBA 即时窗口中使用它更容易,并且在需要时转换为 C# 是微不足道的(毕竟它是相同的对象模型)。

Word 的Selection对象具有 a 的属性Range,如果您只是想要所有选定的单词,那么这将是微不足道的(Selection.Words!)。但是,如果我们想要该页面上的所有单词,那么我们需要更加努力。

首先,让我们找出(开始)选择在哪个页面上。为此,我们可以使用信息方法:

pageNumber = Selection.Information(wdActiveEndPageNumber)

所以现在我们知道我们对哪个页面感兴趣。我们现在需要获取一个Range包含该页面上所有文本的对象。我们需要分两步执行此操作——首先找到该范围的起点,然后找到该范围的终点。

要查找范围的开始,我们可以使用该Goto函数,它返回一个 Range 对象,表示指定项的开始:

startOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber).Start

范围的结尾是下一页的开头(减去一个字符,但我们不要吹毛求疵),或者是文档的结尾(如果我们在最后一页上):

If pageNumber = ActiveDocument.Content.Information(wdNumberOfPagesInDocument) Then
    endOfRange = ActiveDocument.Content.End
Else
    endOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber + 1).Start
End If

现在我们可以构造一个Range包含页面上所有文本的对象:

Set pageRange = ActiveDocument.Range(startOfRange, endOfRange)

...从那里我们可以得到的话:

Set words = pageRange.Words

这是一个简短的 VBA 宏,它使用上述技术来报告活动页面上的字数:

Sub Test()

    Dim pageNumber As Integer
    Dim startOfRange As Integer
    Dim endOfRange As Integer
    Dim pageRange As Range

    pageNumber = Selection.Information(wdActiveEndPageNumber)

    startOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber).Start

    If pageNumber = ActiveDocument.Content.Information(wdNumberOfPagesInDocument) Then
        endOfRange = ActiveDocument.Content.End
    Else
        endOfRange = ActiveDocument.GoTo(WdGoToItem.wdGoToPage, WdGoToDirection.wdGoToAbsolute, pageNumber + 1).Start
    End If

    Set pageRange = ActiveDocument.Range(startOfRange, endOfRange)

    MsgBox pageRange.Words.Count

End Sub

更新 好的,事实证明有一种更简单的方法可以做到这一点。Word 有一个“特殊书签”,它指向当前页面上的文本,所以这将与上面的所有代码一样:

words = ActiveDocument.Bookmarks("\page").Range.Words
于 2013-05-22T12:29:16.227 回答