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()