如何使用 office interop word 获取放置在 .docx 文件中形状内部的超链接

How to get hyperlinks placed inside of shapes in .docx file using office interop word

我正在寻找一种以编程方式替换 word 文档内部超链接的方法。我已经有了处理超链接替换的代码,只要它们沿着文档的正文放置即可。不幸的是,如果超链接位于形状内部,则此代码看不到超链接。我处理的文档经常包含由形状(通常是分组形状)组成的图表(流程图),我找不到任何方法来从形状内部检索和修改超链接。

我目前使用的代码允许我从文档文本中检索所有超链接:

Microsoft.Office.Interop.Word.Application applicationObject = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document aDDoc = applicationObject.Documents.Open(FileName: @"c:\Temp\a.docx");
Microsoft.Office.Interop.Word.Hyperlinks links = aDDoc.Hyperlinks;

foreach (var hyperlink in links)
        {
            string adress = ((Microsoft.Office.Interop.Word.Hyperlink) hyperlink).Address;
        }

不幸的是,所有从形状对象检索超链接的尝试都会导致异常:

Microsoft.Office.Interop.Word.Shapes shapes = aDDoc.Shapes;


        foreach (var shape in shapes)
        {

                Microsoft.Office.Interop.Word.Hyperlink hyperlink = ((Microsoft.Office.Interop.Word.Shape)shape).Hyperlink;

                string adress = ((Microsoft.Office.Interop.Word.Hyperlink)hyperlink).Address;
        }

这会在分配地址变量的行上引发异常。我在 visual studio 的非英文版本中工作,所以我得到的异常也不是英文的,但它说的是:操作无法执行

有人知道如何从形状内部检索超链接吗?

我做了一个小例子,它从 word 文件中的形状中检索超链接。我正在使用 Word 2010。您无法通过 Shape.Hyperlink 从形状内访问文本超链接,因为这会让您

Returns a Hyperlink object that represents the hyperlink associated with the specified shape.

请参阅 MSDN - Shape 文档。

除此之外,您还必须访问 Shape - TextFrame - TextRange 属性。这将允许您访问任何形状的文本中的超链接。

源代码

/// entry point - will look for hyperlinks in text
/// and afterwards in shapes within this document
private static void replaceHyperlinksInShapes()
{
    Word.Application app = new Word.Application();
    Word.Document doc = app.Documents.Open(FileName: @"e:\Temp\demoFile.docx");
    Word.Hyperlinks links = doc.Hyperlinks;

    Debug.WriteLine("Text Hyperlinks");
    foreach (var hyperlink in links)
    {
        string address = ((Microsoft.Office.Interop.Word.Hyperlink)hyperlink).Address;
        Debug.WriteLine("\t" + address);
    }

    Debug.WriteLine("Shape Hyperlinks");
    foreach (Word.Shape shape in doc.Shapes)
    {
        searchForHyperLink(shape);
    }
}

/// will search for hyperlinks in given shape
/// if this shape is a group, call recursivly
private static void searchForHyperLink(Word.Shape shape)
{
    /// check if this shape is a group or not
    /// CRUCIAL!!! There are way more types which may contain hyperlinks
    /// check if necessary
    if (shape.Type == Office.MsoShapeType.msoAutoShape)
    {
        Word.TextFrame frame = shape.TextFrame;
        Word.Range range = frame.TextRange;
        if (range != null)
        {
            foreach (var hyperlink in range.Hyperlinks)
            {
                string address = ((Word.Hyperlink)hyperlink).Address;
                Debug.WriteLine("\t" + address);
            }
        }
    }
    else if (shape.Type == Office.MsoShapeType.msoGroup)
    {
        for (int i = 1; i <= shape.GroupItems.Count; i++)
        {
            Word.Shape childShape = shape.GroupItems[i];
            searchForHyperLink(childShape);
        }
    }
}

Word-File

结果输出

编辑

在 MSDN 中搜索后,我跌跌撞撞 Type Property。通过使用这个,我能够区分形状和组(组也是一种形状!)。

希望对您有所帮助!