我正在为 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 的事件页面/段落,并用“事件”词做一些事情。
最佳答案
有趣的问题。 [查看最后的更新]
Word 的对象模型实际上并没有“页面”对象,因为当您添加和删除内容(或更改字体大小、纸张大小等)时,文档的分页会不断变化。因此,不存在“ActiveDocument.Pages(1)”之类的东西。
此外,没有简单的方法可以判断当前显示的是哪个页面。部分原因是用户不一定一次只能看到一页。他可能正在查看一页的结尾和下一页的开头,或者可能会显示几页 - 这取决于他的 View 设置。
如果我可以让问题稍微简单一些,那么也许我可以以对您有帮助的方式回答它。让我将“当前事件(用户可见)页面”重新定义为选择所在的页面。 (实际上,由于选择可以跨越多个页面,因此我们将其定义为“选择的事件端所在的页面”)。
我还将回答使用 VBA,因为在 VBA 直接窗口中使用它更容易,并且在需要时转换为 C# 也很简单(毕竟,这是相同的对象模型)。
Word 的 Selection
对象具有 Range
的属性,如果您只是想要所有选定的单词,那么这将是微不足道的(Selection.Words
!)。但是,如果我们想要该页面上的所有单词,那么我们需要更加努力。
首先,让我们找出所选内容(开始)所在的页面。为此,我们可以使用 Information 方法:
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
关于c# - 如何从ms word文档的当前可见页面获取单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16690729/