diff --git a/ClosedXML/Excel/XLWorkbook_ImageHandling.cs b/ClosedXML/Excel/XLWorkbook_ImageHandling.cs index 9dbaf3e..8ea8d29 100644 --- a/ClosedXML/Excel/XLWorkbook_ImageHandling.cs +++ b/ClosedXML/Excel/XLWorkbook_ImageHandling.cs @@ -43,13 +43,13 @@ if (!IsAllowedAnchor(anchor)) return null; - var picture = anchor - .Descendants() - .FirstOrDefault(); + // Maybe we should not restrict here, and just search for all NonVisualDrawingProperties in an anchor? + var shape = anchor.Descendants().Cast().FirstOrDefault() + ?? anchor.Descendants().Cast().FirstOrDefault(); - if (picture == null) return null; + if (shape == null) return null; - return picture + return shape .Descendants() .FirstOrDefault(); } diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index 99e1730..9e536de 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -104,7 +104,7 @@ if (errors.Any()) { - var message = string.Join("\r\n", errors.Select(e => string.Format("{0} in {1}", e.Description, e.Path.XPath)).ToArray()); + var message = string.Join("\r\n", errors.Select(e => string.Format("Part {0}, Path {1}: {2}", e.Part.Uri, e.Path.XPath, e.Description)).ToArray()); throw new ApplicationException(message); } return true; @@ -3075,14 +3075,22 @@ } } - private static void RebasePictureIds(WorksheetPart worksheetPart) + // Still not fully implemented for all shapes + private static void RebaseShapeIds(WorksheetPart worksheetPart) { - for (var i = 0; i < worksheetPart.DrawingsPart.WorksheetDrawing.ChildElements.Count; i++) + var worksheetDrawing = worksheetPart.DrawingsPart.WorksheetDrawing; + for (var i = 0; i < worksheetDrawing.ChildElements.Count; i++) { - var anchor = worksheetPart.DrawingsPart.WorksheetDrawing.ElementAt(i); + var anchor = worksheetDrawing.ElementAt(i); var props = GetPropertiesFromAnchor(anchor); if (props != null) - props.Id = Convert.ToUInt32(i + 1); + { + var offset = 1; + while (worksheetDrawing.Descendants().Any(p => p.Id == Convert.ToUInt32(i + offset))) + offset++; + + props.Id = Convert.ToUInt32(i + offset); + } } } @@ -5437,7 +5445,7 @@ } if (xlWorksheet.Pictures.Any()) - RebasePictureIds(worksheetPart); + RebaseShapeIds(worksheetPart); var tableParts = worksheetPart.Worksheet.Elements().First(); if (xlWorksheet.Pictures.Any() && !worksheetPart.Worksheet.OfType().Any())