diff --git a/ClosedXML/Excel/Tables/XLTable.cs b/ClosedXML/Excel/Tables/XLTable.cs index 528eb6d..4c70fc1 100644 --- a/ClosedXML/Excel/Tables/XLTable.cs +++ b/ClosedXML/Excel/Tables/XLTable.cs @@ -22,13 +22,14 @@ public XLTable(XLRange range, Boolean addToTables, Boolean setAutofilter = true) : base(new XLRangeParameters(range.RangeAddress, range.Style)) { + CheckRangeNotInTable(range); InitializeValues(setAutofilter); Int32 id = 1; while (true) { string tableName = String.Concat("Table", id); - if (Worksheet.Tables.All(t => t.Name != tableName)) + if (!Worksheet.Tables.Any(t => t.Name.Equals(tableName, StringComparison.OrdinalIgnoreCase))) { Name = tableName; AddToTables(range, addToTables); @@ -41,6 +42,7 @@ public XLTable(XLRange range, String name, Boolean addToTables, Boolean setAutofilter = true) : base(new XLRangeParameters(range.RangeAddress, range.Style)) { + CheckRangeNotInTable(range); InitializeValues(setAutofilter); Name = name; @@ -858,5 +860,12 @@ return table; } + + private static void CheckRangeNotInTable(XLRange range) + { + var overlappingTables = range.Worksheet.Tables.Where(t => t.RangeUsed().Intersects(range)); + if (overlappingTables.Any()) + throw new ArgumentException(nameof(range), $"The range {range.RangeAddress.ToStringRelative(true)} is already part of table '{overlappingTables.First().Name}'"); + } } } diff --git a/ClosedXML_Tests/Excel/Tables/TablesTests.cs b/ClosedXML_Tests/Excel/Tables/TablesTests.cs index e5868fa..f440bd3 100644 --- a/ClosedXML_Tests/Excel/Tables/TablesTests.cs +++ b/ClosedXML_Tests/Excel/Tables/TablesTests.cs @@ -763,6 +763,24 @@ } } + [Test] + public void CannotCreateDuplicateTablesOverSameRange() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(l); + Assert.Throws(() => ws.RangeUsed().CreateTable()); + } + + } + //TODO: Delete table (not underlying range) } }