diff --git a/ClosedXML/Excel/Tables/IXLTableField.cs b/ClosedXML/Excel/Tables/IXLTableField.cs index 4c2fb00..c1e9107 100644 --- a/ClosedXML/Excel/Tables/IXLTableField.cs +++ b/ClosedXML/Excel/Tables/IXLTableField.cs @@ -20,6 +20,7 @@ { /// /// Gets the corresponding column for this table field. + /// Includes the header and footer cells /// /// /// The column. @@ -27,6 +28,31 @@ IXLRangeColumn Column { get; } /// + /// Gets the collection of data cells for this field + /// Excludes the header and footer cells + /// + /// + /// The data cells + /// + IXLCells DataCells { get; } + + /// + /// Gets the footer cell for the table field. + /// + /// + /// The footer cell. + /// + IXLCell TotalsCell { get; } + + /// + /// Gets the header cell for the table field. + /// + /// + /// The header cell. + /// + IXLCell HeaderCell { get; } + + /// /// Gets the index of the column (0-based). /// /// diff --git a/ClosedXML/Excel/Tables/XLTable.cs b/ClosedXML/Excel/Tables/XLTable.cs index 5841bb9..aa0024d 100644 --- a/ClosedXML/Excel/Tables/XLTable.cs +++ b/ClosedXML/Excel/Tables/XLTable.cs @@ -245,6 +245,9 @@ _showTotalsRow = value; + // Invalidate fields' columns + this.Fields.Cast().ForEach(f => f.Column = null); + if (_showTotalsRow) { AutoFilter.Range = Worksheet.Range( @@ -669,6 +672,9 @@ _showHeaderRow = value; + // Invalidate fields' columns + this.Fields.Cast().ForEach(f => f.Column = null); + if (_showHeaderRow) HeadersRow().DataType = XLDataType.Text; } diff --git a/ClosedXML/Excel/Tables/XLTableField.cs b/ClosedXML/Excel/Tables/XLTableField.cs index 15a2a89..c074518 100644 --- a/ClosedXML/Excel/Tables/XLTableField.cs +++ b/ClosedXML/Excel/Tables/XLTableField.cs @@ -32,6 +32,36 @@ } return _column; } + internal set + { + _column = value; + } + } + + public IXLCells DataCells + { + get + { + return Column.Cells(c => + { + if (table.ShowHeaderRow && c == HeaderCell) + return false; + if (table.ShowTotalsRow && c == TotalsCell) + return false; + return true; + }); + } + } + + public IXLCell HeaderCell + { + get + { + if (!table.ShowHeaderRow) + return null; + + return Column.FirstCell(); + } } public Int32 Index @@ -65,6 +95,17 @@ public IXLTable Table { get { return table; } } + public IXLCell TotalsCell + { + get + { + if (!table.ShowTotalsRow) + return null; + + return Column.LastCell(); + } + } + public String TotalsRowFormulaA1 { get { return table.TotalsRow().Cell(Index + 1).FormulaA1; } diff --git a/ClosedXML_Tests/Excel/Tables/TablesTests.cs b/ClosedXML_Tests/Excel/Tables/TablesTests.cs index e29fcb4..7d5d3ed 100644 --- a/ClosedXML_Tests/Excel/Tables/TablesTests.cs +++ b/ClosedXML_Tests/Excel/Tables/TablesTests.cs @@ -461,6 +461,47 @@ } [Test] + public void TestFieldCellTypes() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + var table = ws.Cell("B2").InsertTable(l); + + Assert.AreEqual(4, table.Fields.Count()); + + Assert.AreEqual("B2", table.Field(0).HeaderCell.Address.ToString()); + Assert.AreEqual("C2", table.Field(1).HeaderCell.Address.ToString()); + Assert.AreEqual("D2", table.Field(2).HeaderCell.Address.ToString()); + Assert.AreEqual("E2", table.Field(3).HeaderCell.Address.ToString()); + + Assert.IsNull(table.Field(0).TotalsCell); + Assert.IsNull(table.Field(1).TotalsCell); + Assert.IsNull(table.Field(2).TotalsCell); + Assert.IsNull(table.Field(3).TotalsCell); + + table.SetShowTotalsRow(); + + Assert.AreEqual("B5", table.Field(0).TotalsCell.Address.ToString()); + Assert.AreEqual("C5", table.Field(1).TotalsCell.Address.ToString()); + Assert.AreEqual("D5", table.Field(2).TotalsCell.Address.ToString()); + Assert.AreEqual("E5", table.Field(3).TotalsCell.Address.ToString()); + + var field = table.Fields.Last(); + + Assert.AreEqual("E2:E5", field.Column.RangeAddress.ToString()); + Assert.AreEqual("E3", field.DataCells.First().Address.ToString()); + Assert.AreEqual("E4", field.DataCells.Last().Address.ToString()); + } + } + + [Test] public void CanDeleteTable() { var l = new List()