diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs index a7ecc46..bec5f1d 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs @@ -7,10 +7,11 @@ internal class XLColumn : XLRangeBase, IXLColumn { #region Private fields - private bool m_isHidden; - private IXLStyle m_style; - private bool m_collapsed; - private int m_outlineLevel; + private bool _isHidden; + private IXLStyle _style; + private bool _collapsed; + private int _outlineLevel; + private Double _width; #endregion #region Constructor public XLColumn(Int32 column, XLColumnParameters xlColumnParameters) @@ -27,8 +28,8 @@ } else { - m_style = new XLStyle(this, xlColumnParameters.DefaultStyle); - width = xlColumnParameters.Worksheet.ColumnWidth; + _style = new XLStyle(this, xlColumnParameters.DefaultStyle); + _width = xlColumnParameters.Worksheet.ColumnWidth; } } @@ -37,12 +38,12 @@ new XLRangeAddress(new XLAddress(column.Worksheet, 1, column.ColumnNumber(), false, false), new XLAddress(column.Worksheet, ExcelHelper.MaxRowNumber, column.ColumnNumber(), false, false))) { - width = column.width; + _width = column._width; IsReference = column.IsReference; - m_collapsed = column.m_collapsed; - m_isHidden = column.m_isHidden; - m_outlineLevel = column.m_outlineLevel; - m_style = new XLStyle(this, column.Style); + _collapsed = column._collapsed; + _isHidden = column._isHidden; + _outlineLevel = column._outlineLevel; + _style = new XLStyle(this, column.Style); } #endregion private void Worksheet_RangeShiftedColumns(XLRange range, int columnsShifted) @@ -76,7 +77,7 @@ public Boolean IsReference { get; private set; } #region IXLColumn Members - private Double width; + public Double Width { get @@ -87,7 +88,7 @@ } else { - return width; + return _width; } } set @@ -98,7 +99,7 @@ } else { - width = value; + _width = value; } } } @@ -156,7 +157,7 @@ } else { - return m_style; + return _style; } } set @@ -167,7 +168,7 @@ } else { - m_style = new XLStyle(this, value); + _style = new XLStyle(this, value); Int32 minRow = 1; Int32 maxRow = 0; @@ -250,7 +251,7 @@ } else { - return new XLStyle(new XLStylizedContainer(m_style, this), m_style); + return new XLStyle(new XLStylizedContainer(_style, this), _style); } } set @@ -261,7 +262,7 @@ } else { - m_style = new XLStyle(this, value); + _style = new XLStyle(this, value); } } } @@ -573,7 +574,7 @@ } else { - return m_isHidden; + return _isHidden; } } set @@ -584,14 +585,14 @@ } else { - m_isHidden = value; + _isHidden = value; } } } public Boolean Collapsed { - get { return IsReference ? (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Collapsed : m_collapsed; } + get { return IsReference ? (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Collapsed : _collapsed; } set { if (IsReference) @@ -600,14 +601,14 @@ } else { - m_collapsed = value; + _collapsed = value; } } } public Int32 OutlineLevel { - get { return IsReference ? (Worksheet).Internals.ColumnsCollection[ColumnNumber()].OutlineLevel : m_outlineLevel; } + get { return IsReference ? (Worksheet).Internals.ColumnsCollection[ColumnNumber()].OutlineLevel : _outlineLevel; } set { if (value < 0 || value > 8) @@ -622,8 +623,8 @@ else { (Worksheet).IncrementColumnOutline(value); - (Worksheet).DecrementColumnOutline(m_outlineLevel); - m_outlineLevel = value; + (Worksheet).DecrementColumnOutline(_outlineLevel); + _outlineLevel = value; } } } @@ -716,9 +717,10 @@ } } - public new IXLRangeColumn CopyTo(IXLCell target) + + IXLRangeColumn IXLColumn.CopyTo(IXLCell target) { - var rngUsed = RangeUsed().Column(1); + var rngUsed = RangeUsed(true).Column(1); CopyToCell(rngUsed, (XLCell) target); Int32 lastRowNumber = target.Address.RowNumber + rngUsed.CellCount() - 1; @@ -734,9 +736,13 @@ target.Address.ColumnNumber) .Column(1); } - public new IXLRangeColumn CopyTo(IXLRangeBase target) + public override void CopyTo(IXLCell target) { - var thisRangeUsed = RangeUsed(); + ((IXLColumn) this).CopyTo(target); + } + IXLRangeColumn IXLColumn.CopyTo(IXLRangeBase target) + { + var thisRangeUsed = RangeUsed(true); Int32 thisRowCount = thisRangeUsed.RowCount(); var targetRangeUsed = target.AsRange().RangeUsed(); Int32 targetRowCount = targetRangeUsed.RowCount(); @@ -757,18 +763,27 @@ target.RangeAddress.LastAddress.ColumnNumber) .Column(1); } + public override void CopyTo(IXLRangeBase target) + { + ((IXLColumn)this).CopyTo(target); + } + public IXLColumn CopyTo(IXLColumn column) { - var thisRangeUsed = RangeUsed(); - Int32 thisRowCount = thisRangeUsed.RowCount(); - //var targetRangeUsed = column target.AsRange().RangeUsed(); - Int32 targetRowCount = column.LastCellUsed(true).Address.RowNumber; - Int32 maxRow = thisRowCount > targetRowCount ? thisRowCount : targetRowCount; - - CopyToCell(Column(1, maxRow), (XLCell) column.FirstCell()); + column.Clear(); + var originalRange = RangeUsed(true); + if (!ReferenceEquals(originalRange, null)) + { + int rowNumber = originalRange.RowCount(); + var destRange = column.Worksheet.Range(ExcelHelper.MinRowNumber, column.ColumnNumber(), rowNumber, column.ColumnNumber()); + originalRange.CopyTo(destRange); + //Old + //CopyToCell(Column(1, rowNumber), (XLCell) column.FirstCell()); + } + var newColumn = (XLColumn) column; - newColumn.width = width; - newColumn.m_style = new XLStyle(newColumn, Style); + newColumn._width = _width; + newColumn._style = new XLStyle(newColumn, Style); return newColumn; } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs index 82d8586..daa05b3 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -158,9 +158,13 @@ } var firstRow = cellsUsed.Min(c => c.Address.RowNumber); var firstColumn = cellsUsed.Min(c => c.Address.ColumnNumber); + var mergedRanges = Worksheet.Internals.MergedRanges.GetContainingMergedRanges(GetSheetRange()); + foreach (var mrange in mergedRanges) + { + firstRow = Math.Max(mrange.FirstAddress.RowNumber, firstRow); + firstColumn = Math.Max(mrange.FirstAddress.ColumnNumber, firstColumn); + } return Worksheet.Cell(firstRow, firstColumn); - //var firstAddress = cellsUsed.Min(c => c.Address); - //return Worksheet.Cell(firstAddress); } IXLCell IXLRangeBase.LastCellUsed() @@ -1205,12 +1209,12 @@ return this; } - public void CopyTo(IXLRangeBase target) + public virtual void CopyTo(IXLRangeBase target) { CopyTo(target.FirstCell()); } - public void CopyTo(IXLCell target) + public virtual void CopyTo(IXLCell target) { target.Value = this; } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs index 8f4330d..6273b06 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs @@ -619,7 +619,7 @@ AsRange().Sort(XLSortOrientation.LeftToRight, matchCase); return this; } - public IXLRow Sort(XLSortOrder sortOrder, Boolean matchCase) + public IXLRow Sort(XLSortOrder sortOrder, bool matchCase) { AsRange().Sort(XLSortOrientation.LeftToRight, sortOrder, matchCase); return this; @@ -636,9 +636,9 @@ } } - public new IXLRangeRow CopyTo(IXLCell target) + IXLRangeRow IXLRow.CopyTo(IXLCell target) { - var rngUsed = RangeUsed().Row(1); + var rngUsed = RangeUsed(true).Row(1); CopyToCell(rngUsed, (XLCell) target); Int32 lastColumnNumber = target.Address.ColumnNumber + rngUsed.CellCount() - 1; @@ -654,15 +654,19 @@ lastColumnNumber) .Row(1); } - public new IXLRangeRow CopyTo(IXLRangeBase target) + public override void CopyTo(IXLCell target) { - var thisRangeUsed = RangeUsed(); + ((IXLRow)this).CopyTo(target); + } + IXLRangeRow IXLRow.CopyTo(IXLRangeBase target) + { + var thisRangeUsed = RangeUsed(true); Int32 thisColumnCount = thisRangeUsed.ColumnCount(); var targetRangeUsed = target.AsRange().RangeUsed(); Int32 targetColumnCount = targetRangeUsed.ColumnCount(); Int32 maxColumn = thisColumnCount > targetColumnCount ? thisColumnCount : targetColumnCount; - CopyToCell(Range(1, 1, 1, maxColumn).Row(1), (XLCell) target.FirstCell()); + CopyToCell(Range(1, 1, 1, maxColumn).Row(1), (XLCell)target.FirstCell()); Int32 lastColumnNumber = target.RangeAddress.LastAddress.ColumnNumber + maxColumn - 1; if (lastColumnNumber > ExcelHelper.MaxColumnNumber) @@ -676,17 +680,23 @@ lastColumnNumber) .Row(1); } + public override void CopyTo(IXLRangeBase target) + { + ((IXLRow) this).CopyTo(target); + } + public IXLRow CopyTo(IXLRow row) { - var thisRangeUsed = RangeUsed(true); - - int thisColumnCount = ReferenceEquals(thisRangeUsed, null) ? 0 : thisRangeUsed.ColumnCount(); - //var targetRangeUsed = column target.AsRange().RangeUsed(); - var lastCellUsed = row.LastCellUsed(true); - int targetColumnCount = ReferenceEquals(lastCellUsed, null) ? 0 : row.LastCellUsed(true).Address.ColumnNumber; - int maxColumn = thisColumnCount > targetColumnCount ? thisColumnCount : targetColumnCount; - - CopyToCell(Row(1, maxColumn), (XLCell) row.FirstCell()); + row.Clear(); + var originalRange = RangeUsed(true); + if (!ReferenceEquals(originalRange, null)) + { + int columnNumber = originalRange.ColumnCount(); + var destRange = row.Worksheet.Range(row.RowNumber(), ExcelHelper.MinColumnNumber, row.RowNumber(), columnNumber); + originalRange.CopyTo(destRange); + //Old + //CopyToCell(Row(1, columnNumber), (XLCell) row.FirstCell()); + } var newRow = (XLRow) row; newRow.m_height = m_height; newRow.style = new XLStyle(newRow, Style); diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/CopyContentsTest.cs b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/CopyContentsTest.cs index 654bb64..3f37d9e 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/CopyContentsTest.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/Misc/CopyContentsTest.cs @@ -13,8 +13,6 @@ [TestClass] public class CopyContentsTest { - - [TestMethod] public void TestRowCopyContents() { @@ -27,18 +25,17 @@ originalSheet.Cell("A2").SetValue("test value"); originalSheet.Range("A2:E2").Merge(); - { var originalRange = originalSheet.Range("A2:E2"); var destinationRange = copyRangeSheet.Range("A2:E2"); + originalRange.CopyTo(destinationRange); } - CopyRowAsRange(originalSheet, 2, copyRowAsRangeSheet, 3); - { var originalRow = originalSheet.Row(2); var destinationRow = copyRowSheet.Row(2); + copyRowSheet.Cell("G2").Value = "must be removed after copy"; originalRow.CopyTo(destinationRow); } TestHelper.SaveWorkbook(workbook, "CopyRowContents.xlsx"); @@ -51,9 +48,9 @@ destinationRow.Clear(); var originalRow = originalSheet.Row(originalRowNumber); - int columnNumber= originalRow.LastCellUsed(true).Address.ColumnNumber; + int columnNumber = originalRow.LastCellUsed(true).Address.ColumnNumber; - var originalRange= originalSheet.Range(originalRowNumber, 1, originalRowNumber, columnNumber); + var originalRange = originalSheet.Range(originalRowNumber, 1, originalRowNumber, columnNumber); var destRange = destSheet.Range(destRowNumber, 1, destRowNumber, columnNumber); originalRange.CopyTo(destRange); }