Skip to content
This repository was archived by the owner on Nov 14, 2022. It is now read-only.

Commit 6d867d9

Browse files
Merge pull request #20 from stesee/1252_shape_bugfix
Fixes an issue where image reference links would appear broken when some images were deleted. Fixes disappearing shapes when there was no image.
2 parents 30af159 + b57da61 commit 6d867d9

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

ClosedXML/Excel/XLWorkbook_Save.cs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5969,6 +5969,15 @@ var r in
59695969
foreach (var removedPicture in xlPictures.Deleted)
59705970
{
59715971
worksheetPart.DrawingsPart.DeletePart(removedPicture);
5972+
// Remove Image reference link
5973+
foreach (var wd in worksheetPart.DrawingsPart.WorksheetDrawing)
5974+
{
5975+
if (wd.Descendants<Blip>().Any(x => x.Embed == removedPicture))
5976+
{
5977+
worksheetPart.DrawingsPart.WorksheetDrawing.RemoveChild(wd);
5978+
break;
5979+
}
5980+
}
59725981
}
59735982
xlPictures.Deleted.Clear();
59745983
}
@@ -5990,9 +5999,22 @@ var r in
59905999
cm.SetElement(XLWorksheetContents.Drawing, worksheetPart.Worksheet.Elements<Drawing>().First());
59916000
}
59926001

6002+
bool isEmptyDrawingsPart(DrawingsPart drawingsPart)
6003+
{
6004+
return drawingsPart != null
6005+
&& !drawingsPart.CustomXmlParts.Any()
6006+
&& !drawingsPart.ImageParts.Any()
6007+
&& !drawingsPart.DiagramStyleParts.Any()
6008+
&& !drawingsPart.DiagramLayoutDefinitionParts.Any()
6009+
&& !drawingsPart.DiagramPersistLayoutParts.Any()
6010+
&& !drawingsPart.DiagramDataParts.Any()
6011+
&& !drawingsPart.DiagramColorsParts.Any()
6012+
&& !drawingsPart.ChartParts.Any()
6013+
&& !drawingsPart.WebExtensionParts.Any();
6014+
}
6015+
59936016
// Instead of saving a file with an empty Drawings.xml file, rather remove the .xml file
5994-
if (!xlWorksheet.Pictures.Any() && worksheetPart.DrawingsPart != null
5995-
&& !worksheetPart.DrawingsPart.Parts.Any())
6017+
if (!xlWorksheet.Pictures.Any() && isEmptyDrawingsPart(worksheetPart.DrawingsPart))
59966018
{
59976019
var id = worksheetPart.GetIdOfPart(worksheetPart.DrawingsPart);
59986020
worksheetPart.Worksheet.RemoveChild(worksheetPart.Worksheet.OfType<Drawing>().FirstOrDefault(p => p.Id == id));

ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,31 @@ public void CanLoadFileWithImagesAndCopyImagesToNewSheet()
289289
}
290290
}
291291

292+
[Test]
293+
public void CanDeletePictureOnlyOne()
294+
{
295+
using (var ms = new MemoryStream())
296+
{
297+
int originalCount;
298+
299+
using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx")))
300+
using (var wb = new XLWorkbook(stream))
301+
{
302+
var ws = wb.Worksheets.First();
303+
originalCount = ws.Pictures.Count;
304+
305+
ws.Pictures.Delete(ws.Pictures.First());
306+
wb.SaveAs(ms);
307+
}
308+
309+
using (var wb = new XLWorkbook(ms))
310+
{
311+
var ws = wb.Worksheets.First();
312+
Assert.AreEqual(originalCount - 1, ws.Pictures.Count);
313+
}
314+
}
315+
}
316+
292317
[Test]
293318
public void CanDeletePictures()
294319
{

0 commit comments

Comments
 (0)