diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs index feed098..30c1832 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs @@ -11,10 +11,13 @@ internal partial class XLCell : IXLCell, IXLStylized { public static readonly DateTime BaseDate = new DateTime(1899, 12, 30); - #region Private fields + #region Fields private readonly XLWorksheet m_worksheet; private XLRichText m_richText; private XLHyperlink m_hyperlink; + + internal String m_cellValue = String.Empty; + internal XLCellValues m_dataType; #endregion #region Constructor public XLCell(XLWorksheet worksheet, XLAddress address, IXLStyle defaultStyle) @@ -235,7 +238,7 @@ return format; } - internal String m_cellValue = String.Empty; + public Object Value { get @@ -551,31 +554,11 @@ if (createTable) { - if (tableName == null) - { - return range.CreateTable(); - } - else - { - return range.CreateTable(tableName); - } + return tableName == null ? range.CreateTable() : range.CreateTable(tableName); } - else - { - if (tableName == null) - { - return range.AsTable(); - } - else - { - return range.AsTable(tableName); - } - } + return tableName == null ? range.AsTable() : range.AsTable(tableName); } - else - { - return null; - } + return null; } public IXLRange InsertData(IEnumerable data) @@ -647,17 +630,9 @@ private void ClearMerged(Int32 rowCount, Int32 columnCount) { - var point = Address.GetSheetPoint(); - var range = new SheetRange(point, point); - var mergeToDelete = new List(); - foreach (var merge in m_worksheet.Internals.MergedRanges) - { - if (merge.Intersects(range)) - { - mergeToDelete.Add(merge); - } - } - mergeToDelete.ForEach(m => m_worksheet.Internals.MergedRanges.Remove(m)); + //TODO: For MDLeon: Need review why parameters is never used(see compare with revision 67871 before VF changes) + var intersectingRanges = m_worksheet.Internals.MergedRanges.GetIntersectingMergedRanges(Address.GetSheetPoint()); + intersectingRanges.ForEach(m => m_worksheet.Internals.MergedRanges.Remove(m)); } private void SetValue(object objWithValue, int ro, int co) @@ -784,7 +759,7 @@ return this; } - internal XLCellValues m_dataType; + public XLCellValues DataType { get { @@ -828,8 +803,7 @@ } else { - throw new ArgumentException("Cannot set data type to DateTime because '" + m_cellValue + - "' is not recognized as a date."); + throw new ArgumentException(string.Format("Cannot set data type to DateTime because '{0}' is not recognized as a date.", m_cellValue)); } if (Style.NumberFormat.Format == String.Empty && Style.NumberFormat.NumberFormatId == 0) @@ -863,8 +837,7 @@ } catch { - throw new ArgumentException("Cannot set data type to TimeSpan because '" + m_cellValue + - "' is not recognized as a TimeSpan."); + throw new ArgumentException(string.Format("Cannot set data type to TimeSpan because '{0}' is not recognized as a TimeSpan.", m_cellValue)); } } } @@ -877,8 +850,7 @@ } else { - throw new ArgumentException("Cannot set data type to Number because '" + m_cellValue + - "' is not recognized as a number."); + throw new ArgumentException(string.Format("Cannot set data type to Number because '{0}' is not recognized as a number.", m_cellValue)); } } else diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs index 592e814..a7ecc46 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs @@ -6,10 +6,17 @@ { internal class XLColumn : XLRangeBase, IXLColumn { + #region Private fields + private bool m_isHidden; + private IXLStyle m_style; + private bool m_collapsed; + private int m_outlineLevel; + #endregion + #region Constructor public XLColumn(Int32 column, XLColumnParameters xlColumnParameters) : base( new XLRangeAddress(new XLAddress(xlColumnParameters.Worksheet, 1, column, false, false), - new XLAddress(xlColumnParameters.Worksheet, XLWorksheet.MaxNumberOfRows, column, false, false))) + new XLAddress(xlColumnParameters.Worksheet, ExcelHelper.MaxRowNumber, column, false, false))) { SetColumnNumber(column); @@ -20,7 +27,7 @@ } else { - style = new XLStyle(this, xlColumnParameters.DefaultStyle); + m_style = new XLStyle(this, xlColumnParameters.DefaultStyle); width = xlColumnParameters.Worksheet.ColumnWidth; } } @@ -28,16 +35,16 @@ public XLColumn(XLColumn column) : base( new XLRangeAddress(new XLAddress(column.Worksheet, 1, column.ColumnNumber(), false, false), - new XLAddress(column.Worksheet, XLWorksheet.MaxNumberOfRows, column.ColumnNumber(), false, false))) + new XLAddress(column.Worksheet, ExcelHelper.MaxRowNumber, column.ColumnNumber(), false, false))) { width = column.width; IsReference = column.IsReference; - collapsed = column.collapsed; - isHidden = column.isHidden; - outlineLevel = column.outlineLevel; - style = new XLStyle(this, column.Style); + m_collapsed = column.m_collapsed; + m_isHidden = column.m_isHidden; + m_outlineLevel = column.m_outlineLevel; + m_style = new XLStyle(this, column.Style); } - + #endregion private void Worksheet_RangeShiftedColumns(XLRange range, int columnsShifted) { if (range.RangeAddress.FirstAddress.ColumnNumber <= ColumnNumber()) @@ -46,7 +53,7 @@ } } - private void SetColumnNumber(Int32 column) + private void SetColumnNumber(int column) { if (column <= 0) { @@ -60,7 +67,7 @@ RangeAddress.FirstAddress.FixedRow, RangeAddress.FirstAddress.FixedColumn); RangeAddress.LastAddress = new XLAddress(Worksheet, - XLWorksheet.MaxNumberOfRows, + ExcelHelper.MaxRowNumber, column, RangeAddress.LastAddress.FixedRow, RangeAddress.LastAddress.FixedColumn); @@ -139,7 +146,6 @@ } #endregion #region IXLStylized Members - private IXLStyle style; public override IXLStyle Style { get @@ -150,7 +156,7 @@ } else { - return style; + return m_style; } } set @@ -161,7 +167,7 @@ } else { - style = new XLStyle(this, value); + m_style = new XLStyle(this, value); Int32 minRow = 1; Int32 maxRow = 0; @@ -244,7 +250,7 @@ } else { - return new XLStyle(new XLStylizedContainer(style, this), style); + return new XLStyle(new XLStylizedContainer(m_style, this), m_style); } } set @@ -255,7 +261,7 @@ } else { - style = new XLStyle(this, value); + m_style = new XLStyle(this, value); } } } @@ -281,7 +287,7 @@ public override IXLRange AsRange() { - return Range(1, 1, XLWorksheet.MaxNumberOfRows, 1); + return Range(1, 1, ExcelHelper.MaxRowNumber, 1); } public override XLRange Range(String rangeAddressStr) { @@ -317,7 +323,7 @@ } public IXLColumn AdjustToContents(Int32 startRow) { - return AdjustToContents(startRow, XLWorksheet.MaxNumberOfRows); + return AdjustToContents(startRow, ExcelHelper.MaxRowNumber); } public IXLColumn AdjustToContents(Int32 startRow, Int32 endRow) { @@ -326,16 +332,16 @@ private double DegreeToRadian(double angle) { - return Math.PI * angle / 180.0; + return Math.PI*angle/180.0; } public IXLColumn AdjustToContents(Double minWidth, Double maxWidth) { - return AdjustToContents(1, XLWorksheet.MaxNumberOfRows, minWidth, maxWidth); + return AdjustToContents(1, ExcelHelper.MaxRowNumber, minWidth, maxWidth); } public IXLColumn AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth) { - return AdjustToContents(startRow, XLWorksheet.MaxNumberOfRows, minWidth, maxWidth); + return AdjustToContents(startRow, ExcelHelper.MaxRowNumber, minWidth, maxWidth); } public IXLColumn AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth) { @@ -351,23 +357,22 @@ Int32 textRotation = c.Style.Alignment.TextRotation; if (c.HasRichText || textRotation != 0 || c.InnerText.Contains(Environment.NewLine)) { - List> kpList = new List>(); - #region if (c.HasRichText) - if (c.HasRichText) { foreach (var rt in c.RichText) { String formattedString = rt.Text; - var arr = formattedString.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); + var arr = formattedString.Split(new[] {Environment.NewLine}, StringSplitOptions.None); Int32 arrCount = arr.Count(); for (Int32 i = 0; i < arrCount; i++) { String s = arr[i]; if (i < arrCount - 1) + { s += Environment.NewLine; + } kpList.Add(new KeyValuePair(rt, s)); } } @@ -375,21 +380,20 @@ else { String formattedString = c.GetFormattedString(); - var arr = formattedString.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); + var arr = formattedString.Split(new[] {Environment.NewLine}, StringSplitOptions.None); Int32 arrCount = arr.Count(); for (Int32 i = 0; i < arrCount; i++) { String s = arr[i]; if (i < arrCount - 1) + { s += Environment.NewLine; + } kpList.Add(new KeyValuePair(c.Style.Font, s)); } } #endregion - #region foreach (var kp in kpList) - - Double runningWidth = 0; Boolean rotated = false; Double maxLineWidth = 0; @@ -403,19 +407,26 @@ if (textRotation == 0) { #region if (newLinePosition >= 0) - if (newLinePosition >= 0) { if (newLinePosition > 0) + { runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition)); + } if (runningWidth > thisWidthMax) + { thisWidthMax = runningWidth; + } if (newLinePosition < formattedString.Length - 2) + { runningWidth = f.GetWidth(formattedString.Substring(newLinePosition + 2)); + } else + { runningWidth = 0; + } } else { @@ -429,33 +440,46 @@ if (textRotation == 255) { if (runningWidth == 0) + { runningWidth = f.GetWidth("X"); + } if (newLinePosition >= 0) + { runningWidth += f.GetWidth("X"); + } } else { rotated = true; Double vWidth = f.GetWidth("X"); if (vWidth > maxLineWidth) + { maxLineWidth = vWidth; + } if (newLinePosition >= 0) { lineCount++; if (newLinePosition > 0) + { runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition)); + } if (runningWidth > thisWidthMax) + { thisWidthMax = runningWidth; + } if (newLinePosition < formattedString.Length - 2) + { runningWidth = f.GetWidth(formattedString.Substring(newLinePosition + 2)); + } else + { runningWidth = 0; - + } } else { @@ -467,20 +491,25 @@ } #endregion if (runningWidth > thisWidthMax) + { thisWidthMax = runningWidth; - + } #region if (rotated) if (rotated) { Int32 rotation; if (textRotation == 90 || textRotation == 180 || textRotation == 255) + { rotation = 90; + } else - rotation = textRotation % 90; + { + rotation = textRotation%90; + } Double r = DegreeToRadian(rotation); - - thisWidthMax = (thisWidthMax * Math.Cos(r)) + (maxLineWidth * lineCount) ; + + thisWidthMax = (thisWidthMax*Math.Cos(r)) + (maxLineWidth*lineCount); } #endregion } @@ -501,7 +530,9 @@ } if (colMaxWidth == 0) + { colMaxWidth = Worksheet.ColumnWidth; + } Width = colMaxWidth; @@ -531,7 +562,7 @@ { IsHidden = false; } - private Boolean isHidden; + public Boolean IsHidden { get @@ -542,7 +573,7 @@ } else { - return isHidden; + return m_isHidden; } } set @@ -553,18 +584,14 @@ } else { - isHidden = value; + m_isHidden = value; } } } - private Boolean collapsed; public Boolean Collapsed { - get - { - return IsReference ? (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Collapsed : collapsed; - } + get { return IsReference ? (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Collapsed : m_collapsed; } set { if (IsReference) @@ -573,16 +600,14 @@ } else { - collapsed = value; + m_collapsed = value; } } } - private Int32 outlineLevel; + public Int32 OutlineLevel { - get { - return IsReference ? (Worksheet).Internals.ColumnsCollection[ColumnNumber()].OutlineLevel : outlineLevel; - } + get { return IsReference ? (Worksheet).Internals.ColumnsCollection[ColumnNumber()].OutlineLevel : m_outlineLevel; } set { if (value < 0 || value > 8) @@ -597,11 +622,12 @@ else { (Worksheet).IncrementColumnOutline(value); - (Worksheet).DecrementColumnOutline(outlineLevel); - outlineLevel = value; + (Worksheet).DecrementColumnOutline(m_outlineLevel); + m_outlineLevel = value; } } } + public void Group() { Group(false); @@ -693,12 +719,12 @@ public new IXLRangeColumn CopyTo(IXLCell target) { var rngUsed = RangeUsed().Column(1); - CopyToCell(rngUsed, (XLCell)target); + CopyToCell(rngUsed, (XLCell) target); Int32 lastRowNumber = target.Address.RowNumber + rngUsed.CellCount() - 1; - if (lastRowNumber > XLWorksheet.MaxNumberOfRows) + if (lastRowNumber > ExcelHelper.MaxRowNumber) { - lastRowNumber = XLWorksheet.MaxNumberOfRows; + lastRowNumber = ExcelHelper.MaxRowNumber; } return target.Worksheet.Range( @@ -716,12 +742,12 @@ Int32 targetRowCount = targetRangeUsed.RowCount(); Int32 maxRow = thisRowCount > targetRowCount ? thisRowCount : targetRowCount; - CopyToCell(Range(1, 1, maxRow, 1).Column(1), (XLCell)target.FirstCell()); + CopyToCell(Range(1, 1, maxRow, 1).Column(1), (XLCell) target.FirstCell()); Int32 lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + maxRow - 1; - if (lastRowNumber > XLWorksheet.MaxNumberOfRows) + if (lastRowNumber > ExcelHelper.MaxRowNumber) { - lastRowNumber = XLWorksheet.MaxNumberOfRows; + lastRowNumber = ExcelHelper.MaxRowNumber; } return (target as XLRangeBase).Worksheet.Range( @@ -742,7 +768,7 @@ CopyToCell(Column(1, maxRow), (XLCell) column.FirstCell()); var newColumn = (XLColumn) column; newColumn.width = width; - newColumn.style = new XLStyle(newColumn, Style); + newColumn.m_style = new XLStyle(newColumn, Style); return newColumn; } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumnCollection.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumnCollection.cs index a4e72ab..3eaff28 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumnCollection.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumnCollection.cs @@ -12,7 +12,7 @@ { var columnToMove = dictionary[ro]; Int32 newColumn = ro + columnsToShift; - if (newColumn <= XLWorksheet.MaxNumberOfColumns) + if (newColumn <= ExcelHelper.MaxColumnNumber) { dictionary.Add(newColumn, new XLColumn(columnToMove)); } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/SheetRange.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/SheetRange.cs index fd76fc8..689df68 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/SheetRange.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Coordinate/SheetRange.cs @@ -88,7 +88,21 @@ || 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)) @@ -108,6 +122,7 @@ 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()); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs index 1927e1a..2c6036d 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs @@ -1028,14 +1028,14 @@ base.CopyTo(target); Int32 lastRowNumber = target.Address.RowNumber + RowCount() - 1; - if (lastRowNumber > XLWorksheet.MaxNumberOfRows) + if (lastRowNumber > ExcelHelper.MaxRowNumber) { - lastRowNumber = XLWorksheet.MaxNumberOfRows; + lastRowNumber = ExcelHelper.MaxRowNumber; } Int32 lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLWorksheet.MaxNumberOfColumns) + if (lastColumnNumber > ExcelHelper.MaxColumnNumber) { - lastColumnNumber = XLWorksheet.MaxNumberOfColumns; + lastColumnNumber = ExcelHelper.MaxColumnNumber; } return target.Worksheet.Range(target.Address.RowNumber, @@ -1048,14 +1048,14 @@ base.CopyTo(target); Int32 lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; - if (lastRowNumber > XLWorksheet.MaxNumberOfRows) + if (lastRowNumber > ExcelHelper.MaxRowNumber) { - lastRowNumber = XLWorksheet.MaxNumberOfRows; + lastRowNumber = ExcelHelper.MaxRowNumber; } Int32 lastColumnNumber = target.RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLWorksheet.MaxNumberOfColumns) + if (lastColumnNumber > ExcelHelper.MaxColumnNumber) { - lastColumnNumber = XLWorksheet.MaxNumberOfColumns; + lastColumnNumber = ExcelHelper.MaxColumnNumber; } return target.Worksheet.Range(target.RangeAddress.FirstAddress.RowNumber, diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs index 1eb2167..82d8586 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -182,11 +182,17 @@ { 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) + { + lastRow = Math.Max(mrange.LastAddress.RowNumber, lastRow); + lastColumn = Math.Max(mrange.LastAddress.ColumnNumber, lastColumn); + } return Worksheet.Cell(lastRow, lastColumn); - // var lastAddress = cellsUsed.Max(c => c.Address); - // return Worksheet.Cell(lastAddress); + } public XLCell Cell(Int32 row, Int32 column) @@ -330,6 +336,7 @@ } return retVal; } + protected String FixColumnAddress(String address) { Int32 test; @@ -348,6 +355,7 @@ } return address; } + public IXLCells Cells() { var cells = new XLCells(false, false, false); @@ -394,7 +402,6 @@ } return AsRange(); } - public IXLRange Unmerge() { foreach (var m in (Worksheet).Internals.MergedRanges) @@ -441,21 +448,21 @@ { var columnCount = ColumnCount(); var firstColumn = RangeAddress.FirstAddress.ColumnNumber + columnCount; - if (firstColumn > XLWorksheet.MaxNumberOfColumns) + if (firstColumn > ExcelHelper.MaxColumnNumber) { - firstColumn = XLWorksheet.MaxNumberOfColumns; + firstColumn = ExcelHelper.MaxColumnNumber; } var lastColumn = firstColumn + ColumnCount() - 1; - if (lastColumn > XLWorksheet.MaxNumberOfColumns) + if (lastColumn > ExcelHelper.MaxColumnNumber) { - lastColumn = XLWorksheet.MaxNumberOfColumns; + lastColumn = ExcelHelper.MaxColumnNumber; } var firstRow = RangeAddress.FirstAddress.RowNumber; var lastRow = firstRow + RowCount() - 1; - if (lastRow > XLWorksheet.MaxNumberOfRows) + if (lastRow > ExcelHelper.MaxRowNumber) { - lastRow = XLWorksheet.MaxNumberOfRows; + lastRow = ExcelHelper.MaxRowNumber; } var newRange = Worksheet.Range(firstRow, firstColumn, lastRow, lastColumn); @@ -607,21 +614,21 @@ { var rowCount = RowCount(); var firstRow = RangeAddress.FirstAddress.RowNumber + rowCount; - if (firstRow > XLWorksheet.MaxNumberOfRows) + if (firstRow > ExcelHelper.MaxRowNumber) { - firstRow = XLWorksheet.MaxNumberOfRows; + firstRow = ExcelHelper.MaxRowNumber; } var lastRow = firstRow + RowCount() - 1; - if (lastRow > XLWorksheet.MaxNumberOfRows) + if (lastRow > ExcelHelper.MaxRowNumber) { - lastRow = XLWorksheet.MaxNumberOfRows; + lastRow = ExcelHelper.MaxRowNumber; } var firstColumn = RangeAddress.FirstAddress.ColumnNumber; var lastColumn = firstColumn + ColumnCount() - 1; - if (lastColumn > XLWorksheet.MaxNumberOfColumns) + if (lastColumn > ExcelHelper.MaxColumnNumber) { - lastColumn = XLWorksheet.MaxNumberOfColumns; + lastColumn = ExcelHelper.MaxColumnNumber; } var newRange = Worksheet.Range(firstRow, firstColumn, lastRow, lastColumn); @@ -791,7 +798,7 @@ mergeToDelete.ForEach(m => (Worksheet).Internals.MergedRanges.Remove(m)); } - public Boolean Contains(String rangeAddress) + public bool Contains(String rangeAddress) { String addressToUse; if (rangeAddress.Contains("!")) @@ -818,44 +825,37 @@ } return Contains(firstAddress, lastAddress); } - - public Boolean Contains(IXLRangeBase range) + public bool Contains(IXLRangeBase range) { return Contains((XLAddress) range.RangeAddress.FirstAddress, (XLAddress) range.RangeAddress.LastAddress); } - public bool Contains(XLAddress first, XLAddress last) { return Contains(first) && Contains(last); } - public bool Contains(XLAddress address) { return RangeAddress.FirstAddress.RowNumber <= address.RowNumber && address.RowNumber <= RangeAddress.LastAddress.RowNumber && RangeAddress.FirstAddress.ColumnNumber <= address.ColumnNumber && address.ColumnNumber <= RangeAddress.LastAddress.ColumnNumber; } - - public Boolean Contains(SheetRange range) + 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 Boolean Intersects(String rangeAddress) + public bool Intersects(string rangeAddress) { return Intersects(Range(rangeAddress)); } - public bool Intersects(IXLRangeBase range) { if (range.RangeAddress.IsInvalid || RangeAddress.IsInvalid) @@ -872,7 +872,6 @@ || ma.LastAddress.RowNumber < ra.FirstAddress.RowNumber ); } - public bool Intersects(SheetRange range) { if (RangeAddress.IsInvalid) @@ -896,7 +895,7 @@ IXLRange shiftedRangeFormula; if (shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp) { - var lastCell = Worksheet.Cell(XLWorksheet.MaxNumberOfRows, RangeAddress.LastAddress.ColumnNumber); + 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)) { @@ -905,7 +904,7 @@ } else { - var lastCell = Worksheet.Cell(RangeAddress.LastAddress.RowNumber, XLWorksheet.MaxNumberOfColumns); + 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)) { diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumn.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumn.cs index c43fe91..9fe151b 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumn.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumn.cs @@ -198,14 +198,14 @@ base.CopyTo(target); Int32 lastRowNumber = target.Address.RowNumber + RowCount() - 1; - if (lastRowNumber > XLWorksheet.MaxNumberOfRows) + if (lastRowNumber > ExcelHelper.MaxRowNumber) { - lastRowNumber = XLWorksheet.MaxNumberOfRows; + lastRowNumber = ExcelHelper.MaxRowNumber; } Int32 lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLWorksheet.MaxNumberOfColumns) + if (lastColumnNumber > ExcelHelper.MaxColumnNumber) { - lastColumnNumber = XLWorksheet.MaxNumberOfColumns; + lastColumnNumber = ExcelHelper.MaxColumnNumber; } return target.Worksheet.Range(target.Address.RowNumber, @@ -219,14 +219,14 @@ base.CopyTo(target); var lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; - if (lastRowNumber > XLWorksheet.MaxNumberOfRows) + if (lastRowNumber > ExcelHelper.MaxRowNumber) { - lastRowNumber = XLWorksheet.MaxNumberOfRows; + lastRowNumber = ExcelHelper.MaxRowNumber; } Int32 lastColumnNumber = target.RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLWorksheet.MaxNumberOfColumns) + if (lastColumnNumber > ExcelHelper.MaxColumnNumber) { - lastColumnNumber = XLWorksheet.MaxNumberOfColumns; + lastColumnNumber = ExcelHelper.MaxColumnNumber; } return target.Worksheet.Range(target.RangeAddress.FirstAddress.RowNumber, diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRow.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRow.cs index 02444a7..9f8daf6 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRow.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRow.cs @@ -214,14 +214,14 @@ base.CopyTo(target); Int32 lastRowNumber = target.Address.RowNumber + RowCount() - 1; - if (lastRowNumber > XLWorksheet.MaxNumberOfRows) + if (lastRowNumber > ExcelHelper.MaxRowNumber) { - lastRowNumber = XLWorksheet.MaxNumberOfRows; + lastRowNumber = ExcelHelper.MaxRowNumber; } Int32 lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLWorksheet.MaxNumberOfColumns) + if (lastColumnNumber > ExcelHelper.MaxColumnNumber) { - lastColumnNumber = XLWorksheet.MaxNumberOfColumns; + lastColumnNumber = ExcelHelper.MaxColumnNumber; } return target.Worksheet.Range(target.Address.RowNumber, @@ -234,14 +234,14 @@ { base.CopyTo(target); Int32 lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; - if (lastRowNumber > XLWorksheet.MaxNumberOfRows) + if (lastRowNumber > ExcelHelper.MaxRowNumber) { - lastRowNumber = XLWorksheet.MaxNumberOfRows; + lastRowNumber = ExcelHelper.MaxRowNumber; } Int32 lastColumnNumber = target.RangeAddress.LastAddress.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLWorksheet.MaxNumberOfColumns) + if (lastColumnNumber > ExcelHelper.MaxColumnNumber) { - lastColumnNumber = XLWorksheet.MaxNumberOfColumns; + lastColumnNumber = ExcelHelper.MaxColumnNumber; } return target.Worksheet.Range(target.RangeAddress.FirstAddress.RowNumber, diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs index 5141e0b..8f4330d 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs @@ -22,7 +22,7 @@ #region Constructor public XLRow(Int32 row, XLRowParameters xlRowParameters) : base(new XLRangeAddress(new XLAddress(xlRowParameters.Worksheet, row, 1, false, false), - new XLAddress(xlRowParameters.Worksheet, row, XLWorksheet.MaxNumberOfColumns, false, false))) + new XLAddress(xlRowParameters.Worksheet, row, ExcelHelper.MaxColumnNumber, false, false))) { SetRowNumber(row); @@ -41,7 +41,7 @@ public XLRow(XLRow row) : base(new XLRangeAddress(new XLAddress(row.Worksheet, row.RowNumber(), 1, false, false), - new XLAddress(row.Worksheet, row.RowNumber(), XLWorksheet.MaxNumberOfColumns, false, false))) + new XLAddress(row.Worksheet, row.RowNumber(), ExcelHelper.MaxColumnNumber, false, false))) { m_height = row.m_height; IsReference = row.IsReference; @@ -78,7 +78,7 @@ RangeAddress.FirstAddress = new XLAddress(Worksheet, row, 1, RangeAddress.FirstAddress.FixedRow, RangeAddress.FirstAddress.FixedColumn); RangeAddress.LastAddress = new XLAddress(Worksheet, row, - XLWorksheet.MaxNumberOfColumns, + ExcelHelper.MaxColumnNumber, RangeAddress.LastAddress.FixedRow, RangeAddress.LastAddress.FixedColumn); } @@ -210,7 +210,7 @@ } public IXLRow AdjustToContents(Int32 startColumn) { - return AdjustToContents(startColumn, XLWorksheet.MaxNumberOfColumns); + return AdjustToContents(startColumn, ExcelHelper.MaxColumnNumber); } public IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn) { @@ -219,11 +219,11 @@ public IXLRow AdjustToContents(Double minHeight, Double maxHeight) { - return AdjustToContents(1, XLWorksheet.MaxNumberOfColumns, minHeight, maxHeight); + return AdjustToContents(1, ExcelHelper.MaxColumnNumber, minHeight, maxHeight); } public IXLRow AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight) { - return AdjustToContents(startColumn, XLWorksheet.MaxNumberOfColumns, minHeight, maxHeight); + return AdjustToContents(startColumn, ExcelHelper.MaxColumnNumber, minHeight, maxHeight); } public IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight) { @@ -489,7 +489,7 @@ public override IXLRange AsRange() { - return Range(1, 1, 1, XLWorksheet.MaxNumberOfColumns); + return Range(1, 1, 1, ExcelHelper.MaxColumnNumber); } #endregion public Boolean Collapsed @@ -642,9 +642,9 @@ CopyToCell(rngUsed, (XLCell) target); Int32 lastColumnNumber = target.Address.ColumnNumber + rngUsed.CellCount() - 1; - if (lastColumnNumber > XLWorksheet.MaxNumberOfColumns) + if (lastColumnNumber > ExcelHelper.MaxColumnNumber) { - lastColumnNumber = XLWorksheet.MaxNumberOfColumns; + lastColumnNumber = ExcelHelper.MaxColumnNumber; } return target.Worksheet.Range( @@ -665,9 +665,9 @@ CopyToCell(Range(1, 1, 1, maxColumn).Row(1), (XLCell) target.FirstCell()); Int32 lastColumnNumber = target.RangeAddress.LastAddress.ColumnNumber + maxColumn - 1; - if (lastColumnNumber > XLWorksheet.MaxNumberOfColumns) + if (lastColumnNumber > ExcelHelper.MaxColumnNumber) { - lastColumnNumber = XLWorksheet.MaxNumberOfColumns; + lastColumnNumber = ExcelHelper.MaxColumnNumber; } return target.Worksheet.Range(target.RangeAddress.FirstAddress.RowNumber, diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRowCollection.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRowCollection.cs index ffc31d0..28e6ca0 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRowCollection.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRowCollection.cs @@ -12,7 +12,7 @@ { var rowToMove = dictionary[ro]; Int32 newRow = ro + rowsToShift; - if (newRow <= XLWorksheet.MaxNumberOfRows) + if (newRow <= ExcelHelper.MaxRowNumber) { dictionary.Add(newRow, new XLRow(rowToMove)); } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLAddress.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLAddress.cs index 54eb8f7..21ed859 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLAddress.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLAddress.cs @@ -71,7 +71,7 @@ private readonly int m_columnNumber; [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly int m_hashCode; - private String m_trimmedAddress; + private string m_trimmedAddress; #endregion #region Constructors /// @@ -118,13 +118,13 @@ get { return Worksheet; } } - public Boolean FixedRow + public bool FixedRow { get { return m_fixedRow; } set { m_fixedRow = value; } } - public Boolean FixedColumn + public bool FixedColumn { get { return m_fixedColumn; } set { m_fixedColumn = value; } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLMergedRanges.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLMergedRanges.cs index ec79a02..ee8104a 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLMergedRanges.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLMergedRanges.cs @@ -47,17 +47,73 @@ 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) diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs index 957bfa2..c4d58c5 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs @@ -564,7 +564,7 @@ if (columns != null) { var wsDefaultColumn = - columns.Elements().Where(c => c.Max == XLWorksheet.MaxNumberOfColumns).FirstOrDefault(); + columns.Elements().Where(c => c.Max == ExcelHelper.MaxColumnNumber).FirstOrDefault(); if (wsDefaultColumn != null && wsDefaultColumn.Width != null) ws.ColumnWidth = wsDefaultColumn.Width - COLUMN_WIDTH_OFFSET; @@ -578,7 +578,7 @@ foreach (Column col in columns.Elements()) { //IXLStylized toApply; - if (col.Max != XLWorksheet.MaxNumberOfColumns) + if (col.Max != ExcelHelper.MaxColumnNumber) { var xlColumns = (XLColumns) ws.Columns(col.Min, col.Max); if (col.Width != null) diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs index 06901c8..aaacaeb 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs @@ -2091,12 +2091,12 @@ } } - if (maxInColumnsCollection < XLWorksheet.MaxNumberOfColumns) + if (maxInColumnsCollection < ExcelHelper.MaxColumnNumber) { Column column = new Column() { Min = (UInt32) (maxInColumnsCollection + 1), - Max = (UInt32) (XLWorksheet.MaxNumberOfColumns), + Max = (UInt32) (ExcelHelper.MaxColumnNumber), Style = context.SharedStyles[xlWorksheet.Style].StyleId, Width = worksheetColumnWidth, CustomWidth = true diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs index 9127580..9c2fa04 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs @@ -11,8 +11,7 @@ internal class XLWorksheet : XLRangeBase, IXLWorksheet { #region Constants - public const Int32 MaxNumberOfRows = 1048576; - public const Int32 MaxNumberOfColumns = 16384; + #endregion #region Events public event RangeShiftedRowsDelegate RangeShiftedRows; @@ -33,8 +32,8 @@ #endregion #region Constructor public XLWorksheet(String sheetName, XLWorkbook workbook) - : base(new XLRangeAddress(new XLAddress(null, 1, 1, false, false), - new XLAddress(null, MaxNumberOfRows, MaxNumberOfColumns, false, false))) + : base(new XLRangeAddress(new XLAddress(null, ExcelHelper.MinRowNumber, ExcelHelper.MinColumnNumber, false, false), + new XLAddress(null, ExcelHelper.MaxRowNumber, ExcelHelper.MaxColumnNumber, false, false))) { RangeAddress.Worksheet = this; RangeAddress.FirstAddress.Worksheet = this; @@ -256,7 +255,7 @@ public IXLColumn LastColumn() { - return Column(MaxNumberOfColumns); + return Column(ExcelHelper.MaxColumnNumber); } public IXLColumn FirstColumn() { @@ -268,7 +267,7 @@ } public IXLRow LastRow() { - return Row(MaxNumberOfRows); + return Row(ExcelHelper.MaxRowNumber); } public IXLColumn FirstColumnUsed() { @@ -541,7 +540,7 @@ public override IXLRange AsRange() { - return Range(1, 1, MaxNumberOfRows, MaxNumberOfColumns); + return Range(1, 1, ExcelHelper.MaxRowNumber, ExcelHelper.MaxColumnNumber); } public IXLWorksheet CollapseRows() diff --git a/ClosedXML/ClosedXML/ClosedXML/ExcelHelper.cs b/ClosedXML/ClosedXML/ClosedXML/ExcelHelper.cs index 9cc90b9..a226bbd 100644 --- a/ClosedXML/ClosedXML/ClosedXML/ExcelHelper.cs +++ b/ClosedXML/ClosedXML/ClosedXML/ExcelHelper.cs @@ -10,6 +10,11 @@ /// public static class ExcelHelper { + public const int MinRowNumber = 1; + public const int MinColumnNumber = 1; + public const int MaxRowNumber = 1048576; + public const int MaxColumnNumber = 16384; + internal static readonly NumberFormatInfo NumberFormatForParse = CultureInfo.InvariantCulture.NumberFormat; private const Int32 TwoT26 = 26 * 26; /// @@ -95,7 +100,7 @@ Int32 row; if (Int32.TryParse(rowString, out row)) { - return row > 0 && row <= XLWorksheet.MaxNumberOfRows; + return row > 0 && row <= MaxRowNumber; } return false; }