gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:46:36 25 4
gpt4 key购买 nike

我正在为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com