1

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

我能够获取字段对象的名称,但文档中没有定义书签,尽管在 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)
        {
        }
    }

4

1 回答 1

0

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

即使书签被隐藏,您也可以引用它们。因此,例如,您应该能够执行以下操作(这是 VBA 语法):

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

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

根据用户插入的交叉引用类型,Word“覆盖”了引用材料的不同部分。因此,您可能需要构建您真正需要的范围,例如使用书签的 Range.Start 来告诉您参考指向的段落。

于 2020-01-02T09:42:40.243 回答