【问题标题】:C# VSTO How can can I return the cross references from the Word documentC# VSTO 如何从 Word 文档返回交叉引用
【发布时间】:2019-02-20 10:13:23
【问题描述】:

我开发了一个工具,它遍历 Word 文档以根据文档中的样式提取文本,并将该文本插入到 XML 模板中。

我需要能够检查段落中是否存在对图形的交叉引用,并提取图形引用或某种识别方式,以便我可以在 XML 文档中重现交叉引用。

经过大量搜索,我找不到任何可以做到这一点的信息。很多关于插入引用的信息,但没有从文档中检索它们。

我已经使用了以下代码,该代码在 Word 文档的每个段落中传递,以查看它是否包含任何字段,但不知道从哪里开始。请问有什么想法吗?

private void checkParaForCrossReferences(word.Paragraph eachPara)
{
     var fields = eachPara.Range.Fields;

     foreach (var field in fields)
     {
          //some code to get the cross reference information (figure or table number, caption or ID or something)

     }
}

【问题讨论】:

    标签: c# ms-word vsto cross-reference


    【解决方案1】:

    Word 使用REF 字段进行交叉引用,因此要获取段落的交叉引用,代码应如下所示

    Word.Range rng = null;
    
    foreach (para In doc.Paragraphs)
    {
        rng = para.Range;
        foreach (fld In rng.Fields)
        {
            if (fld.Type = Word.WdFieldType.wdFieldRef)
            {
                Debug.Print("Code: " + fld.Code.Text + "; Result: " + fld.Result.Text);
            }
        }
    }
    

    这里的棘手部分是 REF 字段实际引用的内容。当交叉引用插入到除Bookmark 之外的任何内容时,Word 会自动为文档中的该范围分配一个书签。书签名称以下划线_ 开头,后跟Ref 和一个数字。默认情况下,这些隐藏在页面上和“书签”对话框中。一个典型的 REF 域代码:REF _Ref1571107

    因此,仅凭域代码无法确定这是哪种交叉引用。根据在插入图的交叉引用时选择了哪个选项,可能可以从Result 获取它。例如,如果交叉引用显示整个标题或“仅标签和数字”,那么它将包含字符串Figure,这是相当直接的。

    如果这两种情况都不是并且选择了其他三个选项之一,则可以从域代码中提取书签名称并在文档文本中查找书签并从该范围中获取信息 - 确切地说是如何将取决于单个文档以及如何引用这些数字。

    目前我没有运行 C# 环境,但有用于从 REF 字段中查找书签名称的基本 VB 代码:

    sBkmName = Mid(fld.code, InStr(fld.code, "_Ref"), 11) 'a bookmark name is 11 characters long
    Debug.Print ActiveDocument.Bookmarks(sBkmName).Range.Text
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多