如何使用OpenXML 3.0.1获取Word/Excel中形状的Hyperlink对象
解决OpenXML SDK获取Word/Excel形状超链接的问题
Word文档处理
Word中文本超链接对应DocumentFormat.OpenXml.Wordprocessing.Hyperlink元素,可直接通过Descendants<Hyperlink>()获取;但形状超链接属于DrawingML范畴,附着在Drawing元素上,对应DocumentFormat.OpenXml.Drawing.Hyperlink,需通过形状节点提取关联ID后匹配超链接关系。
代码示例:
// 获取文档所有形状(Drawing元素) var drawings = doc.MainDocumentPart.Document.Descendants<DocumentFormat.OpenXml.Wordprocessing.Drawing>().ToList(); // 遍历形状提取超链接信息 foreach (var drawing in drawings) { var drawingHyperlink = drawing.Descendants<DocumentFormat.OpenXml.Drawing.Hyperlink>().FirstOrDefault(); if (drawingHyperlink != null && !string.IsNullOrEmpty(drawingHyperlink.Id)) { var hyperlinkRel = doc.MainDocumentPart.HyperlinkRelationships.FirstOrDefault(r => r.Id == drawingHyperlink.Id); if (hyperlinkRel != null) { // 输出形状超链接目标 Console.WriteLine($"形状超链接目标:{hyperlinkRel.Uri}"); } } }
Excel工作表处理
Excel中形状的超链接不直接以Hyperlink元素存在于WorksheetDrawing中,而是存储在形状的NonVisualDrawingProperties下的HyperlinkOnClick节点里,通过Relationship ID关联到HyperlinkRelationships。
代码示例:
if (worksheetPart.DrawingsPart != null) { // 获取所有形状的NonVisualDrawingProperties var shapeNonVisualProps = worksheetPart.DrawingsPart.WorksheetDrawing .Descendants<DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualDrawingProperties>() .ToList(); foreach (var props in shapeNonVisualProps) { var hyperlinkOnClick = props.Descendants<DocumentFormat.OpenXml.Drawing.HyperlinkOnClick>().FirstOrDefault(); if (hyperlinkOnClick != null && !string.IsNullOrEmpty(hyperlinkOnClick.Id)) { var hyperlinkRel = worksheetPart.DrawingsPart.HyperlinkRelationships.FirstOrDefault(r => r.Id == hyperlinkOnClick.Id); if (hyperlinkRel != null) { // 输出形状超链接目标 Console.WriteLine($"形状超链接目标:{hyperlinkRel.Uri}"); } } } }
内容的提问来源于stack exchange,提问作者AnhTT
相关产品推荐
相关产品推荐

