diff --git a/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/Excel/Cells/XLCell.cs index 8255203..8b05502 100644 --- a/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/Excel/Cells/XLCell.cs @@ -105,7 +105,27 @@ get { return _worksheet; } } - public XLAddress Address { get; internal set; } + + private int _rowNumber; + private int _columnNumber; + private bool _fixedRow; + private bool _fixedCol; + public XLAddress Address + { + get + { + return new XLAddress(_worksheet, _rowNumber, _columnNumber, _fixedRow, _fixedCol); + } + internal set + { + if (value == null) + return; + _rowNumber = value.RowNumber; + _columnNumber = value.ColumnNumber; + _fixedRow = value.FixedRow; + _fixedCol = value.FixedColumn; + } + } public string InnerText { @@ -476,8 +496,8 @@ if (data != null && !(data is String)) { - var ro = Address.RowNumber + 1; - var fRo = Address.RowNumber; + var ro = _rowNumber + 1; + var fRo = _rowNumber; var hasTitles = false; var maxCo = 0; var isDataTable = false; @@ -487,15 +507,15 @@ if (!data.Any()) { if (itemType.IsPrimitive || itemType == typeof(String) || itemType == typeof(DateTime) || itemType.IsNumber()) - maxCo = Address.ColumnNumber + 1; + maxCo = _columnNumber + 1; else - maxCo = Address.ColumnNumber + itemType.GetFields().Length + itemType.GetProperties().Length; + maxCo = _columnNumber + itemType.GetFields().Length + itemType.GetProperties().Length; } else if (itemType.IsPrimitive || itemType == typeof(String) || itemType == typeof(DateTime) || itemType.IsNumber()) { foreach (object o in data) { - var co = Address.ColumnNumber; + var co = _columnNumber; if (!hasTitles) { @@ -505,7 +525,7 @@ _worksheet.SetValue(fieldName, fRo, co); hasTitles = true; - co = Address.ColumnNumber; + co = _columnNumber; } _worksheet.SetValue(o, ro, co); @@ -559,7 +579,7 @@ accessor = accessorCache[type]; } - var co = Address.ColumnNumber; + var co = _columnNumber; if (itemType.IsArray) { @@ -586,7 +606,7 @@ co++; } - co = Address.ColumnNumber; + co = _columnNumber; hasTitles = true; } @@ -612,7 +632,7 @@ co++; } - co = Address.ColumnNumber; + co = _columnNumber; hasTitles = true; } @@ -640,7 +660,7 @@ co++; } - co = Address.ColumnNumber; + co = _columnNumber; hasTitles = true; } @@ -666,8 +686,8 @@ ClearMerged(); var range = _worksheet.Range( - Address.RowNumber, - Address.ColumnNumber, + _rowNumber, + _columnNumber, ro - 1, maxCo - 1); @@ -703,8 +723,8 @@ throw new InvalidOperationException(String.Format("This cell '{0}' is already part of a table.", this.Address.ToString())); if (data.Rows.Cast().Any()) return InsertTable(data.Rows.Cast(), tableName, createTable); - var ro = Address.RowNumber; - var co = Address.ColumnNumber; + var ro = _rowNumber; + var co = _columnNumber; foreach (DataColumn col in data.Columns) { @@ -714,8 +734,8 @@ ClearMerged(); var range = _worksheet.Range( - Address.RowNumber, - Address.ColumnNumber, + _rowNumber, + _columnNumber, ro, co - 1); @@ -729,8 +749,8 @@ var table = this.Worksheet.Tables.FirstOrDefault(t => t.AsRange().Contains(this)); if (table == null) return XLTableCellType.None; - if (table.ShowHeaderRow && table.HeadersRow().RowNumber().Equals(this.Address.RowNumber)) return XLTableCellType.Header; - if (table.ShowTotalsRow && table.TotalsRow().RowNumber().Equals(this.Address.RowNumber)) return XLTableCellType.Total; + if (table.ShowHeaderRow && table.HeadersRow().RowNumber().Equals(this._rowNumber)) return XLTableCellType.Header; + if (table.ShowTotalsRow && table.TotalsRow().RowNumber().Equals(this._rowNumber)) return XLTableCellType.Total; return XLTableCellType.Data; } @@ -744,8 +764,8 @@ { if (data != null && !(data is String)) { - var rowNumber = Address.RowNumber; - var columnNumber = Address.ColumnNumber; + var rowNumber = _rowNumber; + var columnNumber = _columnNumber; var maxColumnNumber = 0; var maxRowNumber = 0; @@ -763,9 +783,9 @@ var itemType = m.GetType(); if (transpose) - rowNumber = Address.RowNumber; + rowNumber = _rowNumber; else - columnNumber = Address.ColumnNumber; + columnNumber = _columnNumber; if (itemType.IsPrimitive || itemType == typeof(String) || itemType == typeof(DateTime) || itemType.IsNumber()) { @@ -869,8 +889,8 @@ ClearMerged(); return _worksheet.Range( - Address.RowNumber, - Address.ColumnNumber, + _rowNumber, + _columnNumber, maxRowNumber - 1, maxColumnNumber - 1); } @@ -1228,11 +1248,11 @@ if (_style == null) { XLRow row; - if (Worksheet.Internals.RowsCollection.TryGetValue(Address.RowNumber, out row) && !row.Style.Equals(Worksheet.Style)) + if (Worksheet.Internals.RowsCollection.TryGetValue(_rowNumber, out row) && !row.Style.Equals(Worksheet.Style)) return false; XLColumn column; - if (Worksheet.Internals.ColumnsCollection.TryGetValue(Address.ColumnNumber, out column) && !column.Style.Equals(Worksheet.Style)) + if (Worksheet.Internals.ColumnsCollection.TryGetValue(_columnNumber, out column) && !column.Style.Equals(Worksheet.Style)) return false; } } @@ -1246,12 +1266,12 @@ public IXLColumn WorksheetColumn() { - return Worksheet.Column(Address.ColumnNumber); + return Worksheet.Column(_columnNumber); } public IXLRow WorksheetRow() { - return Worksheet.Row(Address.RowNumber); + return Worksheet.Row(_rowNumber); } public IXLCell CopyTo(IXLCell target) @@ -1753,7 +1773,7 @@ { var maxRows = asRange.RowCount(); var maxColumns = asRange.ColumnCount(); - using (var rng = Worksheet.Range(Address.RowNumber, Address.ColumnNumber, maxRows, maxColumns)) + using (var rng = Worksheet.Range(_rowNumber, _columnNumber, maxRows, maxColumns)) rng.Clear(); } @@ -1762,19 +1782,19 @@ foreach (var sourceCell in asRange.CellsUsed(true)) { Worksheet.Cell( - Address.RowNumber + sourceCell.Address.RowNumber - minRow, - Address.ColumnNumber + sourceCell.Address.ColumnNumber - minColumn + _rowNumber + sourceCell.Address.RowNumber - minRow, + _columnNumber + sourceCell.Address.ColumnNumber - minColumn ).CopyFromInternal(sourceCell as XLCell, true); } var rangesToMerge = (from mergedRange in (asRange.Worksheet).Internals.MergedRanges where asRange.Contains(mergedRange) let initialRo = - Address.RowNumber + + _rowNumber + (mergedRange.RangeAddress.FirstAddress.RowNumber - asRange.RangeAddress.FirstAddress.RowNumber) let initialCo = - Address.ColumnNumber + + _columnNumber + (mergedRange.RangeAddress.FirstAddress.ColumnNumber - asRange.RangeAddress.FirstAddress.ColumnNumber) select @@ -1809,7 +1829,7 @@ int cCnt = minCo - fromRange.RangeAddress.FirstAddress.ColumnNumber + 1; rCnt = Math.Min(rCnt, fromRange.RowCount()); cCnt = Math.Min(cCnt, fromRange.ColumnCount()); - var toRange = Worksheet.Range(this, Worksheet.Cell(Address.RowNumber + rCnt - 1, Address.ColumnNumber + cCnt - 1)); + var toRange = Worksheet.Range(this, Worksheet.Cell(_rowNumber + rCnt - 1, _columnNumber + cCnt - 1)); var formats = srcSheet.ConditionalFormats.Where(f => f.Range.Intersects(fromRange)); foreach (var cf in formats.ToList()) { @@ -2053,7 +2073,7 @@ { string columnToReturn; if (columnPart == "C") - columnToReturn = XLHelper.GetColumnLetterFromNumber(Address.ColumnNumber + columnsToShift); + columnToReturn = XLHelper.GetColumnLetterFromNumber(_columnNumber + columnsToShift); else { var bIndex = columnPart.IndexOf("["); @@ -2061,14 +2081,14 @@ if (bIndex >= 0) { columnToReturn = XLHelper.GetColumnLetterFromNumber( - Address.ColumnNumber + + _columnNumber + Int32.Parse(columnPart.Substring(bIndex + 1, columnPart.Length - bIndex - 2)) + columnsToShift ); } else if (mIndex >= 0) { columnToReturn = XLHelper.GetColumnLetterFromNumber( - Address.ColumnNumber + Int32.Parse(columnPart.Substring(mIndex)) + columnsToShift + _columnNumber + Int32.Parse(columnPart.Substring(mIndex)) + columnsToShift ); } else @@ -2086,14 +2106,14 @@ { string rowToReturn; if (rowPart == "R") - rowToReturn = (Address.RowNumber + rowsToShift).ToString(); + rowToReturn = (_rowNumber + rowsToShift).ToString(); else { var bIndex = rowPart.IndexOf("["); if (bIndex >= 0) { rowToReturn = - (Address.RowNumber + Int32.Parse(rowPart.Substring(bIndex + 1, rowPart.Length - bIndex - 2)) + + (_rowNumber + Int32.Parse(rowPart.Substring(bIndex + 1, rowPart.Length - bIndex - 2)) + rowsToShift).ToString(); } else @@ -2140,7 +2160,7 @@ { string rowPart; rowNumber += rowsToShift; - var rowDiff = rowNumber - Address.RowNumber; + var rowDiff = rowNumber - _rowNumber; if (rowDiff != 0 || fixedRow) rowPart = fixedRow ? String.Format("R{0}", rowNumber) : String.Format("R[{0}]", rowDiff); else @@ -2153,7 +2173,7 @@ { string columnPart; columnNumber += columnsToShift; - var columnDiff = columnNumber - Address.ColumnNumber; + var columnDiff = columnNumber - _columnNumber; if (columnDiff != 0 || fixedColumn) columnPart = fixedColumn ? String.Format("C{0}", columnNumber) : String.Format("C[{0}]", columnDiff); else @@ -2689,7 +2709,7 @@ private XLCell CellShift(Int32 rowsToShift, Int32 columnsToShift) { - return Worksheet.Cell(Address.RowNumber + rowsToShift, Address.ColumnNumber + columnsToShift); + return Worksheet.Cell(_rowNumber + rowsToShift, _columnNumber + columnsToShift); } #region Nested type: FormulaConversionType