从 Word 互操作字段对象获取引用文本

Reaching the referenced text from a Word interop field object

我正在使用 Word 互操作来构建 Word 插件。在这个插件中,我想检查所有的情况 文档中的字段对象,当该字段是对同一文档中另一个位置的交叉引用时,我需要能够捕获该字段所引用的段落中的文本。

我能够获取字段对象的名称,但文档中没有定义书签,尽管在 Word 中我可以单击该字段以转到其他位置。

示例字段

代码示例字段

我需要获取的参考文字

没有定义书签对象

我试图通过在其上调用 DoClick() 来模拟用户点击该字段,然后我访问了 V_V_Scalar_Document_Generic.Application.Selection.Range.Text 但它什么也没给。我也尝试了下面的 GoTo 方法,但仍然没有到达引用的文本。

 System.Collections.Generic.List<string> L_V_List_String_Fields = new System.Collections.Generic.List<string>();
    foreach (Field L_V_Scalar_Field_Item in V_V_Scalar_Document_Generic.Range.Fields)
    {
        try
        {
            if (L_V_Scalar_Field_Item.Type == WdFieldType.wdFieldRef)
                // L_V_Scalar_Field_Item.Data --> gives COM exception
                // L_V_Scalar_Field_Item.Code.ID --> blanks
                // L_V_Scalar_Field_Item.DoClick() 'will not help because fields are not always hyperlinks
                // L_V_Scalar_Field_Item.Result.Text --> gives the text of the field itself

                // all variations I tried for the target parameter in the line below (last param) are not working
                // V_V_Scalar_Document_Generic.[GoTo](Microsoft.Office.Interop.Word.WdGoToItem.wdGoToField, System.Type.Missing, System.Type.Missing, "_Ref28680085")
                // Dim L_V_Scalar_String_Source as string = V_V_Scalar_Document_Generic.Application.Selection.Range.Text

                L_V_List_String_Fields.Add($"CodeText:{L_V_Scalar_Field_Item.Code.Text} |FieldType:{L_V_Scalar_Field_Item.Type} |FieldKind:{L_V_Scalar_Field_Item.Kind} |SourceText:{"source text ??"}");
        }
        catch (Exception L_V_Scalar_Exception_Generic)
        {
        }
    }

没有列出书签,因为 Word 有一个约定,名称以下划线 (“_”) 开头的书签是 "hidden"。在“插入”->“链接”->“书签”对话框中,如果勾选 "Hidden Bookmarks" 框,您可以看到它们,但在“查找和替换”框中,您必须手动输入名称。

即使书签被隐藏,您也可以引用它们。因此,例如你应该能够做这样的事情(这是 VBA 语法):

Dim TargetText As String
TargetText = ActiveDocument.Bookmarks("_Ref28680085").Range.Text

通过书签获取文本"covered"。理论上,您可以通过使用 wdGotoBookmark 而不是 wdGotoField 来使用 Goto,但我认为它只能使用 Selection 对象,而不是 Range 对象。

根据用户插入的交叉引用类型,Word "covers" 引用的不同部分 material。所以你可能需要构建你真正需要的范围,例如使用书签的 Range.Start 告诉您引用指向的段落。