diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs index e7807ea..ae07e55 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs @@ -7,25 +7,28 @@ internal class XLColumn : XLRangeBase, IXLColumn { #region Private fields - private bool _isHidden; - private IXLStyle _style; + private bool _collapsed; + private bool _isHidden; private int _outlineLevel; + private IXLStyle _style; private Double _width; + #endregion + #region Constructor + public XLColumn(Int32 column, XLColumnParameters xlColumnParameters) - : base( - new XLRangeAddress(new XLAddress(xlColumnParameters.Worksheet, 1, column, false, false), - new XLAddress(xlColumnParameters.Worksheet, ExcelHelper.MaxRowNumber, column, false, false))) + : base( + new XLRangeAddress(new XLAddress(xlColumnParameters.Worksheet, 1, column, false, false), + new XLAddress(xlColumnParameters.Worksheet, ExcelHelper.MaxRowNumber, column, false, + false))) { SetColumnNumber(column); IsReference = xlColumnParameters.IsReference; if (IsReference) - { - (Worksheet).RangeShiftedColumns += Worksheet_RangeShiftedColumns; - } + (Worksheet).RangeShiftedColumns += WorksheetRangeShiftedColumns; else { _style = new XLStyle(this, xlColumnParameters.DefaultStyle); @@ -34,9 +37,10 @@ } public XLColumn(XLColumn column) - : base( - new XLRangeAddress(new XLAddress(column.Worksheet, 1, column.ColumnNumber(), false, false), - new XLAddress(column.Worksheet, ExcelHelper.MaxRowNumber, column.ColumnNumber(), false, false))) + : base( + new XLRangeAddress(new XLAddress(column.Worksheet, 1, column.ColumnNumber(), false, false), + new XLAddress(column.Worksheet, ExcelHelper.MaxRowNumber, column.ColumnNumber(), + false, false))) { _width = column._width; IsReference = column.IsReference; @@ -45,73 +49,100 @@ _outlineLevel = column._outlineLevel; _style = new XLStyle(this, column.Style); } - #endregion - private void Worksheet_RangeShiftedColumns(XLRange range, int columnsShifted) - { - if (range.RangeAddress.FirstAddress.ColumnNumber <= ColumnNumber()) - { - SetColumnNumber(ColumnNumber() + columnsShifted); - } - } - private void SetColumnNumber(int column) - { - if (column <= 0) - { - RangeAddress.IsInvalid = false; - } - else - { - RangeAddress.FirstAddress = new XLAddress(Worksheet, - 1, - column, - RangeAddress.FirstAddress.FixedRow, - RangeAddress.FirstAddress.FixedColumn); - RangeAddress.LastAddress = new XLAddress(Worksheet, - ExcelHelper.MaxRowNumber, - column, - RangeAddress.LastAddress.FixedRow, - RangeAddress.LastAddress.FixedColumn); - } - } + #endregion public Boolean IsReference { get; private set; } + + public override IEnumerable Styles + { + get + { + UpdatingStyle = true; + + yield return Style; + + int column = ColumnNumber(); + Int32 maxRow = 0; + if (Worksheet.Internals.CellsCollection.ColumnsUsed.ContainsKey(column)) + maxRow = Worksheet.Internals.CellsCollection.MaxRowInColumn(column); + + if ((Worksheet).Internals.RowsCollection.Count > 0) + { + Int32 maxInCollection = (Worksheet).Internals.RowsCollection.Keys.Max(); + if (maxInCollection > maxRow) + maxRow = maxInCollection; + } + if (maxRow > 0) + { + for (int ro = 1; ro <= maxRow; ro++) + yield return Worksheet.Cell(ro, column).Style; + } + UpdatingStyle = false; + } + } + + public override Boolean UpdatingStyle { get; set; } + + public override IXLStyle InnerStyle + { + get + { + if (IsReference) + return (Worksheet).Internals.ColumnsCollection[ColumnNumber()].InnerStyle; + + return new XLStyle(new XLStylizedContainer(_style, this), _style); + } + set + { + if (IsReference) + (Worksheet).Internals.ColumnsCollection[ColumnNumber()].InnerStyle = value; + else + _style = new XLStyle(this, value); + } + } + + public Boolean Collapsed + { + get { return IsReference ? (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Collapsed : _collapsed; } + set + { + if (IsReference) + (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Collapsed = value; + else + _collapsed = value; + } + } + #region IXLColumn Members - + public Double Width { get { if (IsReference) - { return (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Width; - } - else - { + return _width; - } } set { if (IsReference) - { (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Width = value; - } else - { _width = value; - } } } public void Delete() { - var columnNumber = ColumnNumber(); + int columnNumber = ColumnNumber(); AsRange().Delete(XLShiftDeletedCells.ShiftCellsLeft); (Worksheet).Internals.ColumnsCollection.Remove(columnNumber); - List columnsToMove = new List(); - columnsToMove.AddRange((Worksheet).Internals.ColumnsCollection.Where(c => c.Key > columnNumber).Select(c => c.Key)); - foreach (var column in columnsToMove.OrderBy(c => c)) + var columnsToMove = new List(); + columnsToMove.AddRange( + (Worksheet).Internals.ColumnsCollection.Where(c => c.Key > columnNumber).Select(c => c.Key)); + foreach (int column in columnsToMove.OrderBy(c => c)) { (Worksheet).Internals.ColumnsCollection.Add(column - 1, (Worksheet).Internals.ColumnsCollection[column]); (Worksheet).Internals.ColumnsCollection.Remove(column); @@ -127,17 +158,15 @@ public IXLCell Cell(Int32 rowNumber) { - return base.Cell(rowNumber, 1); + return Cell(rowNumber, 1); } public new IXLCells Cells(String cellsInColumn) { - var retVal = new XLCells( false, false); + var retVal = new XLCells(false, false); var rangePairs = cellsInColumn.Split(','); - foreach (var pair in rangePairs) - { + foreach (string pair in rangePairs) retVal.Add(Range(pair.Trim()).RangeAddress); - } return retVal; } @@ -145,34 +174,27 @@ { return Cells(firstRow + ":" + lastRow); } - #endregion - #region IXLStylized Members + public override IXLStyle Style { get { if (IsReference) - { return (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Style; - } - else - { + return _style; - } } set { if (IsReference) - { (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Style = value; - } else { _style = new XLStyle(this, value); Int32 minRow = 1; Int32 maxRow = 0; - var column = ColumnNumber(); + int column = ColumnNumber(); if (Worksheet.Internals.CellsCollection.ColumnsUsed.ContainsKey(column)) { minRow = Worksheet.Internals.CellsCollection.MinRowInColumn(column); @@ -184,100 +206,36 @@ Int32 minInCollection = (Worksheet).Internals.RowsCollection.Keys.Min(); Int32 maxInCollection = (Worksheet).Internals.RowsCollection.Keys.Max(); if (minInCollection < minRow) - { minRow = minInCollection; - } if (maxInCollection > maxRow) - { maxRow = maxInCollection; - } } - for (Int32 ro = minRow; ro <= maxRow; ro++) + if (minRow > 0 && maxRow > 0) { - Worksheet.Cell(ro, column).Style = value; + for (Int32 ro = minRow; ro <= maxRow; ro++) + Worksheet.Cell(ro, column).Style = value; } } } } - public override IEnumerable Styles - { - get - { - UpdatingStyle = true; - - yield return Style; - - var column = ColumnNumber(); - Int32 minRow = 1; - Int32 maxRow = 0; - if (Worksheet.Internals.CellsCollection.ColumnsUsed.ContainsKey(column)) - { - maxRow = Worksheet.Internals.CellsCollection.MaxRowInColumn(column); - } - - if ((Worksheet).Internals.RowsCollection.Count > 0) - { - Int32 maxInCollection = (Worksheet).Internals.RowsCollection.Keys.Max(); - if (maxInCollection > maxRow) - { - maxRow = maxInCollection; - } - } - - for (var ro = minRow; ro <= maxRow; ro++) - { - yield return Worksheet.Cell(ro, column).Style; - } - - UpdatingStyle = false; - } - } - - public override Boolean UpdatingStyle { get; set; } - - public override IXLStyle InnerStyle - { - get - { - if (IsReference) - { - return (Worksheet).Internals.ColumnsCollection[ColumnNumber()].InnerStyle; - } - else - { - return new XLStyle(new XLStylizedContainer(_style, this), _style); - } - } - set - { - if (IsReference) - { - (Worksheet).Internals.ColumnsCollection[ColumnNumber()].InnerStyle = value; - } - else - { - _style = new XLStyle(this, value); - } - } - } - #endregion public new IXLColumns InsertColumnsAfter(Int32 numberOfColumns) { - var columnNum = ColumnNumber(); + int columnNum = ColumnNumber(); (Worksheet).Internals.ColumnsCollection.ShiftColumnsRight(columnNum + 1, numberOfColumns); - XLRange range = (XLRange) Worksheet.Column(columnNum).AsRange(); + var range = (XLRange)Worksheet.Column(columnNum).AsRange(); range.InsertColumnsAfter(true, numberOfColumns); return Worksheet.Columns(columnNum + 1, columnNum + numberOfColumns); } + public new IXLColumns InsertColumnsBefore(Int32 numberOfColumns) { - var columnNum = ColumnNumber(); + int columnNum = ColumnNumber(); (Worksheet).Internals.ColumnsCollection.ShiftColumnsRight(columnNum, numberOfColumns); // We can't use this.AsRange() because we've shifted the columns // and we want to use the old columnNum. - XLRange range = (XLRange) Worksheet.Column(columnNum).AsRange(); + var range = (XLRange)Worksheet.Column(columnNum).AsRange(); range.InsertColumnsBefore(true, numberOfColumns); return Worksheet.Columns(columnNum, columnNum + numberOfColumns - 1); } @@ -286,60 +244,32 @@ { return Range(1, 1, ExcelHelper.MaxRowNumber, 1); } - public override XLRange Range(String rangeAddressStr) - { - String rangeAddressToUse; - if (rangeAddressStr.Contains(':') || rangeAddressStr.Contains('-')) - { - if (rangeAddressStr.Contains('-')) - { - rangeAddressStr = rangeAddressStr.Replace('-', ':'); - } - - String[] arrRange = rangeAddressStr.Split(':'); - var firstPart = arrRange[0]; - var secondPart = arrRange[1]; - rangeAddressToUse = FixColumnAddress(firstPart) + ":" + FixColumnAddress(secondPart); - } - else - { - rangeAddressToUse = FixColumnAddress(rangeAddressStr); - } - - var rangeAddress = new XLRangeAddress(Worksheet, rangeAddressToUse); - return Range(rangeAddress); - } - public IXLRangeColumn Range(int firstRow, int lastRow) - { - return Range(firstRow, 1, lastRow, 1).Column(1); - } public IXLColumn AdjustToContents() { return AdjustToContents(1); } + public IXLColumn AdjustToContents(Int32 startRow) { return AdjustToContents(startRow, ExcelHelper.MaxRowNumber); } + public IXLColumn AdjustToContents(Int32 startRow, Int32 endRow) { return AdjustToContents(startRow, endRow, 0, Double.MaxValue); } - private double DegreeToRadian(double angle) - { - return Math.PI*angle/180.0; - } - public IXLColumn AdjustToContents(Double minWidth, Double maxWidth) { return AdjustToContents(1, ExcelHelper.MaxRowNumber, minWidth, maxWidth); } + public IXLColumn AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth) { return AdjustToContents(startRow, ExcelHelper.MaxRowNumber, minWidth, maxWidth); } + public IXLColumn AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth) { Double colMaxWidth = minWidth; @@ -351,11 +281,13 @@ Int32 textRotation = c.Style.Alignment.TextRotation; if (c.HasRichText || textRotation != 0 || c.InnerText.Contains(Environment.NewLine)) { - List> kpList = new List>(); + var kpList = new List>(); + #region if (c.HasRichText) + if (c.HasRichText) { - foreach (var rt in c.RichText) + foreach (IXLRichString rt in c.RichText) { String formattedString = rt.Text; var arr = formattedString.Split(new[] {Environment.NewLine}, StringSplitOptions.None); @@ -364,9 +296,7 @@ { String s = arr[i]; if (i < arrCount - 1) - { s += Environment.NewLine; - } kpList.Add(new KeyValuePair(rt, s)); } } @@ -380,153 +310,120 @@ { 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; Int32 lineCount = 1; - foreach (var kp in kpList) + foreach (KeyValuePair kp in kpList) { - IXLFontBase f = kp.Key; + var f = kp.Key; String formattedString = kp.Value; Int32 newLinePosition = formattedString.IndexOf(Environment.NewLine); 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; - } + runningWidth = newLinePosition < formattedString.Length - 2 ? f.GetWidth(formattedString.Substring(newLinePosition + 2)) : 0; } else - { runningWidth += f.GetWidth(formattedString); - } + #endregion } else { #region if (textRotation == 255) + 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; - } + runningWidth = newLinePosition < formattedString.Length - 2 ? f.GetWidth(formattedString.Substring(newLinePosition + 2)) : 0; } else - { runningWidth += f.GetWidth(formattedString); - } } + #endregion } } + #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 } else - { thisWidthMax = c.Style.Font.GetWidth(c.GetFormattedString()); - } if (thisWidthMax >= maxWidth) { colMaxWidth = maxWidth; break; } - else if (thisWidthMax > colMaxWidth) - { + + if (thisWidthMax > colMaxWidth) colMaxWidth = thisWidthMax + 1; - } } } if (colMaxWidth == 0) - { colMaxWidth = Worksheet.ColumnWidth; - } Width = colMaxWidth; @@ -534,11 +431,11 @@ } - public void Hide() { IsHidden = true; } + public void Unhide() { IsHidden = false; @@ -549,40 +446,16 @@ get { if (IsReference) - { return (Worksheet).Internals.ColumnsCollection[ColumnNumber()].IsHidden; - } - else - { - return _isHidden; - } - } - set - { - if (IsReference) - { - (Worksheet).Internals.ColumnsCollection[ColumnNumber()].IsHidden = value; - } - else - { - _isHidden = value; - } - } - } - public Boolean Collapsed - { - get { return IsReference ? (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Collapsed : _collapsed; } + return _isHidden; + } set { if (IsReference) - { - (Worksheet).Internals.ColumnsCollection[ColumnNumber()].Collapsed = value; - } + (Worksheet).Internals.ColumnsCollection[ColumnNumber()].IsHidden = value; else - { - _collapsed = value; - } + _isHidden = value; } } @@ -592,14 +465,10 @@ set { if (value < 0 || value > 8) - { throw new ArgumentOutOfRangeException("value", "Outline level must be between 0 and 8."); - } if (IsReference) - { (Worksheet).Internals.ColumnsCollection[ColumnNumber()].OutlineLevel = value; - } else { (Worksheet).IncrementColumnOutline(value); @@ -613,47 +482,48 @@ { Group(false); } + public void Group(Boolean collapse) { if (OutlineLevel < 8) - { OutlineLevel += 1; - } Collapsed = collapse; } + public void Group(Int32 outlineLevel) { Group(outlineLevel, false); } + public void Group(Int32 outlineLevel, Boolean collapse) { OutlineLevel = outlineLevel; Collapsed = collapse; } + public void Ungroup() { Ungroup(false); } + public void Ungroup(Boolean ungroupFromAll) { if (ungroupFromAll) - { OutlineLevel = 0; - } else { if (OutlineLevel > 0) - { OutlineLevel -= 1; - } } } + public void Collapse() { Collapsed = true; Hide(); } + public void Expand() { Collapsed = false; @@ -670,16 +540,19 @@ RangeUsed().Sort(); return this; } + public IXLColumn Sort(XLSortOrder sortOrder) { RangeUsed().Sort(sortOrder); return this; } + public IXLColumn Sort(Boolean matchCase) { AsRange().Sort(matchCase); return this; } + public IXLColumn Sort(XLSortOrder sortOrder, Boolean matchCase) { AsRange().Sort(sortOrder, matchCase); @@ -691,26 +564,19 @@ { return AsRange().CopyTo(target).Column(1); } - public override void CopyTo(IXLCell target) - { - CopyTo(target); - } + IXLRangeColumn IXLColumn.CopyTo(IXLRangeBase target) { return AsRange().CopyTo(target).Column(1); } - public override void CopyTo(IXLRangeBase target) - { - CopyTo(target); - } public IXLColumn CopyTo(IXLColumn column) { column.Clear(); AsRange().CopyTo(column).Column(1); - - - var newColumn = (XLColumn) column; + + + var newColumn = (XLColumn)column; newColumn._width = _width; newColumn._style = new XLStyle(newColumn, Style); return newColumn; @@ -720,19 +586,18 @@ { return Range(start, 1, end, 1).Column(1); } + public IXLRangeColumns Columns(String columns) { var retVal = new XLRangeColumns(); var columnPairs = columns.Split(','); - foreach (var pair in columnPairs) - { + foreach (string pair in columnPairs) AsRange().Columns(pair.Trim()).ForEach(retVal.Add); - } return retVal; } /// - /// Adds a vertical page break after this column. + /// Adds a vertical page break after this column. /// public IXLColumn AddVerticalPageBreak() { @@ -745,5 +610,72 @@ DataType = dataType; return this; } + + #endregion + + private void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) + { + if (range.RangeAddress.FirstAddress.ColumnNumber <= ColumnNumber()) + SetColumnNumber(ColumnNumber() + columnsShifted); + } + + private void SetColumnNumber(int column) + { + if (column <= 0) + RangeAddress.IsInvalid = false; + else + { + RangeAddress.FirstAddress = new XLAddress(Worksheet, + 1, + column, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn); + RangeAddress.LastAddress = new XLAddress(Worksheet, + ExcelHelper.MaxRowNumber, + column, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn); + } + } + + public override XLRange Range(String rangeAddressStr) + { + String rangeAddressToUse; + if (rangeAddressStr.Contains(':') || rangeAddressStr.Contains('-')) + { + if (rangeAddressStr.Contains('-')) + rangeAddressStr = rangeAddressStr.Replace('-', ':'); + + var arrRange = rangeAddressStr.Split(':'); + string firstPart = arrRange[0]; + string secondPart = arrRange[1]; + rangeAddressToUse = FixColumnAddress(firstPart) + ":" + FixColumnAddress(secondPart); + } + else + rangeAddressToUse = FixColumnAddress(rangeAddressStr); + + var rangeAddress = new XLRangeAddress(Worksheet, rangeAddressToUse); + return Range(rangeAddress); + } + + public IXLRangeColumn Range(int firstRow, int lastRow) + { + return Range(firstRow, 1, lastRow, 1).Column(1); + } + + private static double DegreeToRadian(double angle) + { + return Math.PI * angle / 180.0; + } + + public override void CopyTo(IXLCell target) + { + CopyTo(target); + } + + public override void CopyTo(IXLRangeBase target) + { + CopyTo(target); + } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs index c8bd684..26aba04 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs @@ -6,23 +6,23 @@ { internal class XLRow : XLRangeBase, IXLRow { - #region Static - private static double DegreeToRadian(double angle) - { - return Math.PI*angle/180.0; - } - #endregion + #region Private fields - private Boolean m_collapsed; - private Int32 m_outlineLevel; - private Double m_height; - private Boolean m_isHidden; - private IXLStyle style; + + private Boolean _collapsed; + private Double _height; + private Boolean _isHidden; + private Int32 _outlineLevel; + private IXLStyle _style; + #endregion + #region Constructor + public XLRow(Int32 row, XLRowParameters xlRowParameters) - : base(new XLRangeAddress(new XLAddress(xlRowParameters.Worksheet, row, 1, false, false), - new XLAddress(xlRowParameters.Worksheet, row, ExcelHelper.MaxColumnNumber, false, false))) + : base(new XLRangeAddress(new XLAddress(xlRowParameters.Worksheet, row, 1, false, false), + new XLAddress(xlRowParameters.Worksheet, row, ExcelHelper.MaxColumnNumber, false, + false))) { SetRowNumber(row); @@ -30,93 +30,126 @@ if (IsReference) { //SMELL: Leak may occur - (Worksheet).RangeShiftedRows += Worksheet_RangeShiftedRows; + (Worksheet).RangeShiftedRows += WorksheetRangeShiftedRows; } else { - style = new XLStyle(this, xlRowParameters.DefaultStyle); - m_height = xlRowParameters.Worksheet.RowHeight; + _style = new XLStyle(this, xlRowParameters.DefaultStyle); + _height = xlRowParameters.Worksheet.RowHeight; } } public XLRow(XLRow row) - : base(new XLRangeAddress(new XLAddress(row.Worksheet, row.RowNumber(), 1, false, false), - new XLAddress(row.Worksheet, row.RowNumber(), ExcelHelper.MaxColumnNumber, false, false))) + : base(new XLRangeAddress(new XLAddress(row.Worksheet, row.RowNumber(), 1, false, false), + new XLAddress(row.Worksheet, row.RowNumber(), ExcelHelper.MaxColumnNumber, false, + false))) { - m_height = row.m_height; + _height = row._height; IsReference = row.IsReference; - m_collapsed = row.m_collapsed; - m_isHidden = row.m_isHidden; - m_outlineLevel = row.m_outlineLevel; - style = new XLStyle(this, row.Style); + _collapsed = row._collapsed; + _isHidden = row._isHidden; + _outlineLevel = row._outlineLevel; + _style = new XLStyle(this, row.Style); } + #endregion - private void Worksheet_RangeShiftedRows(XLRange range, int rowsShifted) - { - if (range.RangeAddress.FirstAddress.RowNumber <= RowNumber()) - { - SetRowNumber(RowNumber() + rowsShifted); - } - } - - private void RowsCollection_RowShifted(int startingRow, int rowsShifted) - { - if (startingRow <= RowNumber()) - { - SetRowNumber(RowNumber() + rowsShifted); - } - } - - private void SetRowNumber(Int32 row) - { - if (row <= 0) - { - RangeAddress.IsInvalid = false; - } - else - { - RangeAddress.FirstAddress = new XLAddress(Worksheet, row, 1, RangeAddress.FirstAddress.FixedRow, RangeAddress.FirstAddress.FixedColumn); - RangeAddress.LastAddress = new XLAddress(Worksheet, - row, - ExcelHelper.MaxColumnNumber, - RangeAddress.LastAddress.FixedRow, - RangeAddress.LastAddress.FixedColumn); - } - } public Boolean IsReference { get; private set; } + + public override IEnumerable Styles + { + get + { + UpdatingStyle = true; + + yield return Style; + + int row = RowNumber(); + + Int32 maxColumn = 0; + if ((Worksheet).Internals.CellsCollection.RowsUsed.ContainsKey(row)) + maxColumn = Worksheet.Internals.CellsCollection.MaxColumnInRow(row); + + if ((Worksheet).Internals.ColumnsCollection.Count > 0) + { + Int32 maxInCollection = (Worksheet).Internals.ColumnsCollection.Keys.Max(); + if (maxInCollection > maxColumn) + maxColumn = maxInCollection; + } + + if (maxColumn > 0) + { + for (int co = 1; co <= maxColumn; co++) + yield return Worksheet.Cell(row, co).Style; + } + UpdatingStyle = false; + } + } + + public override Boolean UpdatingStyle { get; set; } + + public override IXLStyle InnerStyle + { + get + { + if (IsReference) + return (Worksheet).Internals.RowsCollection[RowNumber()].InnerStyle; + return new XLStyle(new XLStylizedContainer(_style, this), _style); + } + set + { + if (IsReference) + (Worksheet).Internals.RowsCollection[RowNumber()].InnerStyle = value; + else + _style = new XLStyle(this, value); + } + } + + public Boolean Collapsed + { + get + { + if (IsReference) + return (Worksheet).Internals.RowsCollection[RowNumber()].Collapsed; + + return _collapsed; + } + set + { + if (IsReference) + (Worksheet).Internals.RowsCollection[RowNumber()].Collapsed = value; + else + _collapsed = value; + } + } + #region IXLRow Members + public Double Height { get { if (IsReference) - { return (Worksheet).Internals.RowsCollection[RowNumber()].Height; - } - return m_height; + return _height; } set { if (IsReference) - { (Worksheet).Internals.RowsCollection[RowNumber()].Height = value; - } else - { - m_height = value; - } + _height = value; } } public void Delete() { - var rowNumber = RowNumber(); + int rowNumber = RowNumber(); AsRange().Delete(XLShiftDeletedCells.ShiftCellsUp); (Worksheet).Internals.RowsCollection.Remove(rowNumber); var rowsToMove = new List(); rowsToMove.AddRange((Worksheet).Internals.RowsCollection.Where(c => c.Key > rowNumber).Select(c => c.Key)); - foreach (var row in rowsToMove.OrderBy(r => r)) + foreach (int row in rowsToMove.OrderBy(r => r)) { (Worksheet).Internals.RowsCollection.Add(row - 1, (Worksheet).Internals.RowsCollection[row]); (Worksheet).Internals.RowsCollection.Remove(row); @@ -125,20 +158,20 @@ public new IXLRows InsertRowsBelow(Int32 numberOfRows) { - var rowNum = RowNumber(); + int rowNum = RowNumber(); (Worksheet).Internals.RowsCollection.ShiftRowsDown(rowNum + 1, numberOfRows); - XLRange range = (XLRange) Worksheet.Row(rowNum).AsRange(); + var range = (XLRange)Worksheet.Row(rowNum).AsRange(); range.InsertRowsBelow(true, numberOfRows); return Worksheet.Rows(rowNum + 1, rowNum + numberOfRows); } public new IXLRows InsertRowsAbove(Int32 numberOfRows) { - var rowNum = RowNumber(); + int rowNum = RowNumber(); (Worksheet).Internals.RowsCollection.ShiftRowsDown(rowNum, numberOfRows); // We can't use this.AsRange() because we've shifted the rows // and we want to use the old rowNum. - XLRange range = (XLRange) Worksheet.Row(rowNum).AsRange(); + var range = (XLRange)Worksheet.Row(rowNum).AsRange(); range.InsertRowsAbove(true, numberOfRows); return Worksheet.Rows(rowNum, rowNum + numberOfRows - 1); } @@ -152,48 +185,23 @@ public IXLCell Cell(Int32 columnNumber) { - return base.Cell(1, columnNumber); + return Cell(1, columnNumber); } + public new IXLCell Cell(String columnLetter) { - return base.Cell(1, columnLetter); + return Cell(1, columnLetter); } public new IXLCells Cells(String cellsInRow) { - var retVal = new XLCells( false, false); + var retVal = new XLCells(false, false); var rangePairs = cellsInRow.Split(','); - foreach (var pair in rangePairs) - { + foreach (string pair in rangePairs) retVal.Add(Range(pair.Trim()).RangeAddress); - } return retVal; } - public override XLRange Range(String rangeAddressStr) - { - String rangeAddressToUse; - if (rangeAddressStr.Contains(':') || rangeAddressStr.Contains('-')) - { - if (rangeAddressStr.Contains('-')) - { - rangeAddressStr = rangeAddressStr.Replace('-', ':'); - } - - String[] arrRange = rangeAddressStr.Split(':'); - var firstPart = arrRange[0]; - var secondPart = arrRange[1]; - rangeAddressToUse = FixRowAddress(firstPart) + ":" + FixRowAddress(secondPart); - } - else - { - rangeAddressToUse = FixRowAddress(rangeAddressStr); - } - - var rangeAddress = new XLRangeAddress(Worksheet, rangeAddressToUse); - return Range(rangeAddress); - } - public IXLCells Cells(Int32 firstColumn, Int32 lastColumn) { return Cells(firstColumn + ":" + lastColumn); @@ -204,14 +212,12 @@ return Cells(ExcelHelper.GetColumnNumberFromLetter(firstColumn) + ":" + ExcelHelper.GetColumnNumberFromLetter(lastColumn)); } - public IXLRow AdjustToContents() - { - return AdjustToContents(1); - } + public IXLRow AdjustToContents(Int32 startColumn) { return AdjustToContents(startColumn, ExcelHelper.MaxColumnNumber); } + public IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn) { return AdjustToContents(startColumn, endColumn, 0, Double.MaxValue); @@ -221,16 +227,18 @@ { return AdjustToContents(1, ExcelHelper.MaxColumnNumber, minHeight, maxHeight); } + public IXLRow AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight) { return AdjustToContents(startColumn, ExcelHelper.MaxColumnNumber, minHeight, maxHeight); } + public IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight) { Double rowMaxHeight = minHeight; - foreach (var cell in Row(startColumn, endColumn).CellsUsed()) + foreach (IXLCell cell in Row(startColumn, endColumn).CellsUsed()) { - var c = (XLCell) cell; + var c = (XLCell)cell; if (!c.IsMerged()) { Double thisHeight; @@ -240,10 +248,10 @@ var kpList = new List>(); if (c.HasRichText) { - foreach (var rt in c.RichText) + foreach (IXLRichString 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++) { @@ -257,7 +265,7 @@ 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++) { @@ -267,40 +275,30 @@ kpList.Add(new KeyValuePair(c.Style.Font, s)); } } - + Double maxLongCol = kpList.Max(kp => kp.Value.Length); Double maxHeightCol = kpList.Max(kp => kp.Key.GetHeight()); Int32 lineCount = kpList.Count(kp => kp.Value.Contains(Environment.NewLine)); if (textRotation == 0) - { thisHeight = maxHeightCol * lineCount; - } else { if (textRotation == 255) - { thisHeight = maxLongCol * maxHeightCol; - } else { Double rotation; if (textRotation == 90 || textRotation == 180 || textRotation == 255) - { rotation = 90; - } else - { rotation = textRotation % 90; - } thisHeight = (rotation / 90.0) * maxHeightCol * maxLongCol * 0.5; } } } else - { thisHeight = c.Style.Font.GetHeight(); - } if (thisHeight >= maxHeight) { @@ -308,9 +306,7 @@ break; } if (thisHeight > rowMaxHeight) - { rowMaxHeight = thisHeight; - } } } @@ -325,6 +321,7 @@ { IsHidden = true; } + public void Unhide() { IsHidden = false; @@ -332,39 +329,13 @@ public Boolean IsHidden { - get - { - return IsReference ? (Worksheet).Internals.RowsCollection[RowNumber()].IsHidden : m_isHidden; - } + get { return IsReference ? (Worksheet).Internals.RowsCollection[RowNumber()].IsHidden : _isHidden; } set { if (IsReference) - { (Worksheet).Internals.RowsCollection[RowNumber()].IsHidden = value; - } else - { - m_isHidden = value; - } - } - } - #endregion - #region IXLStylized Members - internal void SetStyleNoColumns(IXLStyle value) - { - if (IsReference) - { - (Worksheet).Internals.RowsCollection[RowNumber()].SetStyleNoColumns(value); - } - else - { - style = new XLStyle(this, value); - - var row = RowNumber(); - foreach (var c in Worksheet.Internals.CellsCollection.GetCellsInRow(row)) - { - c.Style = value; - } + _isHidden = value; } } @@ -373,27 +344,21 @@ get { if (IsReference) - { return (Worksheet).Internals.RowsCollection[RowNumber()].Style; - } - else - { - return style; - } + + return _style; } set { if (IsReference) - { (Worksheet).Internals.RowsCollection[RowNumber()].Style = value; - } else { - style = new XLStyle(this, value); + _style = new XLStyle(this, value); Int32 minColumn = 1; Int32 maxColumn = 0; - var row = RowNumber(); + int row = RowNumber(); if (Worksheet.Internals.CellsCollection.RowsUsed.ContainsKey(row)) { minColumn = Worksheet.Internals.CellsCollection.MinColumnInRow(row); @@ -405,139 +370,44 @@ Int32 minInCollection = (Worksheet).Internals.ColumnsCollection.Keys.Min(); Int32 maxInCollection = (Worksheet).Internals.ColumnsCollection.Keys.Max(); if (minInCollection < minColumn) - { minColumn = minInCollection; - } if (maxInCollection > maxColumn) - { maxColumn = maxInCollection; - } } - - for (Int32 co = minColumn; co <= maxColumn; co++) + if (minColumn > 0 && maxColumn > 0) { - Worksheet.Cell(row, co).Style = value; + for (Int32 co = minColumn; co <= maxColumn; co++) + Worksheet.Cell(row, co).Style = value; } } } } - public override IEnumerable Styles - { - get - { - UpdatingStyle = true; - - yield return Style; - - var row = RowNumber(); - Int32 minColumn = 1; - Int32 maxColumn = 0; - if ((Worksheet).Internals.CellsCollection.RowsUsed.ContainsKey(row)) - { - maxColumn = Worksheet.Internals.CellsCollection.MaxColumnInRow(row); - } - - if ((Worksheet).Internals.ColumnsCollection.Count > 0) - { - Int32 maxInCollection = (Worksheet).Internals.ColumnsCollection.Keys.Max(); - if (maxInCollection > maxColumn) - { - maxColumn = maxInCollection; - } - } - - for (var co = minColumn; co <= maxColumn; co++) - { - yield return Worksheet.Cell(row, co).Style; - } - - UpdatingStyle = false; - } - } - - public override Boolean UpdatingStyle { get; set; } - - public override IXLStyle InnerStyle - { - get - { - if (IsReference) - { - return (Worksheet).Internals.RowsCollection[RowNumber()].InnerStyle; - } - return new XLStyle(new XLStylizedContainer(style, this), style); - } - set - { - if (IsReference) - { - (Worksheet).Internals.RowsCollection[RowNumber()].InnerStyle = value; - } - else - { - style = new XLStyle(this, value); - } - } - } - public override IXLRange AsRange() { return Range(1, 1, 1, ExcelHelper.MaxColumnNumber); } - #endregion - public Boolean Collapsed - { - get - { - if (IsReference) - { - return (Worksheet).Internals.RowsCollection[RowNumber()].Collapsed; - } - else - { - return m_collapsed; - } - } - set - { - if (IsReference) - { - (Worksheet).Internals.RowsCollection[RowNumber()].Collapsed = value; - } - else - { - m_collapsed = value; - } - } - } public Int32 OutlineLevel { get { if (IsReference) - { return (Worksheet).Internals.RowsCollection[RowNumber()].OutlineLevel; - } - return m_outlineLevel; + return _outlineLevel; } set { if (value < 1 || value > 8) - { throw new ArgumentOutOfRangeException("value", "Outline level must be between 1 and 8."); - } if (IsReference) - { Worksheet.Internals.RowsCollection[RowNumber()].OutlineLevel = value; - } else { Worksheet.IncrementColumnOutline(value); - Worksheet.DecrementColumnOutline(m_outlineLevel); - m_outlineLevel = value; + Worksheet.DecrementColumnOutline(_outlineLevel); + _outlineLevel = value; } } } @@ -546,47 +416,48 @@ { Group(false); } + public void Group(Int32 outlineLevel) { Group(outlineLevel, false); } + public void Ungroup() { Ungroup(false); } + public void Group(Boolean collapse) { if (OutlineLevel < 8) - { OutlineLevel += 1; - } Collapsed = collapse; } + public void Group(Int32 outlineLevel, Boolean collapse) { OutlineLevel = outlineLevel; Collapsed = collapse; } + public void Ungroup(Boolean ungroupFromAll) { if (ungroupFromAll) - { OutlineLevel = 0; - } else { if (OutlineLevel > 0) - { OutlineLevel -= 1; - } } } + public void Collapse() { Collapsed = true; Hide(); } + public void Expand() { Collapsed = false; @@ -603,16 +474,19 @@ RangeUsed().Sort(XLSortOrientation.LeftToRight); return this; } + public IXLRow Sort(XLSortOrder sortOrder) { RangeUsed().Sort(XLSortOrientation.LeftToRight, sortOrder); return this; } + public IXLRow Sort(Boolean matchCase) { AsRange().Sort(XLSortOrientation.LeftToRight, matchCase); return this; } + public IXLRow Sort(XLSortOrder sortOrder, bool matchCase) { AsRange().Sort(XLSortOrientation.LeftToRight, sortOrder, matchCase); @@ -623,18 +497,11 @@ { return AsRange().CopyTo(target).Row(1); } - public override void CopyTo(IXLCell target) - { - CopyTo(target); - } + IXLRangeRow IXLRow.CopyTo(IXLRangeBase target) { return AsRange().CopyTo(target).Row(1); } - public override void CopyTo(IXLRangeBase target) - { - CopyTo(target); - } public IXLRow CopyTo(IXLRow row) { @@ -642,8 +509,8 @@ AsRange().CopyTo(row); var newRow = (XLRow)row; - newRow.m_height = m_height; - newRow.style = new XLStyle(newRow, Style); + newRow._height = _height; + newRow._style = new XLStyle(newRow, Style); return newRow; } @@ -651,14 +518,13 @@ { return Range(1, start, 1, end).Row(1); } + public IXLRangeRows Rows(String rows) { var retVal = new XLRangeRows(); var rowPairs = rows.Split(','); - foreach (var pair in rowPairs) - { + foreach (string pair in rowPairs) AsRange().Rows(pair.Trim()).ForEach(retVal.Add); - } return retVal; } @@ -673,5 +539,78 @@ DataType = dataType; return this; } + + #endregion + + private void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) + { + if (range.RangeAddress.FirstAddress.RowNumber <= RowNumber()) + SetRowNumber(RowNumber() + rowsShifted); + } + + private void SetRowNumber(Int32 row) + { + if (row <= 0) + RangeAddress.IsInvalid = false; + else + { + RangeAddress.FirstAddress = new XLAddress(Worksheet, row, 1, RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn); + RangeAddress.LastAddress = new XLAddress(Worksheet, + row, + ExcelHelper.MaxColumnNumber, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn); + } + } + + public override XLRange Range(String rangeAddressStr) + { + String rangeAddressToUse; + if (rangeAddressStr.Contains(':') || rangeAddressStr.Contains('-')) + { + if (rangeAddressStr.Contains('-')) + rangeAddressStr = rangeAddressStr.Replace('-', ':'); + + var arrRange = rangeAddressStr.Split(':'); + string firstPart = arrRange[0]; + string secondPart = arrRange[1]; + rangeAddressToUse = FixRowAddress(firstPart) + ":" + FixRowAddress(secondPart); + } + else + rangeAddressToUse = FixRowAddress(rangeAddressStr); + + var rangeAddress = new XLRangeAddress(Worksheet, rangeAddressToUse); + return Range(rangeAddress); + } + + public IXLRow AdjustToContents() + { + return AdjustToContents(1); + } + + internal void SetStyleNoColumns(IXLStyle value) + { + if (IsReference) + (Worksheet).Internals.RowsCollection[RowNumber()].SetStyleNoColumns(value); + else + { + _style = new XLStyle(this, value); + + int row = RowNumber(); + foreach (XLCell c in Worksheet.Internals.CellsCollection.GetCellsInRow(row)) + c.Style = value; + } + } + + public override void CopyTo(IXLCell target) + { + CopyTo(target); + } + + public override void CopyTo(IXLRangeBase target) + { + CopyTo(target); + } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx b/ClosedXML/ClosedXML/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx index c78f8c9..fffdb21 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx Binary files differ