diff --git a/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj index 3e96499..5e41e2a 100644 --- a/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj +++ b/ClosedXML/ClosedXML/ClosedXML/ClosedXML.csproj @@ -34,8 +34,7 @@ TRACE prompt 4 - - + bin\Release\ClosedXML.XML @@ -57,6 +56,7 @@ + @@ -83,6 +83,7 @@ + diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs index ce5926a..8b1b934 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Cells/XLCell.cs @@ -199,11 +199,10 @@ } } var rangesToMerge = new List(); - foreach (var merge in asRange.Worksheet.Internals.MergedCells) + foreach (var mergedRange in asRange.Worksheet.Internals.MergedRanges) { - if (asRange.ContainsRange(merge)) + if (asRange.Contains(mergedRange)) { - var mergedRange = worksheet.Range(merge); 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)); @@ -285,22 +284,15 @@ private void ClearMerged(Int32 rowCount, Int32 columnCount) { - List mergeToDelete = new List(); - foreach (var merge in worksheet.Internals.MergedCells) + List mergeToDelete = new List(); + foreach (var merge in worksheet.Internals.MergedRanges) { - var ma = new XLRangeAddress(merge); - - if (!( // See if the two ranges intersect... - ma.FirstAddress.ColumnNumber > Address.ColumnNumber + columnCount - || ma.LastAddress.ColumnNumber < Address.ColumnNumber - || ma.FirstAddress.RowNumber > Address.RowNumber + rowCount - || ma.LastAddress.RowNumber < Address.RowNumber - )) + if (merge.Intersects(AsRange())) { mergeToDelete.Add(merge); } } - mergeToDelete.ForEach(m => worksheet.Internals.MergedCells.Remove(m)); + 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/IXLColumn.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/IXLColumn.cs index 7229dad..c3887a4 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/IXLColumn.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/IXLColumn.cs @@ -79,6 +79,17 @@ /// Adjusts the width of the column based on its contents. /// void AdjustToContents(); + /// + /// Adjusts the width of the column based on its contents, starting from the startRow. + /// + /// The row to start calculating the column width. + void AdjustToContents(Int32 startRow); + /// + /// Adjusts the width of the column based on its contents, starting from the startRow and ending at endRow. + /// + /// The row to start calculating the column width. + /// The row to end calculating the column width. + void AdjustToContents(Int32 startRow, Int32 endRow); /// diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/IXLColumns.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/IXLColumns.cs index 8ad4ed8..08c3c34 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/IXLColumns.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/IXLColumns.cs @@ -24,6 +24,17 @@ /// Adjusts the width of all columns based on its contents. /// void AdjustToContents(); + /// + /// Adjusts the width of all columns based on its contents, starting from the startRow. + /// + /// The row to start calculating the column width. + void AdjustToContents(Int32 startRow); + /// + /// Adjusts the width of all columns based on its contents, starting from the startRow and ending at endRow. + /// + /// The row to start calculating the column width. + /// The row to end calculating the column width. + void AdjustToContents(Int32 startRow, Int32 endRow); /// /// Hides all columns. diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs index 8ff1c68..f4367b9 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumn.cs @@ -102,7 +102,7 @@ var rangePairs = cellsInColumn.Split(','); foreach (var pair in rangePairs) { - retVal.AddRange(Range(pair).Cells()); + retVal.AddRange(Range(pair.Trim()).Cells()); } return retVal; } @@ -244,12 +244,33 @@ public void AdjustToContents() { + AdjustToContents(1); + } + public void AdjustToContents(Int32 startRow) + { + AdjustToContents(startRow, XLWorksheet.MaxNumberOfRows); + } + public void AdjustToContents(Int32 startRow, Int32 endRow) + { Double maxWidth = 0; - foreach (var c in CellsUsed()) - { - var thisWidth = ((XLFont)c.Style.Font).GetWidth(c.GetFormattedString()); - if (thisWidth > maxWidth) - maxWidth = thisWidth; + foreach (var c in CellsUsed().Where(cell=>cell.Address.RowNumber >= startRow && cell.Address.RowNumber <= endRow)) + { + Boolean isMerged = false; + var cellAsRange = c.AsRange(); + foreach (var m in Worksheet.Internals.MergedRanges) + { + if (cellAsRange.Intersects(m)) + { + isMerged = true; + break; + } + } + if (!isMerged) + { + var thisWidth = ((XLFont)c.Style.Font).GetWidth(c.GetFormattedString()); + if (thisWidth > maxWidth) + maxWidth = thisWidth; + } } if (maxWidth == 0) diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumns.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumns.cs index 01150e6..f464b10 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumns.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Columns/XLColumns.cs @@ -147,6 +147,14 @@ { columns.ForEach(c => c.AdjustToContents()); } + public void AdjustToContents(Int32 startRow) + { + columns.ForEach(c => c.AdjustToContents(startRow)); + } + public void AdjustToContents(Int32 startRow, Int32 endRow) + { + columns.ForEach(c => c.AdjustToContents(startRow, endRow)); + } public void Hide() { diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLSheetView.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLSheetView.cs new file mode 100644 index 0000000..5c55821 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLSheetView.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLSheetView + { + /// + /// Gets or sets the row after which the vertical split should take place. + /// + Int32 SplitRow { get; set; } + /// + /// Gets or sets the column after which the horizontal split should take place. + /// + Int32 SplitColumn { get; set; } + //Boolean FreezePanes { get; set; } + /// + /// Freezes the top X rows. + /// + /// The rows to freeze. + void FreezeRows(Int32 rows); + /// + /// Freezes the left X columns. + /// + /// The columns to freeze. + void FreezeColumns(Int32 columns); + /// + /// Freezes the specified rows and columns. + /// + /// The rows to freeze. + /// The columns to freeze. + void Freeze(Int32 rows, Int32 columns); + } +} diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs index 2181fac..e9efaea 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheet.cs @@ -230,5 +230,10 @@ /// Gets an object to manage this worksheet's named ranges. /// IXLNamedRanges NamedRanges { get; } + + /// + /// Gets an object to manage how the worksheet is going to displayed by Excel. + /// + IXLSheetView SheetView { get; } } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheetInternals.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheetInternals.cs index aefd5d8..20d5c57 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheetInternals.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/IXLWorksheetInternals.cs @@ -10,7 +10,7 @@ XLCellCollection CellsCollection { get; } XLColumnsCollection ColumnsCollection { get; } XLRowsCollection RowsCollection { get; } - List MergedCells { 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 22916df..6f16848 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/IXLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/IXLRangeBase.cs @@ -59,13 +59,45 @@ IXLCell LastCellUsed(Boolean includeStyles); /// - /// Determines whether this range contains the specified range address. + /// Determines whether this range contains the specified range (completely). + /// For partial matches use the range.Intersects method. /// /// The range address. /// - /// true if this range contains the specified range address; otherwise, false. + /// true if this range contains the specified range; otherwise, false. /// - Boolean ContainsRange(String rangeAddress); + Boolean Contains(String rangeAddress); + + /// + /// Determines whether this range contains the specified range (completely). + /// For partial matches use the range.Intersects method. + /// + /// The range to match. + /// + /// true if this range contains the specified range; otherwise, false. + /// + Boolean Contains(IXLRangeBase range); + + /// + /// Determines whether this range intersects the specified range. + /// For whole matches use the range.Contains method. + /// + /// The range address. + /// + /// true if this range intersects the specified range; otherwise, false. + /// + Boolean Intersects(String rangeAddress); + + /// + /// Determines whether this range contains the specified range. + /// For whole matches use the range.Contains method. + /// + /// The range to match. + /// + /// true if this range intersects the specified range; otherwise, false. + /// + Boolean Intersects(IXLRangeBase range); + /// /// Unmerges this range. /// diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs index e6b4159..a2e8555 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRange.cs @@ -190,16 +190,16 @@ { String firstColumn; String lastColumn; - if (pair.Contains(':')) + if (pair.Trim().Contains(':')) { - var columnRange = pair.Split(':'); + var columnRange = pair.Trim().Split(':'); firstColumn = columnRange[0]; lastColumn = columnRange[1]; } else { - firstColumn = pair; - lastColumn = pair; + firstColumn = pair.Trim(); + lastColumn = pair.Trim(); } Int32 tmp; @@ -244,16 +244,16 @@ { String firstRow; String lastRow; - if (pair.Contains(':')) + if (pair.Trim().Contains(':')) { - var rowRange = pair.Split(':'); + var rowRange = pair.Trim().Split(':'); firstRow = rowRange[0]; lastRow = rowRange[1]; } else { - firstRow = pair; - lastRow = pair; + firstRow = pair.Trim(); + lastRow = pair.Trim(); } foreach (var row in this.Rows(Int32.Parse(firstRow), Int32.Parse(lastRow))) { @@ -336,28 +336,19 @@ private void TransposeMerged() { - List mergeToDelete = new List(); - List mergeToInsert = new List(); - foreach (var merge in Worksheet.Internals.MergedCells) + List mergeToDelete = new List(); + List mergeToInsert = new List(); + foreach (var merge in Worksheet.Internals.MergedRanges) { - if (this.ContainsRange(merge)) + if (this.Contains(merge)) { - String addressToUse; - if (merge.Contains("!")) - addressToUse = merge.Substring(merge.IndexOf("!") + 1); - else - addressToUse = merge; - - mergeToDelete.Add(merge); - String[] arrRange = addressToUse.Split(':'); - var firstAddress = new XLAddress(arrRange[0]); - var lastAddress = new XLAddress(arrRange[1]); + var lastAddress = merge.RangeAddress.LastAddress; var newLastAddress = new XLAddress(lastAddress.ColumnNumber, lastAddress.RowNumber); - mergeToInsert.Add(firstAddress.ToString() + ":" + newLastAddress.ToString()); + merge.RangeAddress.LastAddress = newLastAddress; } } - mergeToDelete.ForEach(m => this.Worksheet.Internals.MergedCells.Remove(m)); - mergeToInsert.ForEach(m => this.Worksheet.Internals.MergedCells.Add(m)); + mergeToDelete.ForEach(m => this.Worksheet.Internals.MergedRanges.Remove(m)); + mergeToInsert.ForEach(m => this.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 9b12026..ca413d4 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeAddress.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeAddress.cs @@ -81,5 +81,10 @@ FirstAddress = firstAddress; LastAddress = lastAddress; } + + public override string ToString() + { + return firstAddress.ToString() + ":" + lastAddress.ToString(); + } } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs index 9415873..ab14177 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -174,7 +174,7 @@ var rangePairs = ranges.Split(','); foreach (var pair in rangePairs) { - retVal.Add(Range(pair)); + retVal.Add(Range(pair.Trim())); } return retVal; } @@ -219,7 +219,7 @@ } public IXLCells CellsUsed() { - var list = this.Worksheet.Internals.CellsCollection.Where(c => !StringExtensions.IsNullOrWhiteSpace(c.Value.InnerText) && this.ContainsRange(c.Key.ToString())).Select(c => (IXLCell)c.Value); + var list = this.Worksheet.Internals.CellsCollection.Where(c => !StringExtensions.IsNullOrWhiteSpace(c.Value.InnerText) && this.Contains(c.Key.ToString())).Select(c => (IXLCell)c.Value); var cells = new XLCells(Worksheet); cells.AddRange(list.AsEnumerable()); return (IXLCells)cells; @@ -229,13 +229,13 @@ IEnumerable list; if (includeStyles) list = this.Worksheet.Internals.CellsCollection.Where(c => - (!StringExtensions.IsNullOrWhiteSpace(c.Value.InnerText) || !c.Value.Style.Equals(Worksheet.Style)) - && this.ContainsRange(c.Key.ToString()) + (!StringExtensions.IsNullOrWhiteSpace(c.Value.InnerText) || !c.Value.Style.Equals(Worksheet.Style)) + && this.Contains(c.Key.ToString()) ).Select(c => (IXLCell)c.Value); else list = this.Worksheet.Internals.CellsCollection.Where(c => - !StringExtensions.IsNullOrWhiteSpace(c.Value.InnerText) - && this.ContainsRange(c.Key.ToString()) + !StringExtensions.IsNullOrWhiteSpace(c.Value.InnerText) + && this.Contains(c.Key.ToString()) ).Select(c => (IXLCell)c.Value); var cells = new XLCells(Worksheet); cells.AddRange(list); @@ -244,16 +244,35 @@ public IXLRange Merge() { - var mergeRange = this.RangeAddress.FirstAddress.ToString() + ":" + this.RangeAddress.LastAddress.ToString(); - if (!this.Worksheet.Internals.MergedCells.Contains(mergeRange)) - this.Worksheet.Internals.MergedCells.Add(mergeRange); + var tAddress = this.RangeAddress.ToString(); + Boolean foundOne = false; + foreach (var m in this.Worksheet.Internals.MergedRanges) + { + var mAddress = m.RangeAddress.ToString(); + if (mAddress == tAddress) + { + foundOne = true; + break; + } + } + + if (!foundOne) + this.Worksheet.Internals.MergedRanges.Add(this.AsRange()); return AsRange(); } public IXLRange Unmerge() { - var mergeRange = this.RangeAddress.FirstAddress.ToString() + ":" + this.RangeAddress.LastAddress.ToString(); - if (this.Worksheet.Internals.MergedCells.Contains(mergeRange)) - this.Worksheet.Internals.MergedCells.Remove(mergeRange); + var tAddress = this.RangeAddress.ToString(); + foreach (var m in this.Worksheet.Internals.MergedRanges) + { + var mAddress = m.RangeAddress.ToString(); + if (mAddress == tAddress) + { + this.Worksheet.Internals.MergedRanges.Remove(this.AsRange()); + break; + } + } + return AsRange(); } @@ -460,26 +479,18 @@ private void ClearMerged() { - List mergeToDelete = new List(); - foreach (var merge in Worksheet.Internals.MergedCells) + List mergeToDelete = new List(); + foreach (var merge in Worksheet.Internals.MergedRanges) { - var ma = new XLRangeAddress(merge); - var ra = RangeAddress; - - if (!( // See if the two ranges intersect... - ma.FirstAddress.ColumnNumber > ra.LastAddress.ColumnNumber - || ma.LastAddress.ColumnNumber < ra.FirstAddress.ColumnNumber - || ma.FirstAddress.RowNumber > ra.LastAddress.RowNumber - || ma.LastAddress.RowNumber < ra.FirstAddress.RowNumber - )) + if (this.Intersects(merge)) { mergeToDelete.Add(merge); } } - mergeToDelete.ForEach(m => this.Worksheet.Internals.MergedCells.Remove(m)); + mergeToDelete.ForEach(m => this.Worksheet.Internals.MergedRanges.Remove(m)); } - public Boolean ContainsRange(String rangeAddress) + public Boolean Contains(String rangeAddress) { String addressToUse; if (rangeAddress.Contains("!")) @@ -505,6 +516,31 @@ && lastAddress <= (XLAddress)this.RangeAddress.LastAddress; } + public Boolean Contains(IXLRangeBase range) + { + return + (XLAddress)range.RangeAddress.FirstAddress >= (XLAddress)this.RangeAddress.FirstAddress + && (XLAddress)range.RangeAddress.LastAddress <= (XLAddress)this.RangeAddress.LastAddress; + } + + public Boolean Intersects(String rangeAddress) + { + return this.Intersects(Range(rangeAddress)); + } + + public Boolean Intersects(IXLRangeBase range) + { + var ma = range.RangeAddress; + var ra = RangeAddress; + + return !( // See if the two ranges intersect... + ma.FirstAddress.ColumnNumber > ra.LastAddress.ColumnNumber + || ma.LastAddress.ColumnNumber < ra.FirstAddress.ColumnNumber + || ma.FirstAddress.RowNumber > ra.LastAddress.RowNumber + || ma.LastAddress.RowNumber < ra.FirstAddress.RowNumber + ); + } + public void Delete(XLShiftDeletedCells shiftDeleteCells) { //this.Clear(); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumn.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumn.cs index 685450f..aa51730 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumn.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeColumn.cs @@ -37,7 +37,7 @@ var rangePairs = cellsInColumn.Split(','); foreach (var pair in rangePairs) { - retVal.AddRange(Range(pair).Cells()); + retVal.AddRange(Range(pair.Trim()).Cells()); } return retVal; } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRow.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRow.cs index f93d11c..d7b1cad 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRow.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Ranges/XLRangeRow.cs @@ -60,7 +60,7 @@ var rangePairs = cellsInRow.Split(','); foreach (var pair in rangePairs) { - retVal.AddRange(Range(pair).Cells()); + retVal.AddRange(Range(pair.Trim()).Cells()); } return retVal; } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/IXLRow.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/IXLRow.cs index da5c318..b2ee030 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/IXLRow.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/IXLRow.cs @@ -48,6 +48,17 @@ /// Adjusts the height of the row based on its contents. /// void AdjustToContents(); + /// + /// Adjusts the height of the row based on its contents, starting from the startColumn. + /// + /// The column to start calculating the row height. + void AdjustToContents(Int32 startColumn); + /// + /// Adjusts the height of the row based on its contents, starting from the startColumn and ending at endColumn. + /// + /// The column to start calculating the row height. + /// The column to end calculating the row height. + void AdjustToContents(Int32 startColumn, Int32 endColumn); /// Hides this row. void Hide(); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/IXLRows.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/IXLRows.cs index 290c775..55445dc 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/IXLRows.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/IXLRows.cs @@ -24,6 +24,17 @@ /// Adjusts the height of all rows based on its contents. /// void AdjustToContents(); + /// + /// Adjusts the height of all rows based on its contents, starting from the startColumn. + /// + /// The column to start calculating the row height. + void AdjustToContents(Int32 startColumn); + /// + /// Adjusts the height of all rows based on its contents, starting from the startColumn and ending at endColumn. + /// + /// The column to start calculating the row height. + /// The column to end calculating the row height. + void AdjustToContents(Int32 startColumn, Int32 endColumn); /// /// Hides all rows. diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs index c64dd1d..e5fbeaa 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRow.cs @@ -134,7 +134,7 @@ var rangePairs = cellsInRow.Split(','); foreach (var pair in rangePairs) { - retVal.AddRange(Range(pair).Cells()); + retVal.AddRange(Range(pair.Trim()).Cells()); } return retVal; } @@ -168,19 +168,41 @@ return Cells(XLAddress.GetColumnNumberFromLetter(firstColumn) + ":" + XLAddress.GetColumnNumberFromLetter(lastColumn)); } - public void AdjustToContents() { + AdjustToContents(1); + } + public void AdjustToContents(Int32 startColumn) + { + AdjustToContents(startColumn, XLWorksheet.MaxNumberOfColumns); + } + public void AdjustToContents(Int32 startColumn, Int32 endColumn) + { Double maxHeight = 0; - var cellsUsed = CellsUsed(); - foreach (var c in cellsUsed) + foreach (var c in CellsUsed().Where(cell => cell.Address.ColumnNumber >= startColumn && cell.Address.ColumnNumber <= endColumn)) { - var thisHeight = ((XLFont)c.Style.Font).GetHeight(); - if (thisHeight > maxHeight) - maxHeight = thisHeight; + Boolean isMerged = false; + var cellAsRange = c.AsRange(); + foreach (var m in Worksheet.Internals.MergedRanges) + { + if (cellAsRange.Intersects(m)) + { + isMerged = true; + break; + } + } + if (!isMerged) + { + var thisHeight = ((XLFont)c.Style.Font).GetHeight(); + if (thisHeight > maxHeight) + maxHeight = thisHeight; + } } - if (maxHeight > 0) - Height = maxHeight; + + if (maxHeight == 0) + maxHeight = Worksheet.RowHeight; + + Height = maxHeight; } public void Hide() diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRows.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRows.cs index 831a82f..a284ba2 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRows.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Rows/XLRows.cs @@ -144,7 +144,14 @@ { rows.ForEach(r => r.AdjustToContents()); } - + public void AdjustToContents(Int32 startColumn) + { + rows.ForEach(r => r.AdjustToContents(startColumn)); + } + public void AdjustToContents(Int32 startColumn, Int32 endColumn) + { + rows.ForEach(r => r.AdjustToContents(startColumn, endColumn)); + } public void Hide() { rows.ForEach(r => r.Hide()); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLFont.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLFont.cs index 63008a9..f8902b7 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLFont.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/Style/XLFont.cs @@ -230,12 +230,14 @@ System.Drawing.Font stringFont = new System.Drawing.Font(fontName, (float)fontSize); return GetWidth(stringFont, text); } - private static readonly Graphics g = Graphics.FromImage(new Bitmap(200, 200)); private Double GetWidth(System.Drawing.Font stringFont, string text) { - System.Drawing.Font drawfont = new System.Drawing.Font(fontName, (float)fontSize); - Int32 charWidth = (Int32)g.MeasureString("X", drawfont).Width; - return 2 + Math.Truncate((text.Length * charWidth) / charWidth * 256.0) / 256.0 - 0.71; + //String textToUse = new String('X', text.Length); + Size textSize = TextRenderer.MeasureText(text, stringFont); + double width = (double)(((textSize.Width / (double)7) * 256) - (128 / 7)) / 256; + width = (double)decimal.Round((decimal)width + 0.2M, 2); + + return width + 1; } public Double GetHeight() diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLSheetView.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLSheetView.cs new file mode 100644 index 0000000..493ea72 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLSheetView.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLSheetView: IXLSheetView + { + public Int32 SplitRow { get; set; } + public Int32 SplitColumn { get; set; } + public Boolean FreezePanes { get; set; } + public void FreezeRows(Int32 rows) + { + SplitRow = rows; + FreezePanes = true; + } + public void FreezeColumns(Int32 columns) + { + SplitColumn = columns; + FreezePanes = true; + } + public void Freeze(Int32 rows, Int32 columns) + { + SplitRow = rows; + SplitColumn = columns; + FreezePanes = true; + } + } +} diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs index e0bb269..f316249 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Load.cs @@ -97,6 +97,22 @@ if (sheetFormatProperties.DefaultColumnWidth != null) ws.ColumnWidth = sheetFormatProperties.DefaultColumnWidth; + var sheetView = (SheetView)worksheetPart.Worksheet.Descendants().FirstOrDefault(); + if (sheetView != null) + { + var pane = (Pane)sheetView.Descendants().FirstOrDefault(); + if (pane != null) + { + if (pane.State != null && pane.State == PaneStateValues.FrozenSplit) + { + if (pane.HorizontalSplit != null) + ws.SheetView.SplitColumn = (Int32)pane.HorizontalSplit.Value; + if (pane.VerticalSplit != null) + ws.SheetView.SplitRow = (Int32)pane.VerticalSplit.Value; + } + } + } + foreach (var mCell in worksheetPart.Worksheet.Descendants()) { var mergeCell = (MergeCell)mCell; @@ -396,7 +412,7 @@ { foreach (var area in definedName.Text.Split(',')) { - var sections = area.Split('!'); + var sections = area.Trim().Split('!'); var sheetName = sections[0].Replace("\'", ""); var sheetArea = sections[1]; Worksheets.Worksheet(sheetName).PageSetup.PrintAreas.Add(sheetArea); @@ -406,7 +422,7 @@ { var areas = definedName.Text.Split(','); - var colSections = areas[0].Split('!'); + var colSections = areas[0].Trim().Split('!'); var sheetNameCol = colSections[0].Replace("\'", ""); var sheetAreaCol = colSections[1]; Worksheets.Worksheet(sheetNameCol).PageSetup.SetColumnsToRepeatAtLeft(sheetAreaCol); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs index 38fd375..cf8fe34 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorkbook_Save.cs @@ -1423,12 +1423,53 @@ if (worksheetPart.Worksheet.SheetDimension == null) worksheetPart.Worksheet.SheetDimension = new SheetDimension() { Reference = sheetDimensionReference }; - if (worksheetPart.Worksheet.SheetViews == null) worksheetPart.Worksheet.SheetViews = new SheetViews(); + var sheetView = worksheetPart.Worksheet.SheetViews.FirstOrDefault(); if (worksheetPart.Worksheet.SheetViews.Count() == 0) - worksheetPart.Worksheet.SheetViews.Append(new SheetView() { WorkbookViewId = (UInt32Value)0U }); + { + sheetView = new SheetView() { WorkbookViewId = (UInt32Value)0U }; + worksheetPart.Worksheet.SheetViews.Append(sheetView); + } + + + var pane = sheetView.Elements().FirstOrDefault(); + if (pane == null) + { + pane = new Pane(); + sheetView.Append(pane); + } + + Double hSplit = 0; + Double ySplit = 0; + //if (xlWorksheet.SheetView.FreezePanes) + //{ + pane.State = PaneStateValues.FrozenSplit; + hSplit = xlWorksheet.SheetView.SplitColumn; + ySplit = xlWorksheet.SheetView.SplitRow; + //} + //else + //{ + // pane.State = null; + // foreach (var column in xlWorksheet.Columns(1, xlWorksheet.SheetView.SplitColumn)) + // { + // hSplit += (column.Width * 141.33); + // } + // foreach (var row in xlWorksheet.Rows(1, xlWorksheet.SheetView.SplitRow)) + // { + // ySplit += (row.Height * 37.0); + // } + //} + + pane.HorizontalSplit = hSplit; + pane.VerticalSplit = ySplit; + + pane.TopLeftCell = XLAddress.GetColumnLetterFromNumber(xlWorksheet.SheetView.SplitColumn + 1) + + (xlWorksheet.SheetView.SplitRow + 1).ToString(); + + if (hSplit == 0 && ySplit == 0) + sheetView.RemoveAllChildren(); #endregion @@ -1739,7 +1780,7 @@ #region MergeCells MergeCells mergeCells = null; - if (xlWorksheet.Internals.MergedCells.Count > 0) + if (xlWorksheet.Internals.MergedRanges.Count() > 0) { if (worksheetPart.Worksheet.Elements().Count() == 0) { @@ -1759,7 +1800,7 @@ mergeCells = worksheetPart.Worksheet.Elements().First(); mergeCells.RemoveAllChildren(); - foreach (var merged in xlWorksheet.Internals.MergedCells) + foreach (var merged in xlWorksheet.Internals.MergedRanges.Select(m=>m.RangeAddress.FirstAddress.ToString() + ":" + m.RangeAddress.LastAddress.ToString())) { MergeCell mergeCell = new MergeCell() { Reference = merged }; mergeCells.Append(mergeCell); diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs index 47bbe98..433c484 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheet.cs @@ -27,9 +27,10 @@ { Worksheet = this; NamedRanges = new XLNamedRanges(workbook); + SheetView = new XLSheetView(); this.workbook = workbook; Style = workbook.Style; - Internals = new XLWorksheetInternals(new XLCellCollection(), new XLColumnsCollection(), new XLRowsCollection(), new List(), workbook); + Internals = new XLWorksheetInternals(new XLCellCollection(), new XLColumnsCollection(), new XLRowsCollection(), new XLRanges(workbook, workbook.Style) , workbook); PageSetup = new XLPageSetup(workbook.PageOptions, this); Outline = new XLOutline(workbook.Outline); ColumnWidth = workbook.ColumnWidth; @@ -41,10 +42,9 @@ void XLWorksheet_RangeShiftedColumns(XLRange range, int columnsShifted) { - var newMerge = new List(); - foreach (var merge in Internals.MergedCells) + var newMerge = new XLRanges(workbook, workbook.Style); + foreach (var rngMerged in Internals.MergedRanges) { - var rngMerged = Range(merge); 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) @@ -54,24 +54,23 @@ rngMerged.RangeAddress.FirstAddress.ColumnNumber + columnsShifted, rngMerged.RangeAddress.LastAddress.RowNumber, rngMerged.RangeAddress.LastAddress.ColumnNumber + columnsShifted); - newMerge.Add(GetRangeLocation(newRng.ToString())); + newMerge.Add(newRng); } else if ( !(range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.RangeAddress.FirstAddress.ColumnNumber && range.RangeAddress.FirstAddress.RowNumber <= rngMerged.RangeAddress.LastAddress.RowNumber)) { - newMerge.Add(GetRangeLocation(rngMerged.ToString())); + newMerge.Add(rngMerged); } } - Internals.MergedCells = newMerge; + Internals.MergedRanges = newMerge; } void XLWorksheet_RangeShiftedRows(XLRange range, int rowsShifted) { - var newMerge = new List(); - foreach (var merge in Internals.MergedCells) + var newMerge = new XLRanges(workbook, workbook.Style); + foreach (var rngMerged in Internals.MergedRanges) { - var rngMerged = Range(merge); 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) @@ -81,23 +80,15 @@ rngMerged.RangeAddress.FirstAddress.ColumnNumber, rngMerged.RangeAddress.LastAddress.RowNumber + rowsShifted, rngMerged.RangeAddress.LastAddress.ColumnNumber); - newMerge.Add(GetRangeLocation(newRng.ToString())); + newMerge.Add(newRng); } else if (!(range.RangeAddress.FirstAddress.RowNumber <= rngMerged.RangeAddress.FirstAddress.RowNumber && range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.RangeAddress.LastAddress.ColumnNumber)) { - newMerge.Add(GetRangeLocation(rngMerged.ToString())); + newMerge.Add(rngMerged); } } - Internals.MergedCells = newMerge; - } - - private String GetRangeLocation(String rangeAddress) - { - if (rangeAddress.Contains("!")) - return rangeAddress.Substring(rangeAddress.IndexOf("!") + 1); - else - return rangeAddress; + Internals.MergedRanges = newMerge; } public void NotifyRangeShiftedRows(XLRange range, Int32 rowsShifted) @@ -272,16 +263,16 @@ { String firstColumn; String lastColumn; - if (pair.Contains(':')) + if (pair.Trim().Contains(':')) { - var columnRange = pair.Split(':'); + var columnRange = pair.Trim().Split(':'); firstColumn = columnRange[0]; lastColumn = columnRange[1]; } else { - firstColumn = pair; - lastColumn = pair; + firstColumn = pair.Trim(); + lastColumn = pair.Trim(); } Int32 tmp; @@ -339,16 +330,16 @@ { String firstRow; String lastRow; - if (pair.Contains(':')) + if (pair.Trim().Contains(':')) { - var rowRange = pair.Split(':'); + var rowRange = pair.Trim().Split(':'); firstRow = rowRange[0]; lastRow = rowRange[1]; } else { - firstRow = pair; - lastRow = pair; + firstRow = pair.Trim(); + lastRow = pair.Trim(); } foreach (var row in this.Rows(Int32.Parse(firstRow), Int32.Parse(lastRow))) { @@ -488,9 +479,10 @@ { Internals.CellsCollection.Clear(); Internals.ColumnsCollection.Clear(); - Internals.MergedCells.Clear(); + Internals.MergedRanges.Clear(); Internals.RowsCollection.Clear(); } public IXLNamedRanges NamedRanges { get; private set; } + public IXLSheetView SheetView { get; private set; } } } diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheetInternals.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheetInternals.cs index 7cf7263..c0d3442 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheetInternals.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/XLWorksheetInternals.cs @@ -11,21 +11,21 @@ XLCellCollection cellsCollection, XLColumnsCollection columnsCollection, XLRowsCollection rowsCollection, - List mergedCells, + XLRanges mergedRanges, XLWorkbook workbook ) { CellsCollection = cellsCollection; ColumnsCollection = columnsCollection; RowsCollection = rowsCollection; - MergedCells = mergedCells; + MergedRanges = mergedRanges; Workbook = workbook; } public XLCellCollection CellsCollection { get; private set; } public XLColumnsCollection ColumnsCollection { get; private set; } public XLRowsCollection RowsCollection { get; private set; } - public List MergedCells { get; internal set; } + public XLRanges MergedRanges { get; internal set; } public XLWorkbook Workbook { get; internal set; } } } diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj b/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj index 6ba614a..8cdfb70 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/ClosedXML_Examples.csproj @@ -51,12 +51,14 @@ + + @@ -82,6 +84,7 @@ + diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Columns/ColumnCells.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Columns/ColumnCells.cs new file mode 100644 index 0000000..4015536 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Columns/ColumnCells.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ClosedXML.Excel; + +using System.Drawing; + +namespace ClosedXML_Examples +{ + public class ColumnCells + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Column Cells"); + + var columnFromWorksheet = ws.Column(1); + columnFromWorksheet.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; + columnFromWorksheet.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; + columnFromWorksheet.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; + columnFromWorksheet.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; + + var columnFromRange = ws.Range("B1:B9").FirstColumn(); + + columnFromRange.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; + columnFromRange.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; + columnFromRange.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; + columnFromRange.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Creating/CreateFiles.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Creating/CreateFiles.cs index 056c71f..c25b7ac 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Examples/Creating/CreateFiles.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Creating/CreateFiles.cs @@ -60,6 +60,9 @@ new BlankCells().Create(@"C:\Excel Files\Created\BlankCells.xlsx"); new TwoPages().Create(@"C:\Excel Files\Created\TwoPages.xlsx"); new UsingColors().Create(@"C:\Excel Files\Created\UsingColors.xlsx"); + new ColumnCells().Create(@"C:\Excel Files\Created\ColumnCells.xlsx"); + new RowCells().Create(@"C:\Excel Files\Created\RowCells.xlsx"); + new FreezePanes().Create(@"C:\Excel Files\Created\FreezePanes.xlsx"); } } } diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/AdjustToContents.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/AdjustToContents.cs index 406eba4..b925c54 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/AdjustToContents.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/AdjustToContents.cs @@ -50,24 +50,39 @@ var ws = wb.Worksheets.Add("Adjust To Contents"); // Set some values with different font sizes - ws.Cell(2, 2).Value = "A"; - ws.Cell(2, 2).Style.Font.FontSize = 30; - ws.Cell(3, 2).Value = "really, really, long text"; - ws.Cell(4, 2).Value = "long text"; - ws.Cell(5, 2).Value = "really long text"; - ws.Cell(5, 2).Style.Font.FontSize = 20; + ws.Cell(1, 1).Value = "Tall Row"; + ws.Cell(1, 1).Style.Font.FontSize = 30; + ws.Cell(2, 1).Value = "Very Wide Column"; + ws.Cell(2, 1).Style.Font.FontSize = 20; + + // Adjust column width + ws.Column(1).AdjustToContents(); - // Adjust all rows/columns in one shot - ws.Rows().AdjustToContents(); - ws.Columns().AdjustToContents(); + // Adjust row heights + ws.Rows(1, 2).AdjustToContents(); - // You can also adjust specific rows/columns + // You can also adjust all rows/columns in one shot + // ws.Rows().AdjustToContents(); + // ws.Columns().AdjustToContents(); - // Adjust the width of column 2 to its contents - //ws.Column(2).AdjustToContents(); - // Adjust the height of rows 2,3,4,5 to their contents - //ws.Rows(2, 5).AdjustToContents(); + // We'll now select which cells should be used for calculating the + // column widths (same method applies for row heights) + + // Set the values + ws.Cell(4, 2).Value = "Width ignored because calling column.AdjustToContents(5, 7)"; + ws.Cell(5, 2).Value = "Short text"; + ws.Cell(6, 2).Value = "Width ignored because it's part of a merge"; + ws.Range(6, 2, 6, 4).Merge(); + ws.Cell(7, 2).Value = "Width should adjust to this cell"; + ws.Cell(8, 2).Value = "Width ignored because calling column.AdjustToContents(5, 7)"; + + // Adjust column widths only taking into account rows 5-7 + // (merged cells will be ignored) + ws.Column(2).AdjustToContents(5, 7); + + // You can also specify the starting row to start calculating the widths: + // e.g. ws.Column(3).AdjustToContents(9); wb.SaveAs(filePath); } diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/FreezePanes.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/FreezePanes.cs new file mode 100644 index 0000000..58c36fb --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Misc/FreezePanes.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ClosedXML.Excel; + +using System.Drawing; + +namespace ClosedXML_Examples.Misc +{ + public class FreezePanes + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var wsFreeze = wb.Worksheets.Add("Freeze View"); + + // Freeze rows and columns in one shot + wsFreeze.SheetView.Freeze(3, 3); + + // You can also be more specific on what you want to freeze + // For example: + // wsFreeze.SheetView.FreezeRows(3); + // wsFreeze.SheetView.FreezeColumns(3); + + + ////////////////////////////// + //var wsSplit = wb.Worksheets.Add("Split View"); + //wsSplit.SheetView.SplitRow = 3; + //wsSplit.SheetView.SplitColumn = 3; + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML/ClosedXML/ClosedXML_Examples/Rows/RowCells.cs b/ClosedXML/ClosedXML/ClosedXML_Examples/Rows/RowCells.cs new file mode 100644 index 0000000..f029b64 --- /dev/null +++ b/ClosedXML/ClosedXML/ClosedXML_Examples/Rows/RowCells.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ClosedXML.Excel; + +using System.Drawing; + +namespace ClosedXML_Examples +{ + public class RowCells + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Row Cells"); + + var rowFromWorksheet = ws.Row(1); + rowFromWorksheet.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; + rowFromWorksheet.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; + rowFromWorksheet.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; + rowFromWorksheet.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; + + var rowFromRange = ws.Range("A2:I2").FirstRow(); + + rowFromRange.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; + rowFromRange.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; + rowFromRange.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; + rowFromRange.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; + + ws.Columns().Width = 7; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj b/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj index 2920223..59021ef 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj +++ b/ClosedXML/ClosedXML/ClosedXML_Net3.5/ClosedXML_Net3.5.csproj @@ -16,6 +16,7 @@ SAK SAK SAK + true @@ -33,8 +34,7 @@ TRACE prompt 4 - - + bin\Release\ClosedXML.XML @@ -88,6 +88,9 @@ Excel\IXLOutline.cs + + Excel\IXLSheetView.cs + Excel\IXLTheme.cs @@ -268,6 +271,9 @@ Excel\XLOutline.cs + + Excel\XLSheetView.cs + Excel\XLTheme.cs diff --git a/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs b/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs index 0376b30..45c5438 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Sandbox/Program.cs @@ -20,7 +20,7 @@ col.Cells("3").Style.Fill.BackgroundColor = XLColor.Blue; col.Cell(6).Style.Fill.BackgroundColor = XLColor.Orange; col.Cells(7, 8).Style.Fill.BackgroundColor = XLColor.Blue; - + var colRng = ws.Range("A2:H2").FirstRow(); colRng.Cells("1:2, 4:5").Style.Fill.BackgroundColor = XLColor.Red;