Skip to content

Commit 5d31e90

Browse files
committed
Ensure that new table doesn't overlap with existing autofilter
1 parent 7390094 commit 5d31e90

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

ClosedXML/Excel/XLWorksheet.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1590,7 +1590,7 @@ public IXLTable Table(XLRange range, Boolean addToTables, Boolean setAutofilter
15901590

15911591
public IXLTable Table(XLRange range, String name, Boolean addToTables, Boolean setAutofilter = true)
15921592
{
1593-
CheckRangeNotInTable(range);
1593+
CheckRangeNotOverlappingOtherEntities(range);
15941594
XLRangeAddress rangeAddress;
15951595
if (range.Rows().Count() == 1)
15961596
{
@@ -1617,11 +1617,16 @@ public IXLTable Table(XLRange range, String name, Boolean addToTables, Boolean s
16171617
return table;
16181618
}
16191619

1620-
private void CheckRangeNotInTable(XLRange range)
1620+
private void CheckRangeNotOverlappingOtherEntities(XLRange range)
16211621
{
1622-
var overlappingTables = Tables.Where(t => t.RangeUsed().Intersects(range));
1623-
if (overlappingTables.Any())
1624-
throw new ArgumentException(nameof(range), $"The range {range.RangeAddress.ToStringRelative(true)} is already part of table '{overlappingTables.First().Name}'");
1622+
// Check that the range doesn't overlap with any existing tables
1623+
var firstOverlappingTable = Tables.FirstOrDefault(t => t.RangeUsed().Intersects(range));
1624+
if (firstOverlappingTable != null)
1625+
throw new InvalidOperationException($"The range {range.RangeAddress.ToStringRelative(includeSheet: true)} is already part of table '{firstOverlappingTable.Name}'");
1626+
1627+
// Check that the range doesn't overlap with any filters
1628+
if (AutoFilter.IsEnabled && this.AutoFilter.Range.Intersects(range))
1629+
throw new InvalidOperationException($"The range {range.RangeAddress.ToStringRelative(includeSheet: true)} overlaps with the worksheet's autofilter.");
16251630
}
16261631

16271632
private string GetNewTableName(string baseName)

ClosedXML_Tests/Excel/Tables/TablesTests.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ public void TableNameCannotBeValidCellName()
552552
}
553553
}
554554

555-
[Test]
555+
[Test]
556556
public void CanDeleteTableField()
557557
{
558558
var l = new List<TestObjectWithAttributes>()
@@ -895,10 +895,28 @@ public void CannotCreateDuplicateTablesOverSameRange()
895895
{
896896
IXLWorksheet ws = wb.AddWorksheet("Sheet1");
897897
ws.FirstCell().InsertTable(l);
898-
Assert.Throws<ArgumentException>(() => ws.RangeUsed().CreateTable());
898+
Assert.Throws<InvalidOperationException>(() => ws.RangeUsed().CreateTable());
899899
}
900900
}
901901

902+
[Test]
903+
public void CannotCreateTableOverExistingAutoFilter()
904+
{
905+
using var wb = new XLWorkbook();
906+
907+
var data = Enumerable.Range(1, 10).Select(i => new
908+
{
909+
Index = i,
910+
String = $"String {i}"
911+
});
912+
913+
var ws = wb.AddWorksheet();
914+
ws.FirstCell().InsertTable(data, createTable: false);
915+
ws.RangeUsed().SetAutoFilter().Column(1).AddFilter(5);
916+
917+
Assert.Throws<InvalidOperationException>(() => ws.RangeUsed().CreateTable());
918+
}
919+
902920
[Test]
903921
public void CopyTableSameWorksheet()
904922
{

0 commit comments

Comments
 (0)