C#VSTO如何从Word文档返回交叉引用

时间:2019-02-20 10:13:23

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

我开发了一种工具,该工具可在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)

     }
}

1 个答案:

答案 0 :(得分:2)

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#环境,但是需要一个基本的VB代码来从REF字段中查找书签名称:

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