diff --git a/src/EPPlus/Drawing/ExcelDrawing.cs b/src/EPPlus/Drawing/ExcelDrawing.cs index 73a182e69..11b4cc5f1 100644 --- a/src/EPPlus/Drawing/ExcelDrawing.cs +++ b/src/EPPlus/Drawing/ExcelDrawing.cs @@ -531,7 +531,7 @@ public Uri Hyperlink DeleteNode(_hyperLinkPath); if (HypRel != null) { - _drawings._package.ZipPackage.DeletePart(UriHelper.ResolvePartUri(HypRel.SourceUri, HypRel.TargetUri)); + _drawings.Part.DeleteRelationship(HypRel.Id); } } @@ -546,7 +546,7 @@ public Uri Hyperlink HypRel = _drawings.Part.CreateRelationship(value, Packaging.TargetMode.External, ExcelPackage.schemaHyperlink); } SetXmlNodeString(_hyperLinkPath + "/@r:id", HypRel.Id); - if (Hyperlink is ExcelHyperLink excelLink) + if (value is ExcelHyperLink excelLink) { SetXmlNodeString(_hyperLinkPath + "/@tooltip", excelLink.ToolTip); } diff --git a/src/EPPlusTest/HyperlinkTest.cs b/src/EPPlusTest/HyperlinkTest.cs index 65d119e60..3bfb8c0ca 100644 --- a/src/EPPlusTest/HyperlinkTest.cs +++ b/src/EPPlusTest/HyperlinkTest.cs @@ -102,5 +102,49 @@ public void ReadUriWithLocation() } } + [TestMethod] + public void DrawingHyperlinkUpdate_ShouldNotThrowException() + { + using (var package = new ExcelPackage()) + { + var ws = package.Workbook.Worksheets.Add("Sheet1"); + + // Add a drawing (shape) + var shape = ws.Drawings.AddShape("MyShape", eShapeStyle.Rect); + + // 1. Assign initial external URL hyperlink + var initialUrl = new ExcelHyperLink("https://epplussoftware.com") { ToolTip = "Initial ToolTip" }; + shape.Hyperlink = initialUrl; + + Assert.IsNotNull(shape.Hyperlink); + + // 2. Re-assign to a new external URL hyperlink (this would crash without the fix) + var updatedUrl = new ExcelHyperLink("https://github.com/EPPlusSoftware/EPPlus") { ToolTip = "Updated ToolTip" }; + shape.Hyperlink = updatedUrl; + + Assert.AreEqual("https://github.com/EPPlusSoftware/EPPlus", shape.Hyperlink.OriginalString); + + // 3. Re-assign to an internal sheet reference (this would also crash without the fix) + var internalLink = new ExcelHyperLink("Sheet1!A10", "Go to A10") { ToolTip = "Internal ToolTip" }; + shape.Hyperlink = internalLink; + + Assert.AreEqual("Sheet1!A10", ((ExcelHyperLink)shape.Hyperlink).ReferenceAddress); + + // 4. Save and read back to verify XML and tooltip are correct + package.Save(); + + using (var readPackage = new ExcelPackage(package.Stream)) + { + var readWs = readPackage.Workbook.Worksheets["Sheet1"]; + var readShape = readWs.Drawings["MyShape"]; + + var readLink = (ExcelHyperLink)readShape.Hyperlink; + Assert.IsNotNull(readLink); + Assert.AreEqual("Sheet1!A10", readLink.ReferenceAddress); + Assert.AreEqual("Internal ToolTip", readLink.ToolTip); + } + } + } + } }