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

标签 c# ms-word add-in

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

相关文章:

java - 如何使用 apache poi 设置 word 文档的页边距?

c# - 在插件中创建没有描述或填充的图表图像

c# - 如何解析文件中的通用数据类型?

c# - asp.net、c#、用户提供的连接字符串和查询

vba - 在 Word VBA 中使用 .body 而不是 .htmlbody 将我的电子邮件正文的一部分设为粗体

vba - Excel VBA .xlam 中的 onLoad 功能区回调失败(未触发/工作)

clickonce - 为 VSTO Outlook 加载项创建 (ClickOnce) 设置

c# - 覆盖 dll 时如何阻止 .NET Core 应用程序关闭?

c# - 如何正确测试抽象类

excel - 使用Excel在Word文档中查找单词时文件名错误