diff --git a/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj index 0bd653e..5b273ff 100644 --- a/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj +++ b/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj @@ -117,8 +117,6 @@ - - @@ -137,7 +135,6 @@ - @@ -240,7 +237,7 @@ - + @@ -251,7 +248,7 @@ - + diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs index 36084cd..3363000 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs @@ -476,7 +476,7 @@ ro++; } - ClearMerged(ro - 1, maxCo - 1); + ClearMerged(); var range = _worksheet.Range( Address.RowNumber, Address.ColumnNumber, @@ -544,7 +544,7 @@ ro++; } - ClearMerged(ro - 1, maxCo - 1); + ClearMerged(); return _worksheet.Range( Address.RowNumber, Address.ColumnNumber, @@ -934,74 +934,72 @@ return true; } - private bool SetRange(object rangeObject) + private Boolean SetRange(Object rangeObject) { var asRange = rangeObject as XLRangeBase; if (asRange == null) { var tmp = rangeObject as XLCell; if (tmp != null) + { asRange = tmp.AsRange() as XLRangeBase; + } } if (asRange != null) { - int maxRows; - int maxColumns; + Int32 maxRows; + Int32 maxColumns; if (asRange is XLRow || asRange is XLColumn) { - var lastCellUsed = asRange.LastCellUsed(true); + var lastCellUsed = asRange.LastCellUsed(); maxRows = lastCellUsed.Address.RowNumber; maxColumns = lastCellUsed.Address.ColumnNumber; - -// if (asRange is XLRow) - // { - // worksheet.Range(Address.RowNumber, Address.ColumnNumber, , maxColumns).Clear(); - // } + //if (asRange is XLRow) + //{ + // worksheet.Range(Address.RowNumber, Address.ColumnNumber, , maxColumns).Clear(); + //} } else { maxRows = asRange.RowCount(); maxColumns = asRange.ColumnCount(); - _worksheet.Range(Address.RowNumber, Address.ColumnNumber, maxRows, maxColumns).Clear(); + Worksheet.Range(Address.RowNumber, Address.ColumnNumber, maxRows, maxColumns).Clear(); } - for (int ro = 1; ro <= maxRows; ro++) + for (var ro = 1; ro <= maxRows; ro++) { - for (int co = 1; co <= maxColumns; co++) + for (var co = 1; co <= maxColumns; co++) { var sourceCell = asRange.Cell(ro, co); - var targetCell = _worksheet.Cell(Address.RowNumber + ro - 1, Address.ColumnNumber + co - 1); + var targetCell = Worksheet.Cell(Address.RowNumber + ro - 1, Address.ColumnNumber + co - 1); targetCell.CopyFrom(sourceCell); - -// targetCell.Style = sourceCell.style; + //targetCell.Style = sourceCell.style; } } - var rangesToMerge = new List(); - foreach (SheetRange mergedRange in asRange.Worksheet.Internals.MergedRanges) + foreach (var mergedRange in (asRange.Worksheet).Internals.MergedRanges) { if (asRange.Contains(mergedRange)) { - int initialRo = Address.RowNumber + - (mergedRange.FirstAddress.RowNumber - - asRange.RangeAddress.FirstAddress.RowNumber); - int initialCo = Address.ColumnNumber + - (mergedRange.FirstAddress.ColumnNumber - - asRange.RangeAddress.FirstAddress.ColumnNumber); - rangesToMerge.Add(_worksheet.Range(initialRo, - initialCo, - initialRo + mergedRange.RowCount - 1, - initialCo + mergedRange.ColumnCount - 1)); + var initialRo = Address.RowNumber + + (mergedRange.RangeAddress.FirstAddress.RowNumber - asRange.RangeAddress.FirstAddress.RowNumber); + var initialCo = Address.ColumnNumber + + (mergedRange.RangeAddress.FirstAddress.ColumnNumber - asRange.RangeAddress.FirstAddress.ColumnNumber); + rangesToMerge.Add(Worksheet.Range(initialRo, + initialCo, + initialRo + mergedRange.RowCount() - 1, + initialCo + mergedRange.ColumnCount() - 1)); } } - rangesToMerge.ForEach(r => r.Merge()); return true; } - - return false; + else + { + return false; + } } private bool SetEnumerable(object collectionObject) @@ -1010,12 +1008,17 @@ return InsertData(asEnumerable) != null; } - private void ClearMerged(int rowCount, int columnCount) + private void ClearMerged() { - // TODO: For MDLeon: Need review why parameters is never used(see compare with revision 67871 before VF changes) - var intersectingRanges = - _worksheet.Internals.MergedRanges.GetIntersectingMergedRanges(Address.GetSheetPoint()); - intersectingRanges.ForEach(m => _worksheet.Internals.MergedRanges.Remove(m)); + List mergeToDelete = new List(); + foreach (var merge in Worksheet.Internals.MergedRanges) + { + if (merge.Intersects(AsRange())) + { + mergeToDelete.Add(merge); + } + } + mergeToDelete.ForEach(m => Worksheet.Internals.MergedRanges.Remove(m)); } private void SetValue(object objWithValue, int ro, int co) diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs index bec5f1d..dda62ef 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs @@ -542,17 +542,8 @@ private Boolean CellIsMerged(IXLCell c) { - Boolean isMerged = false; var cellAsRange = c.AsRange(); - foreach (var m in Worksheet.Internals.MergedRanges) - { - if (cellAsRange.Intersects(m)) - { - isMerged = true; - break; - } - } - return isMerged; + return Worksheet.Internals.MergedRanges.Any(m => cellAsRange.Intersects(m)); } public void Hide() diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/..svnbridge/.svnbridge b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/..svnbridge/.svnbridge deleted file mode 100644 index 88585f2..0000000 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/..svnbridge/.svnbridge +++ /dev/null @@ -1 +0,0 @@ -bugtraq:numbertrue \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/SheetPoint.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/SheetPoint.cs deleted file mode 100644 index 4b0d1b7..0000000 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/SheetPoint.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Diagnostics; - -namespace ClosedXML.Excel -{ - /// - /// Lightweight struct for work with sheet coordinates - /// - public struct SheetPoint : IEquatable - { - #region Static - /// - /// Singleton instance - /// -// ReSharper disable RedundantDefaultFieldInitializer - public static readonly SheetPoint Empty = new SheetPoint(); -// ReSharper restore RedundantDefaultFieldInitializer - #endregion - #region Private fields - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly int m_row; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly int m_column; - #endregion - #region Constructor - public SheetPoint(int row, int column) - { - #region Check - if (row < 0) - { - throw new ArgumentOutOfRangeException("row", "Must be more than 0"); - } - if (column < 0) - { - throw new ArgumentOutOfRangeException("column", "Must be more than 0"); - } - #endregion - m_row = row; - m_column = column; - } - #endregion - #region Public properties - public int RowNumber - { - [DebuggerStepThrough] - get { return m_row; } - } - public int ColumnNumber - { - [DebuggerStepThrough] - get { return m_column; } - } - #endregion - #region Public methods - public bool Equals(SheetPoint other) - { - return other.m_row == m_row && other.m_column == m_column; - } - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - if (obj.GetType() != typeof (SheetPoint)) - { - return false; - } - return Equals((SheetPoint) obj); - } - public override int GetHashCode() - { - unchecked - { - return (m_row*397) ^ m_column; - } - } - public override string ToString() - { - return ToStringA1(); - } - public string ToStringA1() - { - return string.Format("{0}{1}", ExcelHelper.GetColumnLetterFromNumber(m_column), m_row); - } - #endregion - #region Internal methods - internal bool Equals(XLAddress other) - { - if (ReferenceEquals(other,null)) - { - return false; - } - return m_row == other.RowNumber && m_column == other.ColumnNumber; - } - #endregion - } - -} diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/SheetRange.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/SheetRange.cs deleted file mode 100644 index 689df68..0000000 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/SheetRange.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System; -using System.Diagnostics; - -namespace ClosedXML.Excel -{ - /// - /// Lightweight struct for work with sheet coordinate range - /// - public struct SheetRange : IEquatable - { - #region Static - /// - /// Singleton instance - /// -// ReSharper disable RedundantDefaultFieldInitializer - public static readonly SheetRange Empty = new SheetRange(); -// ReSharper restore RedundantDefaultFieldInitializer - #endregion - #region Private fields - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly SheetPoint m_begin; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly SheetPoint m_end; - #endregion - #region Constructor - public SheetRange(int beginRow, int beginColumn, int endRow, int endColumn) - : this(new SheetPoint(beginRow, beginColumn), new SheetPoint(endRow, endColumn)) - { - } - public SheetRange(SheetPoint begin, SheetPoint end) - { - #region Check - if (begin.RowNumber > end.RowNumber) - { - throw new ArgumentOutOfRangeException("begin", "Row part of begin coordinate must be less or equal Row part coordinate of end"); - } - if (begin.ColumnNumber > end.ColumnNumber) - { - throw new ArgumentOutOfRangeException("begin", "Column part of begin coordinate must be less or equal Column part coordinate of end"); - } - #endregion - m_begin = begin; - m_end = end; - } - #endregion - #region Public properties - public SheetPoint FirstAddress - { - [DebuggerStepThrough] - get { return m_begin; } - } - public SheetPoint LastAddress - { - [DebuggerStepThrough] - get { return m_end; } - } - - public bool IsOneCell - { - get { return m_begin.Equals(m_end); } - } - public int RowCount - { - [DebuggerStepThrough] - get { return m_end.RowNumber - m_begin.RowNumber + 1; } - } - public int ColumnCount - { - [DebuggerStepThrough] - get { return m_end.ColumnNumber - m_begin.ColumnNumber + 1; } - } - public int Count - { - [DebuggerStepThrough] - get { return RowCount*ColumnCount; } - } - #endregion - #region Public methods - public bool Equals(SheetRange other) - { - return other.m_begin.Equals(m_begin) && other.m_end.Equals(m_end); - } - public bool Intersects(SheetRange range) - { - return !(range.FirstAddress.ColumnNumber > LastAddress.ColumnNumber - || range.LastAddress.ColumnNumber < FirstAddress.ColumnNumber - || range.FirstAddress.RowNumber > LastAddress.RowNumber - || range.LastAddress.RowNumber < FirstAddress.RowNumber - ); - } - - public Boolean Contains(SheetRange range) - { - return Contains(range.FirstAddress, range.LastAddress); - } - public bool Contains(SheetPoint first, SheetPoint last) - { - return Contains(first) && Contains(last); - } - public bool Contains(SheetPoint point) - { - return FirstAddress.RowNumber <= point.RowNumber && point.RowNumber <= LastAddress.RowNumber && - FirstAddress.ColumnNumber <= point.ColumnNumber && point.ColumnNumber <= LastAddress.ColumnNumber; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - if (obj.GetType() != typeof (SheetRange)) - { - return false; - } - return Equals((SheetRange) obj); - } - public override int GetHashCode() - { - unchecked - { - return (m_begin.GetHashCode()*397) ^ m_end.GetHashCode(); - } - } - - internal string ToStringA1() - { - return IsOneCell ? m_begin.ToStringA1() : string.Format("{0}:{1}", m_begin.ToStringA1(), m_end.ToStringA1()); - } - public override string ToString() - { - return ToStringA1(); - } - #endregion - #region Internal methods - internal bool Equals(XLRangeAddress other) - { - if (ReferenceEquals(other, null)) - { - return false; - } - return m_begin.Equals(other.FirstAddress) && m_end.Equals(other.LastAddress); - } - - internal bool Intersects(XLRangeAddress range) - { - if (ReferenceEquals(range, null)) - { - return false; - } - return !(range.FirstAddress.ColumnNumber > LastAddress.ColumnNumber - || range.LastAddress.ColumnNumber < FirstAddress.ColumnNumber - || range.FirstAddress.RowNumber > LastAddress.RowNumber - || range.LastAddress.RowNumber < FirstAddress.RowNumber - ); - } - - #endregion - - - } -} \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/..svnbridge/.svnbridge b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/..svnbridge/.svnbridge new file mode 100644 index 0000000..88585f2 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/..svnbridge/.svnbridge @@ -0,0 +1 @@ +bugtraq:numbertrue \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/IXLAddress.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/IXLAddress.cs new file mode 100644 index 0000000..c2a29c1 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/IXLAddress.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLAddress : IEqualityComparer, IEquatable + { + IXLWorksheet Worksheet { get; } + Int32 RowNumber { get; } + Int32 ColumnNumber { get; } + String ColumnLetter { get; } + Boolean FixedRow { get; } + Boolean FixedColumn { get; } + String ToStringRelative(); + String ToStringFixed(); + String ToString(XLReferenceStyle referenceStyle); + } +} diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/SheetPoint.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/SheetPoint.cs new file mode 100644 index 0000000..4b0d1b7 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/SheetPoint.cs @@ -0,0 +1,99 @@ +using System; +using System.Diagnostics; + +namespace ClosedXML.Excel +{ + /// + /// Lightweight struct for work with sheet coordinates + /// + public struct SheetPoint : IEquatable + { + #region Static + /// + /// Singleton instance + /// +// ReSharper disable RedundantDefaultFieldInitializer + public static readonly SheetPoint Empty = new SheetPoint(); +// ReSharper restore RedundantDefaultFieldInitializer + #endregion + #region Private fields + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly int m_row; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly int m_column; + #endregion + #region Constructor + public SheetPoint(int row, int column) + { + #region Check + if (row < 0) + { + throw new ArgumentOutOfRangeException("row", "Must be more than 0"); + } + if (column < 0) + { + throw new ArgumentOutOfRangeException("column", "Must be more than 0"); + } + #endregion + m_row = row; + m_column = column; + } + #endregion + #region Public properties + public int RowNumber + { + [DebuggerStepThrough] + get { return m_row; } + } + public int ColumnNumber + { + [DebuggerStepThrough] + get { return m_column; } + } + #endregion + #region Public methods + public bool Equals(SheetPoint other) + { + return other.m_row == m_row && other.m_column == m_column; + } + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + if (obj.GetType() != typeof (SheetPoint)) + { + return false; + } + return Equals((SheetPoint) obj); + } + public override int GetHashCode() + { + unchecked + { + return (m_row*397) ^ m_column; + } + } + public override string ToString() + { + return ToStringA1(); + } + public string ToStringA1() + { + return string.Format("{0}{1}", ExcelHelper.GetColumnLetterFromNumber(m_column), m_row); + } + #endregion + #region Internal methods + internal bool Equals(XLAddress other) + { + if (ReferenceEquals(other,null)) + { + return false; + } + return m_row == other.RowNumber && m_column == other.ColumnNumber; + } + #endregion + } + +} diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/SheetRange.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/SheetRange.cs new file mode 100644 index 0000000..689df68 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/SheetRange.cs @@ -0,0 +1,162 @@ +using System; +using System.Diagnostics; + +namespace ClosedXML.Excel +{ + /// + /// Lightweight struct for work with sheet coordinate range + /// + public struct SheetRange : IEquatable + { + #region Static + /// + /// Singleton instance + /// +// ReSharper disable RedundantDefaultFieldInitializer + public static readonly SheetRange Empty = new SheetRange(); +// ReSharper restore RedundantDefaultFieldInitializer + #endregion + #region Private fields + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly SheetPoint m_begin; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly SheetPoint m_end; + #endregion + #region Constructor + public SheetRange(int beginRow, int beginColumn, int endRow, int endColumn) + : this(new SheetPoint(beginRow, beginColumn), new SheetPoint(endRow, endColumn)) + { + } + public SheetRange(SheetPoint begin, SheetPoint end) + { + #region Check + if (begin.RowNumber > end.RowNumber) + { + throw new ArgumentOutOfRangeException("begin", "Row part of begin coordinate must be less or equal Row part coordinate of end"); + } + if (begin.ColumnNumber > end.ColumnNumber) + { + throw new ArgumentOutOfRangeException("begin", "Column part of begin coordinate must be less or equal Column part coordinate of end"); + } + #endregion + m_begin = begin; + m_end = end; + } + #endregion + #region Public properties + public SheetPoint FirstAddress + { + [DebuggerStepThrough] + get { return m_begin; } + } + public SheetPoint LastAddress + { + [DebuggerStepThrough] + get { return m_end; } + } + + public bool IsOneCell + { + get { return m_begin.Equals(m_end); } + } + public int RowCount + { + [DebuggerStepThrough] + get { return m_end.RowNumber - m_begin.RowNumber + 1; } + } + public int ColumnCount + { + [DebuggerStepThrough] + get { return m_end.ColumnNumber - m_begin.ColumnNumber + 1; } + } + public int Count + { + [DebuggerStepThrough] + get { return RowCount*ColumnCount; } + } + #endregion + #region Public methods + public bool Equals(SheetRange other) + { + return other.m_begin.Equals(m_begin) && other.m_end.Equals(m_end); + } + public bool Intersects(SheetRange range) + { + return !(range.FirstAddress.ColumnNumber > LastAddress.ColumnNumber + || range.LastAddress.ColumnNumber < FirstAddress.ColumnNumber + || range.FirstAddress.RowNumber > LastAddress.RowNumber + || range.LastAddress.RowNumber < FirstAddress.RowNumber + ); + } + + public Boolean Contains(SheetRange range) + { + return Contains(range.FirstAddress, range.LastAddress); + } + public bool Contains(SheetPoint first, SheetPoint last) + { + return Contains(first) && Contains(last); + } + public bool Contains(SheetPoint point) + { + return FirstAddress.RowNumber <= point.RowNumber && point.RowNumber <= LastAddress.RowNumber && + FirstAddress.ColumnNumber <= point.ColumnNumber && point.ColumnNumber <= LastAddress.ColumnNumber; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + if (obj.GetType() != typeof (SheetRange)) + { + return false; + } + return Equals((SheetRange) obj); + } + public override int GetHashCode() + { + unchecked + { + return (m_begin.GetHashCode()*397) ^ m_end.GetHashCode(); + } + } + + internal string ToStringA1() + { + return IsOneCell ? m_begin.ToStringA1() : string.Format("{0}:{1}", m_begin.ToStringA1(), m_end.ToStringA1()); + } + public override string ToString() + { + return ToStringA1(); + } + #endregion + #region Internal methods + internal bool Equals(XLRangeAddress other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + return m_begin.Equals(other.FirstAddress) && m_end.Equals(other.LastAddress); + } + + internal bool Intersects(XLRangeAddress range) + { + if (ReferenceEquals(range, null)) + { + return false; + } + return !(range.FirstAddress.ColumnNumber > LastAddress.ColumnNumber + || range.LastAddress.ColumnNumber < FirstAddress.ColumnNumber + || range.FirstAddress.RowNumber > LastAddress.RowNumber + || range.LastAddress.RowNumber < FirstAddress.RowNumber + ); + } + + #endregion + + + } +} \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/XLAddress.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/XLAddress.cs new file mode 100644 index 0000000..ace531d --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinates/XLAddress.cs @@ -0,0 +1,312 @@ +using System; +using System.Diagnostics; + +namespace ClosedXML.Excel +{ + internal class XLAddress : IXLAddress + { + #region Static + public static XLAddress Create(XLWorksheet worksheet, string cellAddressString) + { + var fixedColumn = cellAddressString[0] == '$'; + Int32 startPos; + if (fixedColumn) + { + startPos = 1; + } + else + { + startPos = 0; + } + + int rowPos = startPos; + while (cellAddressString[rowPos] > '9') + { + rowPos++; + } + + var fixedRow = cellAddressString[rowPos] == '$'; + string columnLetter; + int rowNumber; + if (fixedRow) + { + if (fixedColumn) + { + columnLetter = cellAddressString.Substring(startPos, rowPos - 1); + } + else + { + columnLetter = cellAddressString.Substring(startPos, rowPos); + } + + rowNumber = int.Parse(cellAddressString.Substring(rowPos + 1), ExcelHelper.NumberFormatForParse); + } + else + { + if (fixedColumn) + { + columnLetter = cellAddressString.Substring(startPos, rowPos - 1); + } + else + { + columnLetter = cellAddressString.Substring(startPos, rowPos); + } + + rowNumber = Int32.Parse(cellAddressString.Substring(rowPos), ExcelHelper.NumberFormatForParse); + } + return new XLAddress(worksheet, rowNumber, columnLetter, fixedRow, fixedColumn); + } + #endregion + #region Private fields + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private bool m_fixedRow; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private bool m_fixedColumn; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private string m_columnLetter; + + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly int m_rowNumber; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly int m_columnNumber; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly int m_hashCode; + private string m_trimmedAddress; + #endregion + #region Constructors + /// + /// Initializes a new struct using a mixed notation. + /// + /// + /// The row number of the cell address. + /// The column letter of the cell address. + /// + /// + public XLAddress(XLWorksheet worksheet, int rowNumber, string columnLetter, bool fixedRow, bool fixedColumn) + : this(worksheet, rowNumber, ExcelHelper.GetColumnNumberFromLetter(columnLetter), fixedRow, fixedColumn) + { + m_columnLetter = columnLetter; + } + + /// + /// Initializes a new struct using R1C1 notation. + /// + /// + /// The row number of the cell address. + /// The column number of the cell address. + /// + /// + public XLAddress(XLWorksheet worksheet, int rowNumber, int columnNumber, bool fixedRow, bool fixedColumn) + + { + Worksheet = worksheet; + + m_rowNumber = rowNumber; + m_columnNumber = columnNumber; + m_columnLetter = null; + m_fixedColumn = fixedColumn; + m_fixedRow = fixedRow; + + m_hashCode = m_rowNumber ^ m_columnNumber; + } + #endregion + #region Properties + public XLWorksheet Worksheet { get; internal set; } + IXLWorksheet IXLAddress.Worksheet + { + [DebuggerStepThrough] + get { return Worksheet; } + } + + public bool FixedRow + { + get { return m_fixedRow; } + set { m_fixedRow = value; } + } + + public bool FixedColumn + { + get { return m_fixedColumn; } + set { m_fixedColumn = value; } + } + + /// + /// Gets the row number of this address. + /// + public Int32 RowNumber + { + get { return m_rowNumber; } + } + + /// + /// Gets the column number of this address. + /// + public Int32 ColumnNumber + { + get { return m_columnNumber; } + } + + /// + /// Gets the column letter(s) of this address. + /// + public String ColumnLetter + { + get { return m_columnLetter ?? (m_columnLetter = ExcelHelper.GetColumnLetterFromNumber(m_columnNumber)); } + } + #endregion + #region Overrides + public override string ToString() + { + String retVal = ColumnLetter; + if (m_fixedColumn) + { + retVal = "$" + retVal; + } + if (m_fixedRow) + { + retVal += "$"; + } + retVal += m_rowNumber.ToStringLookup(); + return retVal; + } + + public String ToString(XLReferenceStyle referenceStyle) + { + if (referenceStyle == XLReferenceStyle.A1) + { + return ColumnLetter + m_rowNumber.ToStringLookup(); + } + if (referenceStyle == XLReferenceStyle.R1C1) + { + return m_rowNumber.ToStringLookup() + "," + ColumnNumber; + } + if ((Worksheet).Internals.Workbook.ReferenceStyle == XLReferenceStyle.R1C1) + { + return m_rowNumber.ToStringLookup() + "," + ColumnNumber; + } + return ColumnLetter + m_rowNumber.ToStringLookup(); + } + #endregion + #region Methods + public string GetTrimmedAddress() + { + return m_trimmedAddress ?? (m_trimmedAddress = ColumnLetter + m_rowNumber.ToStringLookup()); + } + + public string ToStringRelative() + { + return GetTrimmedAddress(); + } + + public string ToStringFixed() + { + return "$" + ColumnLetter + "$" + m_rowNumber.ToStringLookup(); + } + + #endregion + #region Operator Overloads + public static XLAddress operator +(XLAddress left, XLAddress right) + { + return new XLAddress(left.Worksheet, + left.RowNumber + right.RowNumber, + left.ColumnNumber + right.ColumnNumber, + left.m_fixedRow, + left.m_fixedColumn); + } + + public static XLAddress operator -(XLAddress left, XLAddress right) + { + return new XLAddress(left.Worksheet, + left.RowNumber - right.RowNumber, + left.ColumnNumber - right.ColumnNumber, + left.m_fixedRow, + left.m_fixedColumn); + } + + public static XLAddress operator +(XLAddress left, Int32 right) + { + return new XLAddress(left.Worksheet, + left.RowNumber + right, + left.ColumnNumber + right, + left.m_fixedRow, + left.m_fixedColumn); + } + + public static XLAddress operator -(XLAddress left, Int32 right) + { + return new XLAddress(left.Worksheet, + left.RowNumber - right, + left.ColumnNumber - right, + left.m_fixedRow, + left.m_fixedColumn); + } + + public static Boolean operator ==(XLAddress left, XLAddress right) + { + if (ReferenceEquals(left, right)) + { + return true; + } + if (ReferenceEquals(left, null)) + { + return false; + } + return left.Equals(right); + } + + public static Boolean operator !=(XLAddress left, XLAddress right) + { + return !(left == right); + } + #endregion + #region Interface Requirements + #region IEqualityComparer Members + public Boolean Equals(IXLAddress x, IXLAddress y) + { + return x == y; + } + + public Int32 GetHashCode(IXLAddress obj) + { + return obj.GetHashCode(); + } + + public new Boolean Equals(Object x, Object y) + { + return x == y; + } + + public Int32 GetHashCode(Object obj) + { + return (obj).GetHashCode(); + } + + public override Int32 GetHashCode() + { + return m_hashCode; + } + #endregion + #region IEquatable Members + public bool Equals(IXLAddress other) + { + var right = other as XLAddress; + if (ReferenceEquals(right, null)) + { + return false; + } + if (m_hashCode != right.m_hashCode) + { + return false; + } + + return m_rowNumber == right.m_rowNumber && m_columnNumber == right.m_columnNumber; + } + + public override Boolean Equals(Object other) + { + return Equals((XLAddress) other); + } + #endregion + #endregion + } +} \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLAddress.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLAddress.cs deleted file mode 100644 index c2a29c1..0000000 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLAddress.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLAddress : IEqualityComparer, IEquatable - { - IXLWorksheet Worksheet { get; } - Int32 RowNumber { get; } - Int32 ColumnNumber { get; } - String ColumnLetter { get; } - Boolean FixedRow { get; } - Boolean FixedColumn { get; } - String ToStringRelative(); - String ToStringFixed(); - String ToString(XLReferenceStyle referenceStyle); - } -} diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheetInternals.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheetInternals.cs index dedb188..82a3e60 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheetInternals.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheetInternals.cs @@ -6,7 +6,7 @@ XLCellCollection CellsCollection { get; } XLColumnsCollection ColumnsCollection { get; } XLRowsCollection RowsCollection { get; } - XLMergedRanges MergedRanges { get; } + XLRanges MergedRanges { get; } XLWorkbook Workbook { get; } } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/IXLRangeBase.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/IXLRangeBase.cs index 614161c..b7773ad 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/IXLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/IXLRangeBase.cs @@ -204,6 +204,5 @@ //IXLChart CreateChart(Int32 firstRow, Int32 firstColumn, Int32 lastRow, Int32 lastColumn); - bool Intersects(SheetRange range); } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs index f8878fc..86383fa 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs @@ -489,26 +489,19 @@ private void TransposeMerged(Int32 squareSide) { - - var rngToTranspose = new SheetRange( + XLRange rngToTranspose = (XLRange)Worksheet.Range( RangeAddress.FirstAddress.RowNumber, RangeAddress.FirstAddress.ColumnNumber, RangeAddress.FirstAddress.RowNumber + squareSide - 1, RangeAddress.FirstAddress.ColumnNumber + squareSide - 1); - var mranges = new List(); foreach (var merge in Worksheet.Internals.MergedRanges) { if (Contains(merge)) { - mranges.Add(new SheetRange(merge.FirstAddress, - new SheetPoint(rngToTranspose.FirstAddress.RowNumber + merge.ColumnCount, - rngToTranspose.FirstAddress.ColumnNumber + merge.RowCount))); - + merge.RangeAddress.LastAddress = rngToTranspose.Cell(merge.ColumnCount(), merge.RowCount()).Address; } } - mranges.ForEach(m => Worksheet.Internals.MergedRanges.Remove(m)); - mranges.ForEach(m => Worksheet.Internals.MergedRanges.Add(m)); } private void MoveOrClearForTranspose(XLTransposeOptions transposeOption, int rowCount, int columnCount) diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeAddress.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeAddress.cs index 3af9776..1b4dc9c 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeAddress.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeAddress.cs @@ -106,10 +106,6 @@ public bool IsInvalid { get; set; } #endregion #region Public methods - public SheetRange GetSheetRange() - { - return new SheetRange(m_firstAddress.GetSheetPoint(), m_lastAddress.GetSheetPoint()); - } public override string ToString() { diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs index daa05b3..c6861ba 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -156,15 +156,12 @@ { return null; } - 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) + else { - firstRow = Math.Max(mrange.FirstAddress.RowNumber, firstRow); - firstColumn = Math.Max(mrange.FirstAddress.ColumnNumber, firstColumn); + var firstRow = cellsUsed.Min(c => c.Address.RowNumber); + var firstColumn = cellsUsed.Min(c => c.Address.ColumnNumber); + return Worksheet.Cell(firstRow, firstColumn); } - return Worksheet.Cell(firstRow, firstColumn); } IXLCell IXLRangeBase.LastCellUsed() @@ -179,24 +176,19 @@ { return LastCellUsed(false); } - public XLCell LastCellUsed(bool includeStyles) + public XLCell LastCellUsed(Boolean includeStyles) { var cellsUsed = CellsUsed(includeStyles); if (!cellsUsed.Any()) { return null; } - - var lastRow = cellsUsed.Max(c => c.Address.RowNumber); - var lastColumn = cellsUsed.Max(c => c.Address.ColumnNumber); - var mergedRanges = Worksheet.Internals.MergedRanges.GetContainingMergedRanges(GetSheetRange()); - foreach (var mrange in mergedRanges) + else { - lastRow = Math.Max(mrange.LastAddress.RowNumber, lastRow); - lastColumn = Math.Max(mrange.LastAddress.ColumnNumber, lastColumn); + var lastRow = cellsUsed.Max(c => c.Address.RowNumber); + var lastColumn = cellsUsed.Max(c => c.Address.ColumnNumber); + return Worksheet.Cell(lastRow, lastColumn); } - return Worksheet.Cell(lastRow, lastColumn); - } public XLCell Cell(Int32 row, Int32 column) @@ -389,11 +381,12 @@ public IXLRange Merge() { + var tAddress = this.RangeAddress.ToString(); Boolean foundOne = false; - foreach (var m in (Worksheet).Internals.MergedRanges) + foreach (var m in (Worksheet as XLWorksheet).Internals.MergedRanges) { - - if (m.Equals(RangeAddress)) + var mAddress = m.RangeAddress.ToString(); + if (mAddress == tAddress) { foundOne = true; break; @@ -401,27 +394,23 @@ } if (!foundOne) - { - Worksheet.Internals.MergedRanges.Add(GetSheetRange()); - } + (Worksheet as XLWorksheet).Internals.MergedRanges.Add(this.AsRange()); return AsRange(); } public IXLRange Unmerge() { - foreach (var m in (Worksheet).Internals.MergedRanges) + var tAddress = this.RangeAddress.ToString(); + foreach (var m in (Worksheet as XLWorksheet).Internals.MergedRanges) { - if (m.Equals(RangeAddress)) + var mAddress = m.RangeAddress.ToString(); + if (mAddress == tAddress) { - Worksheet.Internals.MergedRanges.Remove(m); + (Worksheet as XLWorksheet).Internals.MergedRanges.Remove(this.AsRange()); break; } } - return AsRange(); - } - public virtual SheetRange GetSheetRange() - { - return RangeAddress.GetSheetRange(); + return AsRange(); } public IXLRangeColumns InsertColumnsAfter(Int32 numberOfColumns) @@ -791,15 +780,15 @@ private void ClearMerged() { - var mergeToDelete = new List(); - foreach (var merge in (Worksheet).Internals.MergedRanges) + List mergeToDelete = new List(); + foreach (var merge in (Worksheet as XLWorksheet).Internals.MergedRanges) { - if (Intersects(merge)) + if (this.Intersects(merge)) { mergeToDelete.Add(merge); } } - mergeToDelete.ForEach(m => (Worksheet).Internals.MergedRanges.Remove(m)); + mergeToDelete.ForEach(m => (Worksheet as XLWorksheet).Internals.MergedRanges.Remove(m)); } public bool Contains(String rangeAddress) @@ -842,19 +831,6 @@ return RangeAddress.FirstAddress.RowNumber <= address.RowNumber && address.RowNumber <= RangeAddress.LastAddress.RowNumber && RangeAddress.FirstAddress.ColumnNumber <= address.ColumnNumber && address.ColumnNumber <= RangeAddress.LastAddress.ColumnNumber; } - public bool Contains(SheetRange range) - { - return Contains(range.FirstAddress, range.LastAddress); - } - public bool Contains(SheetPoint first, SheetPoint last) - { - return Contains(first) && Contains(last); - } - public bool Contains(SheetPoint point) - { - return RangeAddress.FirstAddress.RowNumber <= point.RowNumber && point.RowNumber <= RangeAddress.LastAddress.RowNumber && - RangeAddress.FirstAddress.ColumnNumber <= point.ColumnNumber && point.ColumnNumber <= RangeAddress.LastAddress.ColumnNumber; - } public bool Intersects(string rangeAddress) { @@ -876,78 +852,56 @@ || ma.LastAddress.RowNumber < ra.FirstAddress.RowNumber ); } - public bool Intersects(SheetRange range) - { - if (RangeAddress.IsInvalid) - { - return false; - } - var ra = RangeAddress; - - return !( // See if the two ranges intersect... - range.FirstAddress.ColumnNumber > ra.LastAddress.ColumnNumber - || range.LastAddress.ColumnNumber < ra.FirstAddress.ColumnNumber - || range.FirstAddress.RowNumber > ra.LastAddress.RowNumber - || range.LastAddress.RowNumber < ra.FirstAddress.RowNumber - ); - } public void Delete(XLShiftDeletedCells shiftDeleteCells) { - var numberOfRows = RowCount(); - var numberOfColumns = ColumnCount(); + var numberOfRows = this.RowCount(); + var numberOfColumns = this.ColumnCount(); IXLRange shiftedRangeFormula; if (shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp) { var lastCell = Worksheet.Cell(ExcelHelper.MaxRowNumber, RangeAddress.LastAddress.ColumnNumber); shiftedRangeFormula = Worksheet.Range(RangeAddress.FirstAddress, lastCell.Address); if (StringExtensions.IsNullOrWhiteSpace(lastCell.GetString()) && StringExtensions.IsNullOrWhiteSpace(lastCell.FormulaA1)) - { - (Worksheet).Internals.CellsCollection.Remove(lastCell.Address); - } + (Worksheet as XLWorksheet).Internals.CellsCollection.Remove(lastCell.Address); } else { var lastCell = Worksheet.Cell(RangeAddress.LastAddress.RowNumber, ExcelHelper.MaxColumnNumber); shiftedRangeFormula = Worksheet.Range(RangeAddress.FirstAddress, lastCell.Address); if (StringExtensions.IsNullOrWhiteSpace(lastCell.GetString()) && StringExtensions.IsNullOrWhiteSpace(lastCell.FormulaA1)) - { - (Worksheet).Internals.CellsCollection.Remove(lastCell.Address); - } + (Worksheet as XLWorksheet).Internals.CellsCollection.Remove(lastCell.Address); } - foreach (var ws in (Worksheet).Internals.Workbook.WorksheetsInternal) + foreach (var ws in (Worksheet as XLWorksheet).Internals.Workbook.Worksheets) { - foreach (var cell in ws.Internals.CellsCollection.Values.Where(c => !StringExtensions.IsNullOrWhiteSpace(c.FormulaA1))) + var xlWorksheet = (XLWorksheet)ws; + foreach (var cell in (xlWorksheet as XLWorksheet).Internals.CellsCollection.Values.Where(c => !StringExtensions.IsNullOrWhiteSpace(c.FormulaA1))) { if (shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp) - { - cell.ShiftFormulaRows((XLRange) shiftedRangeFormula, numberOfRows*-1); - } + cell.ShiftFormulaRows((XLRange)shiftedRangeFormula, numberOfRows * -1); else - { - cell.ShiftFormulaColumns((XLRange) shiftedRangeFormula, numberOfColumns*-1); - } + cell.ShiftFormulaColumns((XLRange)shiftedRangeFormula, numberOfColumns * -1); } } // Range to shift... var cellsToInsert = new Dictionary(); var cellsToDelete = new List(); - var shiftLeftQuery = (Worksheet).Internals.CellsCollection - .Where(c => - c.Key.RowNumber >= RangeAddress.FirstAddress.RowNumber - && c.Key.RowNumber <= RangeAddress.LastAddress.RowNumber - && c.Key.ColumnNumber >= RangeAddress.FirstAddress.ColumnNumber); + var shiftLeftQuery = (Worksheet as XLWorksheet).Internals.CellsCollection + .Where(c => + c.Key.RowNumber >= this.RangeAddress.FirstAddress.RowNumber + && c.Key.RowNumber <= this.RangeAddress.LastAddress.RowNumber + && c.Key.ColumnNumber >= this.RangeAddress.FirstAddress.ColumnNumber); - var shiftUpQuery = (Worksheet).Internals.CellsCollection - .Where(c => - c.Key.ColumnNumber >= RangeAddress.FirstAddress.ColumnNumber - && c.Key.ColumnNumber <= RangeAddress.LastAddress.ColumnNumber - && c.Key.RowNumber >= RangeAddress.FirstAddress.RowNumber); + var shiftUpQuery = (Worksheet as XLWorksheet).Internals.CellsCollection + .Where(c => + c.Key.ColumnNumber >= this.RangeAddress.FirstAddress.ColumnNumber + && c.Key.ColumnNumber <= this.RangeAddress.LastAddress.ColumnNumber + && c.Key.RowNumber >= this.RangeAddress.FirstAddress.RowNumber); - var columnModifier = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft ? ColumnCount() : 0; - var rowModifier = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp ? RowCount() : 0; + var columnModifier = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft ? this.ColumnCount() : 0; + var rowModifier = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp ? this.RowCount() : 0; var cellsQuery = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft ? shiftLeftQuery : shiftUpQuery; foreach (var c in cellsQuery) { @@ -957,48 +911,43 @@ //newCell.ShiftFormula(rowModifier * -1, columnModifier * -1); cellsToDelete.Add(c.Key); - var canInsert = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft - ? c.Key.ColumnNumber > RangeAddress.LastAddress.ColumnNumber - : c.Key.RowNumber > RangeAddress.LastAddress.RowNumber; + var canInsert = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft ? + c.Key.ColumnNumber > this.RangeAddress.LastAddress.ColumnNumber : + c.Key.RowNumber > this.RangeAddress.LastAddress.RowNumber; if (canInsert) - { cellsToInsert.Add(newKey, newCell); - } } - cellsToDelete.ForEach(c => (Worksheet).Internals.CellsCollection.Remove(c)); - cellsToInsert.ForEach(c => (Worksheet).Internals.CellsCollection.Add(c.Key, c.Value)); + cellsToDelete.ForEach(c => (Worksheet as XLWorksheet).Internals.CellsCollection.Remove(c)); + cellsToInsert.ForEach(c => (Worksheet as XLWorksheet).Internals.CellsCollection.Add(c.Key, c.Value)); - var mergesToRemove = new List(); - foreach (var merge in (Worksheet).Internals.MergedRanges) + List mergesToRemove = new List(); + foreach (var merge in (Worksheet as XLWorksheet).Internals.MergedRanges) { - if (Contains(merge)) - { + if (this.Contains(merge)) mergesToRemove.Add(merge); - } } - mergesToRemove.ForEach(r => (Worksheet).Internals.MergedRanges.Remove(r)); + mergesToRemove.ForEach(r => (Worksheet as XLWorksheet).Internals.MergedRanges.Remove(r)); List hyperlinksToRemove = new List(); foreach (var hl in Worksheet.Hyperlinks) { - if (Contains(hl.Cell.AsRange())) - { + if (this.Contains(hl.Cell.AsRange())) hyperlinksToRemove.Add(hl); - } } hyperlinksToRemove.ForEach(hl => Worksheet.Hyperlinks.Delete(hl)); - var shiftedRange = (XLRange) AsRange(); + var shiftedRange = (XLRange)this.AsRange(); if (shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp) { - (Worksheet).NotifyRangeShiftedRows(shiftedRange, rowModifier*-1); + (Worksheet as XLWorksheet).NotifyRangeShiftedRows(shiftedRange, rowModifier * -1); } else { - (Worksheet).NotifyRangeShiftedColumns(shiftedRange, columnModifier*-1); + (Worksheet as XLWorksheet).NotifyRangeShiftedColumns(shiftedRange, columnModifier * -1); } } + #region IXLStylized Members public virtual IXLStyle Style { diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs index 6273b06..d21dbab 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs @@ -231,7 +231,9 @@ foreach (var cell in Row(startColumn, endColumn).CellsUsed()) { var c = (XLCell) cell; - if (!Worksheet.Internals.MergedRanges.Intersects(c.Address)) + var cellAsRange = c.AsRange(); + Boolean isMerged = Worksheet.Internals.MergedRanges.Any(m => cellAsRange.Intersects(m)); + if (!isMerged) { Double thisHeight; Int32 textRotation = c.Style.Alignment.TextRotation; diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLAddress.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLAddress.cs deleted file mode 100644 index 21ed859..0000000 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLAddress.cs +++ /dev/null @@ -1,316 +0,0 @@ -using System; -using System.Diagnostics; - -namespace ClosedXML.Excel -{ - internal class XLAddress : IXLAddress - { - #region Static - public static XLAddress Create(XLWorksheet worksheet, string cellAddressString) - { - var fixedColumn = cellAddressString[0] == '$'; - Int32 startPos; - if (fixedColumn) - { - startPos = 1; - } - else - { - startPos = 0; - } - - int rowPos = startPos; - while (cellAddressString[rowPos] > '9') - { - rowPos++; - } - - var fixedRow = cellAddressString[rowPos] == '$'; - string columnLetter; - int rowNumber; - if (fixedRow) - { - if (fixedColumn) - { - columnLetter = cellAddressString.Substring(startPos, rowPos - 1); - } - else - { - columnLetter = cellAddressString.Substring(startPos, rowPos); - } - - rowNumber = int.Parse(cellAddressString.Substring(rowPos + 1), ExcelHelper.NumberFormatForParse); - } - else - { - if (fixedColumn) - { - columnLetter = cellAddressString.Substring(startPos, rowPos - 1); - } - else - { - columnLetter = cellAddressString.Substring(startPos, rowPos); - } - - rowNumber = Int32.Parse(cellAddressString.Substring(rowPos), ExcelHelper.NumberFormatForParse); - } - return new XLAddress(worksheet, rowNumber, columnLetter, fixedRow, fixedColumn); - } - #endregion - #region Private fields - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private bool m_fixedRow; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private bool m_fixedColumn; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string m_columnLetter; - - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly int m_rowNumber; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly int m_columnNumber; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly int m_hashCode; - private string m_trimmedAddress; - #endregion - #region Constructors - /// - /// Initializes a new struct using a mixed notation. - /// - /// - /// The row number of the cell address. - /// The column letter of the cell address. - /// - /// - public XLAddress(XLWorksheet worksheet, int rowNumber, string columnLetter, bool fixedRow, bool fixedColumn) - : this(worksheet, rowNumber, ExcelHelper.GetColumnNumberFromLetter(columnLetter), fixedRow, fixedColumn) - { - m_columnLetter = columnLetter; - } - - /// - /// Initializes a new struct using R1C1 notation. - /// - /// - /// The row number of the cell address. - /// The column number of the cell address. - /// - /// - public XLAddress(XLWorksheet worksheet, int rowNumber, int columnNumber, bool fixedRow, bool fixedColumn) - - { - Worksheet = worksheet; - - m_rowNumber = rowNumber; - m_columnNumber = columnNumber; - m_columnLetter = null; - m_fixedColumn = fixedColumn; - m_fixedRow = fixedRow; - - m_hashCode = m_rowNumber ^ m_columnNumber; - } - #endregion - #region Properties - public XLWorksheet Worksheet { get; internal set; } - IXLWorksheet IXLAddress.Worksheet - { - [DebuggerStepThrough] - get { return Worksheet; } - } - - public bool FixedRow - { - get { return m_fixedRow; } - set { m_fixedRow = value; } - } - - public bool FixedColumn - { - get { return m_fixedColumn; } - set { m_fixedColumn = value; } - } - - /// - /// Gets the row number of this address. - /// - public Int32 RowNumber - { - get { return m_rowNumber; } - } - - /// - /// Gets the column number of this address. - /// - public Int32 ColumnNumber - { - get { return m_columnNumber; } - } - - /// - /// Gets the column letter(s) of this address. - /// - public String ColumnLetter - { - get { return m_columnLetter ?? (m_columnLetter = ExcelHelper.GetColumnLetterFromNumber(m_columnNumber)); } - } - #endregion - #region Overrides - public override string ToString() - { - String retVal = ColumnLetter; - if (m_fixedColumn) - { - retVal = "$" + retVal; - } - if (m_fixedRow) - { - retVal += "$"; - } - retVal += m_rowNumber.ToStringLookup(); - return retVal; - } - - public String ToString(XLReferenceStyle referenceStyle) - { - if (referenceStyle == XLReferenceStyle.A1) - { - return ColumnLetter + m_rowNumber.ToStringLookup(); - } - if (referenceStyle == XLReferenceStyle.R1C1) - { - return m_rowNumber.ToStringLookup() + "," + ColumnNumber; - } - if ((Worksheet).Internals.Workbook.ReferenceStyle == XLReferenceStyle.R1C1) - { - return m_rowNumber.ToStringLookup() + "," + ColumnNumber; - } - return ColumnLetter + m_rowNumber.ToStringLookup(); - } - #endregion - #region Methods - public string GetTrimmedAddress() - { - return m_trimmedAddress ?? (m_trimmedAddress = ColumnLetter + m_rowNumber.ToStringLookup()); - } - - public string ToStringRelative() - { - return GetTrimmedAddress(); - } - - public string ToStringFixed() - { - return "$" + ColumnLetter + "$" + m_rowNumber.ToStringLookup(); - } - - public SheetPoint GetSheetPoint() - { - return new SheetPoint(m_rowNumber, m_columnNumber); - } - #endregion - #region Operator Overloads - public static XLAddress operator +(XLAddress left, XLAddress right) - { - return new XLAddress(left.Worksheet, - left.RowNumber + right.RowNumber, - left.ColumnNumber + right.ColumnNumber, - left.m_fixedRow, - left.m_fixedColumn); - } - - public static XLAddress operator -(XLAddress left, XLAddress right) - { - return new XLAddress(left.Worksheet, - left.RowNumber - right.RowNumber, - left.ColumnNumber - right.ColumnNumber, - left.m_fixedRow, - left.m_fixedColumn); - } - - public static XLAddress operator +(XLAddress left, Int32 right) - { - return new XLAddress(left.Worksheet, - left.RowNumber + right, - left.ColumnNumber + right, - left.m_fixedRow, - left.m_fixedColumn); - } - - public static XLAddress operator -(XLAddress left, Int32 right) - { - return new XLAddress(left.Worksheet, - left.RowNumber - right, - left.ColumnNumber - right, - left.m_fixedRow, - left.m_fixedColumn); - } - - public static Boolean operator ==(XLAddress left, XLAddress right) - { - if (ReferenceEquals(left, right)) - { - return true; - } - if (ReferenceEquals(left, null)) - { - return false; - } - return left.Equals(right); - } - - public static Boolean operator !=(XLAddress left, XLAddress right) - { - return !(left == right); - } - #endregion - #region Interface Requirements - #region IEqualityComparer Members - public Boolean Equals(IXLAddress x, IXLAddress y) - { - return x == y; - } - - public Int32 GetHashCode(IXLAddress obj) - { - return obj.GetHashCode(); - } - - public new Boolean Equals(Object x, Object y) - { - return x == y; - } - - public Int32 GetHashCode(Object obj) - { - return (obj).GetHashCode(); - } - - public override Int32 GetHashCode() - { - return m_hashCode; - } - #endregion - #region IEquatable Members - public bool Equals(IXLAddress other) - { - var right = other as XLAddress; - if (ReferenceEquals(right, null)) - { - return false; - } - if (m_hashCode != right.m_hashCode) - { - return false; - } - - return m_rowNumber == right.m_rowNumber && m_columnNumber == right.m_columnNumber; - } - - public override Boolean Equals(Object other) - { - return Equals((XLAddress) other); - } - #endregion - #endregion - } -} \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLMergedRanges.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLMergedRanges.cs deleted file mode 100644 index ee8104a..0000000 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLMergedRanges.cs +++ /dev/null @@ -1,176 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; - -namespace ClosedXML.Excel -{ - internal sealed class XLMergedRanges:IEnumerable - { - #region Private fields - private readonly SortedDictionary m_dict = new SortedDictionary(SheetPointComparer.Instance); - #endregion - #region Constructor - public XLMergedRanges() - { - } - private XLMergedRanges(XLMergedRanges original) - { - m_dict = new SortedDictionary(original.m_dict, SheetPointComparer.Instance); - } - #endregion - #region Public properties - public int Count - { - [DebuggerStepThrough] - get { return m_dict.Count; } - } - #endregion - #region Public methods - public void Add(SheetRange range) - { - #region Check - if (range.IsOneCell) - { - throw new ArgumentException("One cell can't be merged"); - } - #endregion - m_dict.Add(range.FirstAddress, range); - } - - public bool Remove(SheetPoint point) - { - return m_dict.Remove(point); - } - public bool Remove(SheetRange sheetRange) - { - return m_dict.Remove(sheetRange.FirstAddress); - } - - /// - /// Return merged ranges contained on range. Returns merged ranges in row numerical order - /// - /// - /// - public List GetContainingMergedRanges(SheetRange range) - { - var result = new List(); - foreach (var mergedRange in m_dict) - { - if (range.Contains(mergedRange.Value)) - { - result.Add(mergedRange.Value); - continue; - } - //Note: Stop searching after reach merged range whitch has first row number more than lat row number of checking range - if (range.LastAddress.RowNumber < mergedRange.Key.RowNumber) - { - break; - } - } - return result; - } - - - /// - /// Return merged ranges intersect with point. Returns merged ranges in row numerical order - /// - /// - /// - public List GetIntersectingMergedRanges(SheetPoint point) - { - return GetIntersectingMergedRanges(new SheetRange(point, point)); - } - /// - /// Return merged ranges intersect with range. Returns merged ranges in row numerical order - /// - /// - /// - public List GetIntersectingMergedRanges(SheetRange range) - { - var result = new List(); - foreach (var mergedRange in m_dict) - { - if (range.Intersects(mergedRange.Value)) - { - result.Add(mergedRange.Value); - continue; - } - //Note: Stop searching after reach merged range whitch has first row number more than lat row number of checking range - if (range.LastAddress.RowNumber < mergedRange.Key.RowNumber) - { - break; - } - } - return result; - } - - public bool Intersects(IXLAddress address) - { - var point = new SheetPoint(address.RowNumber, address.ColumnNumber); - return Intersects(new SheetRange(point, point)); - } - public bool Intersects(SheetPoint point) - { - return Intersects(new SheetRange(point, point)); - } - public bool Intersects(SheetRange range) - { - foreach (var mergedRange in m_dict.Values) - { - if (mergedRange.Intersects(range)) - { - return true; - } - } - return false; - } - - public void Clear() - { - m_dict.Clear(); - } - - public XLMergedRanges Clone() - { - return new XLMergedRanges(this); - } - #endregion - #region Implementation of IEnumerable - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - #endregion - #region Implementation of IEnumerable - public IEnumerator GetEnumerator() - { - return m_dict.Values.GetEnumerator(); - } - #endregion - //-- - #region Nested type: SheetPointComparer - private sealed class SheetPointComparer : Comparer - { - /// - /// Singleton instance - /// - public static readonly SheetPointComparer Instance = new SheetPointComparer(); - #region Constructor - private SheetPointComparer() - { - } - #endregion - #region Public methods - public override int Compare(SheetPoint x, SheetPoint y) - { - return Math.Sign(x.RowNumber - y.RowNumber) * 2 + Math.Sign(x.ColumnNumber - y.ColumnNumber); - } - #endregion - - } - - #endregion - - } -} \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs index 1667983..6477729 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs @@ -126,7 +126,7 @@ if (dSheet.State != null) ws.Visibility = dSheet.State.Value.ToClosedXml(); - var styleList = new Dictionary(); + var styleList = new Dictionary();// {{0, ws.Style}}; var reader = OpenXmlReader.Create(wsPart); while (reader.Read()) @@ -956,10 +956,9 @@ } } - uint fillId = cellFormat.FillId.Value; - if (fillId > 0) + if (cellFormat.FillId != null) { - var fill = (Fill) fills.ElementAt((Int32) fillId); + var fill = (Fill)fills.ElementAt((Int32)cellFormat.FillId.Value); if (fill.PatternFill != null) { if (fill.PatternFill.PatternType != null) diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs index 83a57f4..d47c174 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs @@ -115,8 +115,10 @@ List existingSheetNames; if (workbookPart.Workbook != null && workbookPart.Workbook.Sheets != null) + { existingSheetNames = workbookPart.Workbook.Sheets.Elements().Select(s => s.Name.Value.ToLower()).ToList(); + } else existingSheetNames = new List(); @@ -213,8 +215,10 @@ if ( !properties.NamespaceDeclarations.Contains(new KeyValuePair("vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"))) + { properties.AddNamespaceDeclaration("vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); + } if (properties.Application == null) properties.AppendChild(new Application {Text = "Microsoft Excel"}); @@ -348,8 +352,10 @@ if ( !workbook.NamespaceDeclarations.Contains(new KeyValuePair("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"))) + { workbook.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + } #region WorkbookProperties @@ -783,11 +789,13 @@ {CellReference = c.Address.ToString(), InChildChain = true}); } else + { calculationChain.AppendChild(new CalculationCell { CellReference = c.Address.ToString(), SheetId = worksheet.SheetId }); + } } } @@ -1615,8 +1623,10 @@ ().FormatId.Value; } else if (workbookStylesPart.Stylesheet.CellStyles.Elements().Any()) + { defaultFormatId = workbookStylesPart.Stylesheet.CellStyles.Elements().Max(c => c.FormatId.Value) + 1; + } else defaultFormatId = 0; @@ -1696,11 +1706,7 @@ { if (!context.SharedStyles.ContainsKey(xlStyle)) { - Int32 numberFormatId; - if (xlStyle.NumberFormat.NumberFormatId >= 0) - numberFormatId = xlStyle.NumberFormat.NumberFormatId; - else - numberFormatId = allSharedNumberFormats[xlStyle.NumberFormat].NumberFormatId; + int numberFormatId = xlStyle.NumberFormat.NumberFormatId >= 0 ? xlStyle.NumberFormat.NumberFormatId : allSharedNumberFormats[xlStyle.NumberFormat].NumberFormatId; context.SharedStyles.Add(xlStyle, new StyleInfo @@ -1770,17 +1776,13 @@ } if (!foundOne) { - Int32 formatId = 0; - foreach (CellFormat f in workbookStylesPart.Stylesheet.CellStyleFormats) - { - if (CellFormatsAreEqual(f, styleInfo)) - break; - styleId++; - } + //StyleInfo info = styleInfo; + //styleId += workbookStylesPart.Stylesheet.CellStyleFormats + // .Cast() + // .TakeWhile(f => !CellFormatsAreEqual(f, info)).Count(); - //CellFormat cellFormat = new CellFormat() { NumberFormatId = (UInt32)styleInfo.NumberFormatId, FontId = (UInt32)styleInfo.FontId, FillId = (UInt32)styleInfo.FillId, BorderId = (UInt32)styleInfo.BorderId, ApplyNumberFormat = false, ApplyFill = ApplyFill(styleInfo), ApplyBorder = ApplyBorder(styleInfo), ApplyAlignment = false, ApplyProtection = false, FormatId = (UInt32)formatId }; var cellFormat = GetCellFormat(styleInfo); - cellFormat.FormatId = (UInt32)formatId; + cellFormat.FormatId = 0; var alignment = new Alignment { Horizontal = styleInfo.Style.Alignment.Horizontal.ToOpenXml(), @@ -1862,7 +1864,7 @@ return styleInfo.Style.Protection != null; } - private CellFormat GetCellFormat(StyleInfo styleInfo) + private static CellFormat GetCellFormat(StyleInfo styleInfo) { var cellFormat = new CellFormat { @@ -1978,7 +1980,7 @@ return allSharedBorders; } - private Border GetNewBorder(BorderInfo borderInfo) + private static Border GetNewBorder(BorderInfo borderInfo) { var border = new Border {DiagonalUp = borderInfo.Border.DiagonalUp, DiagonalDown = borderInfo.Border.DiagonalDown}; @@ -2197,7 +2199,7 @@ workbookStylesPart.Stylesheet.Fonts.Count = (UInt32)workbookStylesPart.Stylesheet.Fonts.Count(); } - private Font GetNewFont(FontInfo fontInfo) + private static Font GetNewFont(FontInfo fontInfo) { var font = new Font(); var bold = fontInfo.Font.Bold ? new Bold() : null; @@ -2233,7 +2235,7 @@ return font; } - private Color GetNewColor(IXLColor xlColor) + private static Color GetNewColor(IXLColor xlColor) { var color = new Color(); if (xlColor.ColorType == XLColorType.Color) @@ -2249,7 +2251,7 @@ return color; } - private TabColor GetTabColor(IXLColor xlColor) + private static TabColor GetTabColor(IXLColor xlColor) { var color = new TabColor(); if (xlColor.ColorType == XLColorType.Color) @@ -2267,23 +2269,17 @@ private bool FontsAreEqual(Font f, IXLFont xlFont) { - var nf = new XLFont(); - nf.Bold = f.Bold != null; - nf.Italic = f.Italic != null; + var nf = new XLFont {Bold = f.Bold != null, Italic = f.Italic != null}; if (f.Underline != null) - { - if (f.Underline.Val != null) - nf.Underline = f.Underline.Val.Value.ToClosedXml(); - else - nf.Underline = XLFontUnderlineValues.Single; - } + nf.Underline = f.Underline.Val != null + ? f.Underline.Val.Value.ToClosedXml() + : XLFontUnderlineValues.Single; nf.Strikethrough = f.Strike != null; if (f.VerticalTextAlignment != null) { - if (f.VerticalTextAlignment.Val != null) - nf.VerticalAlignment = f.VerticalTextAlignment.Val.Value.ToClosedXml(); - else - nf.VerticalAlignment = XLFontVerticalTextAlignmentValues.Baseline; + nf.VerticalAlignment = f.VerticalTextAlignment.Val != null + ? f.VerticalTextAlignment.Val.Value.ToClosedXml() + : XLFontVerticalTextAlignmentValues.Baseline; } nf.Shadow = f.Shadow != null; if (f.FontSize != null) @@ -2385,10 +2381,9 @@ if (worksheetPart.Worksheet.SheetProperties == null) worksheetPart.Worksheet.SheetProperties = new SheetProperties(); - if (xlWorksheet.TabColor.HasValue) - worksheetPart.Worksheet.SheetProperties.TabColor = GetTabColor(xlWorksheet.TabColor); - else - worksheetPart.Worksheet.SheetProperties.TabColor = null; + worksheetPart.Worksheet.SheetProperties.TabColor = xlWorksheet.TabColor.HasValue + ? GetTabColor(xlWorksheet.TabColor) + : null; cm.SetElement(XLWSContentManager.XLWSContents.SheetProperties, worksheetPart.Worksheet.SheetProperties); @@ -2402,30 +2397,26 @@ (xlWorksheet.Outline.SummaryHLocation == XLOutlineSummaryHLocation.Right); - if (worksheetPart.Worksheet.SheetProperties.PageSetupProperties == null && - (xlWorksheet.PageSetup.PagesTall > 0 || xlWorksheet.PageSetup.PagesWide > 0)) - worksheetPart.Worksheet.SheetProperties.PageSetupProperties = new PageSetupProperties(); - - if (xlWorksheet.PageSetup.PagesTall > 0 || xlWorksheet.PageSetup.PagesWide > 0) - worksheetPart.Worksheet.SheetProperties.PageSetupProperties.FitToPage = true; + if (worksheetPart.Worksheet.SheetProperties.PageSetupProperties == null + && xlWorksheet.PageSetup.PagesTall > 0 || xlWorksheet.PageSetup.PagesWide > 0) + worksheetPart.Worksheet.SheetProperties.PageSetupProperties = new PageSetupProperties {FitToPage = true}; #endregion - UInt32 maxColumn = 0; - UInt32 maxRow = 0; + Int32 maxColumn = 0; String sheetDimensionReference = "A1"; if (xlWorksheet.Internals.CellsCollection.Count > 0) { - maxColumn = (UInt32)xlWorksheet.Internals.CellsCollection.Select(c => c.Key.ColumnNumber).Max(); - maxRow = (UInt32)xlWorksheet.Internals.CellsCollection.Select(c => c.Key.RowNumber).Max(); - sheetDimensionReference = "A1:" + ExcelHelper.GetColumnLetterFromNumber((Int32)maxColumn) + - ((Int32)maxRow).ToStringLookup(); + maxColumn = xlWorksheet.Internals.CellsCollection.Select(c => c.Key.ColumnNumber).Max(); + Int32 maxRow = xlWorksheet.Internals.CellsCollection.Select(c => c.Key.RowNumber).Max(); + sheetDimensionReference = "A1:" + ExcelHelper.GetColumnLetterFromNumber(maxColumn) + + maxRow.ToStringLookup(); } if (xlWorksheet.Internals.ColumnsCollection.Count > 0) { - UInt32 maxColCollection = (UInt32)xlWorksheet.Internals.ColumnsCollection.Keys.Max(); + Int32 maxColCollection = xlWorksheet.Internals.ColumnsCollection.Keys.Max(); if (maxColCollection > maxColumn) maxColumn = maxColCollection; } @@ -2557,7 +2548,7 @@ worksheetPart.Worksheet.InsertAfter(new Columns(), previousElement); } - Columns columns = worksheetPart.Worksheet.Elements().First(); + var columns = worksheetPart.Worksheet.Elements().First(); cm.SetElement(XLWSContentManager.XLWSContents.Columns, columns); var sheetColumnsByMin = columns.Elements().ToDictionary(c => c.Min.Value, c => c); @@ -2675,7 +2666,7 @@ worksheetPart.Worksheet.InsertAfter(new SheetData(), previousElement); } - SheetData sheetData = worksheetPart.Worksheet.Elements().First(); + var sheetData = worksheetPart.Worksheet.Elements().First(); cm.SetElement(XLWSContentManager.XLWSContents.SheetData, sheetData); var cellsByRow = new Dictionary>(); @@ -2727,7 +2718,7 @@ } if (maxColumn > 0) - row.Spans = new ListValue {InnerText = "1:" + maxColumn}; + row.Spans = new ListValue {InnerText = "1:" + maxColumn.ToStringLookup()}; row.Height = null; row.CustomHeight = null; @@ -2884,7 +2875,7 @@ worksheetPart.Worksheet.InsertAfter(new SheetProtection(), previousElement); } - SheetProtection sheetProtection = worksheetPart.Worksheet.Elements().First(); + var sheetProtection = worksheetPart.Worksheet.Elements().First(); cm.SetElement(XLWSContentManager.XLWSContents.SheetProtection, sheetProtection); var protection = (XLSheetProtection)xlWorksheet.Protection; @@ -2937,22 +2928,25 @@ #endregion #region MergeCells - - if (xlWorksheet.Internals.MergedRanges.Any()) + MergeCells mergeCells = null; + if ((xlWorksheet as XLWorksheet).Internals.MergedRanges.Any()) { if (!worksheetPart.Worksheet.Elements().Any()) { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.MergeCells); + OpenXmlElement previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.MergeCells); worksheetPart.Worksheet.InsertAfter(new MergeCells(), previousElement); } - MergeCells mergeCells = worksheetPart.Worksheet.Elements().First(); + mergeCells = worksheetPart.Worksheet.Elements().First(); cm.SetElement(XLWSContentManager.XLWSContents.MergeCells, mergeCells); mergeCells.RemoveAllChildren(); - foreach (SheetRange mergedRange in xlWorksheet.Internals.MergedRanges) + foreach ( + var merged in + (xlWorksheet as XLWorksheet).Internals.MergedRanges.Select( + m => m.RangeAddress.FirstAddress.ToString() + ":" + m.RangeAddress.LastAddress.ToString())) { - var mergeCell = new MergeCell {Reference = mergedRange.ToStringA1()}; + MergeCell mergeCell = new MergeCell() { Reference = merged }; mergeCells.AppendChild(mergeCell); } @@ -2963,7 +2957,6 @@ worksheetPart.Worksheet.RemoveAllChildren(); cm.SetElement(XLWSContentManager.XLWSContents.MergeCells, null); } - #endregion #region DataValidations @@ -2982,7 +2975,7 @@ worksheetPart.Worksheet.InsertAfter(new DataValidations(), previousElement); } - DataValidations dataValidations = worksheetPart.Worksheet.Elements().First(); + var dataValidations = worksheetPart.Worksheet.Elements().First(); cm.SetElement(XLWSContentManager.XLWSContents.DataValidations, dataValidations); dataValidations.RemoveAllChildren(); foreach (IXLDataValidation dv in xlWorksheet.DataValidations) @@ -3036,7 +3029,7 @@ worksheetPart.Worksheet.InsertAfter(new Hyperlinks(), previousElement); } - Hyperlinks hyperlinks = worksheetPart.Worksheet.Elements().First(); + var hyperlinks = worksheetPart.Worksheet.Elements().First(); cm.SetElement(XLWSContentManager.XLWSContents.Hyperlinks, hyperlinks); hyperlinks.RemoveAllChildren(); foreach (XLHyperlink hl in xlWorksheet.Hyperlinks) @@ -3073,7 +3066,7 @@ worksheetPart.Worksheet.InsertAfter(new PrintOptions(), previousElement); } - PrintOptions printOptions = worksheetPart.Worksheet.Elements().First(); + var printOptions = worksheetPart.Worksheet.Elements().First(); cm.SetElement(XLWSContentManager.XLWSContents.PrintOptions, printOptions); printOptions.HorizontalCentered = xlWorksheet.PageSetup.CenterHorizontally; @@ -3322,7 +3315,9 @@ { var newColumn = (Column)kp.Value.CloneNode(true); newColumn.Min = lastMin; - var columnsToRemove = columns.Elements().Where(co => co.Min >= newColumn.Min && co.Max <= newColumn.Max).Select(co => co).ToList(); + var columnsToRemove = + columns.Elements().Where(co => co.Min >= newColumn.Min && co.Max <= newColumn.Max). + Select(co => co).ToList(); columnsToRemove.ForEach(c => columns.RemoveChild(c)); columns.AppendChild(newColumn); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs index 137e26e..fdbc0ee 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs @@ -47,7 +47,7 @@ Protection = new XLSheetProtection(); Workbook = workbook; style = new XLStyle(this, workbook.Style); - Internals = new XLWorksheetInternals(new XLCellCollection(), new XLColumnsCollection(), new XLRowsCollection(), new XLMergedRanges(), workbook); + Internals = new XLWorksheetInternals(new XLCellCollection(), new XLColumnsCollection(), new XLRowsCollection(), new XLRanges(), workbook); PageSetup = new XLPageSetup(workbook.PageOptions, this); Outline = new XLOutline(workbook.Outline); ColumnWidth = workbook.ColumnWidth; @@ -69,25 +69,25 @@ #endregion public XLWorkbook Workbook { get; private set; } - private void XLWorksheet_RangeShiftedColumns(XLRange range, int columnsShifted) + void XLWorksheet_RangeShiftedColumns(XLRange range, int columnsShifted) { - var newMerge = new XLMergedRanges(); + var newMerge = new XLRanges(); foreach (var rngMerged in Internals.MergedRanges) { - if (range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.FirstAddress.ColumnNumber - && rngMerged.FirstAddress.RowNumber >= range.RangeAddress.FirstAddress.RowNumber - && rngMerged.LastAddress.RowNumber <= range.RangeAddress.LastAddress.RowNumber) + if (range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.RangeAddress.FirstAddress.ColumnNumber + && rngMerged.RangeAddress.FirstAddress.RowNumber >= range.RangeAddress.FirstAddress.RowNumber + && rngMerged.RangeAddress.LastAddress.RowNumber <= range.RangeAddress.LastAddress.RowNumber) { - var newRng = new SheetRange( - rngMerged.FirstAddress.RowNumber, - rngMerged.FirstAddress.ColumnNumber + columnsShifted, - rngMerged.LastAddress.RowNumber, - rngMerged.LastAddress.ColumnNumber + columnsShifted); + var newRng = Range( + rngMerged.RangeAddress.FirstAddress.RowNumber, + rngMerged.RangeAddress.FirstAddress.ColumnNumber + columnsShifted, + rngMerged.RangeAddress.LastAddress.RowNumber, + rngMerged.RangeAddress.LastAddress.ColumnNumber + columnsShifted); newMerge.Add(newRng); } else if ( - !(range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.FirstAddress.ColumnNumber - && range.RangeAddress.FirstAddress.RowNumber <= rngMerged.LastAddress.RowNumber)) + !(range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.RangeAddress.FirstAddress.ColumnNumber + && range.RangeAddress.FirstAddress.RowNumber <= rngMerged.RangeAddress.LastAddress.RowNumber)) { newMerge.Add(rngMerged); } @@ -95,24 +95,24 @@ Internals.MergedRanges = newMerge; } - private void XLWorksheet_RangeShiftedRows(XLRange range, int rowsShifted) + void XLWorksheet_RangeShiftedRows(XLRange range, int rowsShifted) { - var newMerge = new XLMergedRanges(); + var newMerge = new XLRanges(); foreach (var rngMerged in Internals.MergedRanges) { - if (range.RangeAddress.FirstAddress.RowNumber <= rngMerged.FirstAddress.RowNumber - && rngMerged.FirstAddress.ColumnNumber >= range.RangeAddress.FirstAddress.ColumnNumber - && rngMerged.LastAddress.ColumnNumber <= range.RangeAddress.LastAddress.ColumnNumber) + if (range.RangeAddress.FirstAddress.RowNumber <= rngMerged.RangeAddress.FirstAddress.RowNumber + && rngMerged.RangeAddress.FirstAddress.ColumnNumber >= range.RangeAddress.FirstAddress.ColumnNumber + && rngMerged.RangeAddress.LastAddress.ColumnNumber <= range.RangeAddress.LastAddress.ColumnNumber) { - var newRng = new SheetRange( - rngMerged.FirstAddress.RowNumber + rowsShifted, - rngMerged.FirstAddress.ColumnNumber, - rngMerged.LastAddress.RowNumber + rowsShifted, - rngMerged.LastAddress.ColumnNumber); + var newRng = Range( + rngMerged.RangeAddress.FirstAddress.RowNumber + rowsShifted, + rngMerged.RangeAddress.FirstAddress.ColumnNumber, + rngMerged.RangeAddress.LastAddress.RowNumber + rowsShifted, + rngMerged.RangeAddress.LastAddress.ColumnNumber); newMerge.Add(newRng); } - else if (!(range.RangeAddress.FirstAddress.RowNumber <= rngMerged.FirstAddress.RowNumber - && range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.LastAddress.ColumnNumber)) + else if (!(range.RangeAddress.FirstAddress.RowNumber <= rngMerged.RangeAddress.FirstAddress.RowNumber + && range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.RangeAddress.LastAddress.ColumnNumber)) { newMerge.Add(rngMerged); } @@ -658,7 +658,7 @@ targetSheet.PageSetup = new XLPageSetup(PageSetup, targetSheet); targetSheet.Outline = new XLOutline(Outline); targetSheet.SheetView = new XLSheetView(SheetView); - targetSheet.Internals.MergedRanges = Internals.MergedRanges.Clone(); + this.Internals.MergedRanges.ForEach(kp => targetSheet.Internals.MergedRanges.Add(targetSheet.Range(kp.RangeAddress.ToString()))); foreach (var r in NamedRanges) { diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheetInternals.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheetInternals.cs index c5af1f3..c52bf84 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheetInternals.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheetInternals.cs @@ -6,7 +6,7 @@ XLCellCollection cellsCollection, XLColumnsCollection columnsCollection, XLRowsCollection rowsCollection, - XLMergedRanges mergedRanges, + XLRanges mergedRanges, XLWorkbook workbook ) { @@ -20,7 +20,7 @@ public XLCellCollection CellsCollection { get; private set; } public XLColumnsCollection ColumnsCollection { get; private set; } public XLRowsCollection RowsCollection { get; private set; } - public XLMergedRanges MergedRanges { get; internal set; } + public XLRanges MergedRanges { get; internal set; } public XLWorkbook Workbook { get; internal set; } } } diff --git a/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj b/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj index d2bd67c..0465e56 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj +++ b/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj @@ -169,11 +169,11 @@ Excel\Columns\XLColumns.cs - - Excel\Coordinate\SheetPoint.cs + + Excel\Coordinate\IXLAddress.cs - - Excel\Coordinate\SheetRange.cs + + Excel\Coordinate\XLAddress.cs Excel\CustomProperties\IXLCustomProperties.cs @@ -235,9 +235,6 @@ Excel\Hyperlinks\XLHyperlink_public.cs - - Excel\IXLAddress.cs - Excel\IXLOutline.cs @@ -502,12 +499,6 @@ Excel\Tables\XLTables.cs - - Excel\XLAddress.cs - - - Excel\XLMergedRanges.cs - Excel\XLOutline.cs