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;