diff --git a/ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs b/ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs index 0f1c4ca..356424c 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs @@ -99,7 +99,7 @@ { _relIds.Add(relType, new List()); } - _relIds[relType].AddRange(values); + _relIds[relType].AddRange(values.Where(v => !_relIds[relType].Contains(v))); } public void Reset(RelType relType) { @@ -147,9 +147,5 @@ public IXLStyle Style; } #endregion - - - - } -} \ No newline at end of file +} diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index 8dd7f14..1a4f3bc 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -578,24 +578,36 @@ sheet.Name = wks.Name; } - foreach (var xlSheet in - WorksheetsInternal.Cast().Where(s => s.SheetId == 0).OrderBy(w => w.Position)) + foreach (var xlSheet in WorksheetsInternal.Cast().OrderBy(w => w.Position)) { - var rId = context.RelIdGenerator.GetNext(RelType.Workbook); - - while (WorksheetsInternal.Cast().Any(w => w.SheetId == Int32.Parse(rId.Substring(3)))) + string rId; + if (xlSheet.SheetId == 0) + { rId = context.RelIdGenerator.GetNext(RelType.Workbook); - xlSheet.SheetId = Int32.Parse(rId.Substring(3)); - xlSheet.RelId = rId; - var newSheet = new Sheet - { - Name = xlSheet.Name, - Id = rId, - SheetId = (UInt32)xlSheet.SheetId - }; + while (WorksheetsInternal.Cast().Any(w => w.SheetId == Int32.Parse(rId.Substring(3)))) + rId = context.RelIdGenerator.GetNext(RelType.Workbook); - workbook.Sheets.AppendChild(newSheet); + xlSheet.SheetId = Int32.Parse(rId.Substring(3)); + xlSheet.RelId = rId; + } + else + { + rId = String.Format("rId{0}", xlSheet.SheetId); + context.RelIdGenerator.AddValues(new List { rId }, RelType.Workbook); + } + + if (!workbook.Sheets.Cast().Any(s => s.Id == rId)) + { + var newSheet = new Sheet + { + Name = xlSheet.Name, + Id = rId, + SheetId = (UInt32)xlSheet.SheetId + }; + + workbook.Sheets.AppendChild(newSheet); + } } var sheetElements = from sheet in workbook.Sheets.Elements() diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj index f1c0f09..802f873 100644 --- a/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -78,6 +78,7 @@ + @@ -265,4 +266,4 @@ --> - + \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Saving/SavingTests.cs b/ClosedXML_Tests/Excel/Saving/SavingTests.cs new file mode 100644 index 0000000..22aa34a --- /dev/null +++ b/ClosedXML_Tests/Excel/Saving/SavingTests.cs @@ -0,0 +1,30 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System.IO; + +namespace ClosedXML_Tests.Excel.Saving +{ + [TestFixture] + public class SavingTests + { + [Test] + public void CanSuccessfullySaveFileMultipleTimes() + { + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("TestSheet"); + var memoryStream = new MemoryStream(); + wb.SaveAs(memoryStream, true); + + for (int i = 1; i <= 3; i++) + { + sheet.Cell(i, 1).Value = "test" + i; + wb.SaveAs(memoryStream, true); + } + + memoryStream.Close(); + memoryStream.Dispose(); + } + } + } +}