diff --git a/ClosedXML/Excel/NamedRanges/IXLNamedRange.cs b/ClosedXML/Excel/NamedRanges/IXLNamedRange.cs index 9695475..c1d3831 100644 --- a/ClosedXML/Excel/NamedRanges/IXLNamedRange.cs +++ b/ClosedXML/Excel/NamedRanges/IXLNamedRange.cs @@ -27,6 +27,14 @@ String Comment { get; set; } /// + /// Gets or sets the visibility of this named range. + /// + /// + /// true if visible; otherwise, false. + /// + Boolean Visible { get; set; } + + /// /// Adds the specified range to this named range. /// Note: A named range can point to multiple ranges. /// diff --git a/ClosedXML/Excel/NamedRanges/XLNamedRange.cs b/ClosedXML/Excel/NamedRanges/XLNamedRange.cs index a2958fb..1cef341 100644 --- a/ClosedXML/Excel/NamedRanges/XLNamedRange.cs +++ b/ClosedXML/Excel/NamedRanges/XLNamedRange.cs @@ -13,6 +13,7 @@ private readonly XLNamedRanges _namedRanges; public XLNamedRange(XLNamedRanges namedRanges , String rangeName, String range, String comment = null) { + Visible = true; Name = rangeName; _rangeList.Add(range); Comment = comment; @@ -21,6 +22,7 @@ public XLNamedRange(XLNamedRanges namedRanges, String rangeName, IXLRanges ranges, String comment = null) { + Visible = true; Name = rangeName; ranges.ForEach(r => _rangeList.Add(r.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true))); Comment = comment; @@ -33,7 +35,7 @@ get { var ranges = new XLRanges(); - foreach (var rangeToAdd in + foreach (var rangeToAdd in from rangeAddress in _rangeList.SelectMany(c=>c.Split(',')).Where(s=>s[0] != '"') let match = XLHelper.NamedRangeReferenceRegex.Match(rangeAddress) select @@ -49,6 +51,8 @@ public String Comment { get; set; } + public Boolean Visible { get; set; } + public IXLRanges Add(XLWorkbook workbook, String rangeAddress) { var ranges = new XLRanges(); diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs index 21c7cf9..c60af0e 100644 --- a/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -721,6 +721,8 @@ foreach (DefinedName definedName in workbook.DefinedNames) { var name = definedName.Name; + var visible = true; + if (definedName.Hidden != null) visible = !BooleanValue.ToBoolean(definedName.Hidden); if (name == "_xlnm.Print_Area") { foreach (string area in definedName.Text.Split(',')) @@ -758,12 +760,12 @@ if (localSheetId == null) { if (!NamedRanges.Any(nr => nr.Name == name)) - NamedRanges.Add(name, text, comment); + NamedRanges.Add(name, text, comment).Visible = visible; } else { if (!Worksheet(Int32.Parse(localSheetId) + 1).NamedRanges.Any(nr => nr.Name == name)) - Worksheet(Int32.Parse(localSheetId) + 1).NamedRanges.Add(name, text, comment); + Worksheet(Int32.Parse(localSheetId) + 1).NamedRanges.Add(name, text, comment).Visible = visible; } } } diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index 0e08ae1..5d9ac20 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -729,6 +729,10 @@ LocalSheetId = sheetId, Text = nr.ToString() }; + + if (!nr.Visible) + definedName.Hidden = BooleanValue.FromBoolean(true); + if (!XLHelper.IsNullOrWhiteSpace(nr.Comment)) definedName.Comment = nr.Comment; definedNames.AppendChild(definedName); @@ -780,6 +784,10 @@ Name = nr.Name, Text = nr.ToString() }; + + if (!nr.Visible) + definedName.Hidden = BooleanValue.FromBoolean(true); + if (!XLHelper.IsNullOrWhiteSpace(nr.Comment)) definedName.Comment = nr.Comment; definedNames.AppendChild(definedName); diff --git a/ClosedXML_Examples/Ranges/NamedRanges.cs b/ClosedXML_Examples/Ranges/NamedRanges.cs index 8b035df..325a98f 100644 --- a/ClosedXML_Examples/Ranges/NamedRanges.cs +++ b/ClosedXML_Examples/Ranges/NamedRanges.cs @@ -1,6 +1,5 @@ -using System; -using ClosedXML.Excel; - +using ClosedXML.Excel; +using System; namespace ClosedXML_Examples.Misc { @@ -28,6 +27,12 @@ // Create a named range with the data: wsData.Range("A2:B4").AddToNamed("PeopleData"); // Default named range scope is Workbook + // Create a hidden named range + wb.NamedRanges.Add("Headers", wsData.Range("A1:B1")).Visible = false; + + // Create a hidden named range n worksheet scope + wsData.NamedRanges.Add("HeadersAndData", wsData.Range("A1:B4")).Visible = false; + // Let's use the named range in a formula: wsPresentation.Cell(1, 1).Value = "People Count:"; wsPresentation.Cell(1, 2).FormulaA1 = "COUNT(PeopleData)"; @@ -42,7 +47,6 @@ // Copy the data in a named range: wsPresentation.Cell(4, 1).Value = "People Data:"; wsPresentation.Cell(5, 1).Value = wb.Range("PeopleData"); - ///////////////////////////////////////////////////////////////////////// // For the Excel geeks out there who actually know about @@ -76,7 +80,6 @@ // Override - - #endregion + #endregion Methods } } diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/NamedRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/NamedRanges.xlsx index 7087248..27bb627 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/NamedRanges.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/NamedRanges.xlsx Binary files differ