我正在为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的活动页面/段落,并使用“活动”单词执行某些操作。
答案 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