diff --git a/ClosedXML/Excel/AutoFilters/IXLAutoFilter.cs b/ClosedXML/Excel/AutoFilters/IXLAutoFilter.cs index eff35f0..b848f47 100644 --- a/ClosedXML/Excel/AutoFilters/IXLAutoFilter.cs +++ b/ClosedXML/Excel/AutoFilters/IXLAutoFilter.cs @@ -26,6 +26,8 @@ IXLFilterColumn Column(Int32 column); + IXLAutoFilter Reapply(); + IXLAutoFilter Sort(Int32 columnToSortBy = 1, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); } } diff --git a/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs b/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs index 8b55418..f994fff 100644 --- a/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs +++ b/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs @@ -55,45 +55,10 @@ return filterColumn; } - IXLAutoFilter IXLAutoFilter.Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, - Boolean ignoreBlanks) + public IXLAutoFilter Reapply() { - return Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks); - } - - #endregion IXLAutoFilter Members - - public XLAutoFilter Clear() - { - if (!Enabled) return this; - - Enabled = false; - Filters.Clear(); - foreach (IXLRangeRow row in Range.Rows().Where(r => r.RowNumber() > 1)) - row.WorksheetRow().Unhide(); - return this; - } - - public XLAutoFilter Set(IXLRangeBase range) - { - Range = range.AsRange(); - Enabled = true; - return this; - } - - public XLAutoFilter Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, Boolean ignoreBlanks) - { - if (!Enabled) - throw new InvalidOperationException("Filter has not been enabled."); - var ws = Range.Worksheet as XLWorksheet; ws.SuspendEvents(); - Range.Range(Range.FirstCell().CellBelow(), Range.LastCell()).Sort(columnToSortBy, sortOrder, matchCase, - ignoreBlanks); - - Sorted = true; - SortOrder = sortOrder; - SortColumn = columnToSortBy; // Recalculate shown / hidden rows var rows = Range.Rows(2, Range.RowCount()); @@ -154,5 +119,52 @@ ws.ResumeEvents(); return this; } + + IXLAutoFilter IXLAutoFilter.Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, + Boolean ignoreBlanks) + { + return Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks); + } + + #endregion IXLAutoFilter Members + + public XLAutoFilter Clear() + { + if (!Enabled) return this; + + Enabled = false; + Filters.Clear(); + foreach (IXLRangeRow row in Range.Rows().Where(r => r.RowNumber() > 1)) + row.WorksheetRow().Unhide(); + return this; + } + + public XLAutoFilter Set(IXLRangeBase range) + { + Range = range.AsRange(); + Enabled = true; + return this; + } + + public XLAutoFilter Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, Boolean ignoreBlanks) + { + if (!Enabled) + throw new InvalidOperationException("Filter has not been enabled."); + + var ws = Range.Worksheet as XLWorksheet; + ws.SuspendEvents(); + Range.Range(Range.FirstCell().CellBelow(), Range.LastCell()).Sort(columnToSortBy, sortOrder, matchCase, + ignoreBlanks); + + Sorted = true; + SortOrder = sortOrder; + SortColumn = columnToSortBy; + + ws.ResumeEvents(); + + Reapply(); + + return this; + } } } diff --git a/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs b/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs index ae1f16b..b6c01d5 100644 --- a/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs +++ b/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs @@ -183,5 +183,34 @@ } } + [Test] + public void ReapplyAutoFilter() + { + using (var wb = new XLWorkbook()) + { + using (var ws = wb.Worksheets.Add("Sheet1")) + { + ws.Cell(3, 3).SetValue("Names") + .CellBelow().SetValue("Manuel") + .CellBelow().SetValue("Carlos") + .CellBelow().SetValue("Dominic") + .CellBelow().SetValue("Jose"); + + var autoFilter = ws.RangeUsed() + .SetAutoFilter(); + + autoFilter.Column(1).AddFilter("Carlos"); + + Assert.AreEqual(3, autoFilter.HiddenRows.Count()); + + // Unhide the rows so that the table is out of sync with the filter + autoFilter.HiddenRows.ForEach(r => r.WorksheetRow().Unhide()); + Assert.False(autoFilter.HiddenRows.Any()); + + autoFilter.Reapply(); + Assert.AreEqual(3, autoFilter.HiddenRows.Count()); + } + } + } } }