如何使用 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。通过使用这个,我能够区分形状和组(组也是一种形状!)。
希望对您有所帮助!
我正在寻找一种以编程方式替换 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。通过使用这个,我能够区分形状和组(组也是一种形状!)。
希望对您有所帮助!