Skip to content

Commit

Permalink
Ensure that new table doesn't overlap with existing autofilter
Browse files Browse the repository at this point in the history
  • Loading branch information
igitur committed May 26, 2020
1 parent 7390094 commit 5d31e90
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 7 deletions.
15 changes: 10 additions & 5 deletions ClosedXML/Excel/XLWorksheet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1590,7 +1590,7 @@ public IXLTable Table(XLRange range, Boolean addToTables, Boolean setAutofilter

public IXLTable Table(XLRange range, String name, Boolean addToTables, Boolean setAutofilter = true)
{
CheckRangeNotInTable(range);
CheckRangeNotOverlappingOtherEntities(range);
XLRangeAddress rangeAddress;
if (range.Rows().Count() == 1)
{
Expand All @@ -1617,11 +1617,16 @@ public IXLTable Table(XLRange range, String name, Boolean addToTables, Boolean s
return table;
}

private void CheckRangeNotInTable(XLRange range)
private void CheckRangeNotOverlappingOtherEntities(XLRange range)
{
var overlappingTables = 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}'");
// Check that the range doesn't overlap with any existing tables
var firstOverlappingTable = Tables.FirstOrDefault(t => t.RangeUsed().Intersects(range));
if (firstOverlappingTable != null)
throw new InvalidOperationException($"The range {range.RangeAddress.ToStringRelative(includeSheet: true)} is already part of table '{firstOverlappingTable.Name}'");

// Check that the range doesn't overlap with any filters
if (AutoFilter.IsEnabled && this.AutoFilter.Range.Intersects(range))
throw new InvalidOperationException($"The range {range.RangeAddress.ToStringRelative(includeSheet: true)} overlaps with the worksheet's autofilter.");
}

private string GetNewTableName(string baseName)
Expand Down
22 changes: 20 additions & 2 deletions ClosedXML_Tests/Excel/Tables/TablesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -552,7 +552,7 @@ public void TableNameCannotBeValidCellName()
}
}

[Test]
[Test]
public void CanDeleteTableField()
{
var l = new List<TestObjectWithAttributes>()
Expand Down Expand Up @@ -895,10 +895,28 @@ public void CannotCreateDuplicateTablesOverSameRange()
{
IXLWorksheet ws = wb.AddWorksheet("Sheet1");
ws.FirstCell().InsertTable(l);
Assert.Throws<ArgumentException>(() => ws.RangeUsed().CreateTable());
Assert.Throws<InvalidOperationException>(() => ws.RangeUsed().CreateTable());
}
}

[Test]
public void CannotCreateTableOverExistingAutoFilter()
{
using var wb = new XLWorkbook();

var data = Enumerable.Range(1, 10).Select(i => new
{
Index = i,
String = $"String {i}"
});

var ws = wb.AddWorksheet();
ws.FirstCell().InsertTable(data, createTable: false);
ws.RangeUsed().SetAutoFilter().Column(1).AddFilter(5);

Assert.Throws<InvalidOperationException>(() => ws.RangeUsed().CreateTable());
}

[Test]
public void CopyTableSameWorksheet()
{
Expand Down

0 comments on commit 5d31e90

Please sign in to comment.