From 941833091525354b2591c3505913778cf002c97d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Luthi?= Date: Tue, 26 Apr 2022 10:53:12 +0200 Subject: [PATCH] Add the possibility to enable the AutoFilter feature See https://support.microsoft.com/en-us/office/use-autofilter-to-filter-your-data-7d87d63e-ebd0-424b-8106-e2ab61133d92 --- src/Simplexcel.TestApp/Program.cs | 2 +- src/Simplexcel/Worksheet.cs | 8 ++++++++ src/Simplexcel/XlsxInternal/XlsxWriter.cs | 11 +++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Simplexcel.TestApp/Program.cs b/src/Simplexcel.TestApp/Program.cs index e48ff8e..4394717 100644 --- a/src/Simplexcel.TestApp/Program.cs +++ b/src/Simplexcel.TestApp/Program.cs @@ -136,7 +136,7 @@ static void Main() populatedSheet.Populate(EnumeratePopulateTestData(), cacheTypeColumns: true); wb.Add(populatedSheet); - var frozenTopRowSheet = new Worksheet("Frozen Top Row"); + var frozenTopRowSheet = new Worksheet("Frozen Top Row") { AutoFilter = true }; frozenTopRowSheet.Cells[0, 0] = "Header 1"; frozenTopRowSheet.Cells[0, 1] = "Header 2"; frozenTopRowSheet.Cells[0, 2] = "Header 3"; diff --git a/src/Simplexcel/Worksheet.cs b/src/Simplexcel/Worksheet.cs index 7dde311..02aa420 100644 --- a/src/Simplexcel/Worksheet.cs +++ b/src/Simplexcel/Worksheet.cs @@ -94,6 +94,14 @@ public ColumnWidthCollection ColumnWidths /// public LargeNumberHandlingMode LargeNumberHandlingMode { get; set; } + /// + /// Whether to enable the AutoFilter feature on the first non-empty row. + /// + /// Defaults to . + /// + /// See Use AutoFilter to filter your data + public bool AutoFilter { get; set; } + /// /// Get the cell with the given cell reference, e.g. Get the cell "A1". May return NULL. /// diff --git a/src/Simplexcel/XlsxInternal/XlsxWriter.cs b/src/Simplexcel/XlsxInternal/XlsxWriter.cs index cf6a9b6..54643d6 100644 --- a/src/Simplexcel/XlsxInternal/XlsxWriter.cs +++ b/src/Simplexcel/XlsxInternal/XlsxWriter.cs @@ -473,8 +473,10 @@ private static Relationship CreateSheetFile(Worksheet sheet, int sheetIndex, Rel } var sheetData = new XElement(Namespaces.workbook + "sheetData"); + XlsxRow firstRow = null; foreach (var row in rows.OrderBy(rk => rk.Key)) { + firstRow ??= row.Value; var re = new XElement(Namespaces.workbook + "row", new XAttribute("r", row.Value.RowIndex)); foreach (var cell in row.Value.Cells) { @@ -498,6 +500,15 @@ private static Relationship CreateSheetFile(Worksheet sheet, int sheetIndex, Rel } doc.Root.Add(sheetData); + var firstRowCells = firstRow?.Cells; + if (sheet.AutoFilter && firstRowCells?.Count > 0) + { + var firstRef = firstRowCells.First().Reference; + var lastRef = firstRowCells.Last().Reference; + var autoFilter = new XElement(Namespaces.workbook + "autoFilter", new XAttribute("ref", $"{firstRef}:{lastRef}")); + doc.Root.Add(autoFilter); + } + sheetRels = null; var hyperlinks = sheet.Cells.Where(c => c.Value != null && !string.IsNullOrEmpty(c.Value.Hyperlink)).ToList(); if (hyperlinks.Count > 0)