private void DeleteComments(WorksheetPart worksheetPart, XLWorksheet worksheet, SaveContext context) { // We have the comments so we can delete the comments part worksheetPart.DeletePart(worksheetPart.WorksheetCommentsPart); var vmlDrawingPart = worksheetPart.VmlDrawingParts.FirstOrDefault(); // Only delete the VmlDrawingParts for comments. if (vmlDrawingPart != null) { var xdoc = XDocumentExtensions.Load(vmlDrawingPart.GetStream(FileMode.Open)); //xdoc.Root.Elements().Where(e => e.Name.LocalName == "shapelayout").Remove(); xdoc.Root.Elements().Where( e => e.Name.LocalName == "shapetype" && (string)e.Attribute("id") == @"_x0000_t202").Remove(); xdoc.Root.Elements().Where( e => e.Name.LocalName == "shape" && (string)e.Attribute("type") == @"#_x0000_t202").Remove(); var imageParts = vmlDrawingPart.ImageParts.ToList(); var legacyParts = vmlDrawingPart.LegacyDiagramTextParts.ToList(); var rId = worksheetPart.GetIdOfPart(vmlDrawingPart); worksheet.LegacyDrawingId = rId; worksheetPart.ChangeIdOfPart(vmlDrawingPart, "xxRRxx"); // Anything will do for the new relationship id // we just want it alive enough to create the copy var hasShapes = xdoc.Root.Elements().Any(e => e.Name.LocalName == "shape" || e.Name.LocalName == "group"); VmlDrawingPart vmlDrawingPartNew = null; var hasNewPart = (imageParts.Count > 0 || legacyParts.Count > 0 || hasShapes); if (hasNewPart) { vmlDrawingPartNew = worksheetPart.AddNewPart<VmlDrawingPart>(rId); using (var writer = new XmlTextWriter(vmlDrawingPartNew.GetStream(FileMode.Create), Encoding.UTF8)) { writer.WriteRaw(xdoc.ToString()); } imageParts.ForEach(p => vmlDrawingPartNew.AddPart(p, vmlDrawingPart.GetIdOfPart(p))); legacyParts.ForEach(p => vmlDrawingPartNew.AddPart(p, vmlDrawingPart.GetIdOfPart(p))); } worksheetPart.DeletePart(vmlDrawingPart); if (hasNewPart && rId != worksheetPart.GetIdOfPart(vmlDrawingPartNew)) worksheetPart.ChangeIdOfPart(vmlDrawingPartNew, rId); } }