diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index ff4caa3..6c67db2 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -142,9 +142,10 @@ private void DeleteSheetAndDependencies(WorkbookPart wbPart, string sheetId) { //Get the SheetToDelete from workbook.xml - Sheet worksheet = wbPart.Workbook.Descendants().Where(s => s.Id == sheetId).FirstOrDefault(); + Sheet worksheet = wbPart.Workbook.Descendants().FirstOrDefault(s => s.Id == sheetId); if (worksheet == null) - { } + return; + string sheetName = worksheet.Name; // Get the pivot Table Parts @@ -154,8 +155,8 @@ { PivotCacheDefinition pvtCacheDef = Item.PivotCacheDefinition; //Check if this CacheSource is linked to SheetToDelete - var pvtCahce = pvtCacheDef.Descendants().Where(s => s.WorksheetSource.Sheet == sheetName); - if (pvtCahce.Count() > 0) + var pvtCache = pvtCacheDef.Descendants().Where(s => s.WorksheetSource.Sheet == sheetName); + if (pvtCache.Any()) { pvtTableCacheDefinationPart.Add(Item, Item.ToString()); } @@ -178,7 +179,7 @@ { List defNamesToDelete = new List(); - foreach (DefinedName Item in definedNames) + foreach (var Item in definedNames.OfType()) { // This condition checks to delete only those names which are part of Sheet in question if (Item.Text.Contains(worksheet.Name + "!")) @@ -201,19 +202,15 @@ var calChainEntries = calChainPart.CalculationChain.Descendants().Where(c => c.SheetId == sheetId); List calcsToDelete = new List(); foreach (CalculationCell Item in calChainEntries) - { calcsToDelete.Add(Item); - } + foreach (CalculationCell Item in calcsToDelete) - { Item.Remove(); - } - if (calChainPart.CalculationChain.Count() == 0) - { + + if (!calChainPart.CalculationChain.Any()) wbPart.DeletePart(calChainPart); - } } } @@ -350,6 +347,9 @@ GenerateCustomFilePropertiesPartContent(customFilePropertiesPart); } SetPackageProperties(document); + + // Clear list of deleted worksheets to prevent errors on multiple saves + worksheets.Deleted.Clear(); } private void DeleteComments(WorksheetPart worksheetPart, XLWorksheet worksheet, SaveContext context) diff --git a/ClosedXML_Tests/Excel/Saving/SavingTests.cs b/ClosedXML_Tests/Excel/Saving/SavingTests.cs index ca2fd98..60a1d7a 100644 --- a/ClosedXML_Tests/Excel/Saving/SavingTests.cs +++ b/ClosedXML_Tests/Excel/Saving/SavingTests.cs @@ -34,6 +34,35 @@ } [Test] + public void CanSaveFileMultipleTimesAfterDeletingWorksheet() + { + // https://github.com/ClosedXML/ClosedXML/issues/435 + + + using (var ms = new MemoryStream()) + { + using (XLWorkbook book1 = new XLWorkbook()) + { + book1.AddWorksheet("sheet1"); + book1.AddWorksheet("sheet2"); + + book1.SaveAs(ms); + } + ms.Position = 0; + + using (XLWorkbook book2 = new XLWorkbook(ms)) + { + var ws = book2.Worksheet(1); + Assert.AreEqual("sheet1", ws.Name); + ws.Delete(); + book2.Save(); + book2.Save(); + } + } + } + + + [Test] public void CanSaveAndValidateFileInAnotherCulture() { string[] cultures = new string[] { "it", "de-AT" };