Skip to content

Commit dc971fa

Browse files
Fix: drawing hyperlink reassignment crashes and inert tooltip setting
1 parent 15fedad commit dc971fa

2 files changed

Lines changed: 46 additions & 2 deletions

File tree

src/EPPlus/Drawing/ExcelDrawing.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ public Uri Hyperlink
531531
DeleteNode(_hyperLinkPath);
532532
if (HypRel != null)
533533
{
534-
_drawings._package.ZipPackage.DeletePart(UriHelper.ResolvePartUri(HypRel.SourceUri, HypRel.TargetUri));
534+
_drawings.Part.DeleteRelationship(HypRel.Id);
535535
}
536536
}
537537

@@ -546,7 +546,7 @@ public Uri Hyperlink
546546
HypRel = _drawings.Part.CreateRelationship(value, Packaging.TargetMode.External, ExcelPackage.schemaHyperlink);
547547
}
548548
SetXmlNodeString(_hyperLinkPath + "/@r:id", HypRel.Id);
549-
if (Hyperlink is ExcelHyperLink excelLink)
549+
if (value is ExcelHyperLink excelLink)
550550
{
551551
SetXmlNodeString(_hyperLinkPath + "/@tooltip", excelLink.ToolTip);
552552
}

src/EPPlusTest/HyperlinkTest.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,5 +102,49 @@ public void ReadUriWithLocation()
102102
}
103103
}
104104

105+
[TestMethod]
106+
public void DrawingHyperlinkUpdate_ShouldNotThrowException()
107+
{
108+
using (var package = new ExcelPackage())
109+
{
110+
var ws = package.Workbook.Worksheets.Add("Sheet1");
111+
112+
// Add a drawing (shape)
113+
var shape = ws.Drawings.AddShape("MyShape", eShapeStyle.Rect);
114+
115+
// 1. Assign initial external URL hyperlink
116+
var initialUrl = new ExcelHyperLink("https://epplussoftware.com") { ToolTip = "Initial ToolTip" };
117+
shape.Hyperlink = initialUrl;
118+
119+
Assert.IsNotNull(shape.Hyperlink);
120+
121+
// 2. Re-assign to a new external URL hyperlink (this would crash without the fix)
122+
var updatedUrl = new ExcelHyperLink("https://github.com/EPPlusSoftware/EPPlus") { ToolTip = "Updated ToolTip" };
123+
shape.Hyperlink = updatedUrl;
124+
125+
Assert.AreEqual("https://github.com/EPPlusSoftware/EPPlus", shape.Hyperlink.OriginalString);
126+
127+
// 3. Re-assign to an internal sheet reference (this would also crash without the fix)
128+
var internalLink = new ExcelHyperLink("Sheet1!A10", "Go to A10") { ToolTip = "Internal ToolTip" };
129+
shape.Hyperlink = internalLink;
130+
131+
Assert.AreEqual("Sheet1!A10", ((ExcelHyperLink)shape.Hyperlink).ReferenceAddress);
132+
133+
// 4. Save and read back to verify XML and tooltip are correct
134+
package.Save();
135+
136+
using (var readPackage = new ExcelPackage(package.Stream))
137+
{
138+
var readWs = readPackage.Workbook.Worksheets["Sheet1"];
139+
var readShape = readWs.Drawings["MyShape"];
140+
141+
var readLink = (ExcelHyperLink)readShape.Hyperlink;
142+
Assert.IsNotNull(readLink);
143+
Assert.AreEqual("Sheet1!A10", readLink.ReferenceAddress);
144+
Assert.AreEqual("Internal ToolTip", readLink.ToolTip);
145+
}
146+
}
147+
}
148+
105149
}
106150
}

0 commit comments

Comments
 (0)