diff --git a/ClosedXML/Excel/Drawings/XLPictures.cs b/ClosedXML/Excel/Drawings/XLPictures.cs index 6a102dd..e5832e0 100644 --- a/ClosedXML/Excel/Drawings/XLPictures.cs +++ b/ClosedXML/Excel/Drawings/XLPictures.cs @@ -12,10 +12,12 @@ { private readonly List _pictures = new List(); private readonly XLWorksheet _worksheet; + internal ICollection Deleted { get; private set; } public XLPictures(XLWorksheet worksheet) { _worksheet = worksheet; + Deleted = new HashSet(); } public int Count @@ -94,7 +96,17 @@ public void Delete(string pictureName) { - _pictures.RemoveAll(picture => picture.Name.Equals(pictureName, StringComparison.OrdinalIgnoreCase)); + var picturesToDelete = _pictures + .Where(picture => picture.Name.Equals(pictureName, StringComparison.OrdinalIgnoreCase)) + .ToList(); + + foreach (var picture in picturesToDelete) + { + if (!string.IsNullOrEmpty(picture.RelId)) + Deleted.Add(picture.RelId); + + _pictures.Remove(picture); + } } IEnumerator IEnumerable.GetEnumerator() diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index 74f0f52..db763b6 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -5302,6 +5302,16 @@ #region Drawings + if (worksheetPart.DrawingsPart != null) + { + var xlPictures = xlWorksheet.Pictures as Drawings.XLPictures; + foreach (var removedPicture in xlPictures.Deleted) + { + worksheetPart.DrawingsPart.DeletePart(removedPicture); + } + xlPictures.Deleted.Clear(); + } + foreach (var pic in xlWorksheet.Pictures) { AddPictureAnchor(worksheetPart, pic, context); @@ -5317,6 +5327,14 @@ worksheetPart.Worksheet.InsertBefore(worksheetDrawing, tableParts); } + if (!xlWorksheet.Pictures.Any() && worksheetPart.DrawingsPart != null) + { + var id = worksheetPart.GetIdOfPart(worksheetPart.DrawingsPart); + worksheetPart.Worksheet.RemoveChild(worksheetPart.Worksheet.OfType().FirstOrDefault(p => p.Id == id)); + worksheetPart.DeletePart(worksheetPart.DrawingsPart); + } + + #endregion Drawings #region LegacyDrawing diff --git a/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs index 0cd0edf..1da6ecb 100644 --- a/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs +++ b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs @@ -228,15 +228,30 @@ [Test] public void CanDeletePictures() { - using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx"))) - using (var wb = new XLWorkbook(stream)) + using (var ms = new MemoryStream()) { - var ws = wb.Worksheets.First(); - ws.Pictures.Delete(ws.Pictures.First()); + int originalCount; - var pictureName = ws.Pictures.First().Name; - ws.Pictures.Delete(pictureName); + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + originalCount = ws.Pictures.Count; + ws.Pictures.Delete(ws.Pictures.First()); + + var pictureName = ws.Pictures.First().Name; + ws.Pictures.Delete(pictureName); + + wb.SaveAs(ms); + } + + using (var wb = new XLWorkbook(ms)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual(originalCount - 2, ws.Pictures.Count); + } } + } [Test]