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

Commit b57da61

Browse files
adm90rominator1983
authored andcommitted
Fix shape disappear if there was no image
It also fixes an issue where image reference links would appear broken when some images were deleted. (cherry picked from commit 136b792)
1 parent 3b92722 commit b57da61

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)