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