如何从ms word文档的当前可见页面获取单词?

时间:2013-05-22 11:35:41

标签: c# ms-word add-in

我正在为MS Word开发C#addin。我可以抓住当前文档中的所有单词 - 就像那样:

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

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

换句话说,我需要定义app.Application.ActiveDocument的活动页面/段落,并使用“活动”单词执行某些操作。

1 个答案:

答案 0 :(得分:4)

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

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

更重要的是,没有简单的方法来判断当前显示的页面。在某种程度上,这是因为用户不一定每次只能看到一个页面。他可能正在查看一页的结尾和下一页的开头,或者可能会显示几页 - 取决于他的视图设置。

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

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

Word的Selection对象具有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