diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index d86e097..8e2cd4f 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -3,6 +3,7 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Text.RegularExpressions; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.CustomProperties; using DocumentFormat.OpenXml.Drawing; @@ -2505,7 +2506,9 @@ private static void AddPictureAnchor(WorksheetPart worksheetPart, Drawings.IXLPicture picture) { - var drawingsPart = worksheetPart.DrawingsPart ?? worksheetPart.AddNewPart(); + var drawingsPart = worksheetPart.DrawingsPart ?? + worksheetPart.AddNewPart( + GeneratePartId(picture.Name, worksheetPart)); if (drawingsPart.WorksheetDrawing == null) { @@ -2514,7 +2517,7 @@ var worksheetDrawing = drawingsPart.WorksheetDrawing; - var imagePart = drawingsPart.AddImagePart(ImagePartType.Png); + var imagePart = drawingsPart.AddImagePart(ImagePartType.Png, GeneratePartId(picture.Name, drawingsPart)); using (Stream stream = new MemoryStream()) { @@ -2657,6 +2660,27 @@ } } + private static Regex embedRegex = new Regex("[^a-zA-Z0-9]"); + + public static string GeneratePartId(string name, OpenXmlPart oxp) + { + var partId = name ?? "rId1"; + partId = embedRegex.Replace(partId, ""); + + // We guarantee the id uniqueness based off the name + try + { + oxp.GetPartById(partId); + } + catch(ArgumentOutOfRangeException) + { + return partId; + } + + partId += "c"; + return GeneratePartId(partId, oxp); + } + private static Vml.TextBox GetTextBox(IXLDrawingStyle ds) { var sb = new StringBuilder(); diff --git a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageHandling.xlsx b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageHandling.xlsx index c66abd4..89fb86d 100644 --- a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageHandling.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageHandling.xlsx Binary files differ