diff --git a/.gitattributes b/.gitattributes index 5b587f0..68cc179 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,8 +4,7 @@ # Explicitly declare text files we want to always be normalized and converted # to native line endings on checkout. -*.c text -*.h text +*.cs text diff=csharp eol=crlf # Declare files that will always have CRLF line endings on checkout. *.sln text eol=crlf @@ -16,5 +15,6 @@ *.dll binary *.gif binary *.ico binary +*.xlsx binary core.autocrlf=true diff --git a/.gitignore b/.gitignore index 14f56ef..3a8d055 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ *.cache *.ilk *.log +.vs/ [Bb]in [Dd]ebug*/ *.lib diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/CONTRIBUTING.md diff --git a/ClosedXML/AttributeExtensions.cs b/ClosedXML/AttributeExtensions.cs index 89b8b7f..be35455 100644 --- a/ClosedXML/AttributeExtensions.cs +++ b/ClosedXML/AttributeExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Linq.Expressions; using System.Reflection; diff --git a/ClosedXML/Attributes/XLColumnAttribute.cs b/ClosedXML/Attributes/XLColumnAttribute.cs index 0d33214..41b541b 100644 --- a/ClosedXML/Attributes/XLColumnAttribute.cs +++ b/ClosedXML/Attributes/XLColumnAttribute.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Reflection; using ClosedXML; diff --git a/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML.csproj index 0539fcd..7de9988 100644 --- a/ClosedXML/ClosedXML.csproj +++ b/ClosedXML/ClosedXML.csproj @@ -46,8 +46,8 @@ ClosedXML.snk - - ..\packages\DocumentFormat.OpenXml.2.7.1\lib\net45\DocumentFormat.OpenXml.dll + + ..\packages\DocumentFormat.OpenXml.2.7.2\lib\net40\DocumentFormat.OpenXml.dll True @@ -72,14 +72,19 @@ + + + + + @@ -337,7 +342,9 @@ .editorconfig - + + Designer + - + \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/IXLAutoFilter.cs b/ClosedXML/Excel/AutoFilters/IXLAutoFilter.cs index 8859848..e1a87a7 100644 --- a/ClosedXML/Excel/AutoFilters/IXLAutoFilter.cs +++ b/ClosedXML/Excel/AutoFilters/IXLAutoFilter.cs @@ -1,16 +1,16 @@ -using System; -namespace ClosedXML.Excel -{ - using System.Collections.Generic; - - public interface IXLAutoFilter: IDisposable - { - IXLFilterColumn Column(String column); - IXLFilterColumn Column(Int32 column); - - IXLAutoFilter Sort(Int32 columnToSortBy = 1, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - Boolean Sorted { get; set; } - XLSortOrder SortOrder { get; set; } - Int32 SortColumn { get; set; } - } +using System; +namespace ClosedXML.Excel +{ + using System.Collections.Generic; + + public interface IXLAutoFilter: IDisposable + { + IXLFilterColumn Column(String column); + IXLFilterColumn Column(Int32 column); + + IXLAutoFilter Sort(Int32 columnToSortBy = 1, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + Boolean Sorted { get; set; } + XLSortOrder SortOrder { get; set; } + Int32 SortColumn { get; set; } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/IXLBaseAutoFilter.cs b/ClosedXML/Excel/AutoFilters/IXLBaseAutoFilter.cs index b3f8d66..88ca907 100644 --- a/ClosedXML/Excel/AutoFilters/IXLBaseAutoFilter.cs +++ b/ClosedXML/Excel/AutoFilters/IXLBaseAutoFilter.cs @@ -1,25 +1,25 @@ -using System; -namespace ClosedXML.Excel -{ - using System.Collections.Generic; - public enum XLFilterType { Regular, Custom, TopBottom, Dynamic } - public enum XLFilterDynamicType { AboveAverage, BelowAverage } - public enum XLTopBottomPart { Top, Bottom} - public interface IXLBaseAutoFilter - { - Boolean Enabled { get; set; } - IXLRange Range { get; set; } - IXLBaseAutoFilter Set(IXLRangeBase range); - IXLBaseAutoFilter Clear(); - - IXLFilterColumn Column(String column); - IXLFilterColumn Column(Int32 column); - - IXLBaseAutoFilter Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - Boolean Sorted { get; set; } - XLSortOrder SortOrder { get; set; } - Int32 SortColumn { get; set; } - - - } +using System; +namespace ClosedXML.Excel +{ + using System.Collections.Generic; + public enum XLFilterType { Regular, Custom, TopBottom, Dynamic } + public enum XLFilterDynamicType { AboveAverage, BelowAverage } + public enum XLTopBottomPart { Top, Bottom} + public interface IXLBaseAutoFilter + { + Boolean Enabled { get; set; } + IXLRange Range { get; set; } + IXLBaseAutoFilter Set(IXLRangeBase range); + IXLBaseAutoFilter Clear(); + + IXLFilterColumn Column(String column); + IXLFilterColumn Column(Int32 column); + + IXLBaseAutoFilter Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + Boolean Sorted { get; set; } + XLSortOrder SortOrder { get; set; } + Int32 SortColumn { get; set; } + + + } } \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/IXLCustomFilteredColumn.cs b/ClosedXML/Excel/AutoFilters/IXLCustomFilteredColumn.cs index 85cec03..37c6a17 100644 --- a/ClosedXML/Excel/AutoFilters/IXLCustomFilteredColumn.cs +++ b/ClosedXML/Excel/AutoFilters/IXLCustomFilteredColumn.cs @@ -1,19 +1,19 @@ -using System; -namespace ClosedXML.Excel -{ - public interface IXLCustomFilteredColumn - { - void EqualTo(T value) where T : IComparable; - void NotEqualTo(T value) where T : IComparable; - void GreaterThan(T value) where T : IComparable; - void LessThan(T value) where T : IComparable; - void EqualOrGreaterThan(T value) where T : IComparable; - void EqualOrLessThan(T value) where T : IComparable; - void BeginsWith(String value); - void NotBeginsWith(String value); - void EndsWith(String value); - void NotEndsWith(String value); - void Contains(String value); - void NotContains(String value); - } +using System; +namespace ClosedXML.Excel +{ + public interface IXLCustomFilteredColumn + { + void EqualTo(T value) where T : IComparable; + void NotEqualTo(T value) where T : IComparable; + void GreaterThan(T value) where T : IComparable; + void LessThan(T value) where T : IComparable; + void EqualOrGreaterThan(T value) where T : IComparable; + void EqualOrLessThan(T value) where T : IComparable; + void BeginsWith(String value); + void NotBeginsWith(String value); + void EndsWith(String value); + void NotEndsWith(String value); + void Contains(String value); + void NotContains(String value); + } } \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/IXLFilterColumn.cs b/ClosedXML/Excel/AutoFilters/IXLFilterColumn.cs index 159faf9..41376c8 100644 --- a/ClosedXML/Excel/AutoFilters/IXLFilterColumn.cs +++ b/ClosedXML/Excel/AutoFilters/IXLFilterColumn.cs @@ -1,46 +1,46 @@ -using System; -namespace ClosedXML.Excel -{ - public enum XLTopBottomType { Items, Percent } - public interface IXLFilterColumn - { - void Clear(); - - IXLFilteredColumn AddFilter(T value) where T : IComparable; - - void Top(Int32 value, XLTopBottomType type = XLTopBottomType.Items); - void Bottom(Int32 value, XLTopBottomType type = XLTopBottomType.Items); - void AboveAverage(); - void BelowAverage(); - - IXLFilterConnector EqualTo(T value) where T : IComparable; - IXLFilterConnector NotEqualTo(T value) where T : IComparable; - IXLFilterConnector GreaterThan(T value) where T : IComparable; - IXLFilterConnector LessThan(T value) where T : IComparable; - IXLFilterConnector EqualOrGreaterThan(T value) where T : IComparable; - IXLFilterConnector EqualOrLessThan(T value) where T : IComparable; - void Between(T minValue, T maxValue) where T : IComparable; - void NotBetween(T minValue, T maxValue) where T : IComparable; - IXLFilterConnector BeginsWith(String value); - IXLFilterConnector NotBeginsWith(String value); - IXLFilterConnector EndsWith(String value); - IXLFilterConnector NotEndsWith(String value); - IXLFilterConnector Contains(String value); - IXLFilterConnector NotContains(String value); - - XLFilterType FilterType { get; set; } - Int32 TopBottomValue { get; set; } - XLTopBottomType TopBottomType { get; set; } - XLTopBottomPart TopBottomPart { get; set; } - XLFilterDynamicType DynamicType { get; set; } - Double DynamicValue { get; set; } - - IXLFilterColumn SetFilterType(XLFilterType value); - IXLFilterColumn SetTopBottomValue(Int32 value); - IXLFilterColumn SetTopBottomType(XLTopBottomType value); - IXLFilterColumn SetTopBottomPart(XLTopBottomPart value); - IXLFilterColumn SetDynamicType(XLFilterDynamicType value); - IXLFilterColumn SetDynamicValue(Double value); - - } +using System; +namespace ClosedXML.Excel +{ + public enum XLTopBottomType { Items, Percent } + public interface IXLFilterColumn + { + void Clear(); + + IXLFilteredColumn AddFilter(T value) where T : IComparable; + + void Top(Int32 value, XLTopBottomType type = XLTopBottomType.Items); + void Bottom(Int32 value, XLTopBottomType type = XLTopBottomType.Items); + void AboveAverage(); + void BelowAverage(); + + IXLFilterConnector EqualTo(T value) where T : IComparable; + IXLFilterConnector NotEqualTo(T value) where T : IComparable; + IXLFilterConnector GreaterThan(T value) where T : IComparable; + IXLFilterConnector LessThan(T value) where T : IComparable; + IXLFilterConnector EqualOrGreaterThan(T value) where T : IComparable; + IXLFilterConnector EqualOrLessThan(T value) where T : IComparable; + void Between(T minValue, T maxValue) where T : IComparable; + void NotBetween(T minValue, T maxValue) where T : IComparable; + IXLFilterConnector BeginsWith(String value); + IXLFilterConnector NotBeginsWith(String value); + IXLFilterConnector EndsWith(String value); + IXLFilterConnector NotEndsWith(String value); + IXLFilterConnector Contains(String value); + IXLFilterConnector NotContains(String value); + + XLFilterType FilterType { get; set; } + Int32 TopBottomValue { get; set; } + XLTopBottomType TopBottomType { get; set; } + XLTopBottomPart TopBottomPart { get; set; } + XLFilterDynamicType DynamicType { get; set; } + Double DynamicValue { get; set; } + + IXLFilterColumn SetFilterType(XLFilterType value); + IXLFilterColumn SetTopBottomValue(Int32 value); + IXLFilterColumn SetTopBottomType(XLTopBottomType value); + IXLFilterColumn SetTopBottomPart(XLTopBottomPart value); + IXLFilterColumn SetDynamicType(XLFilterDynamicType value); + IXLFilterColumn SetDynamicValue(Double value); + + } } \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/IXLFilterConnector.cs b/ClosedXML/Excel/AutoFilters/IXLFilterConnector.cs index 7955869..d5d52be 100644 --- a/ClosedXML/Excel/AutoFilters/IXLFilterConnector.cs +++ b/ClosedXML/Excel/AutoFilters/IXLFilterConnector.cs @@ -1,10 +1,10 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLFilterConnector - { - IXLCustomFilteredColumn And { get; } - IXLCustomFilteredColumn Or { get; } - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLFilterConnector + { + IXLCustomFilteredColumn And { get; } + IXLCustomFilteredColumn Or { get; } + } +} diff --git a/ClosedXML/Excel/AutoFilters/IXLFilteredColumn.cs b/ClosedXML/Excel/AutoFilters/IXLFilteredColumn.cs index 6491f55..86db9db 100644 --- a/ClosedXML/Excel/AutoFilters/IXLFilteredColumn.cs +++ b/ClosedXML/Excel/AutoFilters/IXLFilteredColumn.cs @@ -1,8 +1,8 @@ -using System; -namespace ClosedXML.Excel -{ - public interface IXLFilteredColumn - { - IXLFilteredColumn AddFilter(T value) where T : IComparable; - } +using System; +namespace ClosedXML.Excel +{ + public interface IXLFilteredColumn + { + IXLFilteredColumn AddFilter(T value) where T : IComparable; + } } \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs b/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs index 28f4209..dcf4b76 100644 --- a/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs +++ b/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs @@ -1,165 +1,165 @@ -using System; -using System.Linq; - -namespace ClosedXML.Excel -{ - using System.Collections.Generic; - - internal class XLAutoFilter : IXLBaseAutoFilter, IXLAutoFilter - { - private readonly Dictionary _columns = new Dictionary(); - - public XLAutoFilter() - { - Filters = new Dictionary>(); - } - - public Dictionary> Filters { get; private set; } - - #region IXLAutoFilter Members - - IXLAutoFilter IXLAutoFilter.Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, - Boolean ignoreBlanks) - { - return Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks); - } - - public void Dispose() - { - if (Range != null) - Range.Dispose(); - } - - #endregion - - #region IXLBaseAutoFilter Members - - public Boolean Enabled { get; set; } - public IXLRange Range { get; set; } - - IXLBaseAutoFilter IXLBaseAutoFilter.Clear() - { - return Clear(); - } - - IXLBaseAutoFilter IXLBaseAutoFilter.Set(IXLRangeBase range) - { - return Set(range); - } - - IXLBaseAutoFilter IXLBaseAutoFilter.Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, - Boolean ignoreBlanks) - { - return Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks); - } - - public Boolean Sorted { get; set; } - public XLSortOrder SortOrder { get; set; } - public Int32 SortColumn { get; set; } - - public IXLFilterColumn Column(String column) - { - return Column(XLHelper.GetColumnNumberFromLetter(column)); - } - - public IXLFilterColumn Column(Int32 column) - { - XLFilterColumn filterColumn; - if (!_columns.TryGetValue(column, out filterColumn)) - { - filterColumn = new XLFilterColumn(this, column); - _columns.Add(column, filterColumn); - } - - return filterColumn; - } - - #endregion - - public XLAutoFilter Set(IXLRangeBase range) - { - Range = range.AsRange(); - Enabled = true; - return this; - } - - public XLAutoFilter Clear() - { - if (!Enabled) return this; - - Enabled = false; - Filters.Clear(); - foreach (IXLRangeRow row in Range.Rows().Where(r => r.RowNumber() > 1)) - row.WorksheetRow().Unhide(); - return this; - } - - public XLAutoFilter Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, Boolean ignoreBlanks) - { - if (!Enabled) - throw new ApplicationException("Filter has not been enabled."); - - var ws = Range.Worksheet as XLWorksheet; - ws.SuspendEvents(); - Range.Range(Range.FirstCell().CellBelow(), Range.LastCell()).Sort(columnToSortBy, sortOrder, matchCase, - ignoreBlanks); - - Sorted = true; - SortOrder = sortOrder; - SortColumn = columnToSortBy; - - if (Enabled) - { - using (var rows = Range.Rows(2, Range.RowCount())) - { - foreach (IXLRangeRow row in rows) - row.WorksheetRow().Unhide(); - } - - foreach (KeyValuePair> kp in Filters) - { - Boolean firstFilter = true; - foreach (XLFilter filter in kp.Value) - { - Boolean isText = filter.Value is String; - using (var rows = Range.Rows(2, Range.RowCount())) - { - foreach (IXLRangeRow row in rows) - { - Boolean match = isText - ? filter.Condition(row.Cell(kp.Key).GetString()) - : row.Cell(kp.Key).DataType == XLCellValues.Number && - filter.Condition(row.Cell(kp.Key).GetDouble()); - if (firstFilter) - { - if (match) - row.WorksheetRow().Unhide(); - else - row.WorksheetRow().Hide(); - } - else - { - if (filter.Connector == XLConnector.And) - { - if (!row.WorksheetRow().IsHidden) - { - if (match) - row.WorksheetRow().Unhide(); - else - row.WorksheetRow().Hide(); - } - } - else if (match) - row.WorksheetRow().Unhide(); - } - } - firstFilter = false; - } - } - } - } - ws.ResumeEvents(); - return this; - } - } +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections.Generic; + + internal class XLAutoFilter : IXLBaseAutoFilter, IXLAutoFilter + { + private readonly Dictionary _columns = new Dictionary(); + + public XLAutoFilter() + { + Filters = new Dictionary>(); + } + + public Dictionary> Filters { get; private set; } + + #region IXLAutoFilter Members + + IXLAutoFilter IXLAutoFilter.Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, + Boolean ignoreBlanks) + { + return Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks); + } + + public void Dispose() + { + if (Range != null) + Range.Dispose(); + } + + #endregion + + #region IXLBaseAutoFilter Members + + public Boolean Enabled { get; set; } + public IXLRange Range { get; set; } + + IXLBaseAutoFilter IXLBaseAutoFilter.Clear() + { + return Clear(); + } + + IXLBaseAutoFilter IXLBaseAutoFilter.Set(IXLRangeBase range) + { + return Set(range); + } + + IXLBaseAutoFilter IXLBaseAutoFilter.Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, + Boolean ignoreBlanks) + { + return Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks); + } + + public Boolean Sorted { get; set; } + public XLSortOrder SortOrder { get; set; } + public Int32 SortColumn { get; set; } + + public IXLFilterColumn Column(String column) + { + return Column(XLHelper.GetColumnNumberFromLetter(column)); + } + + public IXLFilterColumn Column(Int32 column) + { + XLFilterColumn filterColumn; + if (!_columns.TryGetValue(column, out filterColumn)) + { + filterColumn = new XLFilterColumn(this, column); + _columns.Add(column, filterColumn); + } + + return filterColumn; + } + + #endregion + + public XLAutoFilter Set(IXLRangeBase range) + { + Range = range.AsRange(); + Enabled = true; + return this; + } + + public XLAutoFilter Clear() + { + if (!Enabled) return this; + + Enabled = false; + Filters.Clear(); + foreach (IXLRangeRow row in Range.Rows().Where(r => r.RowNumber() > 1)) + row.WorksheetRow().Unhide(); + return this; + } + + public XLAutoFilter Sort(Int32 columnToSortBy, XLSortOrder sortOrder, Boolean matchCase, Boolean ignoreBlanks) + { + if (!Enabled) + throw new ApplicationException("Filter has not been enabled."); + + var ws = Range.Worksheet as XLWorksheet; + ws.SuspendEvents(); + Range.Range(Range.FirstCell().CellBelow(), Range.LastCell()).Sort(columnToSortBy, sortOrder, matchCase, + ignoreBlanks); + + Sorted = true; + SortOrder = sortOrder; + SortColumn = columnToSortBy; + + if (Enabled) + { + using (var rows = Range.Rows(2, Range.RowCount())) + { + foreach (IXLRangeRow row in rows) + row.WorksheetRow().Unhide(); + } + + foreach (KeyValuePair> kp in Filters) + { + Boolean firstFilter = true; + foreach (XLFilter filter in kp.Value) + { + Boolean isText = filter.Value is String; + using (var rows = Range.Rows(2, Range.RowCount())) + { + foreach (IXLRangeRow row in rows) + { + Boolean match = isText + ? filter.Condition(row.Cell(kp.Key).GetString()) + : row.Cell(kp.Key).DataType == XLCellValues.Number && + filter.Condition(row.Cell(kp.Key).GetDouble()); + if (firstFilter) + { + if (match) + row.WorksheetRow().Unhide(); + else + row.WorksheetRow().Hide(); + } + else + { + if (filter.Connector == XLConnector.And) + { + if (!row.WorksheetRow().IsHidden) + { + if (match) + row.WorksheetRow().Unhide(); + else + row.WorksheetRow().Hide(); + } + } + else if (match) + row.WorksheetRow().Unhide(); + } + } + firstFilter = false; + } + } + } + } + ws.ResumeEvents(); + return this; + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/XLCustomFilteredColumn.cs b/ClosedXML/Excel/AutoFilters/XLCustomFilteredColumn.cs index 26fd585..d2cb44d 100644 --- a/ClosedXML/Excel/AutoFilters/XLCustomFilteredColumn.cs +++ b/ClosedXML/Excel/AutoFilters/XLCustomFilteredColumn.cs @@ -1,143 +1,143 @@ -using System; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLCustomFilteredColumn : IXLCustomFilteredColumn - { - private readonly XLAutoFilter _autoFilter; - private readonly Int32 _column; - private readonly XLConnector _connector; - - public XLCustomFilteredColumn(XLAutoFilter autoFilter, Int32 column, XLConnector connector) - { - _autoFilter = autoFilter; - _column = column; - _connector = connector; - } - - #region IXLCustomFilteredColumn Members - - public void EqualTo(T value) where T: IComparable - { - if (typeof(T) == typeof(String)) - { - ApplyCustomFilter(value, XLFilterOperator.Equal, - v => - v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase)); - } - else - { - ApplyCustomFilter(value, XLFilterOperator.Equal, - v => v.CastTo().CompareTo(value) == 0); - } - } - - public void NotEqualTo(T value) where T: IComparable - { - if (typeof(T) == typeof(String)) - { - ApplyCustomFilter(value, XLFilterOperator.NotEqual, - v => - !v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase)); - } - else - { - ApplyCustomFilter(value, XLFilterOperator.NotEqual, - v => v.CastTo().CompareTo(value) != 0); - } - } - - public void GreaterThan(T value) where T: IComparable - { - ApplyCustomFilter(value, XLFilterOperator.GreaterThan, - v => v.CastTo().CompareTo(value) > 0); - } - - public void LessThan(T value) where T: IComparable - { - ApplyCustomFilter(value, XLFilterOperator.LessThan, v => v.CastTo().CompareTo(value) < 0); - } - - public void EqualOrGreaterThan(T value) where T: IComparable - { - ApplyCustomFilter(value, XLFilterOperator.EqualOrGreaterThan, - v => v.CastTo().CompareTo(value) >= 0); - } - - public void EqualOrLessThan(T value) where T: IComparable - { - ApplyCustomFilter(value, XLFilterOperator.EqualOrLessThan, - v => v.CastTo().CompareTo(value) <= 0); - } - - public void BeginsWith(String value) - { - ApplyCustomFilter(value + "*", XLFilterOperator.Equal, - s => ((string)s).StartsWith(value, StringComparison.InvariantCultureIgnoreCase)); - } - - public void NotBeginsWith(String value) - { - ApplyCustomFilter(value + "*", XLFilterOperator.NotEqual, - s => - !((string)s).StartsWith(value, StringComparison.InvariantCultureIgnoreCase)); - } - - public void EndsWith(String value) - { - ApplyCustomFilter("*" + value, XLFilterOperator.Equal, - s => ((string)s).EndsWith(value, StringComparison.InvariantCultureIgnoreCase)); - } - - public void NotEndsWith(String value) - { - ApplyCustomFilter("*" + value, XLFilterOperator.NotEqual, - s => !((string)s).EndsWith(value, StringComparison.InvariantCultureIgnoreCase)); - } - - public void Contains(String value) - { - ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, - s => ((string)s).ToLower().Contains(value.ToLower())); - } - - public void NotContains(String value) - { - ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, - s => !((string)s).ToLower().Contains(value.ToLower())); - } - - #endregion - - private void ApplyCustomFilter(T value, XLFilterOperator op, Func condition) - where T: IComparable - { - _autoFilter.Filters[_column].Add(new XLFilter - { - Value = value, - Operator = op, - Connector = _connector, - Condition = condition - }); - using (var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount())) - { - foreach (IXLRangeRow row in rows) - { - if (_connector == XLConnector.And) - { - if (!row.WorksheetRow().IsHidden) - { - if (condition(row.Cell(_column).GetValue())) - row.WorksheetRow().Unhide().Dispose(); - else - row.WorksheetRow().Hide().Dispose(); - } - } - else if (condition(row.Cell(_column).GetValue())) - row.WorksheetRow().Unhide().Dispose(); - } - } - } - } +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLCustomFilteredColumn : IXLCustomFilteredColumn + { + private readonly XLAutoFilter _autoFilter; + private readonly Int32 _column; + private readonly XLConnector _connector; + + public XLCustomFilteredColumn(XLAutoFilter autoFilter, Int32 column, XLConnector connector) + { + _autoFilter = autoFilter; + _column = column; + _connector = connector; + } + + #region IXLCustomFilteredColumn Members + + public void EqualTo(T value) where T: IComparable + { + if (typeof(T) == typeof(String)) + { + ApplyCustomFilter(value, XLFilterOperator.Equal, + v => + v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase)); + } + else + { + ApplyCustomFilter(value, XLFilterOperator.Equal, + v => v.CastTo().CompareTo(value) == 0); + } + } + + public void NotEqualTo(T value) where T: IComparable + { + if (typeof(T) == typeof(String)) + { + ApplyCustomFilter(value, XLFilterOperator.NotEqual, + v => + !v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase)); + } + else + { + ApplyCustomFilter(value, XLFilterOperator.NotEqual, + v => v.CastTo().CompareTo(value) != 0); + } + } + + public void GreaterThan(T value) where T: IComparable + { + ApplyCustomFilter(value, XLFilterOperator.GreaterThan, + v => v.CastTo().CompareTo(value) > 0); + } + + public void LessThan(T value) where T: IComparable + { + ApplyCustomFilter(value, XLFilterOperator.LessThan, v => v.CastTo().CompareTo(value) < 0); + } + + public void EqualOrGreaterThan(T value) where T: IComparable + { + ApplyCustomFilter(value, XLFilterOperator.EqualOrGreaterThan, + v => v.CastTo().CompareTo(value) >= 0); + } + + public void EqualOrLessThan(T value) where T: IComparable + { + ApplyCustomFilter(value, XLFilterOperator.EqualOrLessThan, + v => v.CastTo().CompareTo(value) <= 0); + } + + public void BeginsWith(String value) + { + ApplyCustomFilter(value + "*", XLFilterOperator.Equal, + s => ((string)s).StartsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public void NotBeginsWith(String value) + { + ApplyCustomFilter(value + "*", XLFilterOperator.NotEqual, + s => + !((string)s).StartsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public void EndsWith(String value) + { + ApplyCustomFilter("*" + value, XLFilterOperator.Equal, + s => ((string)s).EndsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public void NotEndsWith(String value) + { + ApplyCustomFilter("*" + value, XLFilterOperator.NotEqual, + s => !((string)s).EndsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public void Contains(String value) + { + ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, + s => ((string)s).ToLower().Contains(value.ToLower())); + } + + public void NotContains(String value) + { + ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, + s => !((string)s).ToLower().Contains(value.ToLower())); + } + + #endregion + + private void ApplyCustomFilter(T value, XLFilterOperator op, Func condition) + where T: IComparable + { + _autoFilter.Filters[_column].Add(new XLFilter + { + Value = value, + Operator = op, + Connector = _connector, + Condition = condition + }); + using (var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount())) + { + foreach (IXLRangeRow row in rows) + { + if (_connector == XLConnector.And) + { + if (!row.WorksheetRow().IsHidden) + { + if (condition(row.Cell(_column).GetValue())) + row.WorksheetRow().Unhide().Dispose(); + else + row.WorksheetRow().Hide().Dispose(); + } + } + else if (condition(row.Cell(_column).GetValue())) + row.WorksheetRow().Unhide().Dispose(); + } + } + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/XLFilter.cs b/ClosedXML/Excel/AutoFilters/XLFilter.cs index cf3d8b6..f91231e 100644 --- a/ClosedXML/Excel/AutoFilters/XLFilter.cs +++ b/ClosedXML/Excel/AutoFilters/XLFilter.cs @@ -1,22 +1,22 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public enum XLConnector { And, Or } - public enum XLFilterOperator { Equal, NotEqual, GreaterThan, LessThan, EqualOrGreaterThan, EqualOrLessThan } - internal class XLFilter - { - public XLFilter(XLFilterOperator op = XLFilterOperator.Equal) - { - Operator = op; - } - - public XLFilterOperator Operator { get; set; } - public Object Value { get; set; } - public XLConnector Connector { get; set; } - public Func Condition { get; set; } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLConnector { And, Or } + public enum XLFilterOperator { Equal, NotEqual, GreaterThan, LessThan, EqualOrGreaterThan, EqualOrLessThan } + internal class XLFilter + { + public XLFilter(XLFilterOperator op = XLFilterOperator.Equal) + { + Operator = op; + } + + public XLFilterOperator Operator { get; set; } + public Object Value { get; set; } + public XLConnector Connector { get; set; } + public Func Condition { get; set; } + } +} diff --git a/ClosedXML/Excel/AutoFilters/XLFilterColumn.cs b/ClosedXML/Excel/AutoFilters/XLFilterColumn.cs index 11eb172..a045910 100644 --- a/ClosedXML/Excel/AutoFilters/XLFilterColumn.cs +++ b/ClosedXML/Excel/AutoFilters/XLFilterColumn.cs @@ -1,393 +1,393 @@ -using System; -using System.Linq; - -namespace ClosedXML.Excel -{ - using System.Collections.Generic; - - internal class XLFilterColumn : IXLFilterColumn - { - private readonly XLAutoFilter _autoFilter; - private readonly Int32 _column; - - public XLFilterColumn(XLAutoFilter autoFilter, Int32 column) - { - _autoFilter = autoFilter; - _column = column; - } - - #region IXLFilterColumn Members - - public void Clear() - { - if (_autoFilter.Filters.ContainsKey(_column)) - _autoFilter.Filters.Remove(_column); - } - - public IXLFilteredColumn AddFilter(T value) where T: IComparable - { - if (typeof(T) == typeof(String)) - { - ApplyCustomFilter(value, XLFilterOperator.Equal, - v => - v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase), - XLFilterType.Regular); - } - else - { - ApplyCustomFilter(value, XLFilterOperator.Equal, - v => v.CastTo().CompareTo(value) == 0, XLFilterType.Regular); - } - return new XLFilteredColumn(_autoFilter, _column); - } - - public void Top(Int32 value, XLTopBottomType type = XLTopBottomType.Items) - { - _autoFilter.Column(_column).TopBottomPart = XLTopBottomPart.Top; - SetTopBottom(value, type); - } - - public void Bottom(Int32 value, XLTopBottomType type = XLTopBottomType.Items) - { - _autoFilter.Column(_column).TopBottomPart = XLTopBottomPart.Bottom; - SetTopBottom(value, type, false); - } - - public void AboveAverage() - { - ShowAverage(true); - } - - public void BelowAverage() - { - ShowAverage(false); - } - - public IXLFilterConnector EqualTo(T value) where T: IComparable - { - if (typeof(T) == typeof(String)) - { - return ApplyCustomFilter(value, XLFilterOperator.Equal, - v => - v.ToString().Equals(value.ToString(), - StringComparison.InvariantCultureIgnoreCase)); - } - - return ApplyCustomFilter(value, XLFilterOperator.Equal, - v => v.CastTo().CompareTo(value) == 0); - } - - public IXLFilterConnector NotEqualTo(T value) where T: IComparable - { - if (typeof(T) == typeof(String)) - { - return ApplyCustomFilter(value, XLFilterOperator.NotEqual, - v => - !v.ToString().Equals(value.ToString(), - StringComparison.InvariantCultureIgnoreCase)); - } - - return ApplyCustomFilter(value, XLFilterOperator.NotEqual, - v => v.CastTo().CompareTo(value) != 0); - } - - public IXLFilterConnector GreaterThan(T value) where T: IComparable - { - return ApplyCustomFilter(value, XLFilterOperator.GreaterThan, - v => v.CastTo().CompareTo(value) > 0); - } - - public IXLFilterConnector LessThan(T value) where T: IComparable - { - return ApplyCustomFilter(value, XLFilterOperator.LessThan, - v => v.CastTo().CompareTo(value) < 0); - } - - public IXLFilterConnector EqualOrGreaterThan(T value) where T: IComparable - { - return ApplyCustomFilter(value, XLFilterOperator.EqualOrGreaterThan, - v => v.CastTo().CompareTo(value) >= 0); - } - - public IXLFilterConnector EqualOrLessThan(T value) where T: IComparable - { - return ApplyCustomFilter(value, XLFilterOperator.EqualOrLessThan, - v => v.CastTo().CompareTo(value) <= 0); - } - - public void Between(T minValue, T maxValue) where T: IComparable - { - EqualOrGreaterThan(minValue).And.EqualOrLessThan(maxValue); - } - - public void NotBetween(T minValue, T maxValue) where T: IComparable - { - LessThan(minValue).Or.GreaterThan(maxValue); - } - - public IXLFilterConnector BeginsWith(String value) - { - return ApplyCustomFilter(value + "*", XLFilterOperator.Equal, - s => ((string)s).StartsWith(value, StringComparison.InvariantCultureIgnoreCase)); - } - - public IXLFilterConnector NotBeginsWith(String value) - { - return ApplyCustomFilter(value + "*", XLFilterOperator.NotEqual, - s => !((string)s).StartsWith(value, StringComparison.InvariantCultureIgnoreCase)); - } - - public IXLFilterConnector EndsWith(String value) - { - return ApplyCustomFilter("*" + value, XLFilterOperator.Equal, - s => ((string)s).EndsWith(value, StringComparison.InvariantCultureIgnoreCase)); - } - - public IXLFilterConnector NotEndsWith(String value) - { - return ApplyCustomFilter("*" + value, XLFilterOperator.NotEqual, - s => !((string)s).EndsWith(value, StringComparison.InvariantCultureIgnoreCase)); - } - - public IXLFilterConnector Contains(String value) - { - return ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, - s => ((string)s).ToLower().Contains(value.ToLower())); - } - - public IXLFilterConnector NotContains(String value) - { - return ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, - s => !((string)s).ToLower().Contains(value.ToLower())); - } - - public XLFilterType FilterType { get; set; } - - public Int32 TopBottomValue { get; set; } - public XLTopBottomType TopBottomType { get; set; } - public XLTopBottomPart TopBottomPart { get; set; } - - public XLFilterDynamicType DynamicType { get; set; } - public Double DynamicValue { get; set; } - - #endregion - - private void SetTopBottom(Int32 value, XLTopBottomType type, Boolean takeTop = true) - { - _autoFilter.Enabled = true; - _autoFilter.Column(_column).SetFilterType(XLFilterType.TopBottom) - .SetTopBottomValue(value) - .SetTopBottomType(type); - - var values = GetValues(value, type, takeTop); - - Clear(); - _autoFilter.Filters.Add(_column, new List()); - - Boolean addToList = true; - var ws = _autoFilter.Range.Worksheet as XLWorksheet; - ws.SuspendEvents(); - var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); - foreach (IXLRangeRow row in rows) - { - Boolean foundOne = false; - foreach (double val in values) - { - Func condition = v => (v as IComparable).CompareTo(val) == 0; - if (addToList) - { - _autoFilter.Filters[_column].Add(new XLFilter - { - Value = val, - Operator = XLFilterOperator.Equal, - Connector = XLConnector.Or, - Condition = condition - }); - } - - var cell = row.Cell(_column); - if (cell.DataType != XLCellValues.Number || !condition(cell.GetDouble())) continue; - row.WorksheetRow().Unhide(); - foundOne = true; - } - if (!foundOne) - row.WorksheetRow().Hide(); - - addToList = false; - } - ws.ResumeEvents(); - } - - private IEnumerable GetValues(int value, XLTopBottomType type, bool takeTop) - { - using (var column = _autoFilter.Range.Column(_column)) - { - using (var subColumn = column.Column(2, column.CellCount())) - { - var cellsUsed = subColumn.CellsUsed(c => c.DataType == XLCellValues.Number); - if (takeTop) - { - if (type == XLTopBottomType.Items) - { - return cellsUsed.Select(c => c.GetDouble()).OrderByDescending(d => d).Take(value).Distinct(); - } - var numerics1 = cellsUsed.Select(c => c.GetDouble()); - Int32 valsToTake1 = numerics1.Count() * value / 100; - return numerics1.OrderByDescending(d => d).Take(valsToTake1).Distinct(); - } - - if (type == XLTopBottomType.Items) - { - return cellsUsed.Select(c => c.GetDouble()).OrderBy(d => d).Take(value).Distinct(); - } - - var numerics = cellsUsed.Select(c => c.GetDouble()); - Int32 valsToTake = numerics.Count() * value / 100; - return numerics.OrderBy(d => d).Take(valsToTake).Distinct(); - } - } - } - - private void ShowAverage(Boolean aboveAverage) - { - _autoFilter.Enabled = true; - _autoFilter.Column(_column).SetFilterType(XLFilterType.Dynamic) - .SetDynamicType(aboveAverage - ? XLFilterDynamicType.AboveAverage - : XLFilterDynamicType.BelowAverage); - var values = GetAverageValues(aboveAverage); - - - Clear(); - _autoFilter.Filters.Add(_column, new List()); - - Boolean addToList = true; - var ws = _autoFilter.Range.Worksheet as XLWorksheet; - ws.SuspendEvents(); - var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); - - foreach (IXLRangeRow row in rows) - { - Boolean foundOne = false; - foreach (double val in values) - { - Func condition = v => (v as IComparable).CompareTo(val) == 0; - if (addToList) - { - _autoFilter.Filters[_column].Add(new XLFilter - { - Value = val, - Operator = XLFilterOperator.Equal, - Connector = XLConnector.Or, - Condition = condition - }); - } - - var cell = row.Cell(_column); - if (cell.DataType != XLCellValues.Number || !condition(cell.GetDouble())) continue; - row.WorksheetRow().Unhide(); - foundOne = true; - } - - if (!foundOne) - row.WorksheetRow().Hide(); - - addToList = false; - } - - ws.ResumeEvents(); - } - - private IEnumerable GetAverageValues(bool aboveAverage) - { - using (var column = _autoFilter.Range.Column(_column)) - { - using (var subColumn = column.Column(2, column.CellCount())) - { - Double average = subColumn.CellsUsed(c => c.DataType == XLCellValues.Number).Select(c => c.GetDouble()).Average(); - - if (aboveAverage) - { - return - subColumn.CellsUsed(c => c.DataType == XLCellValues.Number). - Select(c => c.GetDouble()).Where(c => c > average).Distinct(); - } - - return - subColumn.CellsUsed(c => c.DataType == XLCellValues.Number). - Select(c => c.GetDouble()).Where(c => c < average).Distinct(); - - } - } - } - - private IXLFilterConnector ApplyCustomFilter(T value, XLFilterOperator op, Func condition, - XLFilterType filterType = XLFilterType.Custom) - where T: IComparable - { - _autoFilter.Enabled = true; - if (filterType == XLFilterType.Custom) - { - Clear(); - _autoFilter.Filters.Add(_column, - new List - { - new XLFilter - { - Value = value, - Operator = op, - Connector = XLConnector.Or, - Condition = condition - } - }); - } - else - { - List filterList; - if (_autoFilter.Filters.TryGetValue(_column, out filterList)) - filterList.Add(new XLFilter - {Value = value, Operator = op, Connector = XLConnector.Or, Condition = condition}); - else - { - _autoFilter.Filters.Add(_column, - new List - { - new XLFilter - { - Value = value, - Operator = op, - Connector = XLConnector.Or, - Condition = condition - } - }); - } - } - _autoFilter.Column(_column).FilterType = filterType; - Boolean isText = typeof(T) == typeof(String); - var ws = _autoFilter.Range.Worksheet as XLWorksheet; - ws.SuspendEvents(); - var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); - foreach (IXLRangeRow row in rows) - { - Boolean match = isText - ? condition(row.Cell(_column).GetString()) - : row.Cell(_column).DataType == XLCellValues.Number && - condition(row.Cell(_column).GetDouble()); - if (match) - row.WorksheetRow().Unhide(); - else - row.WorksheetRow().Hide(); - } - ws.ResumeEvents(); - return new XLFilterConnector(_autoFilter, _column); - } - - public IXLFilterColumn SetFilterType(XLFilterType value) { FilterType = value; return this; } - public IXLFilterColumn SetTopBottomValue(Int32 value) { TopBottomValue = value; return this; } - public IXLFilterColumn SetTopBottomType(XLTopBottomType value) { TopBottomType = value; return this; } - public IXLFilterColumn SetTopBottomPart(XLTopBottomPart value) { TopBottomPart = value; return this; } - public IXLFilterColumn SetDynamicType(XLFilterDynamicType value) { DynamicType = value; return this; } - public IXLFilterColumn SetDynamicValue(Double value) { DynamicValue = value; return this; } - - } +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections.Generic; + + internal class XLFilterColumn : IXLFilterColumn + { + private readonly XLAutoFilter _autoFilter; + private readonly Int32 _column; + + public XLFilterColumn(XLAutoFilter autoFilter, Int32 column) + { + _autoFilter = autoFilter; + _column = column; + } + + #region IXLFilterColumn Members + + public void Clear() + { + if (_autoFilter.Filters.ContainsKey(_column)) + _autoFilter.Filters.Remove(_column); + } + + public IXLFilteredColumn AddFilter(T value) where T: IComparable + { + if (typeof(T) == typeof(String)) + { + ApplyCustomFilter(value, XLFilterOperator.Equal, + v => + v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase), + XLFilterType.Regular); + } + else + { + ApplyCustomFilter(value, XLFilterOperator.Equal, + v => v.CastTo().CompareTo(value) == 0, XLFilterType.Regular); + } + return new XLFilteredColumn(_autoFilter, _column); + } + + public void Top(Int32 value, XLTopBottomType type = XLTopBottomType.Items) + { + _autoFilter.Column(_column).TopBottomPart = XLTopBottomPart.Top; + SetTopBottom(value, type); + } + + public void Bottom(Int32 value, XLTopBottomType type = XLTopBottomType.Items) + { + _autoFilter.Column(_column).TopBottomPart = XLTopBottomPart.Bottom; + SetTopBottom(value, type, false); + } + + public void AboveAverage() + { + ShowAverage(true); + } + + public void BelowAverage() + { + ShowAverage(false); + } + + public IXLFilterConnector EqualTo(T value) where T: IComparable + { + if (typeof(T) == typeof(String)) + { + return ApplyCustomFilter(value, XLFilterOperator.Equal, + v => + v.ToString().Equals(value.ToString(), + StringComparison.InvariantCultureIgnoreCase)); + } + + return ApplyCustomFilter(value, XLFilterOperator.Equal, + v => v.CastTo().CompareTo(value) == 0); + } + + public IXLFilterConnector NotEqualTo(T value) where T: IComparable + { + if (typeof(T) == typeof(String)) + { + return ApplyCustomFilter(value, XLFilterOperator.NotEqual, + v => + !v.ToString().Equals(value.ToString(), + StringComparison.InvariantCultureIgnoreCase)); + } + + return ApplyCustomFilter(value, XLFilterOperator.NotEqual, + v => v.CastTo().CompareTo(value) != 0); + } + + public IXLFilterConnector GreaterThan(T value) where T: IComparable + { + return ApplyCustomFilter(value, XLFilterOperator.GreaterThan, + v => v.CastTo().CompareTo(value) > 0); + } + + public IXLFilterConnector LessThan(T value) where T: IComparable + { + return ApplyCustomFilter(value, XLFilterOperator.LessThan, + v => v.CastTo().CompareTo(value) < 0); + } + + public IXLFilterConnector EqualOrGreaterThan(T value) where T: IComparable + { + return ApplyCustomFilter(value, XLFilterOperator.EqualOrGreaterThan, + v => v.CastTo().CompareTo(value) >= 0); + } + + public IXLFilterConnector EqualOrLessThan(T value) where T: IComparable + { + return ApplyCustomFilter(value, XLFilterOperator.EqualOrLessThan, + v => v.CastTo().CompareTo(value) <= 0); + } + + public void Between(T minValue, T maxValue) where T: IComparable + { + EqualOrGreaterThan(minValue).And.EqualOrLessThan(maxValue); + } + + public void NotBetween(T minValue, T maxValue) where T: IComparable + { + LessThan(minValue).Or.GreaterThan(maxValue); + } + + public IXLFilterConnector BeginsWith(String value) + { + return ApplyCustomFilter(value + "*", XLFilterOperator.Equal, + s => ((string)s).StartsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public IXLFilterConnector NotBeginsWith(String value) + { + return ApplyCustomFilter(value + "*", XLFilterOperator.NotEqual, + s => !((string)s).StartsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public IXLFilterConnector EndsWith(String value) + { + return ApplyCustomFilter("*" + value, XLFilterOperator.Equal, + s => ((string)s).EndsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public IXLFilterConnector NotEndsWith(String value) + { + return ApplyCustomFilter("*" + value, XLFilterOperator.NotEqual, + s => !((string)s).EndsWith(value, StringComparison.InvariantCultureIgnoreCase)); + } + + public IXLFilterConnector Contains(String value) + { + return ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, + s => ((string)s).ToLower().Contains(value.ToLower())); + } + + public IXLFilterConnector NotContains(String value) + { + return ApplyCustomFilter("*" + value + "*", XLFilterOperator.Equal, + s => !((string)s).ToLower().Contains(value.ToLower())); + } + + public XLFilterType FilterType { get; set; } + + public Int32 TopBottomValue { get; set; } + public XLTopBottomType TopBottomType { get; set; } + public XLTopBottomPart TopBottomPart { get; set; } + + public XLFilterDynamicType DynamicType { get; set; } + public Double DynamicValue { get; set; } + + #endregion + + private void SetTopBottom(Int32 value, XLTopBottomType type, Boolean takeTop = true) + { + _autoFilter.Enabled = true; + _autoFilter.Column(_column).SetFilterType(XLFilterType.TopBottom) + .SetTopBottomValue(value) + .SetTopBottomType(type); + + var values = GetValues(value, type, takeTop); + + Clear(); + _autoFilter.Filters.Add(_column, new List()); + + Boolean addToList = true; + var ws = _autoFilter.Range.Worksheet as XLWorksheet; + ws.SuspendEvents(); + var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); + foreach (IXLRangeRow row in rows) + { + Boolean foundOne = false; + foreach (double val in values) + { + Func condition = v => (v as IComparable).CompareTo(val) == 0; + if (addToList) + { + _autoFilter.Filters[_column].Add(new XLFilter + { + Value = val, + Operator = XLFilterOperator.Equal, + Connector = XLConnector.Or, + Condition = condition + }); + } + + var cell = row.Cell(_column); + if (cell.DataType != XLCellValues.Number || !condition(cell.GetDouble())) continue; + row.WorksheetRow().Unhide(); + foundOne = true; + } + if (!foundOne) + row.WorksheetRow().Hide(); + + addToList = false; + } + ws.ResumeEvents(); + } + + private IEnumerable GetValues(int value, XLTopBottomType type, bool takeTop) + { + using (var column = _autoFilter.Range.Column(_column)) + { + using (var subColumn = column.Column(2, column.CellCount())) + { + var cellsUsed = subColumn.CellsUsed(c => c.DataType == XLCellValues.Number); + if (takeTop) + { + if (type == XLTopBottomType.Items) + { + return cellsUsed.Select(c => c.GetDouble()).OrderByDescending(d => d).Take(value).Distinct(); + } + var numerics1 = cellsUsed.Select(c => c.GetDouble()); + Int32 valsToTake1 = numerics1.Count() * value / 100; + return numerics1.OrderByDescending(d => d).Take(valsToTake1).Distinct(); + } + + if (type == XLTopBottomType.Items) + { + return cellsUsed.Select(c => c.GetDouble()).OrderBy(d => d).Take(value).Distinct(); + } + + var numerics = cellsUsed.Select(c => c.GetDouble()); + Int32 valsToTake = numerics.Count() * value / 100; + return numerics.OrderBy(d => d).Take(valsToTake).Distinct(); + } + } + } + + private void ShowAverage(Boolean aboveAverage) + { + _autoFilter.Enabled = true; + _autoFilter.Column(_column).SetFilterType(XLFilterType.Dynamic) + .SetDynamicType(aboveAverage + ? XLFilterDynamicType.AboveAverage + : XLFilterDynamicType.BelowAverage); + var values = GetAverageValues(aboveAverage); + + + Clear(); + _autoFilter.Filters.Add(_column, new List()); + + Boolean addToList = true; + var ws = _autoFilter.Range.Worksheet as XLWorksheet; + ws.SuspendEvents(); + var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); + + foreach (IXLRangeRow row in rows) + { + Boolean foundOne = false; + foreach (double val in values) + { + Func condition = v => (v as IComparable).CompareTo(val) == 0; + if (addToList) + { + _autoFilter.Filters[_column].Add(new XLFilter + { + Value = val, + Operator = XLFilterOperator.Equal, + Connector = XLConnector.Or, + Condition = condition + }); + } + + var cell = row.Cell(_column); + if (cell.DataType != XLCellValues.Number || !condition(cell.GetDouble())) continue; + row.WorksheetRow().Unhide(); + foundOne = true; + } + + if (!foundOne) + row.WorksheetRow().Hide(); + + addToList = false; + } + + ws.ResumeEvents(); + } + + private IEnumerable GetAverageValues(bool aboveAverage) + { + using (var column = _autoFilter.Range.Column(_column)) + { + using (var subColumn = column.Column(2, column.CellCount())) + { + Double average = subColumn.CellsUsed(c => c.DataType == XLCellValues.Number).Select(c => c.GetDouble()).Average(); + + if (aboveAverage) + { + return + subColumn.CellsUsed(c => c.DataType == XLCellValues.Number). + Select(c => c.GetDouble()).Where(c => c > average).Distinct(); + } + + return + subColumn.CellsUsed(c => c.DataType == XLCellValues.Number). + Select(c => c.GetDouble()).Where(c => c < average).Distinct(); + + } + } + } + + private IXLFilterConnector ApplyCustomFilter(T value, XLFilterOperator op, Func condition, + XLFilterType filterType = XLFilterType.Custom) + where T: IComparable + { + _autoFilter.Enabled = true; + if (filterType == XLFilterType.Custom) + { + Clear(); + _autoFilter.Filters.Add(_column, + new List + { + new XLFilter + { + Value = value, + Operator = op, + Connector = XLConnector.Or, + Condition = condition + } + }); + } + else + { + List filterList; + if (_autoFilter.Filters.TryGetValue(_column, out filterList)) + filterList.Add(new XLFilter + {Value = value, Operator = op, Connector = XLConnector.Or, Condition = condition}); + else + { + _autoFilter.Filters.Add(_column, + new List + { + new XLFilter + { + Value = value, + Operator = op, + Connector = XLConnector.Or, + Condition = condition + } + }); + } + } + _autoFilter.Column(_column).FilterType = filterType; + Boolean isText = typeof(T) == typeof(String); + var ws = _autoFilter.Range.Worksheet as XLWorksheet; + ws.SuspendEvents(); + var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount()); + foreach (IXLRangeRow row in rows) + { + Boolean match = isText + ? condition(row.Cell(_column).GetString()) + : row.Cell(_column).DataType == XLCellValues.Number && + condition(row.Cell(_column).GetDouble()); + if (match) + row.WorksheetRow().Unhide(); + else + row.WorksheetRow().Hide(); + } + ws.ResumeEvents(); + return new XLFilterConnector(_autoFilter, _column); + } + + public IXLFilterColumn SetFilterType(XLFilterType value) { FilterType = value; return this; } + public IXLFilterColumn SetTopBottomValue(Int32 value) { TopBottomValue = value; return this; } + public IXLFilterColumn SetTopBottomType(XLTopBottomType value) { TopBottomType = value; return this; } + public IXLFilterColumn SetTopBottomPart(XLTopBottomPart value) { TopBottomPart = value; return this; } + public IXLFilterColumn SetDynamicType(XLFilterDynamicType value) { DynamicType = value; return this; } + public IXLFilterColumn SetDynamicValue(Double value) { DynamicValue = value; return this; } + + } } \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/XLFilterConnector.cs b/ClosedXML/Excel/AutoFilters/XLFilterConnector.cs index b563fd5..3aac0ec 100644 --- a/ClosedXML/Excel/AutoFilters/XLFilterConnector.cs +++ b/ClosedXML/Excel/AutoFilters/XLFilterConnector.cs @@ -1,33 +1,33 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLFilterConnector : IXLFilterConnector - { - private readonly XLAutoFilter _autoFilter; - private readonly Int32 _column; - - public XLFilterConnector(XLAutoFilter autoFilter, Int32 column) - { - _autoFilter = autoFilter; - _column = column; - } - - #region IXLFilterConnector Members - - public IXLCustomFilteredColumn And - { - get { return new XLCustomFilteredColumn(_autoFilter, _column, XLConnector.And); } - } - - public IXLCustomFilteredColumn Or - { - get { return new XLCustomFilteredColumn(_autoFilter, _column, XLConnector.Or); } - } - - #endregion - } +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLFilterConnector : IXLFilterConnector + { + private readonly XLAutoFilter _autoFilter; + private readonly Int32 _column; + + public XLFilterConnector(XLAutoFilter autoFilter, Int32 column) + { + _autoFilter = autoFilter; + _column = column; + } + + #region IXLFilterConnector Members + + public IXLCustomFilteredColumn And + { + get { return new XLCustomFilteredColumn(_autoFilter, _column, XLConnector.And); } + } + + public IXLCustomFilteredColumn Or + { + get { return new XLCustomFilteredColumn(_autoFilter, _column, XLConnector.Or); } + } + + #endregion + } } \ No newline at end of file diff --git a/ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs b/ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs index 72479d0..f9d2bd3 100644 --- a/ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs +++ b/ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs @@ -1,61 +1,61 @@ -using System; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLFilteredColumn : IXLFilteredColumn - { - private readonly XLAutoFilter _autoFilter; - private readonly Int32 _column; - - public XLFilteredColumn(XLAutoFilter autoFilter, Int32 column) - { - _autoFilter = autoFilter; - _column = column; - } - - #region IXLFilteredColumn Members - - public IXLFilteredColumn AddFilter(T value) where T: IComparable - { - Func condition; - Boolean isText; - if (typeof(T) == typeof(String)) - { - condition = v => v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase); - isText = true; - } - else - { - condition = v => v.CastTo().CompareTo(value) == 0; - isText = false; - } - - _autoFilter.Filters[_column].Add(new XLFilter - { - Value = value, - Condition = condition, - Operator = XLFilterOperator.Equal, - Connector = XLConnector.Or - }); - - using (var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount())) - { - foreach (IXLRangeRow row in rows) - { - if ((isText && condition(row.Cell(_column).GetString())) || ( - !isText && - row.Cell(_column).DataType == - XLCellValues.Number && - condition( - row.Cell(_column).GetValue())) - ) - row.WorksheetRow().Unhide().Dispose(); - } - } - return this; - } - - #endregion - } +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLFilteredColumn : IXLFilteredColumn + { + private readonly XLAutoFilter _autoFilter; + private readonly Int32 _column; + + public XLFilteredColumn(XLAutoFilter autoFilter, Int32 column) + { + _autoFilter = autoFilter; + _column = column; + } + + #region IXLFilteredColumn Members + + public IXLFilteredColumn AddFilter(T value) where T: IComparable + { + Func condition; + Boolean isText; + if (typeof(T) == typeof(String)) + { + condition = v => v.ToString().Equals(value.ToString(), StringComparison.InvariantCultureIgnoreCase); + isText = true; + } + else + { + condition = v => v.CastTo().CompareTo(value) == 0; + isText = false; + } + + _autoFilter.Filters[_column].Add(new XLFilter + { + Value = value, + Condition = condition, + Operator = XLFilterOperator.Equal, + Connector = XLConnector.Or + }); + + using (var rows = _autoFilter.Range.Rows(2, _autoFilter.Range.RowCount())) + { + foreach (IXLRangeRow row in rows) + { + if ((isText && condition(row.Cell(_column).GetString())) || ( + !isText && + row.Cell(_column).DataType == + XLCellValues.Number && + condition( + row.Cell(_column).GetValue())) + ) + row.WorksheetRow().Unhide().Dispose(); + } + } + return this; + } + + #endregion + } } \ No newline at end of file diff --git a/ClosedXML/Excel/CalcEngine/CalcEngine.cs b/ClosedXML/Excel/CalcEngine/CalcEngine.cs index 1738b2f..71e3d72 100644 --- a/ClosedXML/Excel/CalcEngine/CalcEngine.cs +++ b/ClosedXML/Excel/CalcEngine/CalcEngine.cs @@ -1,831 +1,832 @@ -using ClosedXML.Excel.CalcEngine.Functions; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; - -namespace ClosedXML.Excel.CalcEngine -{ - /// - /// CalcEngine parses strings and returns Expression objects that can - /// be evaluated. - /// - /// - /// This class has three extensibility points: - /// Use the DataContext property to add an object's properties to the engine scope. - /// Use the RegisterFunction method to define custom functions. - /// Override the GetExternalObject method to add arbitrary variables to the engine scope. - /// - internal class CalcEngine - { - //--------------------------------------------------------------------------- - - #region ** fields - - // members - private string _expr; // expression being parsed - - private int _len; // length of the expression being parsed - private int _ptr; // current pointer into expression - private char[] _idChars; // valid characters in identifiers (besides alpha and digits) - private Token _token; // current token being parsed - private Dictionary _tkTbl; // table with tokens (+, -, etc) - private Dictionary _fnTbl; // table with constants and functions (pi, sin, etc) - private Dictionary _vars; // table with variables - private object _dataContext; // object with properties - private bool _optimize; // optimize expressions when parsing - private ExpressionCache _cache; // cache with parsed expressions - private CultureInfo _ci; // culture info used to parse numbers/dates - private char _decimal, _listSep, _percent; // localized decimal separator, list separator, percent sign - - #endregion ** fields - - //--------------------------------------------------------------------------- - - #region ** ctor - - public CalcEngine() - { - CultureInfo = CultureInfo.InvariantCulture; - _tkTbl = GetSymbolTable(); - _fnTbl = GetFunctionTable(); - _vars = new Dictionary(StringComparer.OrdinalIgnoreCase); - _cache = new ExpressionCache(this); - _optimize = true; -#if DEBUG - //this.Test(); -#endif - } - - #endregion ** ctor - - //--------------------------------------------------------------------------- - - #region ** object model - - /// - /// Parses a string into an . - /// - /// String to parse. - /// An object that can be evaluated. - public Expression Parse(string expression) - { - // initialize - _expr = expression; - _len = _expr.Length; - _ptr = 0; - - // skip leading equals sign - if (_len > 0 && _expr[0] == '=') - { - _ptr++; - } - - // parse the expression - var expr = ParseExpression(); - - // check for errors - if (_token.ID != TKID.END) - { - Throw(); - } - - // optimize expression - if (_optimize) - { - expr = expr.Optimize(); - } - - // done - return expr; - } - - /// - /// Evaluates a string. - /// - /// Expression to evaluate. - /// The value of the expression. - /// - /// If you are going to evaluate the same expression several times, - /// it is more efficient to parse it only once using the - /// method and then using the Expression.Evaluate method to evaluate - /// the parsed expression. - /// - public object Evaluate(string expression) - { - var x = //Parse(expression); - _cache != null - ? _cache[expression] - : Parse(expression); - return x.Evaluate(); - } - - /// - /// Gets or sets whether the calc engine should keep a cache with parsed - /// expressions. - /// - public bool CacheExpressions - { - get { return _cache != null; } - set - { - if (value != CacheExpressions) - { - _cache = value - ? new ExpressionCache(this) - : null; - } - } - } - - /// - /// Gets or sets whether the calc engine should optimize expressions when - /// they are parsed. - /// - public bool OptimizeExpressions - { - get { return _optimize; } - set { _optimize = value; } - } - - /// - /// Gets or sets a string that specifies special characters that are valid for identifiers. - /// - /// - /// Identifiers must start with a letter or an underscore, which may be followed by - /// additional letters, underscores, or digits. This string allows you to specify - /// additional valid characters such as ':' or '!' (used in Excel range references - /// for example). - /// - public char[] IdentifierChars - { - get { return _idChars; } - set { _idChars = value; } - } - - /// - /// Registers a function that can be evaluated by this . - /// - /// Function name. - /// Minimum parameter count. - /// Maximum parameter count. - /// Delegate that evaluates the function. - public void RegisterFunction(string functionName, int parmMin, int parmMax, CalcEngineFunction fn) - { - _fnTbl.Add(functionName, new FunctionDefinition(parmMin, parmMax, fn)); - } - - /// - /// Registers a function that can be evaluated by this . - /// - /// Function name. - /// Parameter count. - /// Delegate that evaluates the function. - public void RegisterFunction(string functionName, int parmCount, CalcEngineFunction fn) - { - RegisterFunction(functionName, parmCount, parmCount, fn); - } - - /// - /// Gets an external object based on an identifier. - /// - /// - /// This method is useful when the engine needs to create objects dynamically. - /// For example, a spreadsheet calc engine would use this method to dynamically create cell - /// range objects based on identifiers that cannot be enumerated at design time - /// (such as "AB12", "A1:AB12", etc.) - /// - public virtual object GetExternalObject(string identifier) - { - return null; - } - - /// - /// Gets or sets the DataContext for this . - /// - /// - /// Once a DataContext is set, all public properties of the object become available - /// to the CalcEngine, including sub-properties such as "Address.Street". These may - /// be used with expressions just like any other constant. - /// - public virtual object DataContext - { - get { return _dataContext; } - set { _dataContext = value; } - } - - /// - /// Gets the dictionary that contains function definitions. - /// - public Dictionary Functions - { - get { return _fnTbl; } - } - - /// - /// Gets the dictionary that contains simple variables (not in the DataContext). - /// - public Dictionary Variables - { - get { return _vars; } - } - - /// - /// Gets or sets the to use when parsing numbers and dates. - /// - public CultureInfo CultureInfo - { - get { return _ci; } - set - { - _ci = value; - var nf = _ci.NumberFormat; - _decimal = nf.NumberDecimalSeparator[0]; - _percent = nf.PercentSymbol[0]; - _listSep = _ci.TextInfo.ListSeparator[0]; - } - } - - #endregion ** object model - - //--------------------------------------------------------------------------- - - #region ** token/keyword tables - - // build/get static token table - private Dictionary GetSymbolTable() - { - if (_tkTbl == null) - { - _tkTbl = new Dictionary(); - AddToken('&', TKID.CONCAT, TKTYPE.ADDSUB); - AddToken('+', TKID.ADD, TKTYPE.ADDSUB); - AddToken('-', TKID.SUB, TKTYPE.ADDSUB); - AddToken('(', TKID.OPEN, TKTYPE.GROUP); - AddToken(')', TKID.CLOSE, TKTYPE.GROUP); - AddToken('*', TKID.MUL, TKTYPE.MULDIV); - AddToken('.', TKID.PERIOD, TKTYPE.GROUP); - AddToken('/', TKID.DIV, TKTYPE.MULDIV); - AddToken('\\', TKID.DIVINT, TKTYPE.MULDIV); - AddToken('=', TKID.EQ, TKTYPE.COMPARE); - AddToken('>', TKID.GT, TKTYPE.COMPARE); - AddToken('<', TKID.LT, TKTYPE.COMPARE); - AddToken('^', TKID.POWER, TKTYPE.POWER); - AddToken("<>", TKID.NE, TKTYPE.COMPARE); - AddToken(">=", TKID.GE, TKTYPE.COMPARE); - AddToken("<=", TKID.LE, TKTYPE.COMPARE); - - // list separator is localized, not necessarily a comma - // so it can't be on the static table - //AddToken(',', TKID.COMMA, TKTYPE.GROUP); - } - return _tkTbl; - } - - private void AddToken(object symbol, TKID id, TKTYPE type) - { - var token = new Token(symbol, id, type); - _tkTbl.Add(symbol, token); - } - - // build/get static keyword table - private Dictionary GetFunctionTable() - { - if (_fnTbl == null) - { - // create table - _fnTbl = new Dictionary(StringComparer.InvariantCultureIgnoreCase); - - // register built-in functions (and constants) - Information.Register(this); - Logical.Register(this); - Lookup.Register(this); - MathTrig.Register(this); - Text.Register(this); - Statistical.Register(this); - DateAndTime.Register(this); - } - return _fnTbl; - } - - #endregion ** token/keyword tables - - //--------------------------------------------------------------------------- - - #region ** private stuff - - private Expression ParseExpression() - { - GetToken(); - return ParseCompare(); - } - - private Expression ParseCompare() - { - var x = ParseAddSub(); - while (_token.Type == TKTYPE.COMPARE) - { - var t = _token; - GetToken(); - var exprArg = ParseAddSub(); - x = new BinaryExpression(t, x, exprArg); - } - return x; - } - - private Expression ParseAddSub() - { - var x = ParseMulDiv(); - while (_token.Type == TKTYPE.ADDSUB) - { - var t = _token; - GetToken(); - var exprArg = ParseMulDiv(); - x = new BinaryExpression(t, x, exprArg); - } - return x; - } - - private Expression ParseMulDiv() - { - var x = ParsePower(); - while (_token.Type == TKTYPE.MULDIV) - { - var t = _token; - GetToken(); - var a = ParsePower(); - x = new BinaryExpression(t, x, a); - } - return x; - } - - private Expression ParsePower() - { - var x = ParseUnary(); - while (_token.Type == TKTYPE.POWER) - { - var t = _token; - GetToken(); - var a = ParseUnary(); - x = new BinaryExpression(t, x, a); - } - return x; - } - - private Expression ParseUnary() - { - // unary plus and minus - if (_token.ID == TKID.ADD || _token.ID == TKID.SUB) - { - var t = _token; - GetToken(); - var a = ParseAtom(); - return new UnaryExpression(t, a); - } - - // not unary, return atom - return ParseAtom(); - } - - private Expression ParseAtom() - { - string id; - Expression x = null; - FunctionDefinition fnDef = null; - - switch (_token.Type) - { - // literals - case TKTYPE.LITERAL: - x = new Expression(_token); - break; - - // identifiers - case TKTYPE.IDENTIFIER: - - // get identifier - id = (string)_token.Value; - - // look for functions - if (_fnTbl.TryGetValue(id, out fnDef)) - { - var p = GetParameters(); - var pCnt = p == null ? 0 : p.Count; - if (fnDef.ParmMin != -1 && pCnt < fnDef.ParmMin) - { - Throw("Too few parameters."); - } - if (fnDef.ParmMax != -1 && pCnt > fnDef.ParmMax) - { - Throw("Too many parameters."); - } - x = new FunctionExpression(fnDef, p); - break; - } - - // look for simple variables (much faster than binding!) - if (_vars.ContainsKey(id)) - { - x = new VariableExpression(_vars, id); - break; - } - - // look for external objects - var xObj = GetExternalObject(id); - if (xObj != null) - { - x = new XObjectExpression(xObj); - break; - } - - Throw("Unexpected identifier"); - break; - - // sub-expressions - case TKTYPE.GROUP: - - // anything other than opening parenthesis is illegal here - if (_token.ID != TKID.OPEN) - { - Throw("Expression expected."); - } - - // get expression - GetToken(); - x = ParseCompare(); - - // check that the parenthesis was closed - if (_token.ID != TKID.CLOSE) - { - Throw("Unbalanced parenthesis."); - } - - break; - } - - // make sure we got something... - if (x == null) - { - Throw(); - } - - // done - GetToken(); - return x; - } - - #endregion ** private stuff - - //--------------------------------------------------------------------------- - - #region ** parser - - private static IDictionary matchingClosingSymbols = new Dictionary() - { - { '\'', '\'' }, - { '[', ']' } - }; - - private void GetToken() - { - // eat white space - while (_ptr < _len && _expr[_ptr] <= ' ') - { - _ptr++; - } - - // are we done? - if (_ptr >= _len) - { - _token = new Token(null, TKID.END, TKTYPE.GROUP); - return; - } - - // prepare to parse - int i; - var c = _expr[_ptr]; - - // operators - // this gets called a lot, so it's pretty optimized. - // note that operators must start with non-letter/digit characters. - var isLetter = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); - var isDigit = c >= '0' && c <= '9'; - - var isEnclosed = matchingClosingSymbols.Keys.Contains(c); - char matchingClosingSymbol = '\0'; - if (isEnclosed) - matchingClosingSymbol = matchingClosingSymbols[c]; - - if (!isLetter && !isDigit && !isEnclosed) - { - // if this is a number starting with a decimal, don't parse as operator - var nxt = _ptr + 1 < _len ? _expr[_ptr + 1] : 0; - bool isNumber = c == _decimal && nxt >= '0' && nxt <= '9'; - if (!isNumber) - { - // look up localized list separator - if (c == _listSep) - { - _token = new Token(c, TKID.COMMA, TKTYPE.GROUP); - _ptr++; - return; - } - - // look up single-char tokens on table - Token tk; - if (_tkTbl.TryGetValue(c, out tk)) - { - // save token we found - _token = tk; - _ptr++; - - // look for double-char tokens (special case) - if (_ptr < _len && (c == '>' || c == '<')) - { - if (_tkTbl.TryGetValue(_expr.Substring(_ptr - 1, 2), out tk)) - { - _token = tk; - _ptr++; - } - } - - // found token on the table - return; - } - } - } - - // parse numbers - if (isDigit || c == _decimal) - { - var sci = false; - var pct = false; - var div = -1.0; // use double, not int (this may get really big) - var val = 0.0; - for (i = 0; i + _ptr < _len; i++) - { - c = _expr[_ptr + i]; - - // digits always OK - if (c >= '0' && c <= '9') - { - val = val * 10 + (c - '0'); - if (div > -1) - { - div *= 10; - } - continue; - } - - // one decimal is OK - if (c == _decimal && div < 0) - { - div = 1; - continue; - } - - // scientific notation? - if ((c == 'E' || c == 'e') && !sci) - { - sci = true; - c = _expr[_ptr + i + 1]; - if (c == '+' || c == '-') i++; - continue; - } - - // percentage? - if (c == _percent) - { - pct = true; - i++; - break; - } - - // end of literal - break; - } - - // end of number, get value - if (!sci) - { - // much faster than ParseDouble - if (div > 1) - { - val /= div; - } - if (pct) - { - val /= 100.0; - } - } - else - { - var lit = _expr.Substring(_ptr, i); - val = ParseDouble(lit, _ci); - } - - if (c != ':') - { - // build token - _token = new Token(val, TKID.ATOM, TKTYPE.LITERAL); - - // advance pointer and return - _ptr += i; - return; - } - } - - // parse strings - if (c == '\"') - { - // look for end quote, skip double quotes - for (i = 1; i + _ptr < _len; i++) - { - c = _expr[_ptr + i]; - if (c != '\"') continue; - char cNext = i + _ptr < _len - 1 ? _expr[_ptr + i + 1] : ' '; - if (cNext != '\"') break; - i++; - } - - // check that we got the end of the string - if (c != '\"') - { - Throw("Can't find final quote."); - } - - // end of string - var lit = _expr.Substring(_ptr + 1, i - 1); - _ptr += i + 1; - _token = new Token(lit.Replace("\"\"", "\""), TKID.ATOM, TKTYPE.LITERAL); - return; - } - - // parse dates (review) - if (c == '#') - { - // look for end # - for (i = 1; i + _ptr < _len; i++) - { - c = _expr[_ptr + i]; - if (c == '#') break; - } - - // check that we got the end of the date - if (c != '#') - { - Throw("Can't find final date delimiter ('#')."); - } - - // end of date - var lit = _expr.Substring(_ptr + 1, i - 1); - _ptr += i + 1; - _token = new Token(DateTime.Parse(lit, _ci), TKID.ATOM, TKTYPE.LITERAL); - return; - } - - // identifiers (functions, objects) must start with alpha or underscore - if (!isEnclosed && !isLetter && c != '_' && (_idChars == null || !_idChars.Contains(c))) - { - Throw("Identifier expected."); - } - - // and must contain only letters/digits/_idChars - for (i = 1; i + _ptr < _len; i++) - { - c = _expr[_ptr + i]; - isLetter = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); - isDigit = c >= '0' && c <= '9'; - - if (isEnclosed && c == matchingClosingSymbol) - { - isEnclosed = false; - matchingClosingSymbol = '\0'; - - i++; - c = _expr[_ptr + i]; - isLetter = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); - isDigit = c >= '0' && c <= '9'; - } - - var disallowedSymbols = new List() { '\\', '/', '*', '[', ':', '?' }; - if (isEnclosed && disallowedSymbols.Contains(c)) - break; - - var allowedSymbols = new List() { '_' }; - - if (!isLetter && !isDigit - && !(isEnclosed || allowedSymbols.Contains(c)) - && (_idChars == null || !_idChars.Contains(c))) - break; - } - - // got identifier - var id = _expr.Substring(_ptr, i); - _ptr += i; - _token = new Token(id, TKID.ATOM, TKTYPE.IDENTIFIER); - } - - private static double ParseDouble(string str, CultureInfo ci) - { - if (str.Length > 0 && str[str.Length - 1] == ci.NumberFormat.PercentSymbol[0]) - { - str = str.Substring(0, str.Length - 1); - return double.Parse(str, NumberStyles.Any, ci) / 100.0; - } - return double.Parse(str, NumberStyles.Any, ci); - } - - private List GetParameters() // e.g. myfun(a, b, c+2) - { - // check whether next token is a (, - // restore state and bail if it's not - var pos = _ptr; - var tk = _token; - GetToken(); - if (_token.ID != TKID.OPEN) - { - _ptr = pos; - _token = tk; - return null; - } - - // check for empty Parameter list - pos = _ptr; - GetToken(); - if (_token.ID == TKID.CLOSE) - { - return null; - } - _ptr = pos; - - // get Parameters until we reach the end of the list - var parms = new List(); - var expr = ParseExpression(); - parms.Add(expr); - while (_token.ID == TKID.COMMA) - { - expr = ParseExpression(); - parms.Add(expr); - } - - // make sure the list was closed correctly - if (_token.ID != TKID.CLOSE) - { - Throw(); - } - - // done - return parms; - } - - private Token GetMember() - { - // check whether next token is a MEMBER token ('.'), - // restore state and bail if it's not - var pos = _ptr; - var tk = _token; - GetToken(); - if (_token.ID != TKID.PERIOD) - { - _ptr = pos; - _token = tk; - return null; - } - - // skip member token - GetToken(); - if (_token.Type != TKTYPE.IDENTIFIER) - { - Throw("Identifier expected"); - } - return _token; - } - - #endregion ** parser - - //--------------------------------------------------------------------------- - - #region ** static helpers - - private static void Throw() - { - Throw("Syntax error."); - } - - private static void Throw(string msg) - { - throw new Exception(msg); - } - - #endregion ** static helpers - } - - /// - /// Delegate that represents CalcEngine functions. - /// - /// List of objects that represent the - /// parameters to be used in the function call. - /// The function result. - internal delegate object CalcEngineFunction(List parms); -} +using ClosedXML.Excel.CalcEngine.Functions; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace ClosedXML.Excel.CalcEngine +{ + /// + /// CalcEngine parses strings and returns Expression objects that can + /// be evaluated. + /// + /// + /// This class has three extensibility points: + /// Use the DataContext property to add an object's properties to the engine scope. + /// Use the RegisterFunction method to define custom functions. + /// Override the GetExternalObject method to add arbitrary variables to the engine scope. + /// + internal class CalcEngine + { + //--------------------------------------------------------------------------- + + #region ** fields + + // members + private string _expr; // expression being parsed + + private int _len; // length of the expression being parsed + private int _ptr; // current pointer into expression + private char[] _idChars; // valid characters in identifiers (besides alpha and digits) + private Token _token; // current token being parsed + private Dictionary _tkTbl; // table with tokens (+, -, etc) + private Dictionary _fnTbl; // table with constants and functions (pi, sin, etc) + private Dictionary _vars; // table with variables + private object _dataContext; // object with properties + private bool _optimize; // optimize expressions when parsing + private ExpressionCache _cache; // cache with parsed expressions + private CultureInfo _ci; // culture info used to parse numbers/dates + private char _decimal, _listSep, _percent; // localized decimal separator, list separator, percent sign + + #endregion ** fields + + //--------------------------------------------------------------------------- + + #region ** ctor + + public CalcEngine() + { + CultureInfo = CultureInfo.InvariantCulture; + _tkTbl = GetSymbolTable(); + _fnTbl = GetFunctionTable(); + _vars = new Dictionary(StringComparer.OrdinalIgnoreCase); + _cache = new ExpressionCache(this); + _optimize = true; +#if DEBUG + //this.Test(); +#endif + } + + #endregion ** ctor + + //--------------------------------------------------------------------------- + + #region ** object model + + /// + /// Parses a string into an . + /// + /// String to parse. + /// An object that can be evaluated. + public Expression Parse(string expression) + { + // initialize + _expr = expression; + _len = _expr.Length; + _ptr = 0; + + // skip leading equals sign + if (_len > 0 && _expr[0] == '=') + { + _ptr++; + } + + // parse the expression + var expr = ParseExpression(); + + // check for errors + if (_token.ID != TKID.END) + { + Throw(); + } + + // optimize expression + if (_optimize) + { + expr = expr.Optimize(); + } + + // done + return expr; + } + + /// + /// Evaluates a string. + /// + /// Expression to evaluate. + /// The value of the expression. + /// + /// If you are going to evaluate the same expression several times, + /// it is more efficient to parse it only once using the + /// method and then using the Expression.Evaluate method to evaluate + /// the parsed expression. + /// + public object Evaluate(string expression) + { + var x = //Parse(expression); + _cache != null + ? _cache[expression] + : Parse(expression); + return x.Evaluate(); + } + + /// + /// Gets or sets whether the calc engine should keep a cache with parsed + /// expressions. + /// + public bool CacheExpressions + { + get { return _cache != null; } + set + { + if (value != CacheExpressions) + { + _cache = value + ? new ExpressionCache(this) + : null; + } + } + } + + /// + /// Gets or sets whether the calc engine should optimize expressions when + /// they are parsed. + /// + public bool OptimizeExpressions + { + get { return _optimize; } + set { _optimize = value; } + } + + /// + /// Gets or sets a string that specifies special characters that are valid for identifiers. + /// + /// + /// Identifiers must start with a letter or an underscore, which may be followed by + /// additional letters, underscores, or digits. This string allows you to specify + /// additional valid characters such as ':' or '!' (used in Excel range references + /// for example). + /// + public char[] IdentifierChars + { + get { return _idChars; } + set { _idChars = value; } + } + + /// + /// Registers a function that can be evaluated by this . + /// + /// Function name. + /// Minimum parameter count. + /// Maximum parameter count. + /// Delegate that evaluates the function. + public void RegisterFunction(string functionName, int parmMin, int parmMax, CalcEngineFunction fn) + { + _fnTbl.Add(functionName, new FunctionDefinition(parmMin, parmMax, fn)); + } + + /// + /// Registers a function that can be evaluated by this . + /// + /// Function name. + /// Parameter count. + /// Delegate that evaluates the function. + public void RegisterFunction(string functionName, int parmCount, CalcEngineFunction fn) + { + RegisterFunction(functionName, parmCount, parmCount, fn); + } + + /// + /// Gets an external object based on an identifier. + /// + /// + /// This method is useful when the engine needs to create objects dynamically. + /// For example, a spreadsheet calc engine would use this method to dynamically create cell + /// range objects based on identifiers that cannot be enumerated at design time + /// (such as "AB12", "A1:AB12", etc.) + /// + public virtual object GetExternalObject(string identifier) + { + return null; + } + + /// + /// Gets or sets the DataContext for this . + /// + /// + /// Once a DataContext is set, all public properties of the object become available + /// to the CalcEngine, including sub-properties such as "Address.Street". These may + /// be used with expressions just like any other constant. + /// + public virtual object DataContext + { + get { return _dataContext; } + set { _dataContext = value; } + } + + /// + /// Gets the dictionary that contains function definitions. + /// + public Dictionary Functions + { + get { return _fnTbl; } + } + + /// + /// Gets the dictionary that contains simple variables (not in the DataContext). + /// + public Dictionary Variables + { + get { return _vars; } + } + + /// + /// Gets or sets the to use when parsing numbers and dates. + /// + public CultureInfo CultureInfo + { + get { return _ci; } + set + { + _ci = value; + var nf = _ci.NumberFormat; + _decimal = nf.NumberDecimalSeparator[0]; + _percent = nf.PercentSymbol[0]; + _listSep = _ci.TextInfo.ListSeparator[0]; + } + } + + #endregion ** object model + + //--------------------------------------------------------------------------- + + #region ** token/keyword tables + + // build/get static token table + private Dictionary GetSymbolTable() + { + if (_tkTbl == null) + { + _tkTbl = new Dictionary(); + AddToken('&', TKID.CONCAT, TKTYPE.ADDSUB); + AddToken('+', TKID.ADD, TKTYPE.ADDSUB); + AddToken('-', TKID.SUB, TKTYPE.ADDSUB); + AddToken('(', TKID.OPEN, TKTYPE.GROUP); + AddToken(')', TKID.CLOSE, TKTYPE.GROUP); + AddToken('*', TKID.MUL, TKTYPE.MULDIV); + AddToken('.', TKID.PERIOD, TKTYPE.GROUP); + AddToken('/', TKID.DIV, TKTYPE.MULDIV); + AddToken('\\', TKID.DIVINT, TKTYPE.MULDIV); + AddToken('=', TKID.EQ, TKTYPE.COMPARE); + AddToken('>', TKID.GT, TKTYPE.COMPARE); + AddToken('<', TKID.LT, TKTYPE.COMPARE); + AddToken('^', TKID.POWER, TKTYPE.POWER); + AddToken("<>", TKID.NE, TKTYPE.COMPARE); + AddToken(">=", TKID.GE, TKTYPE.COMPARE); + AddToken("<=", TKID.LE, TKTYPE.COMPARE); + + // list separator is localized, not necessarily a comma + // so it can't be on the static table + //AddToken(',', TKID.COMMA, TKTYPE.GROUP); + } + return _tkTbl; + } + + private void AddToken(object symbol, TKID id, TKTYPE type) + { + var token = new Token(symbol, id, type); + _tkTbl.Add(symbol, token); + } + + // build/get static keyword table + private Dictionary GetFunctionTable() + { + if (_fnTbl == null) + { + // create table + _fnTbl = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + + // register built-in functions (and constants) + Information.Register(this); + Logical.Register(this); + Lookup.Register(this); + MathTrig.Register(this); + Text.Register(this); + Statistical.Register(this); + DateAndTime.Register(this); + } + return _fnTbl; + } + + #endregion ** token/keyword tables + + //--------------------------------------------------------------------------- + + #region ** private stuff + + private Expression ParseExpression() + { + GetToken(); + return ParseCompare(); + } + + private Expression ParseCompare() + { + var x = ParseAddSub(); + while (_token.Type == TKTYPE.COMPARE) + { + var t = _token; + GetToken(); + var exprArg = ParseAddSub(); + x = new BinaryExpression(t, x, exprArg); + } + return x; + } + + private Expression ParseAddSub() + { + var x = ParseMulDiv(); + while (_token.Type == TKTYPE.ADDSUB) + { + var t = _token; + GetToken(); + var exprArg = ParseMulDiv(); + x = new BinaryExpression(t, x, exprArg); + } + return x; + } + + private Expression ParseMulDiv() + { + var x = ParsePower(); + while (_token.Type == TKTYPE.MULDIV) + { + var t = _token; + GetToken(); + var a = ParsePower(); + x = new BinaryExpression(t, x, a); + } + return x; + } + + private Expression ParsePower() + { + var x = ParseUnary(); + while (_token.Type == TKTYPE.POWER) + { + var t = _token; + GetToken(); + var a = ParseUnary(); + x = new BinaryExpression(t, x, a); + } + return x; + } + + private Expression ParseUnary() + { + // unary plus and minus + if (_token.ID == TKID.ADD || _token.ID == TKID.SUB) + { + var t = _token; + GetToken(); + var a = ParseAtom(); + return new UnaryExpression(t, a); + } + + // not unary, return atom + return ParseAtom(); + } + + private Expression ParseAtom() + { + string id; + Expression x = null; + FunctionDefinition fnDef = null; + + switch (_token.Type) + { + // literals + case TKTYPE.LITERAL: + x = new Expression(_token); + break; + + // identifiers + case TKTYPE.IDENTIFIER: + + // get identifier + id = (string)_token.Value; + + // look for functions + if (_fnTbl.TryGetValue(id, out fnDef)) + { + var p = GetParameters(); + var pCnt = p == null ? 0 : p.Count; + if (fnDef.ParmMin != -1 && pCnt < fnDef.ParmMin) + { + Throw("Too few parameters."); + } + if (fnDef.ParmMax != -1 && pCnt > fnDef.ParmMax) + { + Throw("Too many parameters."); + } + x = new FunctionExpression(fnDef, p); + break; + } + + // look for simple variables (much faster than binding!) + if (_vars.ContainsKey(id)) + { + x = new VariableExpression(_vars, id); + break; + } + + // look for external objects + var xObj = GetExternalObject(id); + if (xObj != null) + { + x = new XObjectExpression(xObj); + break; + } + + Throw("Unexpected identifier"); + break; + + // sub-expressions + case TKTYPE.GROUP: + + // Normally anything other than opening parenthesis is illegal here + // but Excel allows omitted parameters so return empty value expression. + if (_token.ID != TKID.OPEN) + { + return new EmptyValueExpression(); + } + + // get expression + GetToken(); + x = ParseCompare(); + + // check that the parenthesis was closed + if (_token.ID != TKID.CLOSE) + { + Throw("Unbalanced parenthesis."); + } + + break; + } + + // make sure we got something... + if (x == null) + { + Throw(); + } + + // done + GetToken(); + return x; + } + + #endregion ** private stuff + + //--------------------------------------------------------------------------- + + #region ** parser + + private static IDictionary matchingClosingSymbols = new Dictionary() + { + { '\'', '\'' }, + { '[', ']' } + }; + + private void GetToken() + { + // eat white space + while (_ptr < _len && _expr[_ptr] <= ' ') + { + _ptr++; + } + + // are we done? + if (_ptr >= _len) + { + _token = new Token(null, TKID.END, TKTYPE.GROUP); + return; + } + + // prepare to parse + int i; + var c = _expr[_ptr]; + + // operators + // this gets called a lot, so it's pretty optimized. + // note that operators must start with non-letter/digit characters. + var isLetter = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); + var isDigit = c >= '0' && c <= '9'; + + var isEnclosed = matchingClosingSymbols.Keys.Contains(c); + char matchingClosingSymbol = '\0'; + if (isEnclosed) + matchingClosingSymbol = matchingClosingSymbols[c]; + + if (!isLetter && !isDigit && !isEnclosed) + { + // if this is a number starting with a decimal, don't parse as operator + var nxt = _ptr + 1 < _len ? _expr[_ptr + 1] : 0; + bool isNumber = c == _decimal && nxt >= '0' && nxt <= '9'; + if (!isNumber) + { + // look up localized list separator + if (c == _listSep) + { + _token = new Token(c, TKID.COMMA, TKTYPE.GROUP); + _ptr++; + return; + } + + // look up single-char tokens on table + Token tk; + if (_tkTbl.TryGetValue(c, out tk)) + { + // save token we found + _token = tk; + _ptr++; + + // look for double-char tokens (special case) + if (_ptr < _len && (c == '>' || c == '<')) + { + if (_tkTbl.TryGetValue(_expr.Substring(_ptr - 1, 2), out tk)) + { + _token = tk; + _ptr++; + } + } + + // found token on the table + return; + } + } + } + + // parse numbers + if (isDigit || c == _decimal) + { + var sci = false; + var pct = false; + var div = -1.0; // use double, not int (this may get really big) + var val = 0.0; + for (i = 0; i + _ptr < _len; i++) + { + c = _expr[_ptr + i]; + + // digits always OK + if (c >= '0' && c <= '9') + { + val = val * 10 + (c - '0'); + if (div > -1) + { + div *= 10; + } + continue; + } + + // one decimal is OK + if (c == _decimal && div < 0) + { + div = 1; + continue; + } + + // scientific notation? + if ((c == 'E' || c == 'e') && !sci) + { + sci = true; + c = _expr[_ptr + i + 1]; + if (c == '+' || c == '-') i++; + continue; + } + + // percentage? + if (c == _percent) + { + pct = true; + i++; + break; + } + + // end of literal + break; + } + + // end of number, get value + if (!sci) + { + // much faster than ParseDouble + if (div > 1) + { + val /= div; + } + if (pct) + { + val /= 100.0; + } + } + else + { + var lit = _expr.Substring(_ptr, i); + val = ParseDouble(lit, _ci); + } + + if (c != ':') + { + // build token + _token = new Token(val, TKID.ATOM, TKTYPE.LITERAL); + + // advance pointer and return + _ptr += i; + return; + } + } + + // parse strings + if (c == '\"') + { + // look for end quote, skip double quotes + for (i = 1; i + _ptr < _len; i++) + { + c = _expr[_ptr + i]; + if (c != '\"') continue; + char cNext = i + _ptr < _len - 1 ? _expr[_ptr + i + 1] : ' '; + if (cNext != '\"') break; + i++; + } + + // check that we got the end of the string + if (c != '\"') + { + Throw("Can't find final quote."); + } + + // end of string + var lit = _expr.Substring(_ptr + 1, i - 1); + _ptr += i + 1; + _token = new Token(lit.Replace("\"\"", "\""), TKID.ATOM, TKTYPE.LITERAL); + return; + } + + // parse dates (review) + if (c == '#') + { + // look for end # + for (i = 1; i + _ptr < _len; i++) + { + c = _expr[_ptr + i]; + if (c == '#') break; + } + + // check that we got the end of the date + if (c != '#') + { + Throw("Can't find final date delimiter ('#')."); + } + + // end of date + var lit = _expr.Substring(_ptr + 1, i - 1); + _ptr += i + 1; + _token = new Token(DateTime.Parse(lit, _ci), TKID.ATOM, TKTYPE.LITERAL); + return; + } + + // identifiers (functions, objects) must start with alpha or underscore + if (!isEnclosed && !isLetter && c != '_' && (_idChars == null || !_idChars.Contains(c))) + { + Throw("Identifier expected."); + } + + // and must contain only letters/digits/_idChars + for (i = 1; i + _ptr < _len; i++) + { + c = _expr[_ptr + i]; + isLetter = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); + isDigit = c >= '0' && c <= '9'; + + if (isEnclosed && c == matchingClosingSymbol) + { + isEnclosed = false; + matchingClosingSymbol = '\0'; + + i++; + c = _expr[_ptr + i]; + isLetter = (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); + isDigit = c >= '0' && c <= '9'; + } + + var disallowedSymbols = new List() { '\\', '/', '*', '[', ':', '?' }; + if (isEnclosed && disallowedSymbols.Contains(c)) + break; + + var allowedSymbols = new List() { '_' }; + + if (!isLetter && !isDigit + && !(isEnclosed || allowedSymbols.Contains(c)) + && (_idChars == null || !_idChars.Contains(c))) + break; + } + + // got identifier + var id = _expr.Substring(_ptr, i); + _ptr += i; + _token = new Token(id, TKID.ATOM, TKTYPE.IDENTIFIER); + } + + private static double ParseDouble(string str, CultureInfo ci) + { + if (str.Length > 0 && str[str.Length - 1] == ci.NumberFormat.PercentSymbol[0]) + { + str = str.Substring(0, str.Length - 1); + return double.Parse(str, NumberStyles.Any, ci) / 100.0; + } + return double.Parse(str, NumberStyles.Any, ci); + } + + private List GetParameters() // e.g. myfun(a, b, c+2) + { + // check whether next token is a (, + // restore state and bail if it's not + var pos = _ptr; + var tk = _token; + GetToken(); + if (_token.ID != TKID.OPEN) + { + _ptr = pos; + _token = tk; + return null; + } + + // check for empty Parameter list + pos = _ptr; + GetToken(); + if (_token.ID == TKID.CLOSE) + { + return null; + } + _ptr = pos; + + // get Parameters until we reach the end of the list + var parms = new List(); + var expr = ParseExpression(); + parms.Add(expr); + while (_token.ID == TKID.COMMA) + { + expr = ParseExpression(); + parms.Add(expr); + } + + // make sure the list was closed correctly + if (_token.ID != TKID.CLOSE) + { + Throw(); + } + + // done + return parms; + } + + private Token GetMember() + { + // check whether next token is a MEMBER token ('.'), + // restore state and bail if it's not + var pos = _ptr; + var tk = _token; + GetToken(); + if (_token.ID != TKID.PERIOD) + { + _ptr = pos; + _token = tk; + return null; + } + + // skip member token + GetToken(); + if (_token.Type != TKTYPE.IDENTIFIER) + { + Throw("Identifier expected"); + } + return _token; + } + + #endregion ** parser + + //--------------------------------------------------------------------------- + + #region ** static helpers + + private static void Throw() + { + Throw("Syntax error."); + } + + private static void Throw(string msg) + { + throw new Exception(msg); + } + + #endregion ** static helpers + } + + /// + /// Delegate that represents CalcEngine functions. + /// + /// List of objects that represent the + /// parameters to be used in the function call. + /// The function result. + internal delegate object CalcEngineFunction(List parms); +} diff --git a/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs b/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs index b5853b8..46e96e1 100644 --- a/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs +++ b/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs @@ -1,74 +1,74 @@ -using System; -using System.Diagnostics; -using System.Text.RegularExpressions; - -namespace ClosedXML.Excel.CalcEngine -{ - internal class CalcEngineHelpers - { - internal static bool ValueSatisfiesCriteria(object value, object criteria, CalcEngine ce) - { - // safety... - if (value == null) - { - return false; - } - - // if criteria is a number, straight comparison - if (criteria is double) - { - if (value is Double) - return (double)value == (double)criteria; - Double dValue; - return Double.TryParse(value.ToString(), out dValue) && dValue == (double)criteria; - } - - // convert criteria to string - var cs = criteria as string; - if (!string.IsNullOrEmpty(cs)) - { - // if criteria is an expression (e.g. ">20"), use calc engine - if (cs[0] == '=' || cs[0] == '<' || cs[0] == '>') - { - // build expression - var expression = string.Format("{0}{1}", value, cs); - - // add quotes if necessary - var pattern = @"(\w+)(\W+)(\w+)"; - var m = Regex.Match(expression, pattern); - if (m.Groups.Count == 4) - { - double d; - if (!double.TryParse(m.Groups[1].Value, out d) || - !double.TryParse(m.Groups[3].Value, out d)) - { - expression = string.Format("\"{0}\"{1}\"{2}\"", - m.Groups[1].Value, - m.Groups[2].Value, - m.Groups[3].Value); - } - } - - // evaluate - return (bool)ce.Evaluate(expression); - } - - // if criteria is a regular expression, use regex - if (cs.IndexOf('*') > -1) - { - var pattern = cs.Replace(@"\", @"\\"); - pattern = pattern.Replace(".", @"\"); - pattern = pattern.Replace("*", ".*"); - return Regex.IsMatch(value.ToString(), pattern, RegexOptions.IgnoreCase); - } - - // straight string comparison - return string.Equals(value.ToString(), cs, StringComparison.OrdinalIgnoreCase); - } - - // should never get here? - Debug.Assert(false, "failed to evaluate criteria in SumIf"); - return false; - } - } -} +using System; +using System.Diagnostics; +using System.Text.RegularExpressions; + +namespace ClosedXML.Excel.CalcEngine +{ + internal class CalcEngineHelpers + { + internal static bool ValueSatisfiesCriteria(object value, object criteria, CalcEngine ce) + { + // safety... + if (value == null) + { + return false; + } + + // if criteria is a number, straight comparison + if (criteria is double) + { + if (value is Double) + return (double)value == (double)criteria; + Double dValue; + return Double.TryParse(value.ToString(), out dValue) && dValue == (double)criteria; + } + + // convert criteria to string + var cs = criteria as string; + if (!string.IsNullOrEmpty(cs)) + { + // if criteria is an expression (e.g. ">20"), use calc engine + if (cs[0] == '=' || cs[0] == '<' || cs[0] == '>') + { + // build expression + var expression = string.Format("{0}{1}", value, cs); + + // add quotes if necessary + var pattern = @"(\w+)(\W+)(\w+)"; + var m = Regex.Match(expression, pattern); + if (m.Groups.Count == 4) + { + double d; + if (!double.TryParse(m.Groups[1].Value, out d) || + !double.TryParse(m.Groups[3].Value, out d)) + { + expression = string.Format("\"{0}\"{1}\"{2}\"", + m.Groups[1].Value, + m.Groups[2].Value, + m.Groups[3].Value); + } + } + + // evaluate + return (bool)ce.Evaluate(expression); + } + + // if criteria is a regular expression, use regex + if (cs.IndexOf('*') > -1) + { + var pattern = cs.Replace(@"\", @"\\"); + pattern = pattern.Replace(".", @"\"); + pattern = pattern.Replace("*", ".*"); + return Regex.IsMatch(value.ToString(), pattern, RegexOptions.IgnoreCase); + } + + // straight string comparison + return string.Equals(value.ToString(), cs, StringComparison.OrdinalIgnoreCase); + } + + // should never get here? + Debug.Assert(false, "failed to evaluate criteria in SumIf"); + return false; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Expression.cs b/ClosedXML/Excel/CalcEngine/Expression.cs index 286bedd..dcac3c0 100644 --- a/ClosedXML/Excel/CalcEngine/Expression.cs +++ b/ClosedXML/Excel/CalcEngine/Expression.cs @@ -1,415 +1,424 @@ -using System; -using System.Threading; -using System.Collections; -using System.Collections.Generic; -using System.Globalization; - -namespace ClosedXML.Excel.CalcEngine -{ - /// - /// Base class that represents parsed expressions. - /// - /// - /// For example: - /// - /// Expression expr = scriptEngine.Parse(strExpression); - /// object val = expr.Evaluate(); - /// - /// - internal class Expression : IComparable - { - //--------------------------------------------------------------------------- - #region ** fields - - internal Token _token; - - #endregion - - //--------------------------------------------------------------------------- - #region ** ctors - - internal Expression() - { - _token = new Token(null, TKID.ATOM, TKTYPE.IDENTIFIER); - } - internal Expression(object value) - { - _token = new Token(value, TKID.ATOM, TKTYPE.LITERAL); - } - internal Expression(Token tk) - { - _token = tk; - } - - #endregion - - //--------------------------------------------------------------------------- - #region ** object model - - public virtual object Evaluate() - { - if (_token.Type != TKTYPE.LITERAL) - { - throw new ArgumentException("Bad expression."); - } - return _token.Value; - } - public virtual Expression Optimize() - { - return this; - } - - #endregion - - //--------------------------------------------------------------------------- - #region ** implicit converters - - public static implicit operator string(Expression x) - { - var v = x.Evaluate(); - return v == null ? string.Empty : v.ToString(); - } - public static implicit operator double(Expression x) - { - // evaluate - var v = x.Evaluate(); - - // handle doubles - if (v is double) - { - return (double)v; - } - - // handle booleans - if (v is bool) - { - return (bool)v ? 1 : 0; - } - - // handle dates - if (v is DateTime) - { - return ((DateTime)v).ToOADate(); - } - - // handle nulls - if (v == null || v is string) - { - return 0; - } - - // handle everything else - CultureInfo _ci = Thread.CurrentThread.CurrentCulture; - return (double)Convert.ChangeType(v, typeof(double), _ci); - } - public static implicit operator bool(Expression x) - { - // evaluate - var v = x.Evaluate(); - - // handle booleans - if (v is bool) - { - return (bool)v; - } - - // handle nulls - if (v == null) - { - return false; - } - - // handle doubles - if (v is double) - { - return (double)v == 0 ? false : true; - } - - // handle everything else - return (double)x == 0 ? false : true; - } - public static implicit operator DateTime(Expression x) - { - // evaluate - var v = x.Evaluate(); - - // handle dates - if (v is DateTime) - { - return (DateTime)v; - } - - // handle doubles - if (v is double || v is int) - { - return DateTime.FromOADate((double)x); - } - - // handle everything else - CultureInfo _ci = Thread.CurrentThread.CurrentCulture; - return (DateTime)Convert.ChangeType(v, typeof(DateTime), _ci); - } - - #endregion - - //--------------------------------------------------------------------------- - #region ** IComparable - - public int CompareTo(Expression other) - { - // get both values - var c1 = this.Evaluate() as IComparable; - var c2 = other.Evaluate() as IComparable; - - // handle nulls - if (c1 == null && c2 == null) - { - return 0; - } - if (c2 == null) - { - return -1; - } - if (c1 == null) - { - return +1; - } - - // make sure types are the same - if (c1.GetType() != c2.GetType()) - { - try - { - if (c1 is DateTime) - c2 = ((DateTime)other); - else if (c2 is DateTime) - c1 = ((DateTime)this); - else - c2 = Convert.ChangeType(c2, c1.GetType()) as IComparable; - } - catch (InvalidCastException) { return -1; } - catch (FormatException) { return -1; } - catch (OverflowException) { return -1; } - catch (ArgumentNullException) { return -1; } - } - - // compare - return c1.CompareTo(c2); - } - - #endregion - } - /// - /// Unary expression, e.g. +123 - /// - class UnaryExpression : Expression - { - // ** fields - Expression _expr; - - // ** ctor - public UnaryExpression(Token tk, Expression expr) : base(tk) - { - _expr = expr; - } - - // ** object model - override public object Evaluate() - { - switch (_token.ID) - { - case TKID.ADD: - return +(double)_expr; - case TKID.SUB: - return -(double)_expr; - } - throw new ArgumentException("Bad expression."); - } - public override Expression Optimize() - { - _expr = _expr.Optimize(); - return _expr._token.Type == TKTYPE.LITERAL - ? new Expression(this.Evaluate()) - : this; - } - } - /// - /// Binary expression, e.g. 1+2 - /// - class BinaryExpression : Expression - { - // ** fields - Expression _lft; - Expression _rgt; - - // ** ctor - public BinaryExpression(Token tk, Expression exprLeft, Expression exprRight) : base(tk) - { - _lft = exprLeft; - _rgt = exprRight; - } - - // ** object model - override public object Evaluate() - { - // handle comparisons - if (_token.Type == TKTYPE.COMPARE) - { - var cmp = _lft.CompareTo(_rgt); - switch (_token.ID) - { - case TKID.GT: return cmp > 0; - case TKID.LT: return cmp < 0; - case TKID.GE: return cmp >= 0; - case TKID.LE: return cmp <= 0; - case TKID.EQ: return cmp == 0; - case TKID.NE: return cmp != 0; - } - } - - // handle everything else - switch (_token.ID) - { - case TKID.CONCAT: - return (string)_lft + (string)_rgt; - case TKID.ADD: - return (double)_lft + (double)_rgt; - case TKID.SUB: - return (double)_lft - (double)_rgt; - case TKID.MUL: - return (double)_lft * (double)_rgt; - case TKID.DIV: - return (double)_lft / (double)_rgt; - case TKID.DIVINT: - return (double)(int)((double)_lft / (double)_rgt); - case TKID.MOD: - return (double)(int)((double)_lft % (double)_rgt); - case TKID.POWER: - var a = (double)_lft; - var b = (double)_rgt; - if (b == 0.0) return 1.0; - if (b == 0.5) return Math.Sqrt(a); - if (b == 1.0) return a; - if (b == 2.0) return a * a; - if (b == 3.0) return a * a * a; - if (b == 4.0) return a * a * a * a; - return Math.Pow((double)_lft, (double)_rgt); - } - throw new ArgumentException("Bad expression."); - } - public override Expression Optimize() - { - _lft = _lft.Optimize(); - _rgt = _rgt.Optimize(); - return _lft._token.Type == TKTYPE.LITERAL && _rgt._token.Type == TKTYPE.LITERAL - ? new Expression(this.Evaluate()) - : this; - } - } - /// - /// Function call expression, e.g. sin(0.5) - /// - class FunctionExpression : Expression - { - // ** fields - FunctionDefinition _fn; - List _parms; - - // ** ctor - internal FunctionExpression() - { - } - public FunctionExpression(FunctionDefinition function, List parms) - { - _fn = function; - _parms = parms; - } - - // ** object model - override public object Evaluate() - { - return _fn.Function(_parms); - } - public override Expression Optimize() - { - bool allLits = true; - if (_parms != null) - { - for (int i = 0; i < _parms.Count; i++) - { - var p = _parms[i].Optimize(); - _parms[i] = p; - if (p._token.Type != TKTYPE.LITERAL) - { - allLits = false; - } - } - } - return allLits - ? new Expression(this.Evaluate()) - : this; - } - } - /// - /// Simple variable reference. - /// - class VariableExpression : Expression - { - Dictionary _dct; - string _name; - - public VariableExpression(Dictionary dct, string name) - { - _dct = dct; - _name = name; - } - public override object Evaluate() - { - return _dct[_name]; - } - } - /// - /// Expression that represents an external object. - /// - class XObjectExpression : - Expression, - IEnumerable - { - object _value; - - // ** ctor - internal XObjectExpression(object value) - { - _value = value; - } - - public object Value { get { return _value; } } - - // ** object model - public override object Evaluate() - { - // use IValueObject if available - var iv = _value as IValueObject; - if (iv != null) - { - return iv.GetValue(); - } - - // return raw object - return _value; - } - public IEnumerator GetEnumerator() - { - return (_value as IEnumerable).GetEnumerator(); - } - } - /// - /// Interface supported by external objects that have to return a value - /// other than themselves (e.g. a cell range object should return the - /// cell content instead of the range itself). - /// - public interface IValueObject - { - object GetValue(); - } -} +using System; +using System.Threading; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; + +namespace ClosedXML.Excel.CalcEngine +{ + /// + /// Base class that represents parsed expressions. + /// + /// + /// For example: + /// + /// Expression expr = scriptEngine.Parse(strExpression); + /// object val = expr.Evaluate(); + /// + /// + internal class Expression : IComparable + { + //--------------------------------------------------------------------------- + #region ** fields + + internal Token _token; + + #endregion + + //--------------------------------------------------------------------------- + #region ** ctors + + internal Expression() + { + _token = new Token(null, TKID.ATOM, TKTYPE.IDENTIFIER); + } + internal Expression(object value) + { + _token = new Token(value, TKID.ATOM, TKTYPE.LITERAL); + } + internal Expression(Token tk) + { + _token = tk; + } + + #endregion + + //--------------------------------------------------------------------------- + #region ** object model + + public virtual object Evaluate() + { + if (_token.Type != TKTYPE.LITERAL) + { + throw new ArgumentException("Bad expression."); + } + return _token.Value; + } + public virtual Expression Optimize() + { + return this; + } + + #endregion + + //--------------------------------------------------------------------------- + #region ** implicit converters + + public static implicit operator string(Expression x) + { + var v = x.Evaluate(); + return v == null ? string.Empty : v.ToString(); + } + public static implicit operator double(Expression x) + { + // evaluate + var v = x.Evaluate(); + + // handle doubles + if (v is double) + { + return (double)v; + } + + // handle booleans + if (v is bool) + { + return (bool)v ? 1 : 0; + } + + // handle dates + if (v is DateTime) + { + return ((DateTime)v).ToOADate(); + } + + // handle nulls + if (v == null || v is string) + { + return 0; + } + + // handle everything else + CultureInfo _ci = Thread.CurrentThread.CurrentCulture; + return (double)Convert.ChangeType(v, typeof(double), _ci); + } + public static implicit operator bool(Expression x) + { + // evaluate + var v = x.Evaluate(); + + // handle booleans + if (v is bool) + { + return (bool)v; + } + + // handle nulls + if (v == null) + { + return false; + } + + // handle doubles + if (v is double) + { + return (double)v == 0 ? false : true; + } + + // handle everything else + return (double)x == 0 ? false : true; + } + public static implicit operator DateTime(Expression x) + { + // evaluate + var v = x.Evaluate(); + + // handle dates + if (v is DateTime) + { + return (DateTime)v; + } + + // handle doubles + if (v is double || v is int) + { + return DateTime.FromOADate((double)x); + } + + // handle everything else + CultureInfo _ci = Thread.CurrentThread.CurrentCulture; + return (DateTime)Convert.ChangeType(v, typeof(DateTime), _ci); + } + + #endregion + + //--------------------------------------------------------------------------- + #region ** IComparable + + public int CompareTo(Expression other) + { + // get both values + var c1 = this.Evaluate() as IComparable; + var c2 = other.Evaluate() as IComparable; + + // handle nulls + if (c1 == null && c2 == null) + { + return 0; + } + if (c2 == null) + { + return -1; + } + if (c1 == null) + { + return +1; + } + + // make sure types are the same + if (c1.GetType() != c2.GetType()) + { + try + { + if (c1 is DateTime) + c2 = ((DateTime)other); + else if (c2 is DateTime) + c1 = ((DateTime)this); + else + c2 = Convert.ChangeType(c2, c1.GetType()) as IComparable; + } + catch (InvalidCastException) { return -1; } + catch (FormatException) { return -1; } + catch (OverflowException) { return -1; } + catch (ArgumentNullException) { return -1; } + } + + // compare + return c1.CompareTo(c2); + } + + #endregion + } + /// + /// Unary expression, e.g. +123 + /// + class UnaryExpression : Expression + { + // ** fields + Expression _expr; + + // ** ctor + public UnaryExpression(Token tk, Expression expr) : base(tk) + { + _expr = expr; + } + + // ** object model + override public object Evaluate() + { + switch (_token.ID) + { + case TKID.ADD: + return +(double)_expr; + case TKID.SUB: + return -(double)_expr; + } + throw new ArgumentException("Bad expression."); + } + public override Expression Optimize() + { + _expr = _expr.Optimize(); + return _expr._token.Type == TKTYPE.LITERAL + ? new Expression(this.Evaluate()) + : this; + } + } + /// + /// Binary expression, e.g. 1+2 + /// + class BinaryExpression : Expression + { + // ** fields + Expression _lft; + Expression _rgt; + + // ** ctor + public BinaryExpression(Token tk, Expression exprLeft, Expression exprRight) : base(tk) + { + _lft = exprLeft; + _rgt = exprRight; + } + + // ** object model + override public object Evaluate() + { + // handle comparisons + if (_token.Type == TKTYPE.COMPARE) + { + var cmp = _lft.CompareTo(_rgt); + switch (_token.ID) + { + case TKID.GT: return cmp > 0; + case TKID.LT: return cmp < 0; + case TKID.GE: return cmp >= 0; + case TKID.LE: return cmp <= 0; + case TKID.EQ: return cmp == 0; + case TKID.NE: return cmp != 0; + } + } + + // handle everything else + switch (_token.ID) + { + case TKID.CONCAT: + return (string)_lft + (string)_rgt; + case TKID.ADD: + return (double)_lft + (double)_rgt; + case TKID.SUB: + return (double)_lft - (double)_rgt; + case TKID.MUL: + return (double)_lft * (double)_rgt; + case TKID.DIV: + return (double)_lft / (double)_rgt; + case TKID.DIVINT: + return (double)(int)((double)_lft / (double)_rgt); + case TKID.MOD: + return (double)(int)((double)_lft % (double)_rgt); + case TKID.POWER: + var a = (double)_lft; + var b = (double)_rgt; + if (b == 0.0) return 1.0; + if (b == 0.5) return Math.Sqrt(a); + if (b == 1.0) return a; + if (b == 2.0) return a * a; + if (b == 3.0) return a * a * a; + if (b == 4.0) return a * a * a * a; + return Math.Pow((double)_lft, (double)_rgt); + } + throw new ArgumentException("Bad expression."); + } + public override Expression Optimize() + { + _lft = _lft.Optimize(); + _rgt = _rgt.Optimize(); + return _lft._token.Type == TKTYPE.LITERAL && _rgt._token.Type == TKTYPE.LITERAL + ? new Expression(this.Evaluate()) + : this; + } + } + /// + /// Function call expression, e.g. sin(0.5) + /// + class FunctionExpression : Expression + { + // ** fields + FunctionDefinition _fn; + List _parms; + + // ** ctor + internal FunctionExpression() + { + } + public FunctionExpression(FunctionDefinition function, List parms) + { + _fn = function; + _parms = parms; + } + + // ** object model + override public object Evaluate() + { + return _fn.Function(_parms); + } + public override Expression Optimize() + { + bool allLits = true; + if (_parms != null) + { + for (int i = 0; i < _parms.Count; i++) + { + var p = _parms[i].Optimize(); + _parms[i] = p; + if (p._token.Type != TKTYPE.LITERAL) + { + allLits = false; + } + } + } + return allLits + ? new Expression(this.Evaluate()) + : this; + } + } + /// + /// Simple variable reference. + /// + class VariableExpression : Expression + { + Dictionary _dct; + string _name; + + public VariableExpression(Dictionary dct, string name) + { + _dct = dct; + _name = name; + } + public override object Evaluate() + { + return _dct[_name]; + } + } + /// + /// Expression that represents an external object. + /// + class XObjectExpression : + Expression, + IEnumerable + { + object _value; + + // ** ctor + internal XObjectExpression(object value) + { + _value = value; + } + + public object Value { get { return _value; } } + + // ** object model + public override object Evaluate() + { + // use IValueObject if available + var iv = _value as IValueObject; + if (iv != null) + { + return iv.GetValue(); + } + + // return raw object + return _value; + } + public IEnumerator GetEnumerator() + { + return (_value as IEnumerable).GetEnumerator(); + } + } + + /// + /// Expression that represents an omitted parameter. + /// + class EmptyValueExpression : Expression + { + internal EmptyValueExpression() { } + } + + /// + /// Interface supported by external objects that have to return a value + /// other than themselves (e.g. a cell range object should return the + /// cell content instead of the range itself). + /// + public interface IValueObject + { + object GetValue(); + } +} diff --git a/ClosedXML/Excel/CalcEngine/ExpressionCache.cs b/ClosedXML/Excel/CalcEngine/ExpressionCache.cs index 3c7fd00..57640a4 100644 --- a/ClosedXML/Excel/CalcEngine/ExpressionCache.cs +++ b/ClosedXML/Excel/CalcEngine/ExpressionCache.cs @@ -1,72 +1,72 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace ClosedXML.Excel.CalcEngine -{ - /// - /// Caches expressions based on their string representation. - /// This saves parsing time. - /// - /// - /// Uses weak references to avoid accumulating unused expressions. - /// - class ExpressionCache - { - Dictionary _dct; - CalcEngine _ce; - int _hitCount; - - public ExpressionCache(CalcEngine ce) - { - _ce = ce; - _dct = new Dictionary(); - } - - // gets the parsed version of a string expression - public Expression this[string expression] - { - get - { - Expression x; - WeakReference wr; - if (_dct.TryGetValue(expression, out wr) && wr.IsAlive) - { - x = wr.Target as Expression; - } - else - { - // remove all dead references from dictionary - if (wr != null && _dct.Count > 100 && _hitCount++ > 100) - { - RemoveDeadReferences(); - _hitCount = 0; - } - - // store this expression - x = _ce.Parse(expression); - _dct[expression] = new WeakReference(x); - } - return x; - } - } - - // remove all dead references from the cache - void RemoveDeadReferences() - { - for (bool done = false; !done; ) - { - done = true; - foreach (var k in _dct.Keys) - { - if (!_dct[k].IsAlive) - { - _dct.Remove(k); - done = false; - break; - } - } - } - } - } -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace ClosedXML.Excel.CalcEngine +{ + /// + /// Caches expressions based on their string representation. + /// This saves parsing time. + /// + /// + /// Uses weak references to avoid accumulating unused expressions. + /// + class ExpressionCache + { + Dictionary _dct; + CalcEngine _ce; + int _hitCount; + + public ExpressionCache(CalcEngine ce) + { + _ce = ce; + _dct = new Dictionary(); + } + + // gets the parsed version of a string expression + public Expression this[string expression] + { + get + { + Expression x; + WeakReference wr; + if (_dct.TryGetValue(expression, out wr) && wr.IsAlive) + { + x = wr.Target as Expression; + } + else + { + // remove all dead references from dictionary + if (wr != null && _dct.Count > 100 && _hitCount++ > 100) + { + RemoveDeadReferences(); + _hitCount = 0; + } + + // store this expression + x = _ce.Parse(expression); + _dct[expression] = new WeakReference(x); + } + return x; + } + } + + // remove all dead references from the cache + void RemoveDeadReferences() + { + for (bool done = false; !done; ) + { + done = true; + foreach (var k in _dct.Keys) + { + if (!_dct[k].IsAlive) + { + _dct.Remove(k); + done = false; + break; + } + } + } + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/FunctionDefinition.cs b/ClosedXML/Excel/CalcEngine/FunctionDefinition.cs index fc02182..5f4a55c 100644 --- a/ClosedXML/Excel/CalcEngine/FunctionDefinition.cs +++ b/ClosedXML/Excel/CalcEngine/FunctionDefinition.cs @@ -1,24 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace ClosedXML.Excel.CalcEngine -{ - /// - /// Function definition class (keeps function name, parameter counts, and delegate). - /// - internal class FunctionDefinition - { - // ** fields - public int ParmMin, ParmMax; - public CalcEngineFunction Function; - - // ** ctor - public FunctionDefinition(int parmMin, int parmMax, CalcEngineFunction function) - { - ParmMin = parmMin; - ParmMax = parmMax; - Function = function; - } - } -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace ClosedXML.Excel.CalcEngine +{ + /// + /// Function definition class (keeps function name, parameter counts, and delegate). + /// + internal class FunctionDefinition + { + // ** fields + public int ParmMin, ParmMax; + public CalcEngineFunction Function; + + // ** ctor + public FunctionDefinition(int parmMin, int parmMax, CalcEngineFunction function) + { + ParmMin = parmMin; + ParmMax = parmMax; + Function = function; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Database.cs b/ClosedXML/Excel/CalcEngine/Functions/Database.cs index c7aed5f..1c25747 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/Database.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/Database.cs @@ -1,36 +1,36 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel.CalcEngine.Functions -{ - internal static class Database - { - public static void Register(CalcEngine ce) - { - //ce.RegisterFunction("DAVERAGE", 3, Daverage); // Returns the average of selected database entries - //ce.RegisterFunction("DCOUNT", 1, Dcount); // Counts the cells that contain numbers in a database - //ce.RegisterFunction("DCOUNTA", 1, Dcounta); // Counts nonblank cells in a database - //ce.RegisterFunction("DGET", 1, Dget); // Extracts from a database a single record that matches the specified criteria - //ce.RegisterFunction("DMAX", 1, Dmax); // Returns the maximum value from selected database entries - //ce.RegisterFunction("DMIN", 1, Dmin); // Returns the minimum value from selected database entries - //ce.RegisterFunction("DPRODUCT", 1, Dproduct); // Multiplies the values in a particular field of records that match the criteria in a database - //ce.RegisterFunction("DSTDEV", 1, Dstdev); // Estimates the standard deviation based on a sample of selected database entries - //ce.RegisterFunction("DSTDEVP", 1, Dstdevp); // Calculates the standard deviation based on the entire population of selected database entries - //ce.RegisterFunction("DSUM", 1, Dsum); // Adds the numbers in the field column of records in the database that match the criteria - //ce.RegisterFunction("DVAR", 1, Dvar); // Estimates variance based on a sample from selected database entries - //ce.RegisterFunction("DVARP", 1, Dvarp); // Calculates variance based on the entire population of selected database entries - } - - static object Daverage(List p) - { - var b = true; - foreach (var v in p) - { - b = b && (bool)v; - } - return b; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel.CalcEngine.Functions +{ + internal static class Database + { + public static void Register(CalcEngine ce) + { + //ce.RegisterFunction("DAVERAGE", 3, Daverage); // Returns the average of selected database entries + //ce.RegisterFunction("DCOUNT", 1, Dcount); // Counts the cells that contain numbers in a database + //ce.RegisterFunction("DCOUNTA", 1, Dcounta); // Counts nonblank cells in a database + //ce.RegisterFunction("DGET", 1, Dget); // Extracts from a database a single record that matches the specified criteria + //ce.RegisterFunction("DMAX", 1, Dmax); // Returns the maximum value from selected database entries + //ce.RegisterFunction("DMIN", 1, Dmin); // Returns the minimum value from selected database entries + //ce.RegisterFunction("DPRODUCT", 1, Dproduct); // Multiplies the values in a particular field of records that match the criteria in a database + //ce.RegisterFunction("DSTDEV", 1, Dstdev); // Estimates the standard deviation based on a sample of selected database entries + //ce.RegisterFunction("DSTDEVP", 1, Dstdevp); // Calculates the standard deviation based on the entire population of selected database entries + //ce.RegisterFunction("DSUM", 1, Dsum); // Adds the numbers in the field column of records in the database that match the criteria + //ce.RegisterFunction("DVAR", 1, Dvar); // Estimates variance based on a sample from selected database entries + //ce.RegisterFunction("DVARP", 1, Dvarp); // Calculates variance based on the entire population of selected database entries + } + + static object Daverage(List p) + { + var b = true; + foreach (var v in p) + { + b = b && (bool)v; + } + return b; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/DateAndTime.cs b/ClosedXML/Excel/CalcEngine/Functions/DateAndTime.cs index 1a388e6..028d5c7 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/DateAndTime.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/DateAndTime.cs @@ -1,362 +1,362 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; - -namespace ClosedXML.Excel.CalcEngine.Functions -{ - internal static class DateAndTime - { - public static void Register(CalcEngine ce) - { - ce.RegisterFunction("DATE", 3, Date); // Returns the serial number of a particular date - ce.RegisterFunction("DATEVALUE", 1, Datevalue); // Converts a date in the form of text to a serial number - ce.RegisterFunction("DAY", 1, Day); // Converts a serial number to a day of the month - ce.RegisterFunction("DAYS", 2, Days); // Returns the number of days between two dates. - ce.RegisterFunction("DAYS360", 2, 3, Days360); // Calculates the number of days between two dates based on a 360-day year - ce.RegisterFunction("EDATE", 2, Edate); // Returns the serial number of the date that is the indicated number of months before or after the start date - ce.RegisterFunction("EOMONTH", 2, Eomonth); // Returns the serial number of the last day of the month before or after a specified number of months - ce.RegisterFunction("HOUR", 1, Hour); // Converts a serial number to an hour - ce.RegisterFunction("ISOWEEKNUM", 1, IsoWeekNum); // Returns number of the ISO week number of the year for a given date. - ce.RegisterFunction("MINUTE", 1, Minute); // Converts a serial number to a minute - ce.RegisterFunction("MONTH", 1, Month); // Converts a serial number to a month - ce.RegisterFunction("NETWORKDAYS", 2, 3, Networkdays); // Returns the number of whole workdays between two dates - ce.RegisterFunction("NOW", 0, Now); // Returns the serial number of the current date and time - ce.RegisterFunction("SECOND", 1, Second); // Converts a serial number to a second - ce.RegisterFunction("TIME", 3, Time); // Returns the serial number of a particular time - ce.RegisterFunction("TIMEVALUE", 1, Timevalue); // Converts a time in the form of text to a serial number - ce.RegisterFunction("TODAY", 0, Today); // Returns the serial number of today's date - ce.RegisterFunction("WEEKDAY", 1, 2, Weekday); // Converts a serial number to a day of the week - ce.RegisterFunction("WEEKNUM", 1, 2, Weeknum); // Converts a serial number to a number representing where the week falls numerically with a year - ce.RegisterFunction("WORKDAY", 2, 3, Workday); // Returns the serial number of the date before or after a specified number of workdays - ce.RegisterFunction("YEAR", 1, Year); // Converts a serial number to a year - ce.RegisterFunction("YEARFRAC", 2, 3, Yearfrac); // Returns the year fraction representing the number of whole days between start_date and end_date - } - - /// - /// Calculates number of business days, taking into account: - /// - weekends (Saturdays and Sundays) - /// - bank holidays in the middle of the week - /// - /// First day in the time interval - /// Last day in the time interval - /// List of bank holidays excluding weekends - /// Number of business days during the 'span' - private static int BusinessDaysUntil(DateTime firstDay, DateTime lastDay, IEnumerable bankHolidays) - { - firstDay = firstDay.Date; - lastDay = lastDay.Date; - if (firstDay > lastDay) - return -BusinessDaysUntil(lastDay, firstDay, bankHolidays); - - TimeSpan span = lastDay - firstDay; - int businessDays = span.Days + 1; - int fullWeekCount = businessDays / 7; - // find out if there are weekends during the time exceedng the full weeks - if (businessDays > fullWeekCount * 7) - { - // we are here to find out if there is a 1-day or 2-days weekend - // in the time interval remaining after subtracting the complete weeks - var firstDayOfWeek = (int)firstDay.DayOfWeek; - var lastDayOfWeek = (int)lastDay.DayOfWeek; - if (lastDayOfWeek < firstDayOfWeek) - lastDayOfWeek += 7; - if (firstDayOfWeek <= 6) - { - if (lastDayOfWeek >= 7)// Both Saturday and Sunday are in the remaining time interval - businessDays -= 2; - else if (lastDayOfWeek >= 6)// Only Saturday is in the remaining time interval - businessDays -= 1; - } - else if (firstDayOfWeek <= 7 && lastDayOfWeek >= 7)// Only Sunday is in the remaining time interval - businessDays -= 1; - } - - // subtract the weekends during the full weeks in the interval - businessDays -= fullWeekCount + fullWeekCount; - - // subtract the number of bank holidays during the time interval - foreach (var bh in bankHolidays) - { - if (firstDay <= bh && bh <= lastDay) - --businessDays; - } - - return businessDays; - } - - private static object Date(List p) - { - var year = (int)p[0]; - var month = (int)p[1]; - var day = (int)p[2]; - - return (int)Math.Floor(new DateTime(year, month, day).ToOADate()); - } - - private static object Datevalue(List p) - { - var date = (string)p[0]; - - return (int)Math.Floor(DateTime.Parse(date).ToOADate()); - } - - private static object Day(List p) - { - var date = (DateTime)p[0]; - - return date.Day; - } - - private static object Days(List p) - { - Type type; - - int end_date; - - type = p[0]._token.Value.GetType(); - if (type == typeof(string)) - end_date = (int)Datevalue(new List() { p[0] }); - else - end_date = (int)p[0]; - - int start_date; - - type = p[1]._token.Value.GetType(); - if (type == typeof(string)) - start_date = (int)Datevalue(new List() { p[1] }); - else - start_date = (int)p[1]; - - return end_date - start_date; - } - - private static object Days360(List p) - { - var date1 = (DateTime)p[0]; - var date2 = (DateTime)p[1]; - var isEuropean = p.Count == 3 ? p[2] : false; - - return Days360(date1, date2, isEuropean); - } - - private static Int32 Days360(DateTime date1, DateTime date2, Boolean isEuropean) - { - var d1 = date1.Day; - var m1 = date1.Month; - var y1 = date1.Year; - var d2 = date2.Day; - var m2 = date2.Month; - var y2 = date2.Year; - - if (isEuropean) - { - if (d1 == 31) d1 = 30; - if (d2 == 31) d2 = 30; - } - else - { - if (d1 == 31) d1 = 30; - if (d2 == 31 && d1 == 30) d2 = 30; - } - - return 360 * (y2 - y1) + 30 * (m2 - m1) + (d2 - d1); - } - - private static object Edate(List p) - { - var date = (DateTime)p[0]; - var mod = (int)p[1]; - - var retDate = date.AddMonths(mod); - return retDate; - } - - private static object Eomonth(List p) - { - var start_date = (DateTime)p[0]; - var months = (int)p[1]; - - var retDate = start_date.AddMonths(months); - return new DateTime(retDate.Year, retDate.Month, DateTime.DaysInMonth(retDate.Year, retDate.Month)); - } - - private static Double GetYearAverage(DateTime date1, DateTime date2) - { - var daysInYears = new List(); - for (int year = date1.Year; year <= date2.Year; year++) - daysInYears.Add(DateTime.IsLeapYear(year) ? 366 : 365); - return daysInYears.Average(); - } - - private static object Hour(List p) - { - var date = (DateTime)p[0]; - - return date.Hour; - } - - // http://stackoverflow.com/questions/11154673/get-the-correct-week-number-of-a-given-date - private static object IsoWeekNum(List p) - { - var date = (DateTime)p[0]; - - // Seriously cheat. If its Monday, Tuesday or Wednesday, then it'll - // be the same week# as whatever Thursday, Friday or Saturday are, - // and we always get those right - DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(date); - if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday) - { - date = date.AddDays(3); - } - - // Return the week of our adjusted day - return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); - } - - private static object Minute(List p) - { - var date = (DateTime)p[0]; - - return date.Minute; - } - - private static object Month(List p) - { - var date = (DateTime)p[0]; - - return date.Month; - } - - private static object Networkdays(List p) - { - var date1 = (DateTime)p[0]; - var date2 = (DateTime)p[1]; - var bankHolidays = new List(); - if (p.Count == 3) - { - var t = new Tally { p[2] }; - - bankHolidays.AddRange(t.Select(XLHelper.GetDate)); - } - - return BusinessDaysUntil(date1, date2, bankHolidays); - } - - private static object Now(List p) - { - return DateTime.Now; - } - - private static object Second(List p) - { - var date = (DateTime)p[0]; - - return date.Second; - } - - private static object Time(List p) - { - var hour = (int)p[0]; - var minute = (int)p[1]; - var second = (int)p[2]; - - return new TimeSpan(0, hour, minute, second); - } - - private static object Timevalue(List p) - { - var date = (DateTime)p[0]; - - return (DateTime.MinValue + date.TimeOfDay).ToOADate(); - } - - private static object Today(List p) - { - return DateTime.Today; - } - - private static object Weekday(List p) - { - var dayOfWeek = (int)((DateTime)p[0]).DayOfWeek; - var retType = p.Count == 2 ? (int)p[1] : 1; - - if (retType == 2) return dayOfWeek; - if (retType == 1) return dayOfWeek + 1; - - return dayOfWeek - 1; - } - - private static object Weeknum(List p) - { - var date = (DateTime)p[0]; - var retType = p.Count == 2 ? (int)p[1] : 1; - - DayOfWeek dayOfWeek = retType == 1 ? DayOfWeek.Sunday : DayOfWeek.Monday; - var cal = new GregorianCalendar(GregorianCalendarTypes.Localized); - var val = cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, dayOfWeek); - - return val; - } - - private static object Workday(List p) - { - var startDate = (DateTime)p[0]; - var daysRequired = (int)p[1]; - - if (daysRequired == 0) return startDate; - - var bankHolidays = new List(); - if (p.Count == 3) - { - var t = new Tally { p[2] }; - - bankHolidays.AddRange(t.Select(XLHelper.GetDate)); - } - var testDate = startDate.AddDays(((daysRequired / 7) + 2) * 7 * Math.Sign(daysRequired)); - var return_date = Workday(startDate, testDate, daysRequired, bankHolidays); - if (Math.Sign(daysRequired) == 1) - return_date = return_date.NextWorkday(bankHolidays); - else - return_date = return_date.PreviousWorkDay(bankHolidays); - - return return_date; - } - - private static DateTime Workday(DateTime startDate, DateTime testDate, int daysRequired, IEnumerable bankHolidays) - { - var businessDays = BusinessDaysUntil(startDate, testDate, bankHolidays); - if (businessDays == daysRequired) - return testDate; - - int days = businessDays > daysRequired ? -1 : 1; - - return Workday(startDate, testDate.AddDays(days), daysRequired, bankHolidays); - } - - private static object Year(List p) - { - var date = (DateTime)p[0]; - - return date.Year; - } - - private static object Yearfrac(List p) - { - var date1 = (DateTime)p[0]; - var date2 = (DateTime)p[1]; - var option = p.Count == 3 ? (int)p[2] : 0; - - if (option == 0) - return Days360(date1, date2, false) / 360.0; - if (option == 1) - return Math.Floor((date2 - date1).TotalDays) / GetYearAverage(date1, date2); - if (option == 2) - return Math.Floor((date2 - date1).TotalDays) / 360.0; - if (option == 3) - return Math.Floor((date2 - date1).TotalDays) / 365.0; - - return Days360(date1, date2, true) / 360.0; - } - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; + +namespace ClosedXML.Excel.CalcEngine.Functions +{ + internal static class DateAndTime + { + public static void Register(CalcEngine ce) + { + ce.RegisterFunction("DATE", 3, Date); // Returns the serial number of a particular date + ce.RegisterFunction("DATEVALUE", 1, Datevalue); // Converts a date in the form of text to a serial number + ce.RegisterFunction("DAY", 1, Day); // Converts a serial number to a day of the month + ce.RegisterFunction("DAYS", 2, Days); // Returns the number of days between two dates. + ce.RegisterFunction("DAYS360", 2, 3, Days360); // Calculates the number of days between two dates based on a 360-day year + ce.RegisterFunction("EDATE", 2, Edate); // Returns the serial number of the date that is the indicated number of months before or after the start date + ce.RegisterFunction("EOMONTH", 2, Eomonth); // Returns the serial number of the last day of the month before or after a specified number of months + ce.RegisterFunction("HOUR", 1, Hour); // Converts a serial number to an hour + ce.RegisterFunction("ISOWEEKNUM", 1, IsoWeekNum); // Returns number of the ISO week number of the year for a given date. + ce.RegisterFunction("MINUTE", 1, Minute); // Converts a serial number to a minute + ce.RegisterFunction("MONTH", 1, Month); // Converts a serial number to a month + ce.RegisterFunction("NETWORKDAYS", 2, 3, Networkdays); // Returns the number of whole workdays between two dates + ce.RegisterFunction("NOW", 0, Now); // Returns the serial number of the current date and time + ce.RegisterFunction("SECOND", 1, Second); // Converts a serial number to a second + ce.RegisterFunction("TIME", 3, Time); // Returns the serial number of a particular time + ce.RegisterFunction("TIMEVALUE", 1, Timevalue); // Converts a time in the form of text to a serial number + ce.RegisterFunction("TODAY", 0, Today); // Returns the serial number of today's date + ce.RegisterFunction("WEEKDAY", 1, 2, Weekday); // Converts a serial number to a day of the week + ce.RegisterFunction("WEEKNUM", 1, 2, Weeknum); // Converts a serial number to a number representing where the week falls numerically with a year + ce.RegisterFunction("WORKDAY", 2, 3, Workday); // Returns the serial number of the date before or after a specified number of workdays + ce.RegisterFunction("YEAR", 1, Year); // Converts a serial number to a year + ce.RegisterFunction("YEARFRAC", 2, 3, Yearfrac); // Returns the year fraction representing the number of whole days between start_date and end_date + } + + /// + /// Calculates number of business days, taking into account: + /// - weekends (Saturdays and Sundays) + /// - bank holidays in the middle of the week + /// + /// First day in the time interval + /// Last day in the time interval + /// List of bank holidays excluding weekends + /// Number of business days during the 'span' + private static int BusinessDaysUntil(DateTime firstDay, DateTime lastDay, IEnumerable bankHolidays) + { + firstDay = firstDay.Date; + lastDay = lastDay.Date; + if (firstDay > lastDay) + return -BusinessDaysUntil(lastDay, firstDay, bankHolidays); + + TimeSpan span = lastDay - firstDay; + int businessDays = span.Days + 1; + int fullWeekCount = businessDays / 7; + // find out if there are weekends during the time exceedng the full weeks + if (businessDays > fullWeekCount * 7) + { + // we are here to find out if there is a 1-day or 2-days weekend + // in the time interval remaining after subtracting the complete weeks + var firstDayOfWeek = (int)firstDay.DayOfWeek; + var lastDayOfWeek = (int)lastDay.DayOfWeek; + if (lastDayOfWeek < firstDayOfWeek) + lastDayOfWeek += 7; + if (firstDayOfWeek <= 6) + { + if (lastDayOfWeek >= 7)// Both Saturday and Sunday are in the remaining time interval + businessDays -= 2; + else if (lastDayOfWeek >= 6)// Only Saturday is in the remaining time interval + businessDays -= 1; + } + else if (firstDayOfWeek <= 7 && lastDayOfWeek >= 7)// Only Sunday is in the remaining time interval + businessDays -= 1; + } + + // subtract the weekends during the full weeks in the interval + businessDays -= fullWeekCount + fullWeekCount; + + // subtract the number of bank holidays during the time interval + foreach (var bh in bankHolidays) + { + if (firstDay <= bh && bh <= lastDay) + --businessDays; + } + + return businessDays; + } + + private static object Date(List p) + { + var year = (int)p[0]; + var month = (int)p[1]; + var day = (int)p[2]; + + return (int)Math.Floor(new DateTime(year, month, day).ToOADate()); + } + + private static object Datevalue(List p) + { + var date = (string)p[0]; + + return (int)Math.Floor(DateTime.Parse(date).ToOADate()); + } + + private static object Day(List p) + { + var date = (DateTime)p[0]; + + return date.Day; + } + + private static object Days(List p) + { + Type type; + + int end_date; + + type = p[0]._token.Value.GetType(); + if (type == typeof(string)) + end_date = (int)Datevalue(new List() { p[0] }); + else + end_date = (int)p[0]; + + int start_date; + + type = p[1]._token.Value.GetType(); + if (type == typeof(string)) + start_date = (int)Datevalue(new List() { p[1] }); + else + start_date = (int)p[1]; + + return end_date - start_date; + } + + private static object Days360(List p) + { + var date1 = (DateTime)p[0]; + var date2 = (DateTime)p[1]; + var isEuropean = p.Count == 3 ? p[2] : false; + + return Days360(date1, date2, isEuropean); + } + + private static Int32 Days360(DateTime date1, DateTime date2, Boolean isEuropean) + { + var d1 = date1.Day; + var m1 = date1.Month; + var y1 = date1.Year; + var d2 = date2.Day; + var m2 = date2.Month; + var y2 = date2.Year; + + if (isEuropean) + { + if (d1 == 31) d1 = 30; + if (d2 == 31) d2 = 30; + } + else + { + if (d1 == 31) d1 = 30; + if (d2 == 31 && d1 == 30) d2 = 30; + } + + return 360 * (y2 - y1) + 30 * (m2 - m1) + (d2 - d1); + } + + private static object Edate(List p) + { + var date = (DateTime)p[0]; + var mod = (int)p[1]; + + var retDate = date.AddMonths(mod); + return retDate; + } + + private static object Eomonth(List p) + { + var start_date = (DateTime)p[0]; + var months = (int)p[1]; + + var retDate = start_date.AddMonths(months); + return new DateTime(retDate.Year, retDate.Month, DateTime.DaysInMonth(retDate.Year, retDate.Month)); + } + + private static Double GetYearAverage(DateTime date1, DateTime date2) + { + var daysInYears = new List(); + for (int year = date1.Year; year <= date2.Year; year++) + daysInYears.Add(DateTime.IsLeapYear(year) ? 366 : 365); + return daysInYears.Average(); + } + + private static object Hour(List p) + { + var date = (DateTime)p[0]; + + return date.Hour; + } + + // http://stackoverflow.com/questions/11154673/get-the-correct-week-number-of-a-given-date + private static object IsoWeekNum(List p) + { + var date = (DateTime)p[0]; + + // Seriously cheat. If its Monday, Tuesday or Wednesday, then it'll + // be the same week# as whatever Thursday, Friday or Saturday are, + // and we always get those right + DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(date); + if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday) + { + date = date.AddDays(3); + } + + // Return the week of our adjusted day + return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); + } + + private static object Minute(List p) + { + var date = (DateTime)p[0]; + + return date.Minute; + } + + private static object Month(List p) + { + var date = (DateTime)p[0]; + + return date.Month; + } + + private static object Networkdays(List p) + { + var date1 = (DateTime)p[0]; + var date2 = (DateTime)p[1]; + var bankHolidays = new List(); + if (p.Count == 3) + { + var t = new Tally { p[2] }; + + bankHolidays.AddRange(t.Select(XLHelper.GetDate)); + } + + return BusinessDaysUntil(date1, date2, bankHolidays); + } + + private static object Now(List p) + { + return DateTime.Now; + } + + private static object Second(List p) + { + var date = (DateTime)p[0]; + + return date.Second; + } + + private static object Time(List p) + { + var hour = (int)p[0]; + var minute = (int)p[1]; + var second = (int)p[2]; + + return new TimeSpan(0, hour, minute, second); + } + + private static object Timevalue(List p) + { + var date = (DateTime)p[0]; + + return (DateTime.MinValue + date.TimeOfDay).ToOADate(); + } + + private static object Today(List p) + { + return DateTime.Today; + } + + private static object Weekday(List p) + { + var dayOfWeek = (int)((DateTime)p[0]).DayOfWeek; + var retType = p.Count == 2 ? (int)p[1] : 1; + + if (retType == 2) return dayOfWeek; + if (retType == 1) return dayOfWeek + 1; + + return dayOfWeek - 1; + } + + private static object Weeknum(List p) + { + var date = (DateTime)p[0]; + var retType = p.Count == 2 ? (int)p[1] : 1; + + DayOfWeek dayOfWeek = retType == 1 ? DayOfWeek.Sunday : DayOfWeek.Monday; + var cal = new GregorianCalendar(GregorianCalendarTypes.Localized); + var val = cal.GetWeekOfYear(date, CalendarWeekRule.FirstDay, dayOfWeek); + + return val; + } + + private static object Workday(List p) + { + var startDate = (DateTime)p[0]; + var daysRequired = (int)p[1]; + + if (daysRequired == 0) return startDate; + + var bankHolidays = new List(); + if (p.Count == 3) + { + var t = new Tally { p[2] }; + + bankHolidays.AddRange(t.Select(XLHelper.GetDate)); + } + var testDate = startDate.AddDays(((daysRequired / 7) + 2) * 7 * Math.Sign(daysRequired)); + var return_date = Workday(startDate, testDate, daysRequired, bankHolidays); + if (Math.Sign(daysRequired) == 1) + return_date = return_date.NextWorkday(bankHolidays); + else + return_date = return_date.PreviousWorkDay(bankHolidays); + + return return_date; + } + + private static DateTime Workday(DateTime startDate, DateTime testDate, int daysRequired, IEnumerable bankHolidays) + { + var businessDays = BusinessDaysUntil(startDate, testDate, bankHolidays); + if (businessDays == daysRequired) + return testDate; + + int days = businessDays > daysRequired ? -1 : 1; + + return Workday(startDate, testDate.AddDays(days), daysRequired, bankHolidays); + } + + private static object Year(List p) + { + var date = (DateTime)p[0]; + + return date.Year; + } + + private static object Yearfrac(List p) + { + var date1 = (DateTime)p[0]; + var date2 = (DateTime)p[1]; + var option = p.Count == 3 ? (int)p[2] : 0; + + if (option == 0) + return Days360(date1, date2, false) / 360.0; + if (option == 1) + return Math.Floor((date2 - date1).TotalDays) / GetYearAverage(date1, date2); + if (option == 2) + return Math.Floor((date2 - date1).TotalDays) / 360.0; + if (option == 3) + return Math.Floor((date2 - date1).TotalDays) / 365.0; + + return Days360(date1, date2, true) / 360.0; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Information.cs b/ClosedXML/Excel/CalcEngine/Functions/Information.cs index 2af09f9..6df1a1e 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/Information.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/Information.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; diff --git a/ClosedXML/Excel/CalcEngine/Functions/Logical.cs b/ClosedXML/Excel/CalcEngine/Functions/Logical.cs index 18d2a9d..d5fa418 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/Logical.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/Logical.cs @@ -1,75 +1,82 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel.CalcEngine -{ - internal static class Logical - { - public static void Register(CalcEngine ce) - { - ce.RegisterFunction("AND", 1, int.MaxValue, And); - ce.RegisterFunction("OR", 1, int.MaxValue, Or); - ce.RegisterFunction("NOT", 1, Not); - ce.RegisterFunction("IF", 2, 3, If); - ce.RegisterFunction("TRUE", 0, True); - ce.RegisterFunction("FALSE", 0, False); - ce.RegisterFunction("IFERROR",2,IfError); - } - - static object And(List p) - { - var b = true; - foreach (var v in p) - { - b = b && v; - } - return b; - } - - static object Or(List p) - { - var b = false; - foreach (var v in p) - { - b = b || v; - } - return b; - } - - static object Not(List p) - { - return !p[0]; - } - - static object If(List p) - { - if (p[0]) - { - return p[1].Evaluate(); - } - return p.Count > 2 ? p[2].Evaluate() : false; - } - - static object True(List p) - { - return true; - } - - static object False(List p) - { - return false; - } - - static object IfError(List p) - { - try - { - return p[0].Evaluate(); - } - catch (ArgumentException) - { - return p[1].Evaluate(); - } - } - } -} \ No newline at end of file +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel.CalcEngine +{ + internal static class Logical + { + public static void Register(CalcEngine ce) + { + ce.RegisterFunction("AND", 1, int.MaxValue, And); + ce.RegisterFunction("OR", 1, int.MaxValue, Or); + ce.RegisterFunction("NOT", 1, Not); + ce.RegisterFunction("IF", 2, 3, If); + ce.RegisterFunction("TRUE", 0, True); + ce.RegisterFunction("FALSE", 0, False); + ce.RegisterFunction("IFERROR",2,IfError); + } + + static object And(List p) + { + var b = true; + foreach (var v in p) + { + b = b && v; + } + return b; + } + + static object Or(List p) + { + var b = false; + foreach (var v in p) + { + b = b || v; + } + return b; + } + + static object Not(List p) + { + return !p[0]; + } + + static object If(List p) + { + if (p[0]) + { + return p[1].Evaluate(); + } + else if (p.Count > 2) + { + if (p[2] is EmptyValueExpression) + return false; + else + return p[2].Evaluate(); + } + else return false; + } + + static object True(List p) + { + return true; + } + + static object False(List p) + { + return false; + } + + static object IfError(List p) + { + try + { + return p[0].Evaluate(); + } + catch (ArgumentException) + { + return p[1].Evaluate(); + } + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Lookup.cs b/ClosedXML/Excel/CalcEngine/Functions/Lookup.cs index dfa41bb..8a9ac19 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/Lookup.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/Lookup.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; diff --git a/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs index 48a2bdd..c4e86ca 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs @@ -1,635 +1,635 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using ClosedXML.Excel.CalcEngine.Functions; - -namespace ClosedXML.Excel.CalcEngine -{ - internal static class MathTrig - { - private static readonly Random _rnd = new Random(); - - public static void Register(CalcEngine ce) - { - ce.RegisterFunction("ABS", 1, Abs); - ce.RegisterFunction("ACOS", 1, Acos); - ce.RegisterFunction("ACOSH", 1, Acosh); - ce.RegisterFunction("ASIN", 1, Asin); - ce.RegisterFunction("ASINH", 1, Asinh); - ce.RegisterFunction("ATAN", 1, Atan); - ce.RegisterFunction("ATAN2", 2, Atan2); - ce.RegisterFunction("ATANH", 1, Atanh); - ce.RegisterFunction("CEILING", 1, Ceiling); - ce.RegisterFunction("COMBIN", 2, Combin); - ce.RegisterFunction("COS", 1, Cos); - ce.RegisterFunction("COSH", 1, Cosh); - ce.RegisterFunction("DEGREES", 1, Degrees); - ce.RegisterFunction("EVEN", 1, Even); - ce.RegisterFunction("EXP", 1, Exp); - ce.RegisterFunction("FACT", 1, Fact); - ce.RegisterFunction("FACTDOUBLE", 1, FactDouble); - ce.RegisterFunction("FLOOR", 1, Floor); - ce.RegisterFunction("GCD", 1, 255, Gcd); - ce.RegisterFunction("INT", 1, Int); - ce.RegisterFunction("LCM", 1, 255, Lcm); - ce.RegisterFunction("LN", 1, Ln); - ce.RegisterFunction("LOG", 1, 2, Log); - ce.RegisterFunction("LOG10", 1, Log10); - ce.RegisterFunction("MDETERM", 1, MDeterm); - ce.RegisterFunction("MINVERSE", 1, MInverse); - ce.RegisterFunction("MMULT", 2, MMult); - ce.RegisterFunction("MOD", 2, Mod); - ce.RegisterFunction("MROUND", 2, MRound); - ce.RegisterFunction("MULTINOMIAL", 1, 255, Multinomial); - ce.RegisterFunction("ODD", 1, Odd); - ce.RegisterFunction("PI", 0, Pi); - ce.RegisterFunction("POWER", 2, Power); - ce.RegisterFunction("PRODUCT", 1, 255, Product); - ce.RegisterFunction("QUOTIENT", 2, Quotient); - ce.RegisterFunction("RADIANS", 1, Radians); - ce.RegisterFunction("RAND", 0, Rand); - ce.RegisterFunction("RANDBETWEEN", 2, RandBetween); - ce.RegisterFunction("ROMAN", 1, 2, Roman); - ce.RegisterFunction("ROUND", 2, Round); - ce.RegisterFunction("ROUNDDOWN", 2, RoundDown); - ce.RegisterFunction("ROUNDUP", 1, 2, RoundUp); - ce.RegisterFunction("SERIESSUM", 4, SeriesSum); - ce.RegisterFunction("SIGN", 1, Sign); - ce.RegisterFunction("SIN", 1, Sin); - ce.RegisterFunction("SINH", 1, Sinh); - ce.RegisterFunction("SQRT", 1, Sqrt); - ce.RegisterFunction("SQRTPI", 1, SqrtPi); - ce.RegisterFunction("SUBTOTAL", 2, 255, Subtotal); - ce.RegisterFunction("SUM", 1, int.MaxValue, Sum); - ce.RegisterFunction("SUMIF", 2, 3, SumIf); - //ce.RegisterFunction("SUMPRODUCT", 1, SumProduct); - ce.RegisterFunction("SUMSQ", 1, 255, SumSq); - //ce.RegisterFunction("SUMX2MY2", SumX2MY2, 1); - //ce.RegisterFunction("SUMX2PY2", SumX2PY2, 1); - //ce.RegisterFunction("SUMXMY2", SumXMY2, 1); - ce.RegisterFunction("TAN", 1, Tan); - ce.RegisterFunction("TANH", 1, Tanh); - ce.RegisterFunction("TRUNC", 1, Trunc); - } - - private static object Abs(List p) - { - return Math.Abs(p[0]); - } - - private static object Acos(List p) - { - return Math.Acos(p[0]); - } - - private static object Asin(List p) - { - return Math.Asin(p[0]); - } - - private static object Atan(List p) - { - return Math.Atan(p[0]); - } - - private static object Atan2(List p) - { - return Math.Atan2(p[0], p[1]); - } - - private static object Ceiling(List p) - { - return Math.Ceiling(p[0]); - } - - private static object Cos(List p) - { - return Math.Cos(p[0]); - } - - private static object Cosh(List p) - { - return Math.Cosh(p[0]); - } - - private static object Exp(List p) - { - return Math.Exp(p[0]); - } - - private static object Floor(List p) - { - return Math.Floor(p[0]); - } - - private static object Int(List p) - { - return (int) ((double) p[0]); - } - - private static object Ln(List p) - { - return Math.Log(p[0]); - } - - private static object Log(List p) - { - var lbase = p.Count > 1 ? (double) p[1] : 10; - return Math.Log(p[0], lbase); - } - - private static object Log10(List p) - { - return Math.Log10(p[0]); - } - - private static object Pi(List p) - { - return Math.PI; - } - - private static object Power(List p) - { - return Math.Pow(p[0], p[1]); - } - - private static object Rand(List p) - { - return _rnd.NextDouble(); - } - - private static object RandBetween(List p) - { - return _rnd.Next((int) (double) p[0], (int) (double) p[1]); - } - - private static object Sign(List p) - { - return Math.Sign(p[0]); - } - - private static object Sin(List p) - { - return Math.Sin(p[0]); - } - - private static object Sinh(List p) - { - return Math.Sinh(p[0]); - } - - private static object Sqrt(List p) - { - return Math.Sqrt(p[0]); - } - - private static object Sum(List p) - { - var tally = new Tally(); - foreach (var e in p) - { - tally.Add(e); - } - return tally.Sum(); - } - - private static object SumIf(List p) - { - // get parameters - var range = p[0] as IEnumerable; - var sumRange = p.Count < 3 ? range : p[2] as IEnumerable; - var criteria = p[1].Evaluate(); - - // build list of values in range and sumRange - var rangeValues = new List(); - foreach (var value in range) - { - rangeValues.Add(value); - } - var sumRangeValues = new List(); - foreach (var value in sumRange) - { - sumRangeValues.Add(value); - } - - // compute total - var ce = new CalcEngine(); - var tally = new Tally(); - for (var i = 0; i < Math.Min(rangeValues.Count, sumRangeValues.Count); i++) - { - if (CalcEngineHelpers.ValueSatisfiesCriteria(rangeValues[i], criteria, ce)) - { - tally.AddValue(sumRangeValues[i]); - } - } - - // done - return tally.Sum(); - } - - private static object Tan(List p) - { - return Math.Tan(p[0]); - } - - private static object Tanh(List p) - { - return Math.Tanh(p[0]); - } - - private static object Trunc(List p) - { - return (double) (int) ((double) p[0]); - } - - public static double DegreesToRadians(double degrees) - { - return (Math.PI/180.0)*degrees; - } - - public static double RadiansToDegrees(double radians) - { - return (180.0/Math.PI)*radians; - } - - public static double GradsToRadians(double grads) - { - return (grads/200.0)*Math.PI; - } - - public static double RadiansToGrads(double radians) - { - return (radians/Math.PI)*200.0; - } - - public static double DegreesToGrads(double degrees) - { - return (degrees/9.0)*10.0; - } - - public static double GradsToDegrees(double grads) - { - return (grads/10.0)*9.0; - } - - public static double ASinh(double x) - { - return (Math.Log(x + Math.Sqrt(x*x + 1.0))); - } - - private static object Acosh(List p) - { - return XLMath.ACosh(p[0]); - } - - private static object Asinh(List p) - { - return XLMath.ASinh(p[0]); - } - - private static object Atanh(List p) - { - return XLMath.ATanh(p[0]); - } - - private static object Combin(List p) - { - Int32 n = (int) p[0]; - Int32 k = (int) p[1]; - return XLMath.Combin(n, k); - } - - private static object Degrees(List p) - { - return p[0] * (180.0 / Math.PI); - } - - - - private static object Fact(List p) - { - var num = Math.Floor(p[0]); - double fact = 1.0; - if (num > 1) - for (int i = 2; i <= num; i++) - fact *= i; - return fact; - } - - private static object FactDouble(List p) - { - var num = Math.Floor(p[0]); - double fact = 1.0; - if (num > 1) - { - var start = Math.Abs(num % 2) < XLHelper.Epsilon ? 2 : 1; - for (int i = start; i <= num; i = i + 2) - fact *= i; - } - return fact; - } - - private static object Gcd(List p) - { - return p.Select(v => (int)v).Aggregate(Gcd); - } - - private static int Gcd(int a, int b) - { - return b == 0 ? a : Gcd(b, a % b); - } - - private static object Lcm(List p) - { - return p.Select(v => (int)v).Aggregate(Lcm); - } - - private static int Lcm(int a, int b) - { - if (a == 0 || b == 0) return 0; - return a * ( b / Gcd(a, b)); - } - - private static object Mod(List p) - { - Int32 n = (int)Math.Abs(p[0]); - Int32 d = (int)p[1]; - var ret = n % d; - return d < 0 ? ret * -1 : ret; - } - - private static object MRound(List p) - { - var n = (Decimal)(Double)p[0]; - var k = (Decimal)(Double)p[1]; - - var mod = n % k; - var mult = Math.Floor(n / k); - var div = k / 2; - - if (Math.Abs(mod - div) <= (Decimal)XLHelper.Epsilon) return (k * mult) + k; - - return k * mult; - } - - private static object Multinomial(List p) - { - return Multinomial(p.Select(v => (double)v).ToList()); - } - - private static double Multinomial(List numbers) - { - double numbersSum = 0; - foreach (var number in numbers) - numbersSum += number; - - double maxNumber = numbers.Max(); - var denomFactorPowers = new double[(uint)numbers.Max() + 1]; - foreach (var number in numbers) - for (int i = 2; i <= number; i++) - denomFactorPowers[i]++; - for (int i = 2; i < denomFactorPowers.Length; i++) - denomFactorPowers[i]--; // reduce with nominator; - - int currentFactor = 2; - double currentPower = 1; - double result = 1; - for (double i = maxNumber + 1; i <= numbersSum; i++) - { - double tempDenom = 1; - while (tempDenom < result && currentFactor < denomFactorPowers.Length) - { - if (currentPower > denomFactorPowers[currentFactor]) - { - currentFactor++; - currentPower = 1; - } - else - { - tempDenom *= currentFactor; - currentPower++; - } - } - result = result / tempDenom * i; - } - - return result; - } - - private static object Odd(List p) - { - var num = (int)Math.Ceiling(p[0]); - var addValue = num >= 0 ? 1 : -1; - return XLMath.IsOdd(num) ? num : num + addValue; - } - - private static object Even(List p) - { - var num = (int)Math.Ceiling(p[0]); - var addValue = num >= 0 ? 1 : -1; - return XLMath.IsEven(num) ? num : num + addValue; - } - - private static object Product(List p) - { - if (p.Count == 0) return 0; - Double total = 1; - p.ForEach(v => total *= v); - return total; - } - - private static object Quotient(List p) - { - Double n = p[0]; - Double k = p[1]; - - return (int)(n / k); - } - - private static object Radians(List p) - { - return p[0] * Math.PI / 180.0; - } - - private static object Roman(List p) - { - Int32 intTemp; - Boolean boolTemp; - if (p.Count == 1 - || (Boolean.TryParse(p[1]._token.Value.ToString(), out boolTemp) && boolTemp) - || (Int32.TryParse(p[1]._token.Value.ToString(), out intTemp) && intTemp == 1)) - return XLMath.ToRoman((int)p[0]); - - throw new ArgumentException("Can only support classic roman types."); - } - - private static object Round(List p) - { - var value = (Double)p[0]; - var digits = (Int32)(Double)p[1]; - if (digits >= 0) - { - return Math.Round(value, digits); - } - else - { - digits = Math.Abs(digits); - double temp = value / Math.Pow(10, digits); - temp = Math.Round(temp, 0); - return temp * Math.Pow(10, digits); - } - - } - - private static object RoundDown(List p) - { - var value = (Double)p[0]; - var digits = (Int32)(Double)p[1]; - - if (value >= 0) - return Math.Floor(value * Math.Pow(10, digits)) / Math.Pow(10, digits); - - return Math.Ceiling(value * Math.Pow(10, digits)) / Math.Pow(10, digits); - } - - private static object RoundUp(List p) - { - var value = (Double)p[0]; - var digits = (Int32)(Double)p[1]; - - if (value >= 0) - return Math.Ceiling(value * Math.Pow(10, digits)) / Math.Pow(10, digits); - - return Math.Floor(value * Math.Pow(10, digits)) / Math.Pow(10, digits); - } - - private static object SeriesSum(List p) - { - var x = (Double)p[0]; - var n = (Double)p[1]; - var m = (Double)p[2]; - var obj = p[3] as XObjectExpression; - - if (obj == null) - return p[3] * Math.Pow(x , n); - - Double total = 0; - Int32 i = 0; - foreach (var e in obj) - { - total += (double)e * Math.Pow(x, n + i * m); - i++; - } - - return total; - } - - private static object SqrtPi(List p) - { - var num = (Double)p[0]; - return Math.Sqrt(Math.PI * num); - } - - private static object Subtotal(List p) - { - var fId = (int)(Double)p[0]; - var tally = new Tally(p.Skip(1)); - - switch (fId) - { - case 1: - return tally.Average(); - case 2: - return tally.Count(true); - case 3: - return tally.Count(false); - case 4: - return tally.Max(); - case 5: - return tally.Min(); - case 6: - return tally.Product(); - case 7: - return tally.Std(); - case 8: - return tally.StdP(); - case 9: - return tally.Sum(); - case 10: - return tally.Var(); - case 11: - return tally.VarP(); - default: - throw new ArgumentException("Function not supported."); - } - } - - private static object SumSq(List p) - { - var t = new Tally(p); - return t.NumericValues().Sum(v => Math.Pow(v, 2)); - } - - private static object MMult(List p) - { - Double[,] A = GetArray(p[0]); - Double[,] B = GetArray(p[1]); - - if (A.GetLength(0) != B.GetLength(0) || A.GetLength(1) != B.GetLength(1)) - throw new ArgumentException("Ranges must have the same number of rows and columns."); - - var C = new double[A.GetLength(0), A.GetLength(1)]; - for (int i = 0; i < A.GetLength(0); i++) - { - for (int j = 0; j < B.GetLength(1); j++) - { - for (int k = 0; k < A.GetLength(1); k++) - { - C[i, j] += A[i, k] * B[k, j]; - } - } - } - - - return C; - } - - private static double[,] GetArray(Expression expression) - { - var oExp1 = expression as XObjectExpression; - if (oExp1 == null) return new [,]{{(Double)expression}}; - - var range = (oExp1.Value as CellRangeReference).Range; - var rowCount = range.RowCount(); - var columnCount = range.ColumnCount(); - var arr = new double[rowCount,columnCount]; - - for (int row = 0; row < rowCount; row++) - { - for (int column = 0; column < columnCount; column++) - { - arr[row, column] = range.Cell(row + 1, column + 1).GetDouble(); - } - } - - return arr; - } - - private static object MDeterm(List p) - { - var arr = GetArray(p[0]); - var m = new XLMatrix(arr); - - return m.Determinant(); - } - - private static object MInverse(List p) - { - var arr = GetArray(p[0]); - var m = new XLMatrix(arr); - - return m.Invert().mat; - } - } -} +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using ClosedXML.Excel.CalcEngine.Functions; + +namespace ClosedXML.Excel.CalcEngine +{ + internal static class MathTrig + { + private static readonly Random _rnd = new Random(); + + public static void Register(CalcEngine ce) + { + ce.RegisterFunction("ABS", 1, Abs); + ce.RegisterFunction("ACOS", 1, Acos); + ce.RegisterFunction("ACOSH", 1, Acosh); + ce.RegisterFunction("ASIN", 1, Asin); + ce.RegisterFunction("ASINH", 1, Asinh); + ce.RegisterFunction("ATAN", 1, Atan); + ce.RegisterFunction("ATAN2", 2, Atan2); + ce.RegisterFunction("ATANH", 1, Atanh); + ce.RegisterFunction("CEILING", 1, Ceiling); + ce.RegisterFunction("COMBIN", 2, Combin); + ce.RegisterFunction("COS", 1, Cos); + ce.RegisterFunction("COSH", 1, Cosh); + ce.RegisterFunction("DEGREES", 1, Degrees); + ce.RegisterFunction("EVEN", 1, Even); + ce.RegisterFunction("EXP", 1, Exp); + ce.RegisterFunction("FACT", 1, Fact); + ce.RegisterFunction("FACTDOUBLE", 1, FactDouble); + ce.RegisterFunction("FLOOR", 1, Floor); + ce.RegisterFunction("GCD", 1, 255, Gcd); + ce.RegisterFunction("INT", 1, Int); + ce.RegisterFunction("LCM", 1, 255, Lcm); + ce.RegisterFunction("LN", 1, Ln); + ce.RegisterFunction("LOG", 1, 2, Log); + ce.RegisterFunction("LOG10", 1, Log10); + ce.RegisterFunction("MDETERM", 1, MDeterm); + ce.RegisterFunction("MINVERSE", 1, MInverse); + ce.RegisterFunction("MMULT", 2, MMult); + ce.RegisterFunction("MOD", 2, Mod); + ce.RegisterFunction("MROUND", 2, MRound); + ce.RegisterFunction("MULTINOMIAL", 1, 255, Multinomial); + ce.RegisterFunction("ODD", 1, Odd); + ce.RegisterFunction("PI", 0, Pi); + ce.RegisterFunction("POWER", 2, Power); + ce.RegisterFunction("PRODUCT", 1, 255, Product); + ce.RegisterFunction("QUOTIENT", 2, Quotient); + ce.RegisterFunction("RADIANS", 1, Radians); + ce.RegisterFunction("RAND", 0, Rand); + ce.RegisterFunction("RANDBETWEEN", 2, RandBetween); + ce.RegisterFunction("ROMAN", 1, 2, Roman); + ce.RegisterFunction("ROUND", 2, Round); + ce.RegisterFunction("ROUNDDOWN", 2, RoundDown); + ce.RegisterFunction("ROUNDUP", 1, 2, RoundUp); + ce.RegisterFunction("SERIESSUM", 4, SeriesSum); + ce.RegisterFunction("SIGN", 1, Sign); + ce.RegisterFunction("SIN", 1, Sin); + ce.RegisterFunction("SINH", 1, Sinh); + ce.RegisterFunction("SQRT", 1, Sqrt); + ce.RegisterFunction("SQRTPI", 1, SqrtPi); + ce.RegisterFunction("SUBTOTAL", 2, 255, Subtotal); + ce.RegisterFunction("SUM", 1, int.MaxValue, Sum); + ce.RegisterFunction("SUMIF", 2, 3, SumIf); + //ce.RegisterFunction("SUMPRODUCT", 1, SumProduct); + ce.RegisterFunction("SUMSQ", 1, 255, SumSq); + //ce.RegisterFunction("SUMX2MY2", SumX2MY2, 1); + //ce.RegisterFunction("SUMX2PY2", SumX2PY2, 1); + //ce.RegisterFunction("SUMXMY2", SumXMY2, 1); + ce.RegisterFunction("TAN", 1, Tan); + ce.RegisterFunction("TANH", 1, Tanh); + ce.RegisterFunction("TRUNC", 1, Trunc); + } + + private static object Abs(List p) + { + return Math.Abs(p[0]); + } + + private static object Acos(List p) + { + return Math.Acos(p[0]); + } + + private static object Asin(List p) + { + return Math.Asin(p[0]); + } + + private static object Atan(List p) + { + return Math.Atan(p[0]); + } + + private static object Atan2(List p) + { + return Math.Atan2(p[0], p[1]); + } + + private static object Ceiling(List p) + { + return Math.Ceiling(p[0]); + } + + private static object Cos(List p) + { + return Math.Cos(p[0]); + } + + private static object Cosh(List p) + { + return Math.Cosh(p[0]); + } + + private static object Exp(List p) + { + return Math.Exp(p[0]); + } + + private static object Floor(List p) + { + return Math.Floor(p[0]); + } + + private static object Int(List p) + { + return (int) ((double) p[0]); + } + + private static object Ln(List p) + { + return Math.Log(p[0]); + } + + private static object Log(List p) + { + var lbase = p.Count > 1 ? (double) p[1] : 10; + return Math.Log(p[0], lbase); + } + + private static object Log10(List p) + { + return Math.Log10(p[0]); + } + + private static object Pi(List p) + { + return Math.PI; + } + + private static object Power(List p) + { + return Math.Pow(p[0], p[1]); + } + + private static object Rand(List p) + { + return _rnd.NextDouble(); + } + + private static object RandBetween(List p) + { + return _rnd.Next((int) (double) p[0], (int) (double) p[1]); + } + + private static object Sign(List p) + { + return Math.Sign(p[0]); + } + + private static object Sin(List p) + { + return Math.Sin(p[0]); + } + + private static object Sinh(List p) + { + return Math.Sinh(p[0]); + } + + private static object Sqrt(List p) + { + return Math.Sqrt(p[0]); + } + + private static object Sum(List p) + { + var tally = new Tally(); + foreach (var e in p) + { + tally.Add(e); + } + return tally.Sum(); + } + + private static object SumIf(List p) + { + // get parameters + var range = p[0] as IEnumerable; + var sumRange = p.Count < 3 ? range : p[2] as IEnumerable; + var criteria = p[1].Evaluate(); + + // build list of values in range and sumRange + var rangeValues = new List(); + foreach (var value in range) + { + rangeValues.Add(value); + } + var sumRangeValues = new List(); + foreach (var value in sumRange) + { + sumRangeValues.Add(value); + } + + // compute total + var ce = new CalcEngine(); + var tally = new Tally(); + for (var i = 0; i < Math.Min(rangeValues.Count, sumRangeValues.Count); i++) + { + if (CalcEngineHelpers.ValueSatisfiesCriteria(rangeValues[i], criteria, ce)) + { + tally.AddValue(sumRangeValues[i]); + } + } + + // done + return tally.Sum(); + } + + private static object Tan(List p) + { + return Math.Tan(p[0]); + } + + private static object Tanh(List p) + { + return Math.Tanh(p[0]); + } + + private static object Trunc(List p) + { + return (double) (int) ((double) p[0]); + } + + public static double DegreesToRadians(double degrees) + { + return (Math.PI/180.0)*degrees; + } + + public static double RadiansToDegrees(double radians) + { + return (180.0/Math.PI)*radians; + } + + public static double GradsToRadians(double grads) + { + return (grads/200.0)*Math.PI; + } + + public static double RadiansToGrads(double radians) + { + return (radians/Math.PI)*200.0; + } + + public static double DegreesToGrads(double degrees) + { + return (degrees/9.0)*10.0; + } + + public static double GradsToDegrees(double grads) + { + return (grads/10.0)*9.0; + } + + public static double ASinh(double x) + { + return (Math.Log(x + Math.Sqrt(x*x + 1.0))); + } + + private static object Acosh(List p) + { + return XLMath.ACosh(p[0]); + } + + private static object Asinh(List p) + { + return XLMath.ASinh(p[0]); + } + + private static object Atanh(List p) + { + return XLMath.ATanh(p[0]); + } + + private static object Combin(List p) + { + Int32 n = (int) p[0]; + Int32 k = (int) p[1]; + return XLMath.Combin(n, k); + } + + private static object Degrees(List p) + { + return p[0] * (180.0 / Math.PI); + } + + + + private static object Fact(List p) + { + var num = Math.Floor(p[0]); + double fact = 1.0; + if (num > 1) + for (int i = 2; i <= num; i++) + fact *= i; + return fact; + } + + private static object FactDouble(List p) + { + var num = Math.Floor(p[0]); + double fact = 1.0; + if (num > 1) + { + var start = Math.Abs(num % 2) < XLHelper.Epsilon ? 2 : 1; + for (int i = start; i <= num; i = i + 2) + fact *= i; + } + return fact; + } + + private static object Gcd(List p) + { + return p.Select(v => (int)v).Aggregate(Gcd); + } + + private static int Gcd(int a, int b) + { + return b == 0 ? a : Gcd(b, a % b); + } + + private static object Lcm(List p) + { + return p.Select(v => (int)v).Aggregate(Lcm); + } + + private static int Lcm(int a, int b) + { + if (a == 0 || b == 0) return 0; + return a * ( b / Gcd(a, b)); + } + + private static object Mod(List p) + { + Int32 n = (int)Math.Abs(p[0]); + Int32 d = (int)p[1]; + var ret = n % d; + return d < 0 ? ret * -1 : ret; + } + + private static object MRound(List p) + { + var n = (Decimal)(Double)p[0]; + var k = (Decimal)(Double)p[1]; + + var mod = n % k; + var mult = Math.Floor(n / k); + var div = k / 2; + + if (Math.Abs(mod - div) <= (Decimal)XLHelper.Epsilon) return (k * mult) + k; + + return k * mult; + } + + private static object Multinomial(List p) + { + return Multinomial(p.Select(v => (double)v).ToList()); + } + + private static double Multinomial(List numbers) + { + double numbersSum = 0; + foreach (var number in numbers) + numbersSum += number; + + double maxNumber = numbers.Max(); + var denomFactorPowers = new double[(uint)numbers.Max() + 1]; + foreach (var number in numbers) + for (int i = 2; i <= number; i++) + denomFactorPowers[i]++; + for (int i = 2; i < denomFactorPowers.Length; i++) + denomFactorPowers[i]--; // reduce with nominator; + + int currentFactor = 2; + double currentPower = 1; + double result = 1; + for (double i = maxNumber + 1; i <= numbersSum; i++) + { + double tempDenom = 1; + while (tempDenom < result && currentFactor < denomFactorPowers.Length) + { + if (currentPower > denomFactorPowers[currentFactor]) + { + currentFactor++; + currentPower = 1; + } + else + { + tempDenom *= currentFactor; + currentPower++; + } + } + result = result / tempDenom * i; + } + + return result; + } + + private static object Odd(List p) + { + var num = (int)Math.Ceiling(p[0]); + var addValue = num >= 0 ? 1 : -1; + return XLMath.IsOdd(num) ? num : num + addValue; + } + + private static object Even(List p) + { + var num = (int)Math.Ceiling(p[0]); + var addValue = num >= 0 ? 1 : -1; + return XLMath.IsEven(num) ? num : num + addValue; + } + + private static object Product(List p) + { + if (p.Count == 0) return 0; + Double total = 1; + p.ForEach(v => total *= v); + return total; + } + + private static object Quotient(List p) + { + Double n = p[0]; + Double k = p[1]; + + return (int)(n / k); + } + + private static object Radians(List p) + { + return p[0] * Math.PI / 180.0; + } + + private static object Roman(List p) + { + Int32 intTemp; + Boolean boolTemp; + if (p.Count == 1 + || (Boolean.TryParse(p[1]._token.Value.ToString(), out boolTemp) && boolTemp) + || (Int32.TryParse(p[1]._token.Value.ToString(), out intTemp) && intTemp == 1)) + return XLMath.ToRoman((int)p[0]); + + throw new ArgumentException("Can only support classic roman types."); + } + + private static object Round(List p) + { + var value = (Double)p[0]; + var digits = (Int32)(Double)p[1]; + if (digits >= 0) + { + return Math.Round(value, digits, MidpointRounding.AwayFromZero); + } + else + { + digits = Math.Abs(digits); + double temp = value / Math.Pow(10, digits); + temp = Math.Round(temp, 0, MidpointRounding.AwayFromZero); + return temp * Math.Pow(10, digits); + } + + } + + private static object RoundDown(List p) + { + var value = (Double)p[0]; + var digits = (Int32)(Double)p[1]; + + if (value >= 0) + return Math.Floor(value * Math.Pow(10, digits)) / Math.Pow(10, digits); + + return Math.Ceiling(value * Math.Pow(10, digits)) / Math.Pow(10, digits); + } + + private static object RoundUp(List p) + { + var value = (Double)p[0]; + var digits = (Int32)(Double)p[1]; + + if (value >= 0) + return Math.Ceiling(value * Math.Pow(10, digits)) / Math.Pow(10, digits); + + return Math.Floor(value * Math.Pow(10, digits)) / Math.Pow(10, digits); + } + + private static object SeriesSum(List p) + { + var x = (Double)p[0]; + var n = (Double)p[1]; + var m = (Double)p[2]; + var obj = p[3] as XObjectExpression; + + if (obj == null) + return p[3] * Math.Pow(x , n); + + Double total = 0; + Int32 i = 0; + foreach (var e in obj) + { + total += (double)e * Math.Pow(x, n + i * m); + i++; + } + + return total; + } + + private static object SqrtPi(List p) + { + var num = (Double)p[0]; + return Math.Sqrt(Math.PI * num); + } + + private static object Subtotal(List p) + { + var fId = (int)(Double)p[0]; + var tally = new Tally(p.Skip(1)); + + switch (fId) + { + case 1: + return tally.Average(); + case 2: + return tally.Count(true); + case 3: + return tally.Count(false); + case 4: + return tally.Max(); + case 5: + return tally.Min(); + case 6: + return tally.Product(); + case 7: + return tally.Std(); + case 8: + return tally.StdP(); + case 9: + return tally.Sum(); + case 10: + return tally.Var(); + case 11: + return tally.VarP(); + default: + throw new ArgumentException("Function not supported."); + } + } + + private static object SumSq(List p) + { + var t = new Tally(p); + return t.NumericValues().Sum(v => Math.Pow(v, 2)); + } + + private static object MMult(List p) + { + Double[,] A = GetArray(p[0]); + Double[,] B = GetArray(p[1]); + + if (A.GetLength(0) != B.GetLength(0) || A.GetLength(1) != B.GetLength(1)) + throw new ArgumentException("Ranges must have the same number of rows and columns."); + + var C = new double[A.GetLength(0), A.GetLength(1)]; + for (int i = 0; i < A.GetLength(0); i++) + { + for (int j = 0; j < B.GetLength(1); j++) + { + for (int k = 0; k < A.GetLength(1); k++) + { + C[i, j] += A[i, k] * B[k, j]; + } + } + } + + + return C; + } + + private static double[,] GetArray(Expression expression) + { + var oExp1 = expression as XObjectExpression; + if (oExp1 == null) return new [,]{{(Double)expression}}; + + var range = (oExp1.Value as CellRangeReference).Range; + var rowCount = range.RowCount(); + var columnCount = range.ColumnCount(); + var arr = new double[rowCount,columnCount]; + + for (int row = 0; row < rowCount; row++) + { + for (int column = 0; column < columnCount; column++) + { + arr[row, column] = range.Cell(row + 1, column + 1).GetDouble(); + } + } + + return arr; + } + + private static object MDeterm(List p) + { + var arr = GetArray(p[0]); + var m = new XLMatrix(arr); + + return m.Determinant(); + } + + private static object MInverse(List p) + { + var arr = GetArray(p[0]); + var m = new XLMatrix(arr); + + return m.Invert().mat; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Statistical.cs b/ClosedXML/Excel/CalcEngine/Functions/Statistical.cs index 34b14f1..160af64 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/Statistical.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/Statistical.cs @@ -1,218 +1,218 @@ -using System; -using System.Net; -using System.Collections; -using System.Collections.Generic; - -namespace ClosedXML.Excel.CalcEngine -{ - internal static class Statistical - { - public static void Register(CalcEngine ce) - { - //ce.RegisterFunction("AVEDEV", AveDev, 1, int.MaxValue); - ce.RegisterFunction("AVERAGE", 1, int.MaxValue, Average); // Returns the average (arithmetic mean) of the arguments - ce.RegisterFunction("AVERAGEA", 1, int.MaxValue, AverageA); - //BETADIST Returns the beta cumulative distribution function - //BETAINV Returns the inverse of the cumulative distribution function for a specified beta distribution - //BINOMDIST Returns the individual term binomial distribution probability - //CHIDIST Returns the one-tailed probability of the chi-squared distribution - //CHIINV Returns the inverse of the one-tailed probability of the chi-squared distribution - //CHITEST Returns the test for independence - //CONFIDENCE Returns the confidence interval for a population mean - //CORREL Returns the correlation coefficient between two data sets - ce.RegisterFunction("COUNT", 1, int.MaxValue, Count); - ce.RegisterFunction("COUNTA", 1, int.MaxValue, CountA); - ce.RegisterFunction("COUNTBLANK", 1, CountBlank); - ce.RegisterFunction("COUNTIF", 2, CountIf); - //COVAR Returns covariance, the average of the products of paired deviations - //CRITBINOM Returns the smallest value for which the cumulative binomial distribution is less than or equal to a criterion value - //DEVSQ Returns the sum of squares of deviations - //EXPONDIST Returns the exponential distribution - //FDIST Returns the F probability distribution - //FINV Returns the inverse of the F probability distribution - //FISHER Returns the Fisher transformation - //FISHERINV Returns the inverse of the Fisher transformation - //FORECAST Returns a value along a linear trend - //FREQUENCY Returns a frequency distribution as a vertical array - //FTEST Returns the result of an F-test - //GAMMADIST Returns the gamma distribution - //GAMMAINV Returns the inverse of the gamma cumulative distribution - //GAMMALN Returns the natural logarithm of the gamma function, Γ(x) - //GEOMEAN Returns the geometric mean - //GROWTH Returns values along an exponential trend - //HARMEAN Returns the harmonic mean - //HYPGEOMDIST Returns the hypergeometric distribution - //INTERCEPT Returns the intercept of the linear regression line - //KURT Returns the kurtosis of a data set - //LARGE Returns the k-th largest value in a data set - //LINEST Returns the parameters of a linear trend - //LOGEST Returns the parameters of an exponential trend - //LOGINV Returns the inverse of the lognormal distribution - //LOGNORMDIST Returns the cumulative lognormal distribution - ce.RegisterFunction("MAX", 1, int.MaxValue, Max); - ce.RegisterFunction("MAXA", 1, int.MaxValue, MaxA); - //MEDIAN Returns the median of the given numbers - ce.RegisterFunction("MIN", 1, int.MaxValue, Min); - ce.RegisterFunction("MINA", 1, int.MaxValue, MinA); - //MODE Returns the most common value in a data set - //NEGBINOMDIST Returns the negative binomial distribution - //NORMDIST Returns the normal cumulative distribution - //NORMINV Returns the inverse of the normal cumulative distribution - //NORMSDIST Returns the standard normal cumulative distribution - //NORMSINV Returns the inverse of the standard normal cumulative distribution - //PEARSON Returns the Pearson product moment correlation coefficient - //PERCENTILE Returns the k-th percentile of values in a range - //PERCENTRANK Returns the percentage rank of a value in a data set - //PERMUT Returns the number of permutations for a given number of objects - //POISSON Returns the Poisson distribution - //PROB Returns the probability that values in a range are between two limits - //QUARTILE Returns the quartile of a data set - //RANK Returns the rank of a number in a list of numbers - //RSQ Returns the square of the Pearson product moment correlation coefficient - //SKEW Returns the skewness of a distribution - //SLOPE Returns the slope of the linear regression line - //SMALL Returns the k-th smallest value in a data set - //STANDARDIZE Returns a normalized value - ce.RegisterFunction("STDEV", 1, int.MaxValue, StDev); - ce.RegisterFunction("STDEVA", 1, int.MaxValue, StDevA); - ce.RegisterFunction("STDEVP", 1, int.MaxValue, StDevP); - ce.RegisterFunction("STDEVPA", 1, int.MaxValue, StDevPA); - ce.RegisterFunction("STDEV.S", 1, int.MaxValue, StDev); - ce.RegisterFunction("STDEV.P", 1, int.MaxValue, StDevP); - //STEYX Returns the standard error of the predicted y-value for each x in the regression - //TDIST Returns the Student's t-distribution - //TINV Returns the inverse of the Student's t-distribution - //TREND Returns values along a linear trend - //TRIMMEAN Returns the mean of the interior of a data set - //TTEST Returns the probability associated with a Student's t-test - ce.RegisterFunction("VAR", 1, int.MaxValue, Var); - ce.RegisterFunction("VARA", 1, int.MaxValue, VarA); - ce.RegisterFunction("VARP", 1, int.MaxValue, VarP); - ce.RegisterFunction("VARPA", 1, int.MaxValue, VarPA); - ce.RegisterFunction("VAR.S", 1, int.MaxValue, Var); - ce.RegisterFunction("VAR.P", 1, int.MaxValue, VarP); - //WEIBULL Returns the Weibull distribution - //ZTEST Returns the one-tailed probability-value of a z-test - } - - - - static object Average(List p) - { - return GetTally(p, true).Average(); - } - static object AverageA(List p) - { - return GetTally(p, false).Average(); - } - static object Count(List p) - { - return GetTally(p, true).Count(); - } - static object CountA(List p) - { - return GetTally(p, false).Count(); - } - static object CountBlank(List p) - { - var cnt = 0.0; - foreach (Expression e in p) - { - var ienum = e as IEnumerable; - if (ienum != null) - { - foreach (var value in ienum) - { - if (IsBlank(value)) - cnt++; - } - } - else - { - if (IsBlank(e.Evaluate())) - cnt++; - } - } - return cnt; - } - internal static bool IsBlank(object value) - { - return - value == null || - value is string && ((string)value).Length == 0; - } - static object CountIf(List p) - { - CalcEngine ce = new CalcEngine(); - var cnt = 0.0; - var ienum = p[0] as IEnumerable; - if (ienum != null) - { - var criteria = (string)p[1].Evaluate(); - foreach (var value in ienum) - { - if (!IsBlank(value)) - { - if (CalcEngineHelpers.ValueSatisfiesCriteria(value, criteria, ce)) - cnt++; - } - } - } - return cnt; - } - static object Max(List p) - { - return GetTally(p, true).Max(); - } - static object MaxA(List p) - { - return GetTally(p, false).Max(); - } - static object Min(List p) - { - return GetTally(p, true).Min(); - } - static object MinA(List p) - { - return GetTally(p, false).Min(); - } - static object StDev(List p) - { - return GetTally(p, true).Std(); - } - static object StDevA(List p) - { - return GetTally(p, false).Std(); - } - static object StDevP(List p) - { - return GetTally(p, true).StdP(); - } - static object StDevPA(List p) - { - return GetTally(p, false).StdP(); - } - static object Var(List p) - { - return GetTally(p, true).Var(); - } - static object VarA(List p) - { - return GetTally(p, false).Var(); - } - static object VarP(List p) - { - return GetTally(p, true).VarP(); - } - static object VarPA(List p) - { - return GetTally(p, false).VarP(); - } - - // utility for tallying statistics - static Tally GetTally(List p, bool numbersOnly) - { - return new Tally(p, numbersOnly); - } - } -} +using System; +using System.Net; +using System.Collections; +using System.Collections.Generic; + +namespace ClosedXML.Excel.CalcEngine +{ + internal static class Statistical + { + public static void Register(CalcEngine ce) + { + //ce.RegisterFunction("AVEDEV", AveDev, 1, int.MaxValue); + ce.RegisterFunction("AVERAGE", 1, int.MaxValue, Average); // Returns the average (arithmetic mean) of the arguments + ce.RegisterFunction("AVERAGEA", 1, int.MaxValue, AverageA); + //BETADIST Returns the beta cumulative distribution function + //BETAINV Returns the inverse of the cumulative distribution function for a specified beta distribution + //BINOMDIST Returns the individual term binomial distribution probability + //CHIDIST Returns the one-tailed probability of the chi-squared distribution + //CHIINV Returns the inverse of the one-tailed probability of the chi-squared distribution + //CHITEST Returns the test for independence + //CONFIDENCE Returns the confidence interval for a population mean + //CORREL Returns the correlation coefficient between two data sets + ce.RegisterFunction("COUNT", 1, int.MaxValue, Count); + ce.RegisterFunction("COUNTA", 1, int.MaxValue, CountA); + ce.RegisterFunction("COUNTBLANK", 1, CountBlank); + ce.RegisterFunction("COUNTIF", 2, CountIf); + //COVAR Returns covariance, the average of the products of paired deviations + //CRITBINOM Returns the smallest value for which the cumulative binomial distribution is less than or equal to a criterion value + //DEVSQ Returns the sum of squares of deviations + //EXPONDIST Returns the exponential distribution + //FDIST Returns the F probability distribution + //FINV Returns the inverse of the F probability distribution + //FISHER Returns the Fisher transformation + //FISHERINV Returns the inverse of the Fisher transformation + //FORECAST Returns a value along a linear trend + //FREQUENCY Returns a frequency distribution as a vertical array + //FTEST Returns the result of an F-test + //GAMMADIST Returns the gamma distribution + //GAMMAINV Returns the inverse of the gamma cumulative distribution + //GAMMALN Returns the natural logarithm of the gamma function, Γ(x) + //GEOMEAN Returns the geometric mean + //GROWTH Returns values along an exponential trend + //HARMEAN Returns the harmonic mean + //HYPGEOMDIST Returns the hypergeometric distribution + //INTERCEPT Returns the intercept of the linear regression line + //KURT Returns the kurtosis of a data set + //LARGE Returns the k-th largest value in a data set + //LINEST Returns the parameters of a linear trend + //LOGEST Returns the parameters of an exponential trend + //LOGINV Returns the inverse of the lognormal distribution + //LOGNORMDIST Returns the cumulative lognormal distribution + ce.RegisterFunction("MAX", 1, int.MaxValue, Max); + ce.RegisterFunction("MAXA", 1, int.MaxValue, MaxA); + //MEDIAN Returns the median of the given numbers + ce.RegisterFunction("MIN", 1, int.MaxValue, Min); + ce.RegisterFunction("MINA", 1, int.MaxValue, MinA); + //MODE Returns the most common value in a data set + //NEGBINOMDIST Returns the negative binomial distribution + //NORMDIST Returns the normal cumulative distribution + //NORMINV Returns the inverse of the normal cumulative distribution + //NORMSDIST Returns the standard normal cumulative distribution + //NORMSINV Returns the inverse of the standard normal cumulative distribution + //PEARSON Returns the Pearson product moment correlation coefficient + //PERCENTILE Returns the k-th percentile of values in a range + //PERCENTRANK Returns the percentage rank of a value in a data set + //PERMUT Returns the number of permutations for a given number of objects + //POISSON Returns the Poisson distribution + //PROB Returns the probability that values in a range are between two limits + //QUARTILE Returns the quartile of a data set + //RANK Returns the rank of a number in a list of numbers + //RSQ Returns the square of the Pearson product moment correlation coefficient + //SKEW Returns the skewness of a distribution + //SLOPE Returns the slope of the linear regression line + //SMALL Returns the k-th smallest value in a data set + //STANDARDIZE Returns a normalized value + ce.RegisterFunction("STDEV", 1, int.MaxValue, StDev); + ce.RegisterFunction("STDEVA", 1, int.MaxValue, StDevA); + ce.RegisterFunction("STDEVP", 1, int.MaxValue, StDevP); + ce.RegisterFunction("STDEVPA", 1, int.MaxValue, StDevPA); + ce.RegisterFunction("STDEV.S", 1, int.MaxValue, StDev); + ce.RegisterFunction("STDEV.P", 1, int.MaxValue, StDevP); + //STEYX Returns the standard error of the predicted y-value for each x in the regression + //TDIST Returns the Student's t-distribution + //TINV Returns the inverse of the Student's t-distribution + //TREND Returns values along a linear trend + //TRIMMEAN Returns the mean of the interior of a data set + //TTEST Returns the probability associated with a Student's t-test + ce.RegisterFunction("VAR", 1, int.MaxValue, Var); + ce.RegisterFunction("VARA", 1, int.MaxValue, VarA); + ce.RegisterFunction("VARP", 1, int.MaxValue, VarP); + ce.RegisterFunction("VARPA", 1, int.MaxValue, VarPA); + ce.RegisterFunction("VAR.S", 1, int.MaxValue, Var); + ce.RegisterFunction("VAR.P", 1, int.MaxValue, VarP); + //WEIBULL Returns the Weibull distribution + //ZTEST Returns the one-tailed probability-value of a z-test + } + + + + static object Average(List p) + { + return GetTally(p, true).Average(); + } + static object AverageA(List p) + { + return GetTally(p, false).Average(); + } + static object Count(List p) + { + return GetTally(p, true).Count(); + } + static object CountA(List p) + { + return GetTally(p, false).Count(); + } + static object CountBlank(List p) + { + var cnt = 0.0; + foreach (Expression e in p) + { + var ienum = e as IEnumerable; + if (ienum != null) + { + foreach (var value in ienum) + { + if (IsBlank(value)) + cnt++; + } + } + else + { + if (IsBlank(e.Evaluate())) + cnt++; + } + } + return cnt; + } + internal static bool IsBlank(object value) + { + return + value == null || + value is string && ((string)value).Length == 0; + } + static object CountIf(List p) + { + CalcEngine ce = new CalcEngine(); + var cnt = 0.0; + var ienum = p[0] as IEnumerable; + if (ienum != null) + { + var criteria = (string)p[1].Evaluate(); + foreach (var value in ienum) + { + if (!IsBlank(value)) + { + if (CalcEngineHelpers.ValueSatisfiesCriteria(value, criteria, ce)) + cnt++; + } + } + } + return cnt; + } + static object Max(List p) + { + return GetTally(p, true).Max(); + } + static object MaxA(List p) + { + return GetTally(p, false).Max(); + } + static object Min(List p) + { + return GetTally(p, true).Min(); + } + static object MinA(List p) + { + return GetTally(p, false).Min(); + } + static object StDev(List p) + { + return GetTally(p, true).Std(); + } + static object StDevA(List p) + { + return GetTally(p, false).Std(); + } + static object StDevP(List p) + { + return GetTally(p, true).StdP(); + } + static object StDevPA(List p) + { + return GetTally(p, false).StdP(); + } + static object Var(List p) + { + return GetTally(p, true).Var(); + } + static object VarA(List p) + { + return GetTally(p, false).Var(); + } + static object VarP(List p) + { + return GetTally(p, true).VarP(); + } + static object VarPA(List p) + { + return GetTally(p, false).VarP(); + } + + // utility for tallying statistics + static Tally GetTally(List p, bool numbersOnly) + { + return new Tally(p, numbersOnly); + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Tally.cs b/ClosedXML/Excel/CalcEngine/Functions/Tally.cs index 7f5766b..78e0842 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/Tally.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/Tally.cs @@ -1,196 +1,196 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel.CalcEngine -{ - internal class Tally : IEnumerable - { - private readonly List _list = new List(); - private readonly bool NumbersOnly; - - public Tally() - : this(false) - { } - - public Tally(bool numbersOnly) - : this(null, numbersOnly) - { } - - public Tally(IEnumerable p) - : this(p, false) - { } - - public Tally(IEnumerable p, bool numbersOnly) - { - if (p != null) - { - foreach (var e in p) - { - Add(e); - } - } - - this.NumbersOnly = numbersOnly; - } - - public void Add(Expression e) - { - // handle enumerables - var ienum = e as IEnumerable; - if (ienum != null) - { - foreach (var value in ienum) - { - _list.Add(value); - } - return; - } - - // handle expressions - var val = e.Evaluate(); - var valEnumerable = val as IEnumerable; - if (valEnumerable == null || val is string) - _list.Add(val); - else - foreach (var v in valEnumerable) - _list.Add(v); - } - - public void AddValue(Object v) - { - _list.Add(v); - } - - public double Count() - { - return this.Count(this.NumbersOnly); - } - - public double Count(bool numbersOnly) - { - if (numbersOnly) - return NumericValues().Count(); - else - return _list.Where(o => !Statistical.IsBlank(o)).Count(); - } - - public IEnumerable NumericValues() - { - var retVal = new List(); - foreach (var value in _list) - { - Double tmp; - var vEnumerable = value as IEnumerable; - if (vEnumerable == null && Double.TryParse(value.ToString(), out tmp)) - yield return tmp; - else - { - foreach (var v in vEnumerable) - { - if (Double.TryParse(v.ToString(), out tmp)) - yield return tmp; - break; - } - } - } - } - - public double Product() - { - var nums = NumericValues(); - if (!nums.Any()) return 0; - - Double retVal = 1; - nums.ForEach(n => retVal *= n); - - return retVal; - } - - public double Sum() { return NumericValues().Sum(); } - - public double Average() - { - if (NumericValues().Any()) - return NumericValues().Average(); - else - throw new ApplicationException("No values"); - } - - public double Min() - { - return NumericValues().Any() ? NumericValues().Min() : 0; - } - - public double Max() - { - return NumericValues().Any() ? NumericValues().Max() : 0; - } - - public double Range() - { - var nums = NumericValues(); - return nums.Max() - nums.Min(); - } - - private double Sum2(List nums) - { - return nums.Sum(d => d * d); - } - - public double VarP() - { - var nums = NumericValues(); - var avg = nums.Average(); - var sum2 = nums.Sum(d => d * d); - return nums.Count() <= 1 ? 0 : sum2 / nums.Count() - avg * avg; - } - - public double StdP() - { - var nums = NumericValues(); - var avg = nums.Average(); - var sum2 = nums.Sum(d => d * d); - return nums.Count() <= 1 ? 0 : Math.Sqrt(sum2 / nums.Count() - avg * avg); - } - - public double Var() - { - var nums = NumericValues(); - var avg = nums.Average(); - var sum2 = nums.Sum(d => d * d); - return nums.Count() <= 1 ? 0 : (sum2 / nums.Count() - avg * avg) * nums.Count() / (nums.Count() - 1); - } - - public double Std() - { - var values = NumericValues(); - double ret = 0; - if (values.Any()) - { - //Compute the Average - double avg = values.Average(); - //Perform the Sum of (value-avg)_2_2 - double sum = values.Sum(d => Math.Pow(d - avg, 2)); - //Put it all together - ret = Math.Sqrt((sum) / (values.Count() - 1)); - } - else - { - throw new ApplicationException("No values"); - } - return ret; - } - - public IEnumerator GetEnumerator() - { - return _list.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } -} +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel.CalcEngine +{ + internal class Tally : IEnumerable + { + private readonly List _list = new List(); + private readonly bool NumbersOnly; + + public Tally() + : this(false) + { } + + public Tally(bool numbersOnly) + : this(null, numbersOnly) + { } + + public Tally(IEnumerable p) + : this(p, false) + { } + + public Tally(IEnumerable p, bool numbersOnly) + { + if (p != null) + { + foreach (var e in p) + { + Add(e); + } + } + + this.NumbersOnly = numbersOnly; + } + + public void Add(Expression e) + { + // handle enumerables + var ienum = e as IEnumerable; + if (ienum != null) + { + foreach (var value in ienum) + { + _list.Add(value); + } + return; + } + + // handle expressions + var val = e.Evaluate(); + var valEnumerable = val as IEnumerable; + if (valEnumerable == null || val is string) + _list.Add(val); + else + foreach (var v in valEnumerable) + _list.Add(v); + } + + public void AddValue(Object v) + { + _list.Add(v); + } + + public double Count() + { + return this.Count(this.NumbersOnly); + } + + public double Count(bool numbersOnly) + { + if (numbersOnly) + return NumericValues().Count(); + else + return _list.Where(o => !Statistical.IsBlank(o)).Count(); + } + + public IEnumerable NumericValues() + { + var retVal = new List(); + foreach (var value in _list) + { + Double tmp; + var vEnumerable = value as IEnumerable; + if (vEnumerable == null && Double.TryParse(value.ToString(), out tmp)) + yield return tmp; + else + { + foreach (var v in vEnumerable) + { + if (Double.TryParse(v.ToString(), out tmp)) + yield return tmp; + break; + } + } + } + } + + public double Product() + { + var nums = NumericValues(); + if (!nums.Any()) return 0; + + Double retVal = 1; + nums.ForEach(n => retVal *= n); + + return retVal; + } + + public double Sum() { return NumericValues().Sum(); } + + public double Average() + { + if (NumericValues().Any()) + return NumericValues().Average(); + else + throw new ApplicationException("No values"); + } + + public double Min() + { + return NumericValues().Any() ? NumericValues().Min() : 0; + } + + public double Max() + { + return NumericValues().Any() ? NumericValues().Max() : 0; + } + + public double Range() + { + var nums = NumericValues(); + return nums.Max() - nums.Min(); + } + + private double Sum2(List nums) + { + return nums.Sum(d => d * d); + } + + public double VarP() + { + var nums = NumericValues(); + var avg = nums.Average(); + var sum2 = nums.Sum(d => d * d); + return nums.Count() <= 1 ? 0 : sum2 / nums.Count() - avg * avg; + } + + public double StdP() + { + var nums = NumericValues(); + var avg = nums.Average(); + var sum2 = nums.Sum(d => d * d); + return nums.Count() <= 1 ? 0 : Math.Sqrt(sum2 / nums.Count() - avg * avg); + } + + public double Var() + { + var nums = NumericValues(); + var avg = nums.Average(); + var sum2 = nums.Sum(d => d * d); + return nums.Count() <= 1 ? 0 : (sum2 / nums.Count() - avg * avg) * nums.Count() / (nums.Count() - 1); + } + + public double Std() + { + var values = NumericValues(); + double ret = 0; + if (values.Any()) + { + //Compute the Average + double avg = values.Average(); + //Perform the Sum of (value-avg)_2_2 + double sum = values.Sum(d => Math.Pow(d - avg, 2)); + //Put it all together + ret = Math.Sqrt((sum) / (values.Count() - 1)); + } + else + { + throw new ApplicationException("No values"); + } + return ret; + } + + public IEnumerator GetEnumerator() + { + return _list.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/Text.cs b/ClosedXML/Excel/CalcEngine/Functions/Text.cs index ad9e220..cb66322 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/Text.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/Text.cs @@ -1,351 +1,351 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; - -namespace ClosedXML.Excel.CalcEngine -{ - internal static class Text - { - public static void Register(CalcEngine ce) - { - ce.RegisterFunction("ASC", 1, Asc); // Changes full-width (double-byte) English letters or katakana within a character string to half-width (single-byte) characters - //ce.RegisterFunction("BAHTTEXT Converts a number to text, using the ß (baht) currency format - ce.RegisterFunction("CHAR", 1, _Char); // Returns the character specified by the code number - ce.RegisterFunction("CLEAN", 1, Clean); // Removes all nonprintable characters from text - ce.RegisterFunction("CODE", 1, Code); // Returns a numeric code for the first character in a text string - ce.RegisterFunction("CONCATENATE", 1, int.MaxValue, Concatenate); // Joins several text items into one text item - ce.RegisterFunction("DOLLAR", 1, 2, Dollar); // Converts a number to text, using the $ (dollar) currency format - ce.RegisterFunction("EXACT", 2, Exact); // Checks to see if two text values are identical - ce.RegisterFunction("FIND", 2, 3, Find); //Finds one text value within another (case-sensitive) - ce.RegisterFunction("FIXED", 1, 3, Fixed); // Formats a number as text with a fixed number of decimals - //ce.RegisterFunction("JIS Changes half-width (single-byte) English letters or katakana within a character string to full-width (double-byte) characters - ce.RegisterFunction("LEFT", 1, 2, Left); // LEFTB Returns the leftmost characters from a text value - ce.RegisterFunction("LEN", 1, Len); //, Returns the number of characters in a text string - ce.RegisterFunction("LOWER", 1, Lower); // Converts text to lowercase - ce.RegisterFunction("MID", 3, Mid); // Returns a specific number of characters from a text string starting at the position you specify - //ce.RegisterFunction("PHONETIC Extracts the phonetic (furigana) characters from a text string - ce.RegisterFunction("PROPER", 1, Proper); // Capitalizes the first letter in each word of a text value - ce.RegisterFunction("REPLACE", 4, Replace); // Replaces characters within text - ce.RegisterFunction("REPT", 2, Rept); // Repeats text a given number of times - ce.RegisterFunction("RIGHT", 1, 2, Right); // Returns the rightmost characters from a text value - ce.RegisterFunction("SEARCH", 2, 3, Search); // Finds one text value within another (not case-sensitive) - ce.RegisterFunction("SUBSTITUTE", 3, 4, Substitute); // Substitutes new text for old text in a text string - ce.RegisterFunction("T", 1, T); // Converts its arguments to text - ce.RegisterFunction("TEXT", 2, _Text); // Formats a number and converts it to text - ce.RegisterFunction("TRIM", 1, Trim); // Removes spaces from text - ce.RegisterFunction("UPPER", 1, Upper); // Converts text to uppercase - ce.RegisterFunction("VALUE", 1, Value); // Converts a text argument to a number - ce.RegisterFunction("HYPERLINK", 2, Hyperlink); - } - - private static object _Char(List p) - { - var i = (int)p[0]; - if (i < 1 || i > 255) throw new IndexOutOfRangeException(); - var c = (char)i; - return c.ToString(); - } - - private static object Code(List p) - { - var s = (string)p[0]; - return (int)s[0]; - } - - private static object Concatenate(List p) - { - var sb = new StringBuilder(); - foreach (var x in p) - { - sb.Append((string)x); - } - return sb.ToString(); - } - - private static object Find(List p) - { - var srch = (string)p[0]; - var text = (string)p[1]; - var start = 0; - if (p.Count > 2) - { - start = (int)p[2] - 1; - } - var index = text.IndexOf(srch, start, StringComparison.Ordinal); - if (index == -1) - throw new Exception("String not found."); - else - return index + 1; - } - - private static object Left(List p) - { - var str = (string)p[0]; - var n = 1; - if (p.Count > 1) - { - n = (int)p[1]; - } - if (n >= str.Length) return str; - - return str.Substring(0, n); - } - - private static object Len(List p) - { - return ((string)p[0]).Length; - } - - private static object Lower(List p) - { - return ((string)p[0]).ToLower(); - } - - private static object Mid(List p) - { - var str = (string)p[0]; - var start = (int)p[1] - 1; - var length = (int)p[2]; - if (start > str.Length - 1) - return String.Empty; - if (start + length > str.Length - 1) - return str.Substring(start); - return str.Substring(start, length); - } - - private static string MatchHandler(Match m) - { - return m.Groups[1].Value.ToUpper() + m.Groups[2].Value; - } - - private static object Proper(List p) - { - var s = (string)p[0]; - if (s.Length == 0) return ""; - - MatchEvaluator evaluator = new MatchEvaluator(MatchHandler); - StringBuilder sb = new StringBuilder(); - - string pattern = "\\b(\\w)(\\w+)?\\b"; - Regex regex = new Regex(pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase); - return regex.Replace(s.ToLower(), evaluator); - } - - private static object Replace(List p) - { - // old start len new - var s = (string)p[0]; - var start = (int)p[1] - 1; - var len = (int)p[2]; - var rep = (string)p[3]; - - if (s.Length == 0) return rep; - - var sb = new StringBuilder(); - sb.Append(s.Substring(0, start)); - sb.Append(rep); - sb.Append(s.Substring(start + len)); - - return sb.ToString(); - } - - private static object Rept(List p) - { - var sb = new StringBuilder(); - var s = (string)p[0]; - var repeats = (int)p[1]; - if (repeats < 0) throw new IndexOutOfRangeException("repeats"); - for (int i = 0; i < repeats; i++) - { - sb.Append(s); - } - return sb.ToString(); - } - - private static object Right(List p) - { - var str = (string)p[0]; - var n = 1; - if (p.Count > 1) - { - n = (int)p[1]; - } - - if (n >= str.Length) return str; - - return str.Substring(str.Length - n); - } - - private static string WildcardToRegex(string pattern) - { - return Regex.Escape(pattern) - .Replace(".", "\\.") - .Replace("\\*", ".*") - .Replace("\\?", "."); - } - - private static object Search(List p) - { - var search = WildcardToRegex((string)p[0]); - var text = (string)p[1]; - - if ("" == text) throw new Exception("Invalid input string."); - - var start = 0; - if (p.Count > 2) - { - start = (int)p[2] - 1; - } - - Regex r = new Regex(search, RegexOptions.Compiled | RegexOptions.IgnoreCase); - var match = r.Match(text.Substring(start)); - if (!match.Success) - throw new Exception("Search failed."); - else - return match.Index + start + 1; - //var index = text.IndexOf(search, start, StringComparison.OrdinalIgnoreCase); - //if (index == -1) - // throw new Exception("String not found."); - //else - // return index + 1; - } - - private static object Substitute(List p) - { - // get parameters - var text = (string)p[0]; - var oldText = (string)p[1]; - var newText = (string)p[2]; - - if ("" == text) return ""; - if ("" == oldText) return text; - - // if index not supplied, replace all - if (p.Count == 3) - { - return text.Replace(oldText, newText); - } - - // replace specific instance - int index = (int)p[3]; - if (index < 1) - { - throw new Exception("Invalid index in Substitute."); - } - int pos = text.IndexOf(oldText); - while (pos > -1 && index > 1) - { - pos = text.IndexOf(oldText, pos + 1); - index--; - } - return pos > -1 - ? text.Substring(0, pos) + newText + text.Substring(pos + oldText.Length) - : text; - } - - private static object T(List p) - { - if (p[0]._token.Value.GetType() == typeof(string)) - return (string)p[0]; - else - return ""; - } - - private static object _Text(List p) - { - var value = p[0].Evaluate(); - - // Input values of type string don't get any formatting applied. - if (value is string) return value; - - var number = (double)p[0]; - var format = (string)p[1]; - if (string.IsNullOrEmpty(format.Trim())) return ""; - - // We'll have to guess as to whether the format represents a date and/or time. - // Not sure whether there's a better way to detect this. - bool isDateFormat = new string[] { "y", "m", "d", "h", "s" }.Any(part => format.ToLower().Contains(part.ToLower())); - - if (isDateFormat) - return DateTime.FromOADate(number).ToString(format, CultureInfo.CurrentCulture); - else - return number.ToString(format, CultureInfo.CurrentCulture); - } - - private static object Trim(List p) - { - //Should not trim non breaking space - //See http://office.microsoft.com/en-us/excel-help/trim-function-HP010062581.aspx - return ((string)p[0]).Trim(' '); - } - - private static object Upper(List p) - { - return ((string)p[0]).ToUpper(); - } - - private static object Value(List p) - { - return double.Parse((string)p[0], NumberStyles.Any, CultureInfo.InvariantCulture); - } - - private static object Asc(List p) - { - return (string)p[0]; - } - - private static object Hyperlink(List p) - { - String address = p[0]; - String toolTip = p.Count == 2 ? p[1] : String.Empty; - return new XLHyperlink(address, toolTip); - } - - private static object Clean(List p) - { - var s = (string)p[0]; - - var result = new StringBuilder(); - foreach (var c in from c in s let b = (byte)c where b >= 32 select c) - { - result.Append(c); - } - return result.ToString(); - } - - private static object Dollar(List p) - { - Double value = p[0]; - int dec = p.Count == 2 ? (int)p[1] : 2; - - return value.ToString("C" + dec); - } - - private static object Exact(List p) - { - var t1 = (string)p[0]; - var t2 = (string)p[1]; - - return t1 == t2; - } - - private static object Fixed(List p) - { - if (p[0]._token.Value.GetType() == typeof(string)) - throw new ApplicationException("Input type can't be string"); - - Double value = p[0]; - int decimal_places = p.Count >= 2 ? (int)p[1] : 2; - Boolean no_commas = p.Count == 3 && p[2]; - - var retVal = value.ToString("N" + decimal_places); - if (no_commas) - return retVal.Replace(",", String.Empty); - else - return retVal; - } - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace ClosedXML.Excel.CalcEngine +{ + internal static class Text + { + public static void Register(CalcEngine ce) + { + ce.RegisterFunction("ASC", 1, Asc); // Changes full-width (double-byte) English letters or katakana within a character string to half-width (single-byte) characters + //ce.RegisterFunction("BAHTTEXT Converts a number to text, using the ß (baht) currency format + ce.RegisterFunction("CHAR", 1, _Char); // Returns the character specified by the code number + ce.RegisterFunction("CLEAN", 1, Clean); // Removes all nonprintable characters from text + ce.RegisterFunction("CODE", 1, Code); // Returns a numeric code for the first character in a text string + ce.RegisterFunction("CONCATENATE", 1, int.MaxValue, Concatenate); // Joins several text items into one text item + ce.RegisterFunction("DOLLAR", 1, 2, Dollar); // Converts a number to text, using the $ (dollar) currency format + ce.RegisterFunction("EXACT", 2, Exact); // Checks to see if two text values are identical + ce.RegisterFunction("FIND", 2, 3, Find); //Finds one text value within another (case-sensitive) + ce.RegisterFunction("FIXED", 1, 3, Fixed); // Formats a number as text with a fixed number of decimals + //ce.RegisterFunction("JIS Changes half-width (single-byte) English letters or katakana within a character string to full-width (double-byte) characters + ce.RegisterFunction("LEFT", 1, 2, Left); // LEFTB Returns the leftmost characters from a text value + ce.RegisterFunction("LEN", 1, Len); //, Returns the number of characters in a text string + ce.RegisterFunction("LOWER", 1, Lower); // Converts text to lowercase + ce.RegisterFunction("MID", 3, Mid); // Returns a specific number of characters from a text string starting at the position you specify + //ce.RegisterFunction("PHONETIC Extracts the phonetic (furigana) characters from a text string + ce.RegisterFunction("PROPER", 1, Proper); // Capitalizes the first letter in each word of a text value + ce.RegisterFunction("REPLACE", 4, Replace); // Replaces characters within text + ce.RegisterFunction("REPT", 2, Rept); // Repeats text a given number of times + ce.RegisterFunction("RIGHT", 1, 2, Right); // Returns the rightmost characters from a text value + ce.RegisterFunction("SEARCH", 2, 3, Search); // Finds one text value within another (not case-sensitive) + ce.RegisterFunction("SUBSTITUTE", 3, 4, Substitute); // Substitutes new text for old text in a text string + ce.RegisterFunction("T", 1, T); // Converts its arguments to text + ce.RegisterFunction("TEXT", 2, _Text); // Formats a number and converts it to text + ce.RegisterFunction("TRIM", 1, Trim); // Removes spaces from text + ce.RegisterFunction("UPPER", 1, Upper); // Converts text to uppercase + ce.RegisterFunction("VALUE", 1, Value); // Converts a text argument to a number + ce.RegisterFunction("HYPERLINK", 2, Hyperlink); + } + + private static object _Char(List p) + { + var i = (int)p[0]; + if (i < 1 || i > 255) throw new IndexOutOfRangeException(); + var c = (char)i; + return c.ToString(); + } + + private static object Code(List p) + { + var s = (string)p[0]; + return (int)s[0]; + } + + private static object Concatenate(List p) + { + var sb = new StringBuilder(); + foreach (var x in p) + { + sb.Append((string)x); + } + return sb.ToString(); + } + + private static object Find(List p) + { + var srch = (string)p[0]; + var text = (string)p[1]; + var start = 0; + if (p.Count > 2) + { + start = (int)p[2] - 1; + } + var index = text.IndexOf(srch, start, StringComparison.Ordinal); + if (index == -1) + throw new Exception("String not found."); + else + return index + 1; + } + + private static object Left(List p) + { + var str = (string)p[0]; + var n = 1; + if (p.Count > 1) + { + n = (int)p[1]; + } + if (n >= str.Length) return str; + + return str.Substring(0, n); + } + + private static object Len(List p) + { + return ((string)p[0]).Length; + } + + private static object Lower(List p) + { + return ((string)p[0]).ToLower(); + } + + private static object Mid(List p) + { + var str = (string)p[0]; + var start = (int)p[1] - 1; + var length = (int)p[2]; + if (start > str.Length - 1) + return String.Empty; + if (start + length > str.Length - 1) + return str.Substring(start); + return str.Substring(start, length); + } + + private static string MatchHandler(Match m) + { + return m.Groups[1].Value.ToUpper() + m.Groups[2].Value; + } + + private static object Proper(List p) + { + var s = (string)p[0]; + if (s.Length == 0) return ""; + + MatchEvaluator evaluator = new MatchEvaluator(MatchHandler); + StringBuilder sb = new StringBuilder(); + + string pattern = "\\b(\\w)(\\w+)?\\b"; + Regex regex = new Regex(pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase); + return regex.Replace(s.ToLower(), evaluator); + } + + private static object Replace(List p) + { + // old start len new + var s = (string)p[0]; + var start = (int)p[1] - 1; + var len = (int)p[2]; + var rep = (string)p[3]; + + if (s.Length == 0) return rep; + + var sb = new StringBuilder(); + sb.Append(s.Substring(0, start)); + sb.Append(rep); + sb.Append(s.Substring(start + len)); + + return sb.ToString(); + } + + private static object Rept(List p) + { + var sb = new StringBuilder(); + var s = (string)p[0]; + var repeats = (int)p[1]; + if (repeats < 0) throw new IndexOutOfRangeException("repeats"); + for (int i = 0; i < repeats; i++) + { + sb.Append(s); + } + return sb.ToString(); + } + + private static object Right(List p) + { + var str = (string)p[0]; + var n = 1; + if (p.Count > 1) + { + n = (int)p[1]; + } + + if (n >= str.Length) return str; + + return str.Substring(str.Length - n); + } + + private static string WildcardToRegex(string pattern) + { + return Regex.Escape(pattern) + .Replace(".", "\\.") + .Replace("\\*", ".*") + .Replace("\\?", "."); + } + + private static object Search(List p) + { + var search = WildcardToRegex((string)p[0]); + var text = (string)p[1]; + + if ("" == text) throw new Exception("Invalid input string."); + + var start = 0; + if (p.Count > 2) + { + start = (int)p[2] - 1; + } + + Regex r = new Regex(search, RegexOptions.Compiled | RegexOptions.IgnoreCase); + var match = r.Match(text.Substring(start)); + if (!match.Success) + throw new Exception("Search failed."); + else + return match.Index + start + 1; + //var index = text.IndexOf(search, start, StringComparison.OrdinalIgnoreCase); + //if (index == -1) + // throw new Exception("String not found."); + //else + // return index + 1; + } + + private static object Substitute(List p) + { + // get parameters + var text = (string)p[0]; + var oldText = (string)p[1]; + var newText = (string)p[2]; + + if ("" == text) return ""; + if ("" == oldText) return text; + + // if index not supplied, replace all + if (p.Count == 3) + { + return text.Replace(oldText, newText); + } + + // replace specific instance + int index = (int)p[3]; + if (index < 1) + { + throw new Exception("Invalid index in Substitute."); + } + int pos = text.IndexOf(oldText); + while (pos > -1 && index > 1) + { + pos = text.IndexOf(oldText, pos + 1); + index--; + } + return pos > -1 + ? text.Substring(0, pos) + newText + text.Substring(pos + oldText.Length) + : text; + } + + private static object T(List p) + { + if (p[0]._token.Value.GetType() == typeof(string)) + return (string)p[0]; + else + return ""; + } + + private static object _Text(List p) + { + var value = p[0].Evaluate(); + + // Input values of type string don't get any formatting applied. + if (value is string) return value; + + var number = (double)p[0]; + var format = (string)p[1]; + if (string.IsNullOrEmpty(format.Trim())) return ""; + + // We'll have to guess as to whether the format represents a date and/or time. + // Not sure whether there's a better way to detect this. + bool isDateFormat = new string[] { "y", "m", "d", "h", "s" }.Any(part => format.ToLower().Contains(part.ToLower())); + + if (isDateFormat) + return DateTime.FromOADate(number).ToString(format, CultureInfo.CurrentCulture); + else + return number.ToString(format, CultureInfo.CurrentCulture); + } + + private static object Trim(List p) + { + //Should not trim non breaking space + //See http://office.microsoft.com/en-us/excel-help/trim-function-HP010062581.aspx + return ((string)p[0]).Trim(' '); + } + + private static object Upper(List p) + { + return ((string)p[0]).ToUpper(); + } + + private static object Value(List p) + { + return double.Parse((string)p[0], NumberStyles.Any, CultureInfo.InvariantCulture); + } + + private static object Asc(List p) + { + return (string)p[0]; + } + + private static object Hyperlink(List p) + { + String address = p[0]; + String toolTip = p.Count == 2 ? p[1] : String.Empty; + return new XLHyperlink(address, toolTip); + } + + private static object Clean(List p) + { + var s = (string)p[0]; + + var result = new StringBuilder(); + foreach (var c in from c in s let b = (byte)c where b >= 32 select c) + { + result.Append(c); + } + return result.ToString(); + } + + private static object Dollar(List p) + { + Double value = p[0]; + int dec = p.Count == 2 ? (int)p[1] : 2; + + return value.ToString("C" + dec); + } + + private static object Exact(List p) + { + var t1 = (string)p[0]; + var t2 = (string)p[1]; + + return t1 == t2; + } + + private static object Fixed(List p) + { + if (p[0]._token.Value.GetType() == typeof(string)) + throw new ApplicationException("Input type can't be string"); + + Double value = p[0]; + int decimal_places = p.Count >= 2 ? (int)p[1] : 2; + Boolean no_commas = p.Count == 3 && p[2]; + + var retVal = value.ToString("N" + decimal_places); + if (no_commas) + return retVal.Replace(",", String.Empty); + else + return retVal; + } + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/XLMath.cs b/ClosedXML/Excel/CalcEngine/Functions/XLMath.cs index 63c052c..693f68f 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/XLMath.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/XLMath.cs @@ -1,122 +1,122 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel.CalcEngine.Functions -{ - public static class XLMath - { - public static double DegreesToRadians(double degrees) - { - return (Math.PI / 180.0) * degrees; - } - - public static double RadiansToDegrees(double radians) - { - return (180.0 / Math.PI) * radians; - } - - public static double GradsToRadians(double grads) - { - return (grads / 200.0) * Math.PI; - } - - public static double RadiansToGrads(double radians) - { - return (radians / Math.PI) * 200.0; - } - - public static double DegreesToGrads(double degrees) - { - return (degrees / 9.0) * 10.0; - } - - public static double GradsToDegrees(double grads) - { - return (grads / 10.0) * 9.0; - } - - public static double ASinh(double x) - { - return (Math.Log(x + Math.Sqrt(x * x + 1.0))); - } - - public static double ACosh(double x) - { - return (Math.Log(x + Math.Sqrt((x * x) - 1.0))); - } - - public static double ATanh(double x) - { - return (Math.Log((1.0 + x) / (1.0 - x)) / 2.0); - } - - public static double ACoth(double x) - { - //return (Math.Log((x + 1.0) / (x - 1.0)) / 2.0); - return (ATanh(1.0 / x)); - } - - public static double ASech(double x) - { - return (ACosh(1.0 / x)); - } - - public static double ACsch(double x) - { - return (ASinh(1.0 / x)); - } - - public static double Sech(double x) - { - return (1.0 / Math.Cosh(x)); - } - - public static double Csch(double x) - { - return (1.0 / Math.Sinh(x)); - } - - public static double Coth(double x) - { - return (Math.Cosh(x) / Math.Sinh(x)); - } - - public static double Combin(Int32 n, Int32 k) - { - if (k == 0) return 1; - return n * Combin(n - 1, k - 1) / k; - } - - public static Boolean IsEven(Int32 value) - { - return Math.Abs(value % 2) < XLHelper.Epsilon; - } - public static Boolean IsOdd(Int32 value) - { - return Math.Abs(value % 2) > XLHelper.Epsilon; - } - - public static string ToRoman(int number) - { - if ((number < 0) || (number > 3999)) throw new ArgumentOutOfRangeException("insert value betwheen 1 and 3999"); - if (number < 1) return string.Empty; - if (number >= 1000) return "M" + ToRoman(number - 1000); - if (number >= 900) return "CM" + ToRoman(number - 900); - if (number >= 500) return "D" + ToRoman(number - 500); - if (number >= 400) return "CD" + ToRoman(number - 400); - if (number >= 100) return "C" + ToRoman(number - 100); - if (number >= 90) return "XC" + ToRoman(number - 90); - if (number >= 50) return "L" + ToRoman(number - 50); - if (number >= 40) return "XL" + ToRoman(number - 40); - if (number >= 10) return "X" + ToRoman(number - 10); - if (number >= 9) return "IX" + ToRoman(number - 9); - if (number >= 5) return "V" + ToRoman(number - 5); - if (number >= 4) return "IV" + ToRoman(number - 4); - if (number >= 1) return "I" + ToRoman(number - 1); - throw new ArgumentOutOfRangeException("something bad happened"); - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel.CalcEngine.Functions +{ + public static class XLMath + { + public static double DegreesToRadians(double degrees) + { + return (Math.PI / 180.0) * degrees; + } + + public static double RadiansToDegrees(double radians) + { + return (180.0 / Math.PI) * radians; + } + + public static double GradsToRadians(double grads) + { + return (grads / 200.0) * Math.PI; + } + + public static double RadiansToGrads(double radians) + { + return (radians / Math.PI) * 200.0; + } + + public static double DegreesToGrads(double degrees) + { + return (degrees / 9.0) * 10.0; + } + + public static double GradsToDegrees(double grads) + { + return (grads / 10.0) * 9.0; + } + + public static double ASinh(double x) + { + return (Math.Log(x + Math.Sqrt(x * x + 1.0))); + } + + public static double ACosh(double x) + { + return (Math.Log(x + Math.Sqrt((x * x) - 1.0))); + } + + public static double ATanh(double x) + { + return (Math.Log((1.0 + x) / (1.0 - x)) / 2.0); + } + + public static double ACoth(double x) + { + //return (Math.Log((x + 1.0) / (x - 1.0)) / 2.0); + return (ATanh(1.0 / x)); + } + + public static double ASech(double x) + { + return (ACosh(1.0 / x)); + } + + public static double ACsch(double x) + { + return (ASinh(1.0 / x)); + } + + public static double Sech(double x) + { + return (1.0 / Math.Cosh(x)); + } + + public static double Csch(double x) + { + return (1.0 / Math.Sinh(x)); + } + + public static double Coth(double x) + { + return (Math.Cosh(x) / Math.Sinh(x)); + } + + public static double Combin(Int32 n, Int32 k) + { + if (k == 0) return 1; + return n * Combin(n - 1, k - 1) / k; + } + + public static Boolean IsEven(Int32 value) + { + return Math.Abs(value % 2) < XLHelper.Epsilon; + } + public static Boolean IsOdd(Int32 value) + { + return Math.Abs(value % 2) > XLHelper.Epsilon; + } + + public static string ToRoman(int number) + { + if ((number < 0) || (number > 3999)) throw new ArgumentOutOfRangeException("insert value betwheen 1 and 3999"); + if (number < 1) return string.Empty; + if (number >= 1000) return "M" + ToRoman(number - 1000); + if (number >= 900) return "CM" + ToRoman(number - 900); + if (number >= 500) return "D" + ToRoman(number - 500); + if (number >= 400) return "CD" + ToRoman(number - 400); + if (number >= 100) return "C" + ToRoman(number - 100); + if (number >= 90) return "XC" + ToRoman(number - 90); + if (number >= 50) return "L" + ToRoman(number - 50); + if (number >= 40) return "XL" + ToRoman(number - 40); + if (number >= 10) return "X" + ToRoman(number - 10); + if (number >= 9) return "IX" + ToRoman(number - 9); + if (number >= 5) return "V" + ToRoman(number - 5); + if (number >= 4) return "IV" + ToRoman(number - 4); + if (number >= 1) return "I" + ToRoman(number - 1); + throw new ArgumentOutOfRangeException("something bad happened"); + } + + } +} diff --git a/ClosedXML/Excel/CalcEngine/Functions/XLMatrix.cs b/ClosedXML/Excel/CalcEngine/Functions/XLMatrix.cs index 000f20c..80d2663 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/XLMatrix.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/XLMatrix.cs @@ -1,594 +1,594 @@ -using System; -using System.Linq; -using System.Text.RegularExpressions; - -namespace ClosedXML.Excel.CalcEngine.Functions -{ - internal class XLMatrix - { - public XLMatrix L; - public XLMatrix U; - public int cols; - private double detOfP = 1; - public double[,] mat; - private int[] pi; - public int rows; - - public XLMatrix(int iRows, int iCols) // XLMatrix Class constructor - { - rows = iRows; - cols = iCols; - mat = new double[rows,cols]; - } - public XLMatrix(Double[,] arr) - :this(arr.GetLength(0), arr.GetLength(1)) - { - var roCount = arr.GetLength(0); - var coCount = arr.GetLength(1); - for (int ro = 0; ro < roCount; ro++) - { - for (int co = 0; co < coCount; co++) - { - mat[ro, co] = arr[ro, co]; - } - } - } - - public double this[int iRow, int iCol] // Access this matrix as a 2D array - { - get { return mat[iRow, iCol]; } - set { mat[iRow, iCol] = value; } - } - - public Boolean IsSquare() - { - return (rows == cols); - } - - public XLMatrix GetCol(int k) - { - var m = new XLMatrix(rows, 1); - for (var i = 0; i < rows; i++) m[i, 0] = mat[i, k]; - return m; - } - - public void SetCol(XLMatrix v, int k) - { - for (var i = 0; i < rows; i++) mat[i, k] = v[i, 0]; - } - - public void MakeLU() // Function for LU decomposition - { - if (!IsSquare()) throw new Exception("The matrix is not square!"); - L = IdentityMatrix(rows, cols); - U = Duplicate(); - - pi = new int[rows]; - for (var i = 0; i < rows; i++) pi[i] = i; - - var k0 = 0; - - for (var k = 0; k < cols - 1; k++) - { - double p = 0; - for (var i = k; i < rows; i++) // find the row with the biggest pivot - { - if (Math.Abs(U[i, k]) > p) - { - p = Math.Abs(U[i, k]); - k0 = i; - } - } - if (p == 0) - throw new Exception("The matrix is singular!"); - - var pom1 = pi[k]; - pi[k] = pi[k0]; - pi[k0] = pom1; // switch two rows in permutation matrix - - double pom2; - for (var i = 0; i < k; i++) - { - pom2 = L[k, i]; - L[k, i] = L[k0, i]; - L[k0, i] = pom2; - } - - if (k != k0) detOfP *= -1; - - for (var i = 0; i < cols; i++) // Switch rows in U - { - pom2 = U[k, i]; - U[k, i] = U[k0, i]; - U[k0, i] = pom2; - } - - for (var i = k + 1; i < rows; i++) - { - L[i, k] = U[i, k]/U[k, k]; - for (var j = k; j < cols; j++) - U[i, j] = U[i, j] - L[i, k]*U[k, j]; - } - } - } - - - public XLMatrix SolveWith(XLMatrix v) // Function solves Ax = v in confirmity with solution vector "v" - { - if (rows != cols) throw new Exception("The matrix is not square!"); - if (rows != v.rows) throw new Exception("Wrong number of results in solution vector!"); - if (L == null) MakeLU(); - - var b = new XLMatrix(rows, 1); - for (var i = 0; i < rows; i++) b[i, 0] = v[pi[i], 0]; // switch two items in "v" due to permutation matrix - - var z = SubsForth(L, b); - var x = SubsBack(U, z); - - return x; - } - - public XLMatrix Invert() // Function returns the inverted matrix - { - if (L == null) MakeLU(); - - var inv = new XLMatrix(rows, cols); - - for (var i = 0; i < rows; i++) - { - var Ei = ZeroMatrix(rows, 1); - Ei[i, 0] = 1; - var col = SolveWith(Ei); - inv.SetCol(col, i); - } - return inv; - } - - - public double Determinant() // Function for determinant - { - if (L == null) MakeLU(); - var det = detOfP; - for (var i = 0; i < rows; i++) det *= U[i, i]; - return det; - } - - public XLMatrix GetP() // Function returns permutation matrix "P" due to permutation vector "pi" - { - if (L == null) MakeLU(); - - var matrix = ZeroMatrix(rows, cols); - for (var i = 0; i < rows; i++) matrix[pi[i], i] = 1; - return matrix; - } - - public XLMatrix Duplicate() // Function returns the copy of this matrix - { - var matrix = new XLMatrix(rows, cols); - for (var i = 0; i < rows; i++) - for (var j = 0; j < cols; j++) - matrix[i, j] = mat[i, j]; - return matrix; - } - - public static XLMatrix SubsForth(XLMatrix A, XLMatrix b) // Function solves Ax = b for A as a lower triangular matrix - { - if (A.L == null) A.MakeLU(); - var n = A.rows; - var x = new XLMatrix(n, 1); - - for (var i = 0; i < n; i++) - { - x[i, 0] = b[i, 0]; - for (var j = 0; j < i; j++) x[i, 0] -= A[i, j]*x[j, 0]; - x[i, 0] = x[i, 0]/A[i, i]; - } - return x; - } - - public static XLMatrix SubsBack(XLMatrix A, XLMatrix b) // Function solves Ax = b for A as an upper triangular matrix - { - if (A.L == null) A.MakeLU(); - var n = A.rows; - var x = new XLMatrix(n, 1); - - for (var i = n - 1; i > -1; i--) - { - x[i, 0] = b[i, 0]; - for (var j = n - 1; j > i; j--) x[i, 0] -= A[i, j]*x[j, 0]; - x[i, 0] = x[i, 0]/A[i, i]; - } - return x; - } - - public static XLMatrix ZeroMatrix(int iRows, int iCols) // Function generates the zero matrix - { - var matrix = new XLMatrix(iRows, iCols); - for (var i = 0; i < iRows; i++) - for (var j = 0; j < iCols; j++) - matrix[i, j] = 0; - return matrix; - } - - public static XLMatrix IdentityMatrix(int iRows, int iCols) // Function generates the identity matrix - { - var matrix = ZeroMatrix(iRows, iCols); - for (var i = 0; i < Math.Min(iRows, iCols); i++) - matrix[i, i] = 1; - return matrix; - } - - public static XLMatrix RandomMatrix(int iRows, int iCols, int dispersion) // Function generates the zero matrix - { - var random = new Random(); - var matrix = new XLMatrix(iRows, iCols); - for (var i = 0; i < iRows; i++) - for (var j = 0; j < iCols; j++) - matrix[i, j] = random.Next(-dispersion, dispersion); - return matrix; - } - - public static XLMatrix Parse(string ps) // Function parses the matrix from string - { - var s = NormalizeMatrixString(ps); - var rows = Regex.Split(s, "\r\n"); - var nums = rows[0].Split(' '); - var matrix = new XLMatrix(rows.Length, nums.Length); - try - { - for (var i = 0; i < rows.Length; i++) - { - nums = rows[i].Split(' '); - for (var j = 0; j < nums.Length; j++) matrix[i, j] = double.Parse(nums[j]); - } - } - catch (FormatException) - { - throw new Exception("Wrong input format!"); - } - return matrix; - } - - public override string ToString() // Function returns matrix as a string - { - var s = ""; - for (var i = 0; i < rows; i++) - { - for (var j = 0; j < cols; j++) s += String.Format("{0,5:0.00}", mat[i, j]) + " "; - s += "\r\n"; - } - return s; - } - - public static XLMatrix Transpose(XLMatrix m) // XLMatrix transpose, for any rectangular matrix - { - var t = new XLMatrix(m.cols, m.rows); - for (var i = 0; i < m.rows; i++) - for (var j = 0; j < m.cols; j++) - t[j, i] = m[i, j]; - return t; - } - - public static XLMatrix Power(XLMatrix m, int pow) // Power matrix to exponent - { - if (pow == 0) return IdentityMatrix(m.rows, m.cols); - if (pow == 1) return m.Duplicate(); - if (pow == -1) return m.Invert(); - - XLMatrix x; - if (pow < 0) - { - x = m.Invert(); - pow *= -1; - } - else x = m.Duplicate(); - - var ret = IdentityMatrix(m.rows, m.cols); - while (pow != 0) - { - if ((pow & 1) == 1) ret *= x; - x *= x; - pow >>= 1; - } - return ret; - } - - private static void SafeAplusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) - { - for (var i = 0; i < size; i++) // rows - for (var j = 0; j < size; j++) // cols - { - C[i, j] = 0; - if (xa + j < A.cols && ya + i < A.rows) C[i, j] += A[ya + i, xa + j]; - if (xb + j < B.cols && yb + i < B.rows) C[i, j] += B[yb + i, xb + j]; - } - } - - private static void SafeAminusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) - { - for (var i = 0; i < size; i++) // rows - for (var j = 0; j < size; j++) // cols - { - C[i, j] = 0; - if (xa + j < A.cols && ya + i < A.rows) C[i, j] += A[ya + i, xa + j]; - if (xb + j < B.cols && yb + i < B.rows) C[i, j] -= B[yb + i, xb + j]; - } - } - - private static void SafeACopytoC(XLMatrix A, int xa, int ya, XLMatrix C, int size) - { - for (var i = 0; i < size; i++) // rows - for (var j = 0; j < size; j++) // cols - { - C[i, j] = 0; - if (xa + j < A.cols && ya + i < A.rows) C[i, j] += A[ya + i, xa + j]; - } - } - - private static void AplusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) - { - for (var i = 0; i < size; i++) // rows - for (var j = 0; j < size; j++) C[i, j] = A[ya + i, xa + j] + B[yb + i, xb + j]; - } - - private static void AminusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) - { - for (var i = 0; i < size; i++) // rows - for (var j = 0; j < size; j++) C[i, j] = A[ya + i, xa + j] - B[yb + i, xb + j]; - } - - private static void ACopytoC(XLMatrix A, int xa, int ya, XLMatrix C, int size) - { - for (var i = 0; i < size; i++) // rows - for (var j = 0; j < size; j++) C[i, j] = A[ya + i, xa + j]; - } - - private static XLMatrix StrassenMultiply(XLMatrix A, XLMatrix B) // Smart matrix multiplication - { - if (A.cols != B.rows) throw new Exception("Wrong dimension of matrix!"); - - XLMatrix R; - - var msize = Math.Max(Math.Max(A.rows, A.cols), Math.Max(B.rows, B.cols)); - - if (msize < 32) - { - R = ZeroMatrix(A.rows, B.cols); - for (var i = 0; i < R.rows; i++) - for (var j = 0; j < R.cols; j++) - for (var k = 0; k < A.cols; k++) - R[i, j] += A[i, k]*B[k, j]; - return R; - } - - var size = 1; - var n = 0; - while (msize > size) - { - size *= 2; - n++; - } - - var h = size/2; - - - var mField = new XLMatrix[n,9]; - - /* - * 8x8, 8x8, 8x8, ... - * 4x4, 4x4, 4x4, ... - * 2x2, 2x2, 2x2, ... - * . . . - */ - - for (var i = 0; i < n - 4; i++) // rows - { - var z = (int) Math.Pow(2, n - i - 1); - for (var j = 0; j < 9; j++) mField[i, j] = new XLMatrix(z, z); - } - - SafeAplusBintoC(A, 0, 0, A, h, h, mField[0, 0], h); - SafeAplusBintoC(B, 0, 0, B, h, h, mField[0, 1], h); - StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 1], 1, mField); // (A11 + A22) * (B11 + B22); - - SafeAplusBintoC(A, 0, h, A, h, h, mField[0, 0], h); - SafeACopytoC(B, 0, 0, mField[0, 1], h); - StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 2], 1, mField); // (A21 + A22) * B11; - - SafeACopytoC(A, 0, 0, mField[0, 0], h); - SafeAminusBintoC(B, h, 0, B, h, h, mField[0, 1], h); - StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 3], 1, mField); //A11 * (B12 - B22); - - SafeACopytoC(A, h, h, mField[0, 0], h); - SafeAminusBintoC(B, 0, h, B, 0, 0, mField[0, 1], h); - StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 4], 1, mField); //A22 * (B21 - B11); - - SafeAplusBintoC(A, 0, 0, A, h, 0, mField[0, 0], h); - SafeACopytoC(B, h, h, mField[0, 1], h); - StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 5], 1, mField); //(A11 + A12) * B22; - - SafeAminusBintoC(A, 0, h, A, 0, 0, mField[0, 0], h); - SafeAplusBintoC(B, 0, 0, B, h, 0, mField[0, 1], h); - StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 6], 1, mField); //(A21 - A11) * (B11 + B12); - - SafeAminusBintoC(A, h, 0, A, h, h, mField[0, 0], h); - SafeAplusBintoC(B, 0, h, B, h, h, mField[0, 1], h); - StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 7], 1, mField); // (A12 - A22) * (B21 + B22); - - R = new XLMatrix(A.rows, B.cols); // result - - // C11 - for (var i = 0; i < Math.Min(h, R.rows); i++) // rows - for (var j = 0; j < Math.Min(h, R.cols); j++) // cols - R[i, j] = mField[0, 1 + 1][i, j] + mField[0, 1 + 4][i, j] - mField[0, 1 + 5][i, j] + - mField[0, 1 + 7][i, j]; - - // C12 - for (var i = 0; i < Math.Min(h, R.rows); i++) // rows - for (var j = h; j < Math.Min(2*h, R.cols); j++) // cols - R[i, j] = mField[0, 1 + 3][i, j - h] + mField[0, 1 + 5][i, j - h]; - - // C21 - for (var i = h; i < Math.Min(2*h, R.rows); i++) // rows - for (var j = 0; j < Math.Min(h, R.cols); j++) // cols - R[i, j] = mField[0, 1 + 2][i - h, j] + mField[0, 1 + 4][i - h, j]; - - // C22 - for (var i = h; i < Math.Min(2*h, R.rows); i++) // rows - for (var j = h; j < Math.Min(2*h, R.cols); j++) // cols - R[i, j] = mField[0, 1 + 1][i - h, j - h] - mField[0, 1 + 2][i - h, j - h] + - mField[0, 1 + 3][i - h, j - h] + mField[0, 1 + 6][i - h, j - h]; - - return R; - } - - // function for square matrix 2^N x 2^N - - private static void StrassenMultiplyRun(XLMatrix A, XLMatrix B, XLMatrix C, int l, XLMatrix[,] f) - // A * B into C, level of recursion, matrix field - { - var size = A.rows; - var h = size/2; - - if (size < 32) - { - for (var i = 0; i < C.rows; i++) - for (var j = 0; j < C.cols; j++) - { - C[i, j] = 0; - for (var k = 0; k < A.cols; k++) C[i, j] += A[i, k]*B[k, j]; - } - return; - } - - AplusBintoC(A, 0, 0, A, h, h, f[l, 0], h); - AplusBintoC(B, 0, 0, B, h, h, f[l, 1], h); - StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 1], l + 1, f); // (A11 + A22) * (B11 + B22); - - AplusBintoC(A, 0, h, A, h, h, f[l, 0], h); - ACopytoC(B, 0, 0, f[l, 1], h); - StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 2], l + 1, f); // (A21 + A22) * B11; - - ACopytoC(A, 0, 0, f[l, 0], h); - AminusBintoC(B, h, 0, B, h, h, f[l, 1], h); - StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 3], l + 1, f); //A11 * (B12 - B22); - - ACopytoC(A, h, h, f[l, 0], h); - AminusBintoC(B, 0, h, B, 0, 0, f[l, 1], h); - StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 4], l + 1, f); //A22 * (B21 - B11); - - AplusBintoC(A, 0, 0, A, h, 0, f[l, 0], h); - ACopytoC(B, h, h, f[l, 1], h); - StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 5], l + 1, f); //(A11 + A12) * B22; - - AminusBintoC(A, 0, h, A, 0, 0, f[l, 0], h); - AplusBintoC(B, 0, 0, B, h, 0, f[l, 1], h); - StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 6], l + 1, f); //(A21 - A11) * (B11 + B12); - - AminusBintoC(A, h, 0, A, h, h, f[l, 0], h); - AplusBintoC(B, 0, h, B, h, h, f[l, 1], h); - StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 7], l + 1, f); // (A12 - A22) * (B21 + B22); - - // C11 - for (var i = 0; i < h; i++) // rows - for (var j = 0; j < h; j++) // cols - C[i, j] = f[l, 1 + 1][i, j] + f[l, 1 + 4][i, j] - f[l, 1 + 5][i, j] + f[l, 1 + 7][i, j]; - - // C12 - for (var i = 0; i < h; i++) // rows - for (var j = h; j < size; j++) // cols - C[i, j] = f[l, 1 + 3][i, j - h] + f[l, 1 + 5][i, j - h]; - - // C21 - for (var i = h; i < size; i++) // rows - for (var j = 0; j < h; j++) // cols - C[i, j] = f[l, 1 + 2][i - h, j] + f[l, 1 + 4][i - h, j]; - - // C22 - for (var i = h; i < size; i++) // rows - for (var j = h; j < size; j++) // cols - C[i, j] = f[l, 1 + 1][i - h, j - h] - f[l, 1 + 2][i - h, j - h] + f[l, 1 + 3][i - h, j - h] + - f[l, 1 + 6][i - h, j - h]; - } - - public static XLMatrix StupidMultiply(XLMatrix m1, XLMatrix m2) // Stupid matrix multiplication - { - if (m1.cols != m2.rows) throw new Exception("Wrong dimensions of matrix!"); - - var result = ZeroMatrix(m1.rows, m2.cols); - for (var i = 0; i < result.rows; i++) - for (var j = 0; j < result.cols; j++) - for (var k = 0; k < m1.cols; k++) - result[i, j] += m1[i, k]*m2[k, j]; - return result; - } - - private static XLMatrix Multiply(double n, XLMatrix m) // Multiplication by constant n - { - var r = new XLMatrix(m.rows, m.cols); - for (var i = 0; i < m.rows; i++) - for (var j = 0; j < m.cols; j++) - r[i, j] = m[i, j]*n; - return r; - } - - private static XLMatrix Add(XLMatrix m1, XLMatrix m2) - { - if (m1.rows != m2.rows || m1.cols != m2.cols) - throw new Exception("Matrices must have the same dimensions!"); - var r = new XLMatrix(m1.rows, m1.cols); - for (var i = 0; i < r.rows; i++) - for (var j = 0; j < r.cols; j++) - r[i, j] = m1[i, j] + m2[i, j]; - return r; - } - - public static string NormalizeMatrixString(string matStr) // From Andy - thank you! :) - { - // Remove any multiple spaces - while (matStr.IndexOf(" ") != -1) - matStr = matStr.Replace(" ", " "); - - // Remove any spaces before or after newlines - matStr = matStr.Replace(" \r\n", "\r\n"); - matStr = matStr.Replace("\r\n ", "\r\n"); - - // If the data ends in a newline, remove the trailing newline. - // Make it easier by first replacing \r\n’s with |’s then - // restore the |’s with \r\n’s - matStr = matStr.Replace("\r\n", "|"); - while (matStr.LastIndexOf("|") == (matStr.Length - 1)) - matStr = matStr.Substring(0, matStr.Length - 1); - - matStr = matStr.Replace("|", "\r\n"); - return matStr; - } - - // O P E R A T O R S - - public static XLMatrix operator -(XLMatrix m) - { - return Multiply(-1, m); - } - - public static XLMatrix operator +(XLMatrix m1, XLMatrix m2) - { - return Add(m1, m2); - } - - public static XLMatrix operator -(XLMatrix m1, XLMatrix m2) - { - return Add(m1, -m2); - } - - public static XLMatrix operator *(XLMatrix m1, XLMatrix m2) - { - return StrassenMultiply(m1, m2); - } - - public static XLMatrix operator *(double n, XLMatrix m) - { - return Multiply(n, m); - } - } +using System; +using System.Linq; +using System.Text.RegularExpressions; + +namespace ClosedXML.Excel.CalcEngine.Functions +{ + internal class XLMatrix + { + public XLMatrix L; + public XLMatrix U; + public int cols; + private double detOfP = 1; + public double[,] mat; + private int[] pi; + public int rows; + + public XLMatrix(int iRows, int iCols) // XLMatrix Class constructor + { + rows = iRows; + cols = iCols; + mat = new double[rows,cols]; + } + public XLMatrix(Double[,] arr) + :this(arr.GetLength(0), arr.GetLength(1)) + { + var roCount = arr.GetLength(0); + var coCount = arr.GetLength(1); + for (int ro = 0; ro < roCount; ro++) + { + for (int co = 0; co < coCount; co++) + { + mat[ro, co] = arr[ro, co]; + } + } + } + + public double this[int iRow, int iCol] // Access this matrix as a 2D array + { + get { return mat[iRow, iCol]; } + set { mat[iRow, iCol] = value; } + } + + public Boolean IsSquare() + { + return (rows == cols); + } + + public XLMatrix GetCol(int k) + { + var m = new XLMatrix(rows, 1); + for (var i = 0; i < rows; i++) m[i, 0] = mat[i, k]; + return m; + } + + public void SetCol(XLMatrix v, int k) + { + for (var i = 0; i < rows; i++) mat[i, k] = v[i, 0]; + } + + public void MakeLU() // Function for LU decomposition + { + if (!IsSquare()) throw new Exception("The matrix is not square!"); + L = IdentityMatrix(rows, cols); + U = Duplicate(); + + pi = new int[rows]; + for (var i = 0; i < rows; i++) pi[i] = i; + + var k0 = 0; + + for (var k = 0; k < cols - 1; k++) + { + double p = 0; + for (var i = k; i < rows; i++) // find the row with the biggest pivot + { + if (Math.Abs(U[i, k]) > p) + { + p = Math.Abs(U[i, k]); + k0 = i; + } + } + if (p == 0) + throw new Exception("The matrix is singular!"); + + var pom1 = pi[k]; + pi[k] = pi[k0]; + pi[k0] = pom1; // switch two rows in permutation matrix + + double pom2; + for (var i = 0; i < k; i++) + { + pom2 = L[k, i]; + L[k, i] = L[k0, i]; + L[k0, i] = pom2; + } + + if (k != k0) detOfP *= -1; + + for (var i = 0; i < cols; i++) // Switch rows in U + { + pom2 = U[k, i]; + U[k, i] = U[k0, i]; + U[k0, i] = pom2; + } + + for (var i = k + 1; i < rows; i++) + { + L[i, k] = U[i, k]/U[k, k]; + for (var j = k; j < cols; j++) + U[i, j] = U[i, j] - L[i, k]*U[k, j]; + } + } + } + + + public XLMatrix SolveWith(XLMatrix v) // Function solves Ax = v in confirmity with solution vector "v" + { + if (rows != cols) throw new Exception("The matrix is not square!"); + if (rows != v.rows) throw new Exception("Wrong number of results in solution vector!"); + if (L == null) MakeLU(); + + var b = new XLMatrix(rows, 1); + for (var i = 0; i < rows; i++) b[i, 0] = v[pi[i], 0]; // switch two items in "v" due to permutation matrix + + var z = SubsForth(L, b); + var x = SubsBack(U, z); + + return x; + } + + public XLMatrix Invert() // Function returns the inverted matrix + { + if (L == null) MakeLU(); + + var inv = new XLMatrix(rows, cols); + + for (var i = 0; i < rows; i++) + { + var Ei = ZeroMatrix(rows, 1); + Ei[i, 0] = 1; + var col = SolveWith(Ei); + inv.SetCol(col, i); + } + return inv; + } + + + public double Determinant() // Function for determinant + { + if (L == null) MakeLU(); + var det = detOfP; + for (var i = 0; i < rows; i++) det *= U[i, i]; + return det; + } + + public XLMatrix GetP() // Function returns permutation matrix "P" due to permutation vector "pi" + { + if (L == null) MakeLU(); + + var matrix = ZeroMatrix(rows, cols); + for (var i = 0; i < rows; i++) matrix[pi[i], i] = 1; + return matrix; + } + + public XLMatrix Duplicate() // Function returns the copy of this matrix + { + var matrix = new XLMatrix(rows, cols); + for (var i = 0; i < rows; i++) + for (var j = 0; j < cols; j++) + matrix[i, j] = mat[i, j]; + return matrix; + } + + public static XLMatrix SubsForth(XLMatrix A, XLMatrix b) // Function solves Ax = b for A as a lower triangular matrix + { + if (A.L == null) A.MakeLU(); + var n = A.rows; + var x = new XLMatrix(n, 1); + + for (var i = 0; i < n; i++) + { + x[i, 0] = b[i, 0]; + for (var j = 0; j < i; j++) x[i, 0] -= A[i, j]*x[j, 0]; + x[i, 0] = x[i, 0]/A[i, i]; + } + return x; + } + + public static XLMatrix SubsBack(XLMatrix A, XLMatrix b) // Function solves Ax = b for A as an upper triangular matrix + { + if (A.L == null) A.MakeLU(); + var n = A.rows; + var x = new XLMatrix(n, 1); + + for (var i = n - 1; i > -1; i--) + { + x[i, 0] = b[i, 0]; + for (var j = n - 1; j > i; j--) x[i, 0] -= A[i, j]*x[j, 0]; + x[i, 0] = x[i, 0]/A[i, i]; + } + return x; + } + + public static XLMatrix ZeroMatrix(int iRows, int iCols) // Function generates the zero matrix + { + var matrix = new XLMatrix(iRows, iCols); + for (var i = 0; i < iRows; i++) + for (var j = 0; j < iCols; j++) + matrix[i, j] = 0; + return matrix; + } + + public static XLMatrix IdentityMatrix(int iRows, int iCols) // Function generates the identity matrix + { + var matrix = ZeroMatrix(iRows, iCols); + for (var i = 0; i < Math.Min(iRows, iCols); i++) + matrix[i, i] = 1; + return matrix; + } + + public static XLMatrix RandomMatrix(int iRows, int iCols, int dispersion) // Function generates the zero matrix + { + var random = new Random(); + var matrix = new XLMatrix(iRows, iCols); + for (var i = 0; i < iRows; i++) + for (var j = 0; j < iCols; j++) + matrix[i, j] = random.Next(-dispersion, dispersion); + return matrix; + } + + public static XLMatrix Parse(string ps) // Function parses the matrix from string + { + var s = NormalizeMatrixString(ps); + var rows = Regex.Split(s, "\r\n"); + var nums = rows[0].Split(' '); + var matrix = new XLMatrix(rows.Length, nums.Length); + try + { + for (var i = 0; i < rows.Length; i++) + { + nums = rows[i].Split(' '); + for (var j = 0; j < nums.Length; j++) matrix[i, j] = double.Parse(nums[j]); + } + } + catch (FormatException) + { + throw new Exception("Wrong input format!"); + } + return matrix; + } + + public override string ToString() // Function returns matrix as a string + { + var s = ""; + for (var i = 0; i < rows; i++) + { + for (var j = 0; j < cols; j++) s += String.Format("{0,5:0.00}", mat[i, j]) + " "; + s += "\r\n"; + } + return s; + } + + public static XLMatrix Transpose(XLMatrix m) // XLMatrix transpose, for any rectangular matrix + { + var t = new XLMatrix(m.cols, m.rows); + for (var i = 0; i < m.rows; i++) + for (var j = 0; j < m.cols; j++) + t[j, i] = m[i, j]; + return t; + } + + public static XLMatrix Power(XLMatrix m, int pow) // Power matrix to exponent + { + if (pow == 0) return IdentityMatrix(m.rows, m.cols); + if (pow == 1) return m.Duplicate(); + if (pow == -1) return m.Invert(); + + XLMatrix x; + if (pow < 0) + { + x = m.Invert(); + pow *= -1; + } + else x = m.Duplicate(); + + var ret = IdentityMatrix(m.rows, m.cols); + while (pow != 0) + { + if ((pow & 1) == 1) ret *= x; + x *= x; + pow >>= 1; + } + return ret; + } + + private static void SafeAplusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) // cols + { + C[i, j] = 0; + if (xa + j < A.cols && ya + i < A.rows) C[i, j] += A[ya + i, xa + j]; + if (xb + j < B.cols && yb + i < B.rows) C[i, j] += B[yb + i, xb + j]; + } + } + + private static void SafeAminusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) // cols + { + C[i, j] = 0; + if (xa + j < A.cols && ya + i < A.rows) C[i, j] += A[ya + i, xa + j]; + if (xb + j < B.cols && yb + i < B.rows) C[i, j] -= B[yb + i, xb + j]; + } + } + + private static void SafeACopytoC(XLMatrix A, int xa, int ya, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) // cols + { + C[i, j] = 0; + if (xa + j < A.cols && ya + i < A.rows) C[i, j] += A[ya + i, xa + j]; + } + } + + private static void AplusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) C[i, j] = A[ya + i, xa + j] + B[yb + i, xb + j]; + } + + private static void AminusBintoC(XLMatrix A, int xa, int ya, XLMatrix B, int xb, int yb, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) C[i, j] = A[ya + i, xa + j] - B[yb + i, xb + j]; + } + + private static void ACopytoC(XLMatrix A, int xa, int ya, XLMatrix C, int size) + { + for (var i = 0; i < size; i++) // rows + for (var j = 0; j < size; j++) C[i, j] = A[ya + i, xa + j]; + } + + private static XLMatrix StrassenMultiply(XLMatrix A, XLMatrix B) // Smart matrix multiplication + { + if (A.cols != B.rows) throw new Exception("Wrong dimension of matrix!"); + + XLMatrix R; + + var msize = Math.Max(Math.Max(A.rows, A.cols), Math.Max(B.rows, B.cols)); + + if (msize < 32) + { + R = ZeroMatrix(A.rows, B.cols); + for (var i = 0; i < R.rows; i++) + for (var j = 0; j < R.cols; j++) + for (var k = 0; k < A.cols; k++) + R[i, j] += A[i, k]*B[k, j]; + return R; + } + + var size = 1; + var n = 0; + while (msize > size) + { + size *= 2; + n++; + } + + var h = size/2; + + + var mField = new XLMatrix[n,9]; + + /* + * 8x8, 8x8, 8x8, ... + * 4x4, 4x4, 4x4, ... + * 2x2, 2x2, 2x2, ... + * . . . + */ + + for (var i = 0; i < n - 4; i++) // rows + { + var z = (int) Math.Pow(2, n - i - 1); + for (var j = 0; j < 9; j++) mField[i, j] = new XLMatrix(z, z); + } + + SafeAplusBintoC(A, 0, 0, A, h, h, mField[0, 0], h); + SafeAplusBintoC(B, 0, 0, B, h, h, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 1], 1, mField); // (A11 + A22) * (B11 + B22); + + SafeAplusBintoC(A, 0, h, A, h, h, mField[0, 0], h); + SafeACopytoC(B, 0, 0, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 2], 1, mField); // (A21 + A22) * B11; + + SafeACopytoC(A, 0, 0, mField[0, 0], h); + SafeAminusBintoC(B, h, 0, B, h, h, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 3], 1, mField); //A11 * (B12 - B22); + + SafeACopytoC(A, h, h, mField[0, 0], h); + SafeAminusBintoC(B, 0, h, B, 0, 0, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 4], 1, mField); //A22 * (B21 - B11); + + SafeAplusBintoC(A, 0, 0, A, h, 0, mField[0, 0], h); + SafeACopytoC(B, h, h, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 5], 1, mField); //(A11 + A12) * B22; + + SafeAminusBintoC(A, 0, h, A, 0, 0, mField[0, 0], h); + SafeAplusBintoC(B, 0, 0, B, h, 0, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 6], 1, mField); //(A21 - A11) * (B11 + B12); + + SafeAminusBintoC(A, h, 0, A, h, h, mField[0, 0], h); + SafeAplusBintoC(B, 0, h, B, h, h, mField[0, 1], h); + StrassenMultiplyRun(mField[0, 0], mField[0, 1], mField[0, 1 + 7], 1, mField); // (A12 - A22) * (B21 + B22); + + R = new XLMatrix(A.rows, B.cols); // result + + // C11 + for (var i = 0; i < Math.Min(h, R.rows); i++) // rows + for (var j = 0; j < Math.Min(h, R.cols); j++) // cols + R[i, j] = mField[0, 1 + 1][i, j] + mField[0, 1 + 4][i, j] - mField[0, 1 + 5][i, j] + + mField[0, 1 + 7][i, j]; + + // C12 + for (var i = 0; i < Math.Min(h, R.rows); i++) // rows + for (var j = h; j < Math.Min(2*h, R.cols); j++) // cols + R[i, j] = mField[0, 1 + 3][i, j - h] + mField[0, 1 + 5][i, j - h]; + + // C21 + for (var i = h; i < Math.Min(2*h, R.rows); i++) // rows + for (var j = 0; j < Math.Min(h, R.cols); j++) // cols + R[i, j] = mField[0, 1 + 2][i - h, j] + mField[0, 1 + 4][i - h, j]; + + // C22 + for (var i = h; i < Math.Min(2*h, R.rows); i++) // rows + for (var j = h; j < Math.Min(2*h, R.cols); j++) // cols + R[i, j] = mField[0, 1 + 1][i - h, j - h] - mField[0, 1 + 2][i - h, j - h] + + mField[0, 1 + 3][i - h, j - h] + mField[0, 1 + 6][i - h, j - h]; + + return R; + } + + // function for square matrix 2^N x 2^N + + private static void StrassenMultiplyRun(XLMatrix A, XLMatrix B, XLMatrix C, int l, XLMatrix[,] f) + // A * B into C, level of recursion, matrix field + { + var size = A.rows; + var h = size/2; + + if (size < 32) + { + for (var i = 0; i < C.rows; i++) + for (var j = 0; j < C.cols; j++) + { + C[i, j] = 0; + for (var k = 0; k < A.cols; k++) C[i, j] += A[i, k]*B[k, j]; + } + return; + } + + AplusBintoC(A, 0, 0, A, h, h, f[l, 0], h); + AplusBintoC(B, 0, 0, B, h, h, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 1], l + 1, f); // (A11 + A22) * (B11 + B22); + + AplusBintoC(A, 0, h, A, h, h, f[l, 0], h); + ACopytoC(B, 0, 0, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 2], l + 1, f); // (A21 + A22) * B11; + + ACopytoC(A, 0, 0, f[l, 0], h); + AminusBintoC(B, h, 0, B, h, h, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 3], l + 1, f); //A11 * (B12 - B22); + + ACopytoC(A, h, h, f[l, 0], h); + AminusBintoC(B, 0, h, B, 0, 0, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 4], l + 1, f); //A22 * (B21 - B11); + + AplusBintoC(A, 0, 0, A, h, 0, f[l, 0], h); + ACopytoC(B, h, h, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 5], l + 1, f); //(A11 + A12) * B22; + + AminusBintoC(A, 0, h, A, 0, 0, f[l, 0], h); + AplusBintoC(B, 0, 0, B, h, 0, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 6], l + 1, f); //(A21 - A11) * (B11 + B12); + + AminusBintoC(A, h, 0, A, h, h, f[l, 0], h); + AplusBintoC(B, 0, h, B, h, h, f[l, 1], h); + StrassenMultiplyRun(f[l, 0], f[l, 1], f[l, 1 + 7], l + 1, f); // (A12 - A22) * (B21 + B22); + + // C11 + for (var i = 0; i < h; i++) // rows + for (var j = 0; j < h; j++) // cols + C[i, j] = f[l, 1 + 1][i, j] + f[l, 1 + 4][i, j] - f[l, 1 + 5][i, j] + f[l, 1 + 7][i, j]; + + // C12 + for (var i = 0; i < h; i++) // rows + for (var j = h; j < size; j++) // cols + C[i, j] = f[l, 1 + 3][i, j - h] + f[l, 1 + 5][i, j - h]; + + // C21 + for (var i = h; i < size; i++) // rows + for (var j = 0; j < h; j++) // cols + C[i, j] = f[l, 1 + 2][i - h, j] + f[l, 1 + 4][i - h, j]; + + // C22 + for (var i = h; i < size; i++) // rows + for (var j = h; j < size; j++) // cols + C[i, j] = f[l, 1 + 1][i - h, j - h] - f[l, 1 + 2][i - h, j - h] + f[l, 1 + 3][i - h, j - h] + + f[l, 1 + 6][i - h, j - h]; + } + + public static XLMatrix StupidMultiply(XLMatrix m1, XLMatrix m2) // Stupid matrix multiplication + { + if (m1.cols != m2.rows) throw new Exception("Wrong dimensions of matrix!"); + + var result = ZeroMatrix(m1.rows, m2.cols); + for (var i = 0; i < result.rows; i++) + for (var j = 0; j < result.cols; j++) + for (var k = 0; k < m1.cols; k++) + result[i, j] += m1[i, k]*m2[k, j]; + return result; + } + + private static XLMatrix Multiply(double n, XLMatrix m) // Multiplication by constant n + { + var r = new XLMatrix(m.rows, m.cols); + for (var i = 0; i < m.rows; i++) + for (var j = 0; j < m.cols; j++) + r[i, j] = m[i, j]*n; + return r; + } + + private static XLMatrix Add(XLMatrix m1, XLMatrix m2) + { + if (m1.rows != m2.rows || m1.cols != m2.cols) + throw new Exception("Matrices must have the same dimensions!"); + var r = new XLMatrix(m1.rows, m1.cols); + for (var i = 0; i < r.rows; i++) + for (var j = 0; j < r.cols; j++) + r[i, j] = m1[i, j] + m2[i, j]; + return r; + } + + public static string NormalizeMatrixString(string matStr) // From Andy - thank you! :) + { + // Remove any multiple spaces + while (matStr.IndexOf(" ") != -1) + matStr = matStr.Replace(" ", " "); + + // Remove any spaces before or after newlines + matStr = matStr.Replace(" \r\n", "\r\n"); + matStr = matStr.Replace("\r\n ", "\r\n"); + + // If the data ends in a newline, remove the trailing newline. + // Make it easier by first replacing \r\n’s with |’s then + // restore the |’s with \r\n’s + matStr = matStr.Replace("\r\n", "|"); + while (matStr.LastIndexOf("|") == (matStr.Length - 1)) + matStr = matStr.Substring(0, matStr.Length - 1); + + matStr = matStr.Replace("|", "\r\n"); + return matStr; + } + + // O P E R A T O R S + + public static XLMatrix operator -(XLMatrix m) + { + return Multiply(-1, m); + } + + public static XLMatrix operator +(XLMatrix m1, XLMatrix m2) + { + return Add(m1, m2); + } + + public static XLMatrix operator -(XLMatrix m1, XLMatrix m2) + { + return Add(m1, -m2); + } + + public static XLMatrix operator *(XLMatrix m1, XLMatrix m2) + { + return StrassenMultiply(m1, m2); + } + + public static XLMatrix operator *(double n, XLMatrix m) + { + return Multiply(n, m); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/CalcEngine/Token.cs b/ClosedXML/Excel/CalcEngine/Token.cs index 2095806..67351df 100644 --- a/ClosedXML/Excel/CalcEngine/Token.cs +++ b/ClosedXML/Excel/CalcEngine/Token.cs @@ -1,47 +1,47 @@ -namespace ClosedXML.Excel.CalcEngine -{ - /// - /// Represents a node in the expression tree. - /// - internal class Token - { - // ** fields - public TKID ID; - public TKTYPE Type; - public object Value; - - // ** ctor - public Token(object value, TKID id, TKTYPE type) - { - Value = value; - ID = id; - Type = type; - } - } - /// - /// Token types (used when building expressions, sequence defines operator priority) - /// - internal enum TKTYPE - { - COMPARE, // < > = <= >= - ADDSUB, // + - - MULDIV, // * / - POWER, // ^ - GROUP, // ( ) , . - LITERAL, // 123.32, "Hello", etc. - IDENTIFIER // functions, external objects, bindings - } - /// - /// Token ID (used when evaluating expressions) - /// - internal enum TKID - { - GT, LT, GE, LE, EQ, NE, // COMPARE - ADD, SUB, // ADDSUB - MUL, DIV, DIVINT, MOD, // MULDIV - POWER, // POWER - OPEN, CLOSE, END, COMMA, PERIOD, // GROUP - ATOM, // LITERAL, IDENTIFIER - CONCAT - } -} +namespace ClosedXML.Excel.CalcEngine +{ + /// + /// Represents a node in the expression tree. + /// + internal class Token + { + // ** fields + public TKID ID; + public TKTYPE Type; + public object Value; + + // ** ctor + public Token(object value, TKID id, TKTYPE type) + { + Value = value; + ID = id; + Type = type; + } + } + /// + /// Token types (used when building expressions, sequence defines operator priority) + /// + internal enum TKTYPE + { + COMPARE, // < > = <= >= + ADDSUB, // + - + MULDIV, // * / + POWER, // ^ + GROUP, // ( ) , . + LITERAL, // 123.32, "Hello", etc. + IDENTIFIER // functions, external objects, bindings + } + /// + /// Token ID (used when evaluating expressions) + /// + internal enum TKID + { + GT, LT, GE, LE, EQ, NE, // COMPARE + ADD, SUB, // ADDSUB + MUL, DIV, DIVINT, MOD, // MULDIV + POWER, // POWER + OPEN, CLOSE, END, COMMA, PERIOD, // GROUP + ATOM, // LITERAL, IDENTIFIER + CONCAT + } +} diff --git a/ClosedXML/Excel/CalcEngine/XLCalcEngine.cs b/ClosedXML/Excel/CalcEngine/XLCalcEngine.cs index 6686621..33011e2 100644 --- a/ClosedXML/Excel/CalcEngine/XLCalcEngine.cs +++ b/ClosedXML/Excel/CalcEngine/XLCalcEngine.cs @@ -1,112 +1,112 @@ -using System; -using System.Collections; -using System.Linq; - -namespace ClosedXML.Excel.CalcEngine -{ - internal class XLCalcEngine : CalcEngine - { - private readonly IXLWorksheet _ws; - private readonly XLWorkbook _wb; - - public XLCalcEngine() - { } - - public XLCalcEngine(XLWorkbook wb) - { - _wb = wb; - IdentifierChars = new char[] { '$', ':', '!' }; - } - - public XLCalcEngine(IXLWorksheet ws) : this(ws.Workbook) - { - _ws = ws; - } - - public override object GetExternalObject(string identifier) - { - if (identifier.Contains("!") && _wb != null) - { - var referencedSheetNames = identifier.Split(':') - .Select(part => - { - if (part.Contains("!")) - return part.Substring(0, part.IndexOf('!')).ToLower(); - else - return null; - }) - .Where(sheet => sheet != null) - .Distinct(); - - if (!referencedSheetNames.Any()) - return new CellRangeReference(_ws.Range(identifier), this); - else if (referencedSheetNames.Count() > 1) - throw new ArgumentOutOfRangeException(referencedSheetNames.Last(), "Cross worksheet references may references no more than 1 other worksheet"); - else - { - IXLWorksheet worksheet; - if (!_wb.TryGetWorksheet(referencedSheetNames.Single(), out worksheet)) - throw new ArgumentOutOfRangeException(referencedSheetNames.Single(), "The required worksheet cannot be found"); - - identifier = identifier.ToLower().Replace(string.Format("{0}!", worksheet.Name.ToLower()), ""); - - return new CellRangeReference(worksheet.Range(identifier), this); - } - } - else if (_ws != null) - return new CellRangeReference(_ws.Range(identifier), this); - else - return identifier; - } - } - - internal class CellRangeReference : IValueObject, IEnumerable - { - private IXLRange _range; - private XLCalcEngine _ce; - - public CellRangeReference(IXLRange range, XLCalcEngine ce) - { - _range = range; - _ce = ce; - } - - public IXLRange Range { get { return _range; } } - - // ** IValueObject - public object GetValue() - { - return GetValue(_range.FirstCell()); - } - - // ** IEnumerable - public IEnumerator GetEnumerator() - { - return _range.Cells().Select(GetValue).GetEnumerator(); - } - - private Boolean _evaluating; - - // ** implementation - private object GetValue(IXLCell cell) - { - if (_evaluating) - { - throw new Exception("Circular Reference"); - } - try - { - _evaluating = true; - var f = cell.FormulaA1; - if (XLHelper.IsNullOrWhiteSpace(f)) - return cell.Value; - else - return new XLCalcEngine(cell.Worksheet).Evaluate(f); - } - finally - { - _evaluating = false; - } - } - } -} +using System; +using System.Collections; +using System.Linq; + +namespace ClosedXML.Excel.CalcEngine +{ + internal class XLCalcEngine : CalcEngine + { + private readonly IXLWorksheet _ws; + private readonly XLWorkbook _wb; + + public XLCalcEngine() + { } + + public XLCalcEngine(XLWorkbook wb) + { + _wb = wb; + IdentifierChars = new char[] { '$', ':', '!' }; + } + + public XLCalcEngine(IXLWorksheet ws) : this(ws.Workbook) + { + _ws = ws; + } + + public override object GetExternalObject(string identifier) + { + if (identifier.Contains("!") && _wb != null) + { + var referencedSheetNames = identifier.Split(':') + .Select(part => + { + if (part.Contains("!")) + return part.Substring(0, part.IndexOf('!')).ToLower(); + else + return null; + }) + .Where(sheet => sheet != null) + .Distinct(); + + if (!referencedSheetNames.Any()) + return new CellRangeReference(_ws.Range(identifier), this); + else if (referencedSheetNames.Count() > 1) + throw new ArgumentOutOfRangeException(referencedSheetNames.Last(), "Cross worksheet references may references no more than 1 other worksheet"); + else + { + IXLWorksheet worksheet; + if (!_wb.TryGetWorksheet(referencedSheetNames.Single(), out worksheet)) + throw new ArgumentOutOfRangeException(referencedSheetNames.Single(), "The required worksheet cannot be found"); + + identifier = identifier.ToLower().Replace(string.Format("{0}!", worksheet.Name.ToLower()), ""); + + return new CellRangeReference(worksheet.Range(identifier), this); + } + } + else if (_ws != null) + return new CellRangeReference(_ws.Range(identifier), this); + else + return identifier; + } + } + + internal class CellRangeReference : IValueObject, IEnumerable + { + private IXLRange _range; + private XLCalcEngine _ce; + + public CellRangeReference(IXLRange range, XLCalcEngine ce) + { + _range = range; + _ce = ce; + } + + public IXLRange Range { get { return _range; } } + + // ** IValueObject + public object GetValue() + { + return GetValue(_range.FirstCell()); + } + + // ** IEnumerable + public IEnumerator GetEnumerator() + { + return _range.Cells().Select(GetValue).GetEnumerator(); + } + + private Boolean _evaluating; + + // ** implementation + private object GetValue(IXLCell cell) + { + if (_evaluating) + { + throw new Exception("Circular Reference"); + } + try + { + _evaluating = true; + var f = cell.FormulaA1; + if (XLHelper.IsNullOrWhiteSpace(f)) + return cell.Value; + else + return new XLCalcEngine(cell.Worksheet).Evaluate(f); + } + finally + { + _evaluating = false; + } + } + } +} diff --git a/ClosedXML/Excel/Cells/IXLCell.cs b/ClosedXML/Excel/Cells/IXLCell.cs index 157017f..d685041 100644 --- a/ClosedXML/Excel/Cells/IXLCell.cs +++ b/ClosedXML/Excel/Cells/IXLCell.cs @@ -1,328 +1,328 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Data; - -namespace ClosedXML.Excel -{ - public enum XLCellValues { Text, Number, Boolean, DateTime, TimeSpan } - - public enum XLClearOptions - { - ContentsAndFormats, - Contents, - Formats - } - - public interface IXLCell - { - /// - /// Gets or sets the cell's value. To get a strongly typed object use the method GetValue<T>. - /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from this cell. - /// If the object is a range ClosedXML will copy the range starting from this cell. - /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. - /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. - /// - /// - /// The object containing the value(s) to set. - /// - Object Value { get; set; } - - /// Gets this cell's address, relative to the worksheet. - /// The cell's address. - IXLAddress Address { get; } - - /// - /// Gets or sets the type of this cell's data. - /// Changing the data type will cause ClosedXML to covert the current value to the new data type. - /// An exception will be thrown if the current value cannot be converted to the new data type. - /// - /// - /// The type of the cell's data. - /// - /// - XLCellValues DataType { get; set; } - - /// - /// Sets the type of this cell's data. - /// Changing the data type will cause ClosedXML to covert the current value to the new data type. - /// An exception will be thrown if the current value cannot be converted to the new data type. - /// - /// Type of the data. - /// - IXLCell SetDataType(XLCellValues dataType); - - /// - /// Sets the cell's value. - /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from this cell. - /// If the object is a range ClosedXML will copy the range starting from this cell. - /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. - /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. - /// - /// - /// The object containing the value(s) to set. - /// - IXLCell SetValue(T value); - - /// - /// Gets the cell's value converted to the T type. - /// ClosedXML will try to covert the current value to the T type. - /// An exception will be thrown if the current value cannot be converted to the T type. - /// - /// The return type. - /// - T GetValue(); - - /// - /// Gets the cell's value converted to a String. - /// - String GetString(); - - /// - /// Gets the cell's value formatted depending on the cell's data type and style. - /// - String GetFormattedString(); - - /// - /// Gets the cell's value converted to Double. - /// ClosedXML will try to covert the current value to Double. - /// An exception will be thrown if the current value cannot be converted to Double. - /// - Double GetDouble(); - - /// - /// Gets the cell's value converted to Boolean. - /// ClosedXML will try to covert the current value to Boolean. - /// An exception will be thrown if the current value cannot be converted to Boolean. - /// - Boolean GetBoolean(); - - /// - /// Gets the cell's value converted to DateTime. - /// ClosedXML will try to covert the current value to DateTime. - /// An exception will be thrown if the current value cannot be converted to DateTime. - /// - DateTime GetDateTime(); - - /// - /// Gets the cell's value converted to TimeSpan. - /// ClosedXML will try to covert the current value to TimeSpan. - /// An exception will be thrown if the current value cannot be converted to TimeSpan. - /// - TimeSpan GetTimeSpan(); - - XLHyperlink GetHyperlink(); - - Boolean TryGetValue(out T value); - - - - Boolean HasHyperlink { get; } - - /// - /// Clears the contents of this cell. - /// - /// Specify what you want to clear. - IXLCell Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - /// - /// Deletes the current cell and shifts the surrounding cells according to the shiftDeleteCells parameter. - /// - /// How to shift the surrounding cells. - void Delete(XLShiftDeletedCells shiftDeleteCells); - - /// - /// Gets or sets the cell's formula with A1 references. - /// - /// The formula with A1 references. - String FormulaA1 { get; set; } - - IXLCell SetFormulaA1(String formula); - - /// - /// Gets or sets the cell's formula with R1C1 references. - /// - /// The formula with R1C1 references. - String FormulaR1C1 { get; set; } - - IXLCell SetFormulaR1C1(String formula); - - /// - /// Returns this cell as an IXLRange. - /// - IXLRange AsRange(); - - - /// - /// Gets or sets the cell's style. - /// - IXLStyle Style { get; set; } - - /// - /// Gets or sets a value indicating whether this cell's text should be shared or not. - /// - /// - /// If false the cell's text will not be shared and stored as an inline value. - /// - Boolean ShareString { get; set; } - - /// - /// Inserts the IEnumerable data elements and returns the range it occupies. - /// - /// The IEnumerable data. - IXLRange InsertData(IEnumerable data); - - /// - /// Inserts the IEnumerable data elements as a table and returns it. - /// The new table will receive a generic name: Table# - /// - /// The table data. - IXLTable InsertTable(IEnumerable data); - - /// - /// Inserts the IEnumerable data elements as a table and returns it. - /// The new table will receive a generic name: Table# - /// - /// The table data. - /// - /// if set to true it will create an Excel table. - /// if set to false the table will be created in memory. - /// - IXLTable InsertTable(IEnumerable data, Boolean createTable); - - /// - /// Creates an Excel table from the given IEnumerable data elements. - /// - /// The table data. - /// Name of the table. - IXLTable InsertTable(IEnumerable data, String tableName); - - /// - /// Inserts the IEnumerable data elements as a table and returns it. - /// - /// The table data. - /// Name of the table. - /// - /// if set to true it will create an Excel table. - /// if set to false the table will be created in memory. - /// - IXLTable InsertTable(IEnumerable data, String tableName, Boolean createTable); - - - /// - /// Inserts the DataTable data elements as a table and returns it. - /// The new table will receive a generic name: Table# - /// - /// The table data. - IXLTable InsertTable(DataTable data); - - /// - /// Inserts the DataTable data elements as a table and returns it. - /// The new table will receive a generic name: Table# - /// - /// The table data. - /// - /// if set to true it will create an Excel table. - /// if set to false the table will be created in memory. - /// - IXLTable InsertTable(DataTable data, Boolean createTable); - - /// - /// Creates an Excel table from the given DataTable data elements. - /// - /// The table data. - /// Name of the table. - IXLTable InsertTable(DataTable data, String tableName); - - /// - /// Inserts the DataTable data elements as a table and returns it. - /// - /// The table data. - /// Name of the table. - /// - /// if set to true it will create an Excel table. - /// if set to false the table will be created in memory. - /// - IXLTable InsertTable(DataTable data, String tableName, Boolean createTable); - - - XLHyperlink Hyperlink { get; set; } - IXLWorksheet Worksheet { get; } - - IXLDataValidation DataValidation { get; } - IXLDataValidation NewDataValidation { get; } - IXLDataValidation SetDataValidation(); - - - IXLCells InsertCellsAbove(int numberOfRows); - IXLCells InsertCellsBelow(int numberOfRows); - IXLCells InsertCellsAfter(int numberOfColumns); - IXLCells InsertCellsBefore(int numberOfColumns); - - /// - /// Creates a named range out of this cell. - /// If the named range exists, it will add this range to that named range. - /// The default scope for the named range is Workbook. - /// - /// Name of the range. - IXLCell AddToNamed(String rangeName); - - /// - /// Creates a named range out of this cell. - /// If the named range exists, it will add this range to that named range. - /// Name of the range. - /// The scope for the named range. - /// - IXLCell AddToNamed(String rangeName, XLScope scope); - - /// - /// Creates a named range out of this cell. - /// If the named range exists, it will add this range to that named range. - /// Name of the range. - /// The scope for the named range. - /// The comments for the named range. - /// - IXLCell AddToNamed(String rangeName, XLScope scope, String comment); - - IXLCell CopyFrom(IXLCell otherCell); - IXLCell CopyFrom(String otherCell); - IXLCell CopyTo(IXLCell target); - IXLCell CopyTo(String target); - - String ValueCached { get; } - - IXLRichText RichText { get; } - Boolean HasRichText { get; } - IXLComment Comment { get; } - Boolean HasComment { get; } - - Boolean IsMerged(); - Boolean IsEmpty(); - Boolean IsEmpty(Boolean includeFormats); - - IXLCell CellAbove(); - IXLCell CellAbove(Int32 step); - IXLCell CellBelow(); - IXLCell CellBelow(Int32 step); - IXLCell CellLeft(); - IXLCell CellLeft(Int32 step); - IXLCell CellRight(); - IXLCell CellRight(Int32 step); - - IXLColumn WorksheetColumn(); - IXLRow WorksheetRow(); - - Boolean HasDataValidation { get; } - - IXLConditionalFormat AddConditionalFormat(); - - void Select(); - - Boolean Active { get; set; } - IXLCell SetActive(Boolean value = true); - - Boolean HasFormula { get; } - - IXLRangeAddress FormulaReference { get; set; } - } -} +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; + +namespace ClosedXML.Excel +{ + public enum XLCellValues { Text, Number, Boolean, DateTime, TimeSpan } + + public enum XLClearOptions + { + ContentsAndFormats, + Contents, + Formats + } + + public interface IXLCell + { + /// + /// Gets or sets the cell's value. To get a strongly typed object use the method GetValue<T>. + /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from this cell. + /// If the object is a range ClosedXML will copy the range starting from this cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. + /// + /// + /// The object containing the value(s) to set. + /// + Object Value { get; set; } + + /// Gets this cell's address, relative to the worksheet. + /// The cell's address. + IXLAddress Address { get; } + + /// + /// Gets or sets the type of this cell's data. + /// Changing the data type will cause ClosedXML to covert the current value to the new data type. + /// An exception will be thrown if the current value cannot be converted to the new data type. + /// + /// + /// The type of the cell's data. + /// + /// + XLCellValues DataType { get; set; } + + /// + /// Sets the type of this cell's data. + /// Changing the data type will cause ClosedXML to covert the current value to the new data type. + /// An exception will be thrown if the current value cannot be converted to the new data type. + /// + /// Type of the data. + /// + IXLCell SetDataType(XLCellValues dataType); + + /// + /// Sets the cell's value. + /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from this cell. + /// If the object is a range ClosedXML will copy the range starting from this cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. + /// + /// + /// The object containing the value(s) to set. + /// + IXLCell SetValue(T value); + + /// + /// Gets the cell's value converted to the T type. + /// ClosedXML will try to covert the current value to the T type. + /// An exception will be thrown if the current value cannot be converted to the T type. + /// + /// The return type. + /// + T GetValue(); + + /// + /// Gets the cell's value converted to a String. + /// + String GetString(); + + /// + /// Gets the cell's value formatted depending on the cell's data type and style. + /// + String GetFormattedString(); + + /// + /// Gets the cell's value converted to Double. + /// ClosedXML will try to covert the current value to Double. + /// An exception will be thrown if the current value cannot be converted to Double. + /// + Double GetDouble(); + + /// + /// Gets the cell's value converted to Boolean. + /// ClosedXML will try to covert the current value to Boolean. + /// An exception will be thrown if the current value cannot be converted to Boolean. + /// + Boolean GetBoolean(); + + /// + /// Gets the cell's value converted to DateTime. + /// ClosedXML will try to covert the current value to DateTime. + /// An exception will be thrown if the current value cannot be converted to DateTime. + /// + DateTime GetDateTime(); + + /// + /// Gets the cell's value converted to TimeSpan. + /// ClosedXML will try to covert the current value to TimeSpan. + /// An exception will be thrown if the current value cannot be converted to TimeSpan. + /// + TimeSpan GetTimeSpan(); + + XLHyperlink GetHyperlink(); + + Boolean TryGetValue(out T value); + + + + Boolean HasHyperlink { get; } + + /// + /// Clears the contents of this cell. + /// + /// Specify what you want to clear. + IXLCell Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + /// + /// Deletes the current cell and shifts the surrounding cells according to the shiftDeleteCells parameter. + /// + /// How to shift the surrounding cells. + void Delete(XLShiftDeletedCells shiftDeleteCells); + + /// + /// Gets or sets the cell's formula with A1 references. + /// + /// The formula with A1 references. + String FormulaA1 { get; set; } + + IXLCell SetFormulaA1(String formula); + + /// + /// Gets or sets the cell's formula with R1C1 references. + /// + /// The formula with R1C1 references. + String FormulaR1C1 { get; set; } + + IXLCell SetFormulaR1C1(String formula); + + /// + /// Returns this cell as an IXLRange. + /// + IXLRange AsRange(); + + + /// + /// Gets or sets the cell's style. + /// + IXLStyle Style { get; set; } + + /// + /// Gets or sets a value indicating whether this cell's text should be shared or not. + /// + /// + /// If false the cell's text will not be shared and stored as an inline value. + /// + Boolean ShareString { get; set; } + + /// + /// Inserts the IEnumerable data elements and returns the range it occupies. + /// + /// The IEnumerable data. + IXLRange InsertData(IEnumerable data); + + /// + /// Inserts the IEnumerable data elements as a table and returns it. + /// The new table will receive a generic name: Table# + /// + /// The table data. + IXLTable InsertTable(IEnumerable data); + + /// + /// Inserts the IEnumerable data elements as a table and returns it. + /// The new table will receive a generic name: Table# + /// + /// The table data. + /// + /// if set to true it will create an Excel table. + /// if set to false the table will be created in memory. + /// + IXLTable InsertTable(IEnumerable data, Boolean createTable); + + /// + /// Creates an Excel table from the given IEnumerable data elements. + /// + /// The table data. + /// Name of the table. + IXLTable InsertTable(IEnumerable data, String tableName); + + /// + /// Inserts the IEnumerable data elements as a table and returns it. + /// + /// The table data. + /// Name of the table. + /// + /// if set to true it will create an Excel table. + /// if set to false the table will be created in memory. + /// + IXLTable InsertTable(IEnumerable data, String tableName, Boolean createTable); + + + /// + /// Inserts the DataTable data elements as a table and returns it. + /// The new table will receive a generic name: Table# + /// + /// The table data. + IXLTable InsertTable(DataTable data); + + /// + /// Inserts the DataTable data elements as a table and returns it. + /// The new table will receive a generic name: Table# + /// + /// The table data. + /// + /// if set to true it will create an Excel table. + /// if set to false the table will be created in memory. + /// + IXLTable InsertTable(DataTable data, Boolean createTable); + + /// + /// Creates an Excel table from the given DataTable data elements. + /// + /// The table data. + /// Name of the table. + IXLTable InsertTable(DataTable data, String tableName); + + /// + /// Inserts the DataTable data elements as a table and returns it. + /// + /// The table data. + /// Name of the table. + /// + /// if set to true it will create an Excel table. + /// if set to false the table will be created in memory. + /// + IXLTable InsertTable(DataTable data, String tableName, Boolean createTable); + + + XLHyperlink Hyperlink { get; set; } + IXLWorksheet Worksheet { get; } + + IXLDataValidation DataValidation { get; } + IXLDataValidation NewDataValidation { get; } + IXLDataValidation SetDataValidation(); + + + IXLCells InsertCellsAbove(int numberOfRows); + IXLCells InsertCellsBelow(int numberOfRows); + IXLCells InsertCellsAfter(int numberOfColumns); + IXLCells InsertCellsBefore(int numberOfColumns); + + /// + /// Creates a named range out of this cell. + /// If the named range exists, it will add this range to that named range. + /// The default scope for the named range is Workbook. + /// + /// Name of the range. + IXLCell AddToNamed(String rangeName); + + /// + /// Creates a named range out of this cell. + /// If the named range exists, it will add this range to that named range. + /// Name of the range. + /// The scope for the named range. + /// + IXLCell AddToNamed(String rangeName, XLScope scope); + + /// + /// Creates a named range out of this cell. + /// If the named range exists, it will add this range to that named range. + /// Name of the range. + /// The scope for the named range. + /// The comments for the named range. + /// + IXLCell AddToNamed(String rangeName, XLScope scope, String comment); + + IXLCell CopyFrom(IXLCell otherCell); + IXLCell CopyFrom(String otherCell); + IXLCell CopyTo(IXLCell target); + IXLCell CopyTo(String target); + + String ValueCached { get; } + + IXLRichText RichText { get; } + Boolean HasRichText { get; } + IXLComment Comment { get; } + Boolean HasComment { get; } + + Boolean IsMerged(); + Boolean IsEmpty(); + Boolean IsEmpty(Boolean includeFormats); + + IXLCell CellAbove(); + IXLCell CellAbove(Int32 step); + IXLCell CellBelow(); + IXLCell CellBelow(Int32 step); + IXLCell CellLeft(); + IXLCell CellLeft(Int32 step); + IXLCell CellRight(); + IXLCell CellRight(Int32 step); + + IXLColumn WorksheetColumn(); + IXLRow WorksheetRow(); + + Boolean HasDataValidation { get; } + + IXLConditionalFormat AddConditionalFormat(); + + void Select(); + + Boolean Active { get; set; } + IXLCell SetActive(Boolean value = true); + + Boolean HasFormula { get; } + + IXLRangeAddress FormulaReference { get; set; } + } +} diff --git a/ClosedXML/Excel/Cells/IXLCells.cs b/ClosedXML/Excel/Cells/IXLCells.cs index d2eefe9..d17a1c0 100644 --- a/ClosedXML/Excel/Cells/IXLCells.cs +++ b/ClosedXML/Excel/Cells/IXLCells.cs @@ -1,60 +1,60 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLCells : IEnumerable - { - /// - /// Sets the cells' value. - /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. - /// If the object is a range ClosedXML will copy the range starting from each cell. - /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. - /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. - /// - /// - /// The object containing the value(s) to set. - /// - Object Value { set; } - - /// - /// Sets the type of the cells' data. - /// Changing the data type will cause ClosedXML to covert the current value to the new data type. - /// An exception will be thrown if the current value cannot be converted to the new data type. - /// - /// - /// The type of the cell's data. - /// - /// - XLCellValues DataType { set; } - - IXLCells SetDataType(XLCellValues dataType); - - /// - /// Clears the contents of these cells. - /// - /// Specify what you want to clear. - IXLCells Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - /// - /// Delete the comments of these cells. - /// - void DeleteComments(); - - /// - /// Sets the cells' formula with A1 references. - /// - /// The formula with A1 references. - String FormulaA1 { set; } - - /// - /// Sets the cells' formula with R1C1 references. - /// - /// The formula with R1C1 references. - String FormulaR1C1 { set; } - - IXLStyle Style { get; set; } - - void Select(); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLCells : IEnumerable + { + /// + /// Sets the cells' value. + /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. + /// If the object is a range ClosedXML will copy the range starting from each cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. + /// + /// + /// The object containing the value(s) to set. + /// + Object Value { set; } + + /// + /// Sets the type of the cells' data. + /// Changing the data type will cause ClosedXML to covert the current value to the new data type. + /// An exception will be thrown if the current value cannot be converted to the new data type. + /// + /// + /// The type of the cell's data. + /// + /// + XLCellValues DataType { set; } + + IXLCells SetDataType(XLCellValues dataType); + + /// + /// Clears the contents of these cells. + /// + /// Specify what you want to clear. + IXLCells Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + /// + /// Delete the comments of these cells. + /// + void DeleteComments(); + + /// + /// Sets the cells' formula with A1 references. + /// + /// The formula with A1 references. + String FormulaA1 { set; } + + /// + /// Sets the cells' formula with R1C1 references. + /// + /// The formula with R1C1 references. + String FormulaR1C1 { set; } + + IXLStyle Style { get; set; } + + void Select(); + } +} diff --git a/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/Excel/Cells/XLCell.cs index 73bceb3..a45a568 100644 --- a/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/Excel/Cells/XLCell.cs @@ -1,2627 +1,2627 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Data; -using System.Globalization; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; - -namespace ClosedXML.Excel -{ - using Attributes; - using FastMember; - - internal class XLCell : IXLCell, IXLStylized - { - public static readonly DateTime BaseDate = new DateTime(1899, 12, 30); - private static Dictionary _formatCodes; - - private static readonly Regex A1Regex = new Regex( - @"(?<=\W)(\$?[a-zA-Z]{1,3}\$?\d{1,7})(?=\W)" // A1 - + @"|(?<=\W)(\$?\d{1,7}:\$?\d{1,7})(?=\W)" // 1:1 - + @"|(?<=\W)(\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})(?=\W)", RegexOptions.Compiled); // A:A - - public static readonly Regex A1SimpleRegex = new Regex( - // @"(?<=\W)" // Start with non word - @"(?" // Start Group to pick - + @"(?" // Start Sheet Name, optional - + @"(" - + @"\'([^\[\]\*/\\\?:\']+|\'\')\'" - // Sheet name with special characters, surrounding apostrophes are required - + @"|" - + @"\'?\w+\'?" // Sheet name with letters and numbers, surrounding apostrophes are optional - + @")" - + @"!)?" // End Sheet Name, optional - + @"(?" // Start range - + @"\$?[a-zA-Z]{1,3}\$?\d{1,7}" // A1 Address 1 - + @"(?:\$?[a-zA-Z]{1,3}\$?\d{1,7})?" // A1 Address 2, optional - + @"|" - + @"(?\$?\d{1,7}:\$?\d{1,7})" // 1:1 - + @"|" - + @"(?\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})" // A:A - + @")" // End Range - + @")" // End Group to pick - //+ @"(?=\W)" // End with non word - , RegexOptions.Compiled); - - private static readonly Regex A1RowRegex = new Regex( - @"(\$?\d{1,7}:\$?\d{1,7})" // 1:1 - , RegexOptions.Compiled); - - private static readonly Regex A1ColumnRegex = new Regex( - @"(\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})" // A:A - , RegexOptions.Compiled); - - private static readonly Regex R1C1Regex = new Regex( - @"(?<=\W)([Rr](?:\[-?\d{0,7}\]|\d{0,7})?[Cc](?:\[-?\d{0,7}\]|\d{0,7})?)(?=\W)" // R1C1 - + @"|(?<=\W)([Rr]\[?-?\d{0,7}\]?:[Rr]\[?-?\d{0,7}\]?)(?=\W)" // R:R - + @"|(?<=\W)([Cc]\[?-?\d{0,5}\]?:[Cc]\[?-?\d{0,5}\]?)(?=\W)", RegexOptions.Compiled); // C:C - - private static readonly Regex utfPattern = new Regex(@"(?(T value) - { - FormulaA1 = String.Empty; - _richText = null; - var style = GetStyleForRead(); - if (value is String || value is char) - { - _cellValue = value.ToString(); - _dataType = XLCellValues.Text; - if (_cellValue.Contains(Environment.NewLine) && !GetStyleForRead().Alignment.WrapText) - Style.Alignment.WrapText = true; - } - else if (value is TimeSpan) - { - _cellValue = value.ToString(); - _dataType = XLCellValues.TimeSpan; - if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) - Style.NumberFormat.NumberFormatId = 46; - } - else if (value is DateTime) - { - _dataType = XLCellValues.DateTime; - var dtTest = (DateTime)Convert.ChangeType(value, typeof(DateTime)); - if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) - Style.NumberFormat.NumberFormatId = dtTest.Date == dtTest ? 14 : 22; - - _cellValue = dtTest.ToOADate().ToInvariantString(); - } - else if (value.GetType().IsNumber()) - { - if ((value is double || value is float) && (Double.IsNaN((Double)Convert.ChangeType(value, typeof(Double))) - || Double.IsInfinity((Double)Convert.ChangeType(value, typeof(Double))))) - { - _cellValue = value.ToString(); - _dataType = XLCellValues.Text; - } - else - { - _dataType = XLCellValues.Number; - _cellValue = ((Double)Convert.ChangeType(value, typeof(Double))).ToInvariantString(); - } - } - else if (value is Boolean) - { - _dataType = XLCellValues.Boolean; - _cellValue = (Boolean)Convert.ChangeType(value, typeof(Boolean)) ? "1" : "0"; - } - else - { - _cellValue = Convert.ToString(value); - _dataType = XLCellValues.Text; - } - - return this; - } - - public T GetValue() - { - T retVal; - if (TryGetValue(out retVal)) - return retVal; - - throw new Exception("Cannot convert cell value to " + typeof(T)); - } - - public string GetString() - { - return GetValue(); - } - - public double GetDouble() - { - return GetValue(); - } - - public bool GetBoolean() - { - return GetValue(); - } - - public DateTime GetDateTime() - { - return GetValue(); - } - - public TimeSpan GetTimeSpan() - { - return GetValue(); - } - - public string GetFormattedString() - { - String cValue; - if (FormulaA1.Length > 0) - { - try - { - cValue = GetString(); - } - catch - { - cValue = String.Empty; - } - } - else - { - cValue = _cellValue; - } - - if (_dataType == XLCellValues.Boolean) - return (cValue != "0").ToString(); - if (_dataType == XLCellValues.TimeSpan) - return cValue; - if (_dataType == XLCellValues.DateTime || IsDateFormat()) - { - double dTest; - if (Double.TryParse(cValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out dTest) - && dTest.IsValidOADateNumber()) - { - var format = GetFormat(); - return DateTime.FromOADate(dTest).ToString(format); - } - - return cValue; - } - - if (_dataType == XLCellValues.Number) - { - double dTest; - if (Double.TryParse(cValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out dTest)) - { - var format = GetFormat(); - return dTest.ToString(format); - } - - return cValue; - } - - return cValue; - } - - public object Value - { - get - { - var fA1 = FormulaA1; - if (!XLHelper.IsNullOrWhiteSpace(fA1)) - { - if (fA1[0] == '{') - fA1 = fA1.Substring(1, fA1.Length - 2); - - string sName; - string cAddress; - if (fA1.Contains('!')) - { - sName = fA1.Substring(0, fA1.IndexOf('!')); - if (sName[0] == '\'') - sName = sName.Substring(1, sName.Length - 2); - - cAddress = fA1.Substring(fA1.IndexOf('!') + 1); - } - else - { - sName = Worksheet.Name; - cAddress = fA1; - } - - if (_worksheet.Workbook.WorksheetsInternal.Any( - w => String.Compare(w.Name, sName, true) == 0) - && XLHelper.IsValidA1Address(cAddress) - ) - return _worksheet.Workbook.Worksheet(sName).Cell(cAddress).Value; - - var retVal = Worksheet.Evaluate(fA1); - var retValEnumerable = retVal as IEnumerable; - - if (retValEnumerable != null && !(retVal is String)) - foreach (var v in retValEnumerable) - return v; - - return retVal; - } - - var cellValue = HasRichText ? _richText.ToString() : _cellValue; - - if (_dataType == XLCellValues.Boolean) - return cellValue != "0"; - - if (_dataType == XLCellValues.DateTime) - { - Double d; - if (Double.TryParse(cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out d) - && d.IsValidOADateNumber()) - return DateTime.FromOADate(d); - } - - if (_dataType == XLCellValues.Number) - { - Double d; - if (double.TryParse(cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out d)) - return d; - } - - if (_dataType == XLCellValues.TimeSpan) - { - TimeSpan t; - if (TimeSpan.TryParse(cellValue, out t)) - return t; - } - - return cellValue; - } - - set - { - FormulaA1 = String.Empty; - - if (value as XLCells != null) throw new ArgumentException("Cannot assign IXLCells object to the cell value."); - - if (SetRangeRows(value)) return; - - if (SetRangeColumns(value)) return; - - if (SetEnumerable(value)) return; - - if (SetRange(value)) return; - - if (!SetRichText(value)) - SetValue(value); - - if (_cellValue.Length > 32767) throw new ArgumentException("Cells can only hold 32,767 characters."); - } - } - - public IXLTable InsertTable(IEnumerable data) - { - return InsertTable(data, null, true); - } - - public IXLTable InsertTable(IEnumerable data, bool createTable) - { - return InsertTable(data, null, createTable); - } - - public IXLTable InsertTable(IEnumerable data, string tableName) - { - return InsertTable(data, tableName, true); - } - - public IXLTable InsertTable(IEnumerable data, string tableName, bool createTable) - { - if (data != null && data.GetType() != typeof(String)) - { - var ro = Address.RowNumber + 1; - var fRo = Address.RowNumber; - var hasTitles = false; - var maxCo = 0; - var isDataTable = false; - var isDataReader = false; - var itemType = data.GetItemType(); - - if (!data.Any()) - { - if (itemType.IsPrimitive || itemType == typeof(String) || itemType == typeof(DateTime) || itemType.IsNumber()) - maxCo = Address.ColumnNumber + 1; - else - maxCo = Address.ColumnNumber + itemType.GetFields().Length + itemType.GetProperties().Length; - } - else if (itemType.IsPrimitive || itemType == typeof(String) || itemType == typeof(DateTime) || itemType.IsNumber()) - { - foreach (object o in data) - { - var co = Address.ColumnNumber; - - if (!hasTitles) - { - var fieldName = XLColumnAttribute.GetHeader(itemType); - if (XLHelper.IsNullOrWhiteSpace(fieldName)) - fieldName = itemType.Name; - - SetValue(fieldName, fRo, co); - hasTitles = true; - co = Address.ColumnNumber; - } - - SetValue(o, ro, co); - co++; - - if (co > maxCo) - maxCo = co; - - ro++; - } - } - else - { - const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance; - var memberCache = new Dictionary>(); - var accessorCache = new Dictionary(); - IEnumerable members = null; - TypeAccessor accessor = null; - bool isPlainObject = itemType == typeof(object); - - if (!isPlainObject) - { - members = itemType.GetFields(bindingFlags).Cast() - .Concat(itemType.GetProperties(bindingFlags)) - .Where(mi => !XLColumnAttribute.IgnoreMember(mi)) - .OrderBy(mi => XLColumnAttribute.GetOrder(mi)); - accessor = TypeAccessor.Create(itemType); - } - - foreach (T m in data) - { - if (isPlainObject) - { - // In this case data is just IEnumerable, which means we have to determine the runtime type of each element - // This is very inefficient and we prefer type of T to be a concrete class or struct - var type = m.GetType(); - if (!memberCache.ContainsKey(type)) - { - var _accessor = TypeAccessor.Create(type); - - var _members = type.GetFields(bindingFlags).Cast() - .Concat(type.GetProperties(bindingFlags)) - .Where(mi => !XLColumnAttribute.IgnoreMember(mi)) - .OrderBy(mi => XLColumnAttribute.GetOrder(mi)); - - memberCache.Add(type, _members); - accessorCache.Add(type, _accessor); - } - - members = memberCache[type]; - accessor = accessorCache[type]; - } - - var co = Address.ColumnNumber; - - if (itemType.IsArray) - { - foreach (var item in (m as Array)) - { - SetValue(item, ro, co); - co++; - } - } - else if (isDataTable || m is DataRow) - { - var row = m as DataRow; - if (!isDataTable) - isDataTable = true; - - if (!hasTitles) - { - foreach (var fieldName in from DataColumn column in row.Table.Columns - select XLHelper.IsNullOrWhiteSpace(column.Caption) - ? column.ColumnName - : column.Caption) - { - SetValue(fieldName, fRo, co); - co++; - } - - co = Address.ColumnNumber; - hasTitles = true; - } - - foreach (var item in row.ItemArray) - { - SetValue(item, ro, co); - co++; - } - } - else if (isDataReader || m is IDataRecord) - { - if (!isDataReader) - isDataReader = true; - - var record = m as IDataRecord; - - var fieldCount = record.FieldCount; - if (!hasTitles) - { - for (var i = 0; i < fieldCount; i++) - { - SetValue(record.GetName(i), fRo, co); - co++; - } - - co = Address.ColumnNumber; - hasTitles = true; - } - - for (var i = 0; i < fieldCount; i++) - { - SetValue(record[i], ro, co); - co++; - } - } - else - { - if (!hasTitles) - { - foreach (var mi in members) - { - if ((mi as IEnumerable) == null) - { - var fieldName = XLColumnAttribute.GetHeader(mi); - if (XLHelper.IsNullOrWhiteSpace(fieldName)) - fieldName = mi.Name; - - SetValue(fieldName, fRo, co); - } - - co++; - } - - co = Address.ColumnNumber; - hasTitles = true; - } - - foreach (var mi in members) - { - SetValue(accessor[m, mi.Name], ro, co); - co++; - } - } - - if (co > maxCo) - maxCo = co; - - ro++; - } - } - - ClearMerged(); - var range = _worksheet.Range( - Address.RowNumber, - Address.ColumnNumber, - ro - 1, - maxCo - 1); - - if (createTable) - return tableName == null ? range.CreateTable() : range.CreateTable(tableName); - return tableName == null ? range.AsTable() : range.AsTable(tableName); - } - - return null; - } - - public IXLTable InsertTable(DataTable data) - { - return InsertTable(data, null, true); - } - - public IXLTable InsertTable(DataTable data, bool createTable) - { - return InsertTable(data, null, createTable); - } - - public IXLTable InsertTable(DataTable data, string tableName) - { - return InsertTable(data, tableName, true); - } - - public IXLTable InsertTable(DataTable data, string tableName, bool createTable) - { - if (data == null) return null; - - if (data.Rows.Count > 0) return InsertTable(data.AsEnumerable(), tableName, createTable); - - var ro = Address.RowNumber; - var co = Address.ColumnNumber; - - foreach (DataColumn col in data.Columns) - { - SetValue(col.ColumnName, ro, co); - co++; - } - - ClearMerged(); - var range = _worksheet.Range( - Address.RowNumber, - Address.ColumnNumber, - ro, - co - 1); - - if (createTable) return tableName == null ? range.CreateTable() : range.CreateTable(tableName); - - return tableName == null ? range.AsTable() : range.AsTable(tableName); - } - - public IXLRange InsertData(IEnumerable data) - { - if (data != null && data.GetType() != typeof(String)) - { - var ro = Address.RowNumber; - var maxCo = 0; - var isDataTable = false; - var isDataReader = false; - - const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance; - var memberCache = new Dictionary>(); - var accessorCache = new Dictionary(); - IEnumerable members = null; - TypeAccessor accessor = null; - - foreach (var m in data) - { - var itemType = m.GetType(); - if (!memberCache.ContainsKey(itemType)) - { - var _accessor = TypeAccessor.Create(itemType); - - var _members = itemType.GetFields(bindingFlags).Cast() - .Concat(itemType.GetProperties(bindingFlags)) - .Where(mi => !XLColumnAttribute.IgnoreMember(mi)) - .OrderBy(mi => XLColumnAttribute.GetOrder(mi)); - - memberCache.Add(itemType, _members); - accessorCache.Add(itemType, _accessor); - } - - members = memberCache[itemType]; - accessor = accessorCache[itemType]; - - var co = Address.ColumnNumber; - - if (itemType.IsPrimitive || itemType == typeof(String) || itemType == typeof(DateTime) || itemType.IsNumber()) - { - SetValue(m, ro, co); - co++; - } - else if (itemType.IsArray) - { - // dynamic arr = m; - foreach (var item in (Array)m) - { - SetValue(item, ro, co); - co++; - } - } - else if (isDataTable || m is DataRow) - { - if (!isDataTable) - isDataTable = true; - - foreach (var item in (m as DataRow).ItemArray) - { - SetValue(item, ro, co); - co++; - } - } - else if (isDataReader || m is IDataRecord) - { - if (!isDataReader) - isDataReader = true; - - var record = m as IDataRecord; - - var fieldCount = record.FieldCount; - for (var i = 0; i < fieldCount; i++) - { - SetValue(record[i], ro, co); - co++; - } - } - else - { - foreach (var mi in members) - { - SetValue(accessor[m, mi.Name], ro, co); - co++; - } - } - - if (co > maxCo) - maxCo = co; - - ro++; - } - - ClearMerged(); - return _worksheet.Range( - Address.RowNumber, - Address.ColumnNumber, - ro - 1, - maxCo - 1); - } - - return null; - } - - public IXLStyle Style - { - get { return GetStyle(); } - - set { SetStyle(value); } - } - - public IXLCell SetDataType(XLCellValues dataType) - { - DataType = dataType; - return this; - } - - public XLCellValues DataType - { - get { return _dataType; } - set - { - if (_dataType == value) return; - - if (_richText != null) - { - _cellValue = _richText.ToString(); - _richText = null; - } - - if (_cellValue.Length > 0) - { - if (value == XLCellValues.Boolean) - { - bool bTest; - if (Boolean.TryParse(_cellValue, out bTest)) - _cellValue = bTest ? "1" : "0"; - else - _cellValue = _cellValue == "0" || String.IsNullOrEmpty(_cellValue) ? "0" : "1"; - } - else if (value == XLCellValues.DateTime) - { - DateTime dtTest; - double dblTest; - if (DateTime.TryParse(_cellValue, out dtTest)) - _cellValue = dtTest.ToOADate().ToInvariantString(); - else if (Double.TryParse(_cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out dblTest)) - _cellValue = dblTest.ToInvariantString(); - else - { - throw new ArgumentException( - string.Format( - "Cannot set data type to DateTime because '{0}' is not recognized as a date.", - _cellValue)); - } - var style = GetStyleForRead(); - if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) - Style.NumberFormat.NumberFormatId = _cellValue.Contains('.') ? 22 : 14; - } - else if (value == XLCellValues.TimeSpan) - { - TimeSpan tsTest; - if (TimeSpan.TryParse(_cellValue, out tsTest)) - { - _cellValue = tsTest.ToString(); - var style = GetStyleForRead(); - if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) - Style.NumberFormat.NumberFormatId = 46; - } - else - { - try - { - _cellValue = (DateTime.FromOADate(Double.Parse(_cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture)) - BaseDate).ToString(); - } - catch - { - throw new ArgumentException( - string.Format( - "Cannot set data type to TimeSpan because '{0}' is not recognized as a TimeSpan.", - _cellValue)); - } - } - } - else if (value == XLCellValues.Number) - { - double dTest; - if (Double.TryParse(_cellValue, XLHelper.NumberStyle, CultureInfo.InvariantCulture, out dTest)) - _cellValue = dTest.ToInvariantString(); - else - { - throw new ArgumentException( - string.Format( - "Cannot set data type to Number because '{0}' is not recognized as a number.", - _cellValue)); - } - } - else - { - if (_dataType == XLCellValues.Boolean) - _cellValue = (_cellValue != "0").ToString(); - else if (_dataType == XLCellValues.TimeSpan) - _cellValue = BaseDate.Add(GetTimeSpan()).ToOADate().ToInvariantString(); - } - } - - _dataType = value; - } - } - - public IXLCell Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - return Clear(clearOptions, false); - } - - internal IXLCell Clear(XLClearOptions clearOptions, bool calledFromRange) - { - //Note: We have to check if the cell is part of a merged range. If so we have to clear the whole range - //Checking if called from range to avoid stack overflow - if (IsMerged() && !calledFromRange) - { - using (var asRange = AsRange()) - { - var firstOrDefault = Worksheet.Internals.MergedRanges.FirstOrDefault(asRange.Intersects); - if (firstOrDefault != null) - firstOrDefault.Clear(clearOptions); - } - } - else - { - if (clearOptions == XLClearOptions.Contents || clearOptions == XLClearOptions.ContentsAndFormats) - { - Hyperlink = null; - _richText = null; - //_comment = null; - _cellValue = String.Empty; - FormulaA1 = String.Empty; - } - - if (clearOptions == XLClearOptions.Formats || clearOptions == XLClearOptions.ContentsAndFormats) - { - if (HasDataValidation) - DataValidation.Clear(); - - SetStyle(Worksheet.Style); - } - } - - return this; - } - - public void Delete(XLShiftDeletedCells shiftDeleteCells) - { - _worksheet.Range(Address, Address).Delete(shiftDeleteCells); - } - - public string FormulaA1 - { - get - { - if (XLHelper.IsNullOrWhiteSpace(_formulaA1)) - { - if (!XLHelper.IsNullOrWhiteSpace(_formulaR1C1)) - { - _formulaA1 = GetFormulaA1(_formulaR1C1); - return FormulaA1; - } - - return String.Empty; - } - - if (_formulaA1.Trim()[0] == '=') - return _formulaA1.Substring(1); - - if (_formulaA1.Trim().StartsWith("{=")) - return "{" + _formulaA1.Substring(2); - - return _formulaA1; - } - - set - { - _formulaA1 = XLHelper.IsNullOrWhiteSpace(value) ? null : value; - - _formulaR1C1 = null; - } - } - - public string FormulaR1C1 - { - get - { - if (XLHelper.IsNullOrWhiteSpace(_formulaR1C1)) - _formulaR1C1 = GetFormulaR1C1(FormulaA1); - - return _formulaR1C1; - } - - set - { - _formulaR1C1 = XLHelper.IsNullOrWhiteSpace(value) ? null : value; - } - } - - public bool ShareString { get; set; } - - public XLHyperlink Hyperlink - { - get - { - if (_hyperlink == null) - Hyperlink = new XLHyperlink(); - - return _hyperlink; - } - - set - { - if (_worksheet.Hyperlinks.Any(hl => Address.Equals(hl.Cell.Address))) - _worksheet.Hyperlinks.Delete(Address); - - _hyperlink = value; - - if (_hyperlink == null) return; - - _hyperlink.Worksheet = _worksheet; - _hyperlink.Cell = this; - - _worksheet.Hyperlinks.Add(_hyperlink); - - if (SettingHyperlink) return; - - if (GetStyleForRead().Font.FontColor.Equals(_worksheet.Style.Font.FontColor)) - Style.Font.FontColor = XLColor.FromTheme(XLThemeColor.Hyperlink); - - if (GetStyleForRead().Font.Underline == _worksheet.Style.Font.Underline) - Style.Font.Underline = XLFontUnderlineValues.Single; - } - } - - public IXLCells InsertCellsAbove(int numberOfRows) - { - return AsRange().InsertRowsAbove(numberOfRows).Cells(); - } - - public IXLCells InsertCellsBelow(int numberOfRows) - { - return AsRange().InsertRowsBelow(numberOfRows).Cells(); - } - - public IXLCells InsertCellsAfter(int numberOfColumns) - { - return AsRange().InsertColumnsAfter(numberOfColumns).Cells(); - } - - public IXLCells InsertCellsBefore(int numberOfColumns) - { - return AsRange().InsertColumnsBefore(numberOfColumns).Cells(); - } - - public IXLCell AddToNamed(string rangeName) - { - AsRange().AddToNamed(rangeName); - return this; - } - - public IXLCell AddToNamed(string rangeName, XLScope scope) - { - AsRange().AddToNamed(rangeName, scope); - return this; - } - - public IXLCell AddToNamed(string rangeName, XLScope scope, string comment) - { - AsRange().AddToNamed(rangeName, scope, comment); - return this; - } - - public string ValueCached { get; internal set; } - - public IXLRichText RichText - { - get - { - if (_richText == null) - { - var style = GetStyleForRead(); - _richText = _cellValue.Length == 0 - ? new XLRichText(style.Font) - : new XLRichText(GetFormattedString(), style.Font); - } - - return _richText; - } - } - - public bool HasRichText - { - get { return _richText != null; } - } - - IXLComment IXLCell.Comment - { - get { return Comment; } - } - - public bool HasComment - { - get { return _comment != null; } - } - - public Boolean IsMerged() - { - return Worksheet.Internals.MergedRanges.Any(r => r.Contains(this)); - } - - public Boolean IsEmpty() - { - return IsEmpty(false); - } - - public Boolean IsEmpty(Boolean includeFormats) - { - if (InnerText.Length > 0) - return false; - - if (includeFormats) - { - if (!Style.Equals(Worksheet.Style) || IsMerged() || HasComment || HasDataValidation) - return false; - - if (_style == null) - { - XLRow row; - if (Worksheet.Internals.RowsCollection.TryGetValue(Address.RowNumber, out row) && !row.Style.Equals(Worksheet.Style)) - return false; - - XLColumn column; - if (Worksheet.Internals.ColumnsCollection.TryGetValue(Address.ColumnNumber, out column) && !column.Style.Equals(Worksheet.Style)) - return false; - } - - if (Worksheet.ConditionalFormats.Any(cf => cf.Range.Contains(this))) - return false; - } - return true; - } - - public IXLColumn WorksheetColumn() - { - return Worksheet.Column(Address.ColumnNumber); - } - - public IXLRow WorksheetRow() - { - return Worksheet.Row(Address.RowNumber); - } - - public IXLCell CopyTo(IXLCell target) - { - (target as XLCell).CopyFrom(this, true); - return target; - } - - public IXLCell CopyTo(String target) - { - return CopyTo(GetTargetCell(target, Worksheet)); - } - - public IXLCell CopyFrom(IXLCell otherCell) - { - return CopyFrom(otherCell as XLCell, true); - } - - public IXLCell CopyFrom(String otherCell) - { - return CopyFrom(GetTargetCell(otherCell, Worksheet)); - } - - public IXLCell SetFormulaA1(String formula) - { - FormulaA1 = formula; - return this; - } - - public IXLCell SetFormulaR1C1(String formula) - { - FormulaR1C1 = formula; - return this; - } - - public Boolean HasDataValidation - { - get - { - using (var asRange = AsRange()) - return Worksheet.DataValidations.Any(dv => dv.Ranges.Contains(asRange) && dv.IsDirty()); - } - } - - public IXLDataValidation SetDataValidation() - { - return DataValidation; - } - - public void Select() - { - AsRange().Select(); - } - - public IXLConditionalFormat AddConditionalFormat() - { - using (var r = AsRange()) - return r.AddConditionalFormat(); - } - - public Boolean Active - { - get { return Worksheet.ActiveCell == this; } - set - { - if (value) - Worksheet.ActiveCell = this; - else if (Active) - Worksheet.ActiveCell = null; - } - } - - public IXLCell SetActive(Boolean value = true) - { - Active = value; - return this; - } - - public Boolean HasHyperlink - { - get { return _hyperlink != null; } - } - - public XLHyperlink GetHyperlink() - { - if (HasHyperlink) - return Hyperlink; - - return Value as XLHyperlink; - } - - public Boolean TryGetValue(out T value) - { - var currValue = Value; - - if (currValue == null) - { - value = default(T); - return true; - } - - bool b; - if (TryGetTimeSpanValue(out value, currValue, out b)) return b; - - if (TryGetRichStringValue(out value)) return true; - - if (TryGetStringValue(out value, currValue)) return true; - - var strValue = currValue.ToString(); - if (typeof(T) == typeof(bool)) return TryGetBasicValue(out value, strValue, bool.TryParse); - if (typeof(T) == typeof(sbyte)) return TryGetBasicValue(out value, strValue, sbyte.TryParse); - if (typeof(T) == typeof(byte)) return TryGetBasicValue(out value, strValue, byte.TryParse); - if (typeof(T) == typeof(short)) return TryGetBasicValue(out value, strValue, short.TryParse); - if (typeof(T) == typeof(ushort)) return TryGetBasicValue(out value, strValue, ushort.TryParse); - if (typeof(T) == typeof(int)) return TryGetBasicValue(out value, strValue, int.TryParse); - if (typeof(T) == typeof(uint)) return TryGetBasicValue(out value, strValue, uint.TryParse); - if (typeof(T) == typeof(long)) return TryGetBasicValue(out value, strValue, long.TryParse); - if (typeof(T) == typeof(ulong)) return TryGetBasicValue(out value, strValue, ulong.TryParse); - if (typeof(T) == typeof(float)) return TryGetBasicValue(out value, strValue, float.TryParse); - if (typeof(T) == typeof(double)) return TryGetBasicValue(out value, strValue, double.TryParse); - if (typeof(T) == typeof(decimal)) return TryGetBasicValue(out value, strValue, decimal.TryParse); - - if (typeof(T) == typeof(XLHyperlink)) - { - XLHyperlink tmp = GetHyperlink(); - if (tmp != null) - { - value = (T)Convert.ChangeType(tmp, typeof(T)); - return true; - } - - value = default(T); - return false; - } - - try - { - value = (T)Convert.ChangeType(currValue, typeof(T)); - return true; - } - catch - { - value = default(T); - return false; - } - } - - private static bool TryGetTimeSpanValue(out T value, object currValue, out bool b) - { - if (typeof(T) == typeof(TimeSpan)) - { - TimeSpan tmp; - Boolean retVal = true; - - if (currValue is TimeSpan) - { - tmp = (TimeSpan)currValue; - } - else if (!TimeSpan.TryParse(currValue.ToString(), out tmp)) - { - retVal = false; - } - - value = (T)Convert.ChangeType(tmp, typeof(T)); - { - b = retVal; - return true; - } - } - value = default(T); - b = false; - return false; - } - - private bool TryGetRichStringValue(out T value) - { - if (typeof(T) == typeof(IXLRichText)) - { - value = (T)RichText; - return true; - } - value = default(T); - return false; - } - - private static bool TryGetStringValue(out T value, object currValue) - { - if (typeof(T) == typeof(String)) - { - var valToUse = currValue.ToString(); - if (!utfPattern.Match(valToUse).Success) - { - value = (T)Convert.ChangeType(valToUse, typeof(T)); - return true; - } - - var sb = new StringBuilder(); - var lastIndex = 0; - foreach (Match match in utfPattern.Matches(valToUse)) - { - var matchString = match.Value; - var matchIndex = match.Index; - sb.Append(valToUse.Substring(lastIndex, matchIndex - lastIndex)); - - sb.Append((char)int.Parse(match.Groups[1].Value, NumberStyles.AllowHexSpecifier)); - - lastIndex = matchIndex + matchString.Length; - } - if (lastIndex < valToUse.Length) - sb.Append(valToUse.Substring(lastIndex)); - - value = (T)Convert.ChangeType(sb.ToString(), typeof(T)); - return true; - } - value = default(T); - return false; - } - - private static Boolean TryGetBooleanValue(out T value, object currValue) - { - if (typeof(T) == typeof(Boolean)) - { - Boolean tmp; - if (Boolean.TryParse(currValue.ToString(), out tmp)) - { - value = (T)Convert.ChangeType(tmp, typeof(T)); - { - return true; - } - } - } - value = default(T); - return false; - } - - private delegate Boolean Func(String input, out T output); - - private static Boolean TryGetBasicValue(out T value, String currValue, Func func) - { - U tmp; - if (func(currValue, out tmp)) - { - value = (T)Convert.ChangeType(tmp, typeof(T)); - { - return true; - } - } - value = default(T); - return false; - } - - #endregion IXLCell Members - - #region IXLStylized Members - - public Boolean StyleChanged { get; set; } - - public IEnumerable Styles - { - get - { - UpdatingStyle = true; - yield return Style; - UpdatingStyle = false; - } - } - - public bool UpdatingStyle { get; set; } - - public IXLStyle InnerStyle - { - get { return Style; } - set { Style = value; } - } - - public IXLRanges RangesUsed - { - get - { - var retVal = new XLRanges { AsRange() }; - return retVal; - } - } - - #endregion IXLStylized Members - - private bool SetRangeColumns(object value) - { - var columns = value as XLRangeColumns; - if (columns == null) - return SetColumns(value); - - var cell = this; - foreach (var column in columns) - { - cell.SetRange(column); - cell = cell.CellRight(); - } - return true; - } - - private bool SetColumns(object value) - { - var columns = value as XLColumns; - if (columns == null) - return false; - - var cell = this; - foreach (var column in columns) - { - cell.SetRange(column); - cell = cell.CellRight(); - } - return true; - } - - private bool SetRangeRows(object value) - { - var rows = value as XLRangeRows; - if (rows == null) - return SetRows(value); - - var cell = this; - foreach (var row in rows) - { - cell.SetRange(row); - cell = cell.CellBelow(); - } - return true; - } - - private bool SetRows(object value) - { - var rows = value as XLRows; - if (rows == null) - return false; - - var cell = this; - foreach (var row in rows) - { - cell.SetRange(row); - cell = cell.CellBelow(); - } - return true; - } - - public XLRange AsRange() - { - return _worksheet.Range(Address, Address); - } - - private IXLStyle GetStyle() - { - if (_style != null) - return _style; - - return _style = new XLStyle(this, Worksheet.Workbook.GetStyleById(_styleCacheId)); - } - - public void DeleteComment() - { - _comment = null; - } - - private bool IsDateFormat() - { - var style = GetStyleForRead(); - return _dataType == XLCellValues.Number - && XLHelper.IsNullOrWhiteSpace(style.NumberFormat.Format) - && ((style.NumberFormat.NumberFormatId >= 14 - && style.NumberFormat.NumberFormatId <= 22) - || (style.NumberFormat.NumberFormatId >= 45 - && style.NumberFormat.NumberFormatId <= 47)); - } - - private string GetFormat() - { - var format = String.Empty; - var style = GetStyleForRead(); - if (XLHelper.IsNullOrWhiteSpace(style.NumberFormat.Format)) - { - var formatCodes = GetFormatCodes(); - if (formatCodes.ContainsKey(style.NumberFormat.NumberFormatId)) - format = formatCodes[style.NumberFormat.NumberFormatId]; - } - else - format = style.NumberFormat.Format; - return format; - } - - private bool SetRichText(object value) - { - var asRichString = value as XLRichText; - - if (asRichString == null) - return false; - - _richText = asRichString; - _dataType = XLCellValues.Text; - return true; - } - - private Boolean SetRange(Object rangeObject) - { - var asRange = rangeObject as XLRangeBase; - if (asRange == null) - { - var tmp = rangeObject as XLCell; - if (tmp != null) - asRange = tmp.AsRange(); - } - - if (asRange != null) - { - if (!(asRange is XLRow || asRange is XLColumn)) - { - var maxRows = asRange.RowCount(); - var maxColumns = asRange.ColumnCount(); - Worksheet.Range(Address.RowNumber, Address.ColumnNumber, maxRows, maxColumns).Clear(); - } - - var minRow = asRange.RangeAddress.FirstAddress.RowNumber; - var minColumn = asRange.RangeAddress.FirstAddress.ColumnNumber; - foreach (var sourceCell in asRange.CellsUsed(true)) - { - Worksheet.Cell( - Address.RowNumber + sourceCell.Address.RowNumber - minRow, - Address.ColumnNumber + sourceCell.Address.ColumnNumber - minColumn - ).CopyFrom(sourceCell, true); - } - - var rangesToMerge = (from mergedRange in (asRange.Worksheet).Internals.MergedRanges - where asRange.Contains(mergedRange) - let initialRo = - Address.RowNumber + - (mergedRange.RangeAddress.FirstAddress.RowNumber - - asRange.RangeAddress.FirstAddress.RowNumber) - let initialCo = - Address.ColumnNumber + - (mergedRange.RangeAddress.FirstAddress.ColumnNumber - - asRange.RangeAddress.FirstAddress.ColumnNumber) - select - Worksheet.Range(initialRo, initialCo, initialRo + mergedRange.RowCount() - 1, - initialCo + mergedRange.ColumnCount() - 1)).Cast(). - ToList(); - rangesToMerge.ForEach(r => r.Merge()); - - return true; - } - - return false; - } - - private bool SetEnumerable(object collectionObject) - { - // IXLRichText implements IEnumerable, but we don't want to handle this here. - if ((collectionObject as IXLRichText) != null) return false; - - var asEnumerable = collectionObject as IEnumerable; - return InsertData(asEnumerable) != null; - } - - private void ClearMerged() - { - List mergeToDelete; - using (var asRange = AsRange()) - mergeToDelete = Worksheet.Internals.MergedRanges.Where(merge => merge.Intersects(asRange)).ToList(); - - mergeToDelete.ForEach(m => Worksheet.Internals.MergedRanges.Remove(m)); - } - - private void SetValue(T value, int ro, int co) where T : class - { - if (value == null) - _worksheet.Cell(ro, co).SetValue(String.Empty); - else - { - if (value is IConvertible) - _worksheet.Cell(ro, co).SetValue((T)Convert.ChangeType(value, typeof(T))); - else - _worksheet.Cell(ro, co).SetValue(value); - } - } - - private void SetValue(object value) - { - FormulaA1 = String.Empty; - string val; - if (value == null) - val = string.Empty; - else if (value is DateTime) - val = ((DateTime)value).ToString("o"); - else if (value.IsNumber()) - val = Convert.ToDecimal(value).ToInvariantString(); - else - val = value.ToString(); - _richText = null; - if (val.Length == 0) - _dataType = XLCellValues.Text; - else - { - double dTest; - DateTime dtTest; - bool bTest; - TimeSpan tsTest; - var style = GetStyleForRead(); - if (style.NumberFormat.Format == "@") - { - _dataType = XLCellValues.Text; - if (val.Contains(Environment.NewLine) && !style.Alignment.WrapText) - Style.Alignment.WrapText = true; - } - else if (val[0] == '\'') - { - val = val.Substring(1, val.Length - 1); - _dataType = XLCellValues.Text; - if (val.Contains(Environment.NewLine) && !style.Alignment.WrapText) - Style.Alignment.WrapText = true; - } - else if (value is TimeSpan || (!Double.TryParse(val, XLHelper.NumberStyle, XLHelper.ParseCulture, out dTest) && TimeSpan.TryParse(val, out tsTest))) - { - if (!(value is TimeSpan) && TimeSpan.TryParse(val, out tsTest)) - val = tsTest.ToString(); - - _dataType = XLCellValues.TimeSpan; - if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) - Style.NumberFormat.NumberFormatId = 46; - } - else if (val.Trim() != "NaN" && Double.TryParse(val, XLHelper.NumberStyle, XLHelper.ParseCulture, out dTest)) - _dataType = XLCellValues.Number; - else if (DateTime.TryParse(val, out dtTest) && dtTest >= BaseDate) - { - _dataType = XLCellValues.DateTime; - - if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) - Style.NumberFormat.NumberFormatId = dtTest.Date == dtTest ? 14 : 22; - { - DateTime forMillis; - if (value is DateTime && (forMillis = (DateTime)value).Millisecond > 0) - { - val = forMillis.ToOADate().ToInvariantString(); - } - else - { - val = dtTest.ToOADate().ToInvariantString(); - } - } - } - else if (Boolean.TryParse(val, out bTest)) - { - _dataType = XLCellValues.Boolean; - val = bTest ? "1" : "0"; - } - else - { - _dataType = XLCellValues.Text; - if (val.Contains(Environment.NewLine) && !style.Alignment.WrapText) - Style.Alignment.WrapText = true; - } - } - if (val.Length > 32767) throw new ArgumentException("Cells can only hold 32,767 characters."); - _cellValue = val; - } - - private static Dictionary GetFormatCodes() - { - if (_formatCodes == null) - { - var fCodes = new Dictionary - { - {0, string.Empty}, - {1, "0"}, - {2, "0.00"}, - {3, "#,##0"}, - {4, "#,##0.00"}, - {7, "$#,##0.00_);($#,##0.00)"}, - {9, "0%"}, - {10, "0.00%"}, - {11, "0.00E+00"}, - {12, "# ?/?"}, - {13, "# ??/??"}, - {14, "M/d/yyyy"}, - {15, "d-MMM-yy"}, - {16, "d-MMM"}, - {17, "MMM-yy"}, - {18, "h:mm tt"}, - {19, "h:mm:ss tt"}, - {20, "H:mm"}, - {21, "H:mm:ss"}, - {22, "M/d/yyyy H:mm"}, - {37, "#,##0 ;(#,##0)"}, - {38, "#,##0 ;[Red](#,##0)"}, - {39, "#,##0.00;(#,##0.00)"}, - {40, "#,##0.00;[Red](#,##0.00)"}, - {45, "mm:ss"}, - {46, "[h]:mm:ss"}, - {47, "mmss.0"}, - {48, "##0.0E+0"}, - {49, "@"} - }; - _formatCodes = fCodes; - } - - return _formatCodes; - } - - private string GetFormulaR1C1(string value) - { - return GetFormula(value, FormulaConversionType.A1ToR1C1, 0, 0); - } - - private string GetFormulaA1(string value) - { - return GetFormula(value, FormulaConversionType.R1C1ToA1, 0, 0); - } - - private string GetFormula(string strValue, FormulaConversionType conversionType, int rowsToShift, - int columnsToShift) - { - if (XLHelper.IsNullOrWhiteSpace(strValue)) - return String.Empty; - - var value = ">" + strValue + "<"; - - var regex = conversionType == FormulaConversionType.A1ToR1C1 ? A1Regex : R1C1Regex; - - var sb = new StringBuilder(); - var lastIndex = 0; - - foreach (var match in regex.Matches(value).Cast()) - { - var matchString = match.Value; - var matchIndex = match.Index; - if (value.Substring(0, matchIndex).CharCount('"') % 2 == 0 - && value.Substring(0, matchIndex).CharCount('\'') % 2 == 0) - { - // Check if the match is in between quotes - sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); - sb.Append(conversionType == FormulaConversionType.A1ToR1C1 - ? GetR1C1Address(matchString, rowsToShift, columnsToShift) - : GetA1Address(matchString, rowsToShift, columnsToShift)); - } - else - sb.Append(value.Substring(lastIndex, matchIndex - lastIndex + matchString.Length)); - lastIndex = matchIndex + matchString.Length; - } - - if (lastIndex < value.Length) - sb.Append(value.Substring(lastIndex)); - - var retVal = sb.ToString(); - return retVal.Substring(1, retVal.Length - 2); - } - - private string GetA1Address(string r1C1Address, int rowsToShift, int columnsToShift) - { - var addressToUse = r1C1Address.ToUpper(); - - if (addressToUse.Contains(':')) - { - var parts = addressToUse.Split(':'); - var p1 = parts[0]; - var p2 = parts[1]; - string leftPart; - string rightPart; - if (p1.StartsWith("R")) - { - leftPart = GetA1Row(p1, rowsToShift); - rightPart = GetA1Row(p2, rowsToShift); - } - else - { - leftPart = GetA1Column(p1, columnsToShift); - rightPart = GetA1Column(p2, columnsToShift); - } - - return leftPart + ":" + rightPart; - } - - var rowPart = addressToUse.Substring(0, addressToUse.IndexOf("C")); - var rowToReturn = GetA1Row(rowPart, rowsToShift); - - var columnPart = addressToUse.Substring(addressToUse.IndexOf("C")); - var columnToReturn = GetA1Column(columnPart, columnsToShift); - - var retAddress = columnToReturn + rowToReturn; - return retAddress; - } - - private string GetA1Column(string columnPart, int columnsToShift) - { - string columnToReturn; - if (columnPart == "C") - columnToReturn = XLHelper.GetColumnLetterFromNumber(Address.ColumnNumber + columnsToShift); - else - { - var bIndex = columnPart.IndexOf("["); - var mIndex = columnPart.IndexOf("-"); - if (bIndex >= 0) - { - columnToReturn = XLHelper.GetColumnLetterFromNumber( - Address.ColumnNumber + - Int32.Parse(columnPart.Substring(bIndex + 1, columnPart.Length - bIndex - 2)) + columnsToShift - ); - } - else if (mIndex >= 0) - { - columnToReturn = XLHelper.GetColumnLetterFromNumber( - Address.ColumnNumber + Int32.Parse(columnPart.Substring(mIndex)) + columnsToShift - ); - } - else - { - columnToReturn = "$" + - XLHelper.GetColumnLetterFromNumber(Int32.Parse(columnPart.Substring(1)) + - columnsToShift); - } - } - - return columnToReturn; - } - - private string GetA1Row(string rowPart, int rowsToShift) - { - string rowToReturn; - if (rowPart == "R") - rowToReturn = (Address.RowNumber + rowsToShift).ToString(); - else - { - var bIndex = rowPart.IndexOf("["); - if (bIndex >= 0) - { - rowToReturn = - (Address.RowNumber + Int32.Parse(rowPart.Substring(bIndex + 1, rowPart.Length - bIndex - 2)) + - rowsToShift).ToString(); - } - else - rowToReturn = "$" + (Int32.Parse(rowPart.Substring(1)) + rowsToShift); - } - - return rowToReturn; - } - - private string GetR1C1Address(string a1Address, int rowsToShift, int columnsToShift) - { - if (a1Address.Contains(':')) - { - var parts = a1Address.Split(':'); - var p1 = parts[0]; - var p2 = parts[1]; - int row1; - if (Int32.TryParse(p1.Replace("$", string.Empty), out row1)) - { - var row2 = Int32.Parse(p2.Replace("$", string.Empty)); - var leftPart = GetR1C1Row(row1, p1.Contains('$'), rowsToShift); - var rightPart = GetR1C1Row(row2, p2.Contains('$'), rowsToShift); - return leftPart + ":" + rightPart; - } - else - { - var column1 = XLHelper.GetColumnNumberFromLetter(p1.Replace("$", string.Empty)); - var column2 = XLHelper.GetColumnNumberFromLetter(p2.Replace("$", string.Empty)); - var leftPart = GetR1C1Column(column1, p1.Contains('$'), columnsToShift); - var rightPart = GetR1C1Column(column2, p2.Contains('$'), columnsToShift); - return leftPart + ":" + rightPart; - } - } - - var address = XLAddress.Create(_worksheet, a1Address); - - var rowPart = GetR1C1Row(address.RowNumber, address.FixedRow, rowsToShift); - var columnPart = GetR1C1Column(address.ColumnNumber, address.FixedColumn, columnsToShift); - - return rowPart + columnPart; - } - - private string GetR1C1Row(int rowNumber, bool fixedRow, int rowsToShift) - { - string rowPart; - rowNumber += rowsToShift; - var rowDiff = rowNumber - Address.RowNumber; - if (rowDiff != 0 || fixedRow) - rowPart = fixedRow ? String.Format("R{0}", rowNumber) : String.Format("R[{0}]", rowDiff); - else - rowPart = "R"; - - return rowPart; - } - - private string GetR1C1Column(int columnNumber, bool fixedColumn, int columnsToShift) - { - string columnPart; - columnNumber += columnsToShift; - var columnDiff = columnNumber - Address.ColumnNumber; - if (columnDiff != 0 || fixedColumn) - columnPart = fixedColumn ? String.Format("C{0}", columnNumber) : String.Format("C[{0}]", columnDiff); - else - columnPart = "C"; - - return columnPart; - } - - internal void CopyValuesFrom(XLCell source) - { - _cellValue = source._cellValue; - _dataType = source._dataType; - FormulaR1C1 = source.FormulaR1C1; - _richText = source._richText == null ? null : new XLRichText(source._richText, source.Style.Font); - _comment = source._comment == null ? null : new XLComment(this, source._comment, source.Style.Font); - - if (source._hyperlink != null) - { - SettingHyperlink = true; - Hyperlink = new XLHyperlink(source.Hyperlink); - SettingHyperlink = false; - } - } - - private IXLCell GetTargetCell(String target, XLWorksheet defaultWorksheet) - { - var pair = target.Split('!'); - if (pair.Length == 1) - return defaultWorksheet.Cell(target); - - var wsName = pair[0]; - if (wsName.StartsWith("'")) - wsName = wsName.Substring(1, wsName.Length - 2); - return defaultWorksheet.Workbook.Worksheet(wsName).Cell(pair[1]); - } - - public IXLCell CopyFrom(IXLCell otherCell, Boolean copyDataValidations) - { - var source = otherCell as XLCell; // To expose GetFormulaR1C1, etc - //var source = castedOtherCell; - CopyValuesFrom(source); - - SetStyle(source._style ?? source.Worksheet.Workbook.GetStyleById(source._styleCacheId)); - - var conditionalFormats = source.Worksheet.ConditionalFormats.Where(c => c.Range.Contains(source)).ToList(); - foreach (var cf in conditionalFormats) - { - var c = new XLConditionalFormat(cf as XLConditionalFormat) { Range = AsRange() }; - var oldValues = c.Values.Values.ToList(); - c.Values.Clear(); - foreach (var v in oldValues) - { - var f = v.Value; - if (v.IsFormula) - { - var r1c1 = source.GetFormulaR1C1(f); - f = GetFormulaA1(r1c1); - } - - c.Values.Add(new XLFormula { _value = f, IsFormula = v.IsFormula }); - } - - _worksheet.ConditionalFormats.Add(c); - } - - if (copyDataValidations) - { - var eventTracking = Worksheet.EventTrackingEnabled; - Worksheet.EventTrackingEnabled = false; - if (source.HasDataValidation) - CopyDataValidation(source, source.DataValidation); - else if (HasDataValidation) - { - using (var asRange = AsRange()) - Worksheet.DataValidations.Delete(asRange); - } - Worksheet.EventTrackingEnabled = eventTracking; - } - - return this; - } - - internal void CopyDataValidation(XLCell otherCell, XLDataValidation otherDv) - { - var thisDv = DataValidation; - thisDv.CopyFrom(otherDv); - thisDv.Value = GetFormulaA1(otherCell.GetFormulaR1C1(otherDv.Value)); - thisDv.MinValue = GetFormulaA1(otherCell.GetFormulaR1C1(otherDv.MinValue)); - thisDv.MaxValue = GetFormulaA1(otherCell.GetFormulaR1C1(otherDv.MaxValue)); - } - - internal void ShiftFormulaRows(XLRange shiftedRange, int rowsShifted) - { - _formulaA1 = ShiftFormulaRows(FormulaA1, Worksheet, shiftedRange, rowsShifted); - } - - internal static String ShiftFormulaRows(String formulaA1, XLWorksheet worksheetInAction, XLRange shiftedRange, - int rowsShifted) - { - if (XLHelper.IsNullOrWhiteSpace(formulaA1)) return String.Empty; - - var value = formulaA1; // ">" + formulaA1 + "<"; - - var regex = A1SimpleRegex; - - var sb = new StringBuilder(); - var lastIndex = 0; - - var shiftedWsName = shiftedRange.Worksheet.Name; - foreach (var match in regex.Matches(value).Cast()) - { - var matchString = match.Value; - var matchIndex = match.Index; - if (value.Substring(0, matchIndex).CharCount('"') % 2 == 0) - { - // Check that the match is not between quotes - sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); - string sheetName; - var useSheetName = false; - if (matchString.Contains('!')) - { - sheetName = matchString.Substring(0, matchString.IndexOf('!')); - if (sheetName[0] == '\'') - sheetName = sheetName.Substring(1, sheetName.Length - 2); - useSheetName = true; - } - else - sheetName = worksheetInAction.Name; - - if (String.Compare(sheetName, shiftedWsName, true) == 0) - { - var rangeAddress = matchString.Substring(matchString.IndexOf('!') + 1); - if (!A1ColumnRegex.IsMatch(rangeAddress)) - { - var matchRange = worksheetInAction.Workbook.Worksheet(sheetName).Range(rangeAddress); - if (shiftedRange.RangeAddress.FirstAddress.RowNumber <= matchRange.RangeAddress.LastAddress.RowNumber - && shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= matchRange.RangeAddress.FirstAddress.ColumnNumber - && shiftedRange.RangeAddress.LastAddress.ColumnNumber >= matchRange.RangeAddress.LastAddress.ColumnNumber) - { - if (A1RowRegex.IsMatch(rangeAddress)) - { - var rows = rangeAddress.Split(':'); - var row1String = rows[0]; - var row2String = rows[1]; - string row1; - if (row1String[0] == '$') - { - row1 = "$" + - (Int32.Parse(row1String.Substring(1)) + rowsShifted).ToInvariantString(); - } - else - row1 = (Int32.Parse(row1String) + rowsShifted).ToInvariantString(); - - string row2; - if (row2String[0] == '$') - { - row2 = "$" + - (Int32.Parse(row2String.Substring(1)) + rowsShifted).ToInvariantString(); - } - else - row2 = (Int32.Parse(row2String) + rowsShifted).ToInvariantString(); - - sb.Append(useSheetName - ? String.Format("'{0}'!{1}:{2}", sheetName, row1, row2) - : String.Format("{0}:{1}", row1, row2)); - } - else if (shiftedRange.RangeAddress.FirstAddress.RowNumber <= - matchRange.RangeAddress.FirstAddress.RowNumber) - { - if (rangeAddress.Contains(':')) - { - if (useSheetName) - { - sb.Append(String.Format("'{0}'!{1}:{2}", - sheetName, - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - FirstAddress.RowNumber + - rowsShifted, - matchRange.RangeAddress. - FirstAddress.ColumnLetter, - matchRange.RangeAddress. - FirstAddress.FixedRow, - matchRange.RangeAddress. - FirstAddress.FixedColumn), - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - LastAddress.RowNumber + - rowsShifted, - matchRange.RangeAddress. - LastAddress.ColumnLetter, - matchRange.RangeAddress. - LastAddress.FixedRow, - matchRange.RangeAddress. - LastAddress.FixedColumn))); - } - else - { - sb.Append(String.Format("{0}:{1}", - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - FirstAddress.RowNumber + - rowsShifted, - matchRange.RangeAddress. - FirstAddress.ColumnLetter, - matchRange.RangeAddress. - FirstAddress.FixedRow, - matchRange.RangeAddress. - FirstAddress.FixedColumn), - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - LastAddress.RowNumber + - rowsShifted, - matchRange.RangeAddress. - LastAddress.ColumnLetter, - matchRange.RangeAddress. - LastAddress.FixedRow, - matchRange.RangeAddress. - LastAddress.FixedColumn))); - } - } - else - { - if (useSheetName) - { - sb.Append(String.Format("'{0}'!{1}", - sheetName, - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - FirstAddress.RowNumber + - rowsShifted, - matchRange.RangeAddress. - FirstAddress.ColumnLetter, - matchRange.RangeAddress. - FirstAddress.FixedRow, - matchRange.RangeAddress. - FirstAddress.FixedColumn))); - } - else - { - sb.Append(String.Format("{0}", - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - FirstAddress.RowNumber + - rowsShifted, - matchRange.RangeAddress. - FirstAddress.ColumnLetter, - matchRange.RangeAddress. - FirstAddress.FixedRow, - matchRange.RangeAddress. - FirstAddress.FixedColumn))); - } - } - } - else - { - if (useSheetName) - { - sb.Append(String.Format("'{0}'!{1}:{2}", - sheetName, - matchRange.RangeAddress.FirstAddress, - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - LastAddress.RowNumber + - rowsShifted, - matchRange.RangeAddress. - LastAddress.ColumnLetter, - matchRange.RangeAddress. - LastAddress.FixedRow, - matchRange.RangeAddress. - LastAddress.FixedColumn))); - } - else - { - sb.Append(String.Format("{0}:{1}", - matchRange.RangeAddress.FirstAddress, - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - LastAddress.RowNumber + - rowsShifted, - matchRange.RangeAddress. - LastAddress.ColumnLetter, - matchRange.RangeAddress. - LastAddress.FixedRow, - matchRange.RangeAddress. - LastAddress.FixedColumn))); - } - } - } - else - sb.Append(matchString); - } - else - sb.Append(matchString); - } - else - sb.Append(matchString); - } - else - sb.Append(value.Substring(lastIndex, matchIndex - lastIndex + matchString.Length)); - lastIndex = matchIndex + matchString.Length; - } - - if (lastIndex < value.Length) - sb.Append(value.Substring(lastIndex)); - - return sb.ToString(); - - //string retVal = sb.ToString(); - //return retVal.Substring(1, retVal.Length - 2); - } - - internal void ShiftFormulaColumns(XLRange shiftedRange, int columnsShifted) - { - _formulaA1 = ShiftFormulaColumns(FormulaA1, Worksheet, shiftedRange, columnsShifted); - } - - internal static String ShiftFormulaColumns(String formulaA1, XLWorksheet worksheetInAction, XLRange shiftedRange, - int columnsShifted) - { - if (XLHelper.IsNullOrWhiteSpace(formulaA1)) return String.Empty; - - var value = formulaA1; // ">" + formulaA1 + "<"; - - var regex = A1SimpleRegex; - - var sb = new StringBuilder(); - var lastIndex = 0; - - foreach (var match in regex.Matches(value).Cast()) - { - var matchString = match.Value; - var matchIndex = match.Index; - if (value.Substring(0, matchIndex).CharCount('"') % 2 == 0) - { - // Check that the match is not between quotes - sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); - string sheetName; - var useSheetName = false; - if (matchString.Contains('!')) - { - sheetName = matchString.Substring(0, matchString.IndexOf('!')); - if (sheetName[0] == '\'') - sheetName = sheetName.Substring(1, sheetName.Length - 2); - useSheetName = true; - } - else - sheetName = worksheetInAction.Name; - - if (String.Compare(sheetName, shiftedRange.Worksheet.Name, true) == 0) - { - var rangeAddress = matchString.Substring(matchString.IndexOf('!') + 1); - if (!A1RowRegex.IsMatch(rangeAddress)) - { - var matchRange = worksheetInAction.Workbook.Worksheet(sheetName).Range(rangeAddress); - if (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= - matchRange.RangeAddress.LastAddress.ColumnNumber - && - shiftedRange.RangeAddress.FirstAddress.RowNumber <= - matchRange.RangeAddress.FirstAddress.RowNumber - && - shiftedRange.RangeAddress.LastAddress.RowNumber >= - matchRange.RangeAddress.LastAddress.RowNumber) - { - if (A1ColumnRegex.IsMatch(rangeAddress)) - { - var columns = rangeAddress.Split(':'); - var column1String = columns[0]; - var column2String = columns[1]; - string column1; - if (column1String[0] == '$') - { - column1 = "$" + - XLHelper.GetColumnLetterFromNumber( - XLHelper.GetColumnNumberFromLetter( - column1String.Substring(1)) + columnsShifted); - } - else - { - column1 = - XLHelper.GetColumnLetterFromNumber( - XLHelper.GetColumnNumberFromLetter(column1String) + - columnsShifted); - } - - string column2; - if (column2String[0] == '$') - { - column2 = "$" + - XLHelper.GetColumnLetterFromNumber( - XLHelper.GetColumnNumberFromLetter( - column2String.Substring(1)) + columnsShifted); - } - else - { - column2 = - XLHelper.GetColumnLetterFromNumber( - XLHelper.GetColumnNumberFromLetter(column2String) + - columnsShifted); - } - - sb.Append(useSheetName - ? String.Format("'{0}'!{1}:{2}", sheetName, column1, column2) - : String.Format("{0}:{1}", column1, column2)); - } - else if (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= - matchRange.RangeAddress.FirstAddress.ColumnNumber) - { - if (rangeAddress.Contains(':')) - { - if (useSheetName) - { - sb.Append(String.Format("'{0}'!{1}:{2}", - sheetName, - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - FirstAddress.RowNumber, - matchRange.RangeAddress. - FirstAddress.ColumnNumber + - columnsShifted, - matchRange.RangeAddress. - FirstAddress.FixedRow, - matchRange.RangeAddress. - FirstAddress.FixedColumn), - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - LastAddress.RowNumber, - matchRange.RangeAddress. - LastAddress.ColumnNumber + - columnsShifted, - matchRange.RangeAddress. - LastAddress.FixedRow, - matchRange.RangeAddress. - LastAddress.FixedColumn))); - } - else - { - sb.Append(String.Format("{0}:{1}", - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - FirstAddress.RowNumber, - matchRange.RangeAddress. - FirstAddress.ColumnNumber + - columnsShifted, - matchRange.RangeAddress. - FirstAddress.FixedRow, - matchRange.RangeAddress. - FirstAddress.FixedColumn), - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - LastAddress.RowNumber, - matchRange.RangeAddress. - LastAddress.ColumnNumber + - columnsShifted, - matchRange.RangeAddress. - LastAddress.FixedRow, - matchRange.RangeAddress. - LastAddress.FixedColumn))); - } - } - else - { - if (useSheetName) - { - sb.Append(String.Format("'{0}'!{1}", - sheetName, - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - FirstAddress.RowNumber, - matchRange.RangeAddress. - FirstAddress.ColumnNumber + - columnsShifted, - matchRange.RangeAddress. - FirstAddress.FixedRow, - matchRange.RangeAddress. - FirstAddress.FixedColumn))); - } - else - { - sb.Append(String.Format("{0}", - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - FirstAddress.RowNumber, - matchRange.RangeAddress. - FirstAddress.ColumnNumber + - columnsShifted, - matchRange.RangeAddress. - FirstAddress.FixedRow, - matchRange.RangeAddress. - FirstAddress.FixedColumn))); - } - } - } - else - { - if (useSheetName) - { - sb.Append(String.Format("'{0}'!{1}:{2}", - sheetName, - matchRange.RangeAddress.FirstAddress, - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - LastAddress.RowNumber, - matchRange.RangeAddress. - LastAddress.ColumnNumber + - columnsShifted, - matchRange.RangeAddress. - LastAddress.FixedRow, - matchRange.RangeAddress. - LastAddress.FixedColumn))); - } - else - { - sb.Append(String.Format("{0}:{1}", - matchRange.RangeAddress.FirstAddress, - new XLAddress(worksheetInAction, - matchRange.RangeAddress. - LastAddress.RowNumber, - matchRange.RangeAddress. - LastAddress.ColumnNumber + - columnsShifted, - matchRange.RangeAddress. - LastAddress.FixedRow, - matchRange.RangeAddress. - LastAddress.FixedColumn))); - } - } - } - else - sb.Append(matchString); - } - else - sb.Append(matchString); - } - else - sb.Append(matchString); - } - else - sb.Append(value.Substring(lastIndex, matchIndex - lastIndex + matchString.Length)); - lastIndex = matchIndex + matchString.Length; - } - - if (lastIndex < value.Length) - sb.Append(value.Substring(lastIndex)); - - return sb.ToString(); - - //string retVal = sb.ToString(); - //return retVal.Substring(1, retVal.Length - 2); - } - - // -- - - private XLCell CellShift(Int32 rowsToShift, Int32 columnsToShift) - { - return Worksheet.Cell(Address.RowNumber + rowsToShift, Address.ColumnNumber + columnsToShift); - } - - #region Nested type: FormulaConversionType - - private enum FormulaConversionType - { - A1ToR1C1, - R1C1ToA1 - }; - - #endregion Nested type: FormulaConversionType - - #region XLCell Above - - IXLCell IXLCell.CellAbove() - { - return CellAbove(); - } - - IXLCell IXLCell.CellAbove(Int32 step) - { - return CellAbove(step); - } - - public XLCell CellAbove() - { - return CellAbove(1); - } - - public XLCell CellAbove(Int32 step) - { - return CellShift(step * -1, 0); - } - - #endregion XLCell Above - - #region XLCell Below - - IXLCell IXLCell.CellBelow() - { - return CellBelow(); - } - - IXLCell IXLCell.CellBelow(Int32 step) - { - return CellBelow(step); - } - - public XLCell CellBelow() - { - return CellBelow(1); - } - - public XLCell CellBelow(Int32 step) - { - return CellShift(step, 0); - } - - #endregion XLCell Below - - #region XLCell Left - - IXLCell IXLCell.CellLeft() - { - return CellLeft(); - } - - IXLCell IXLCell.CellLeft(Int32 step) - { - return CellLeft(step); - } - - public XLCell CellLeft() - { - return CellLeft(1); - } - - public XLCell CellLeft(Int32 step) - { - return CellShift(0, step * -1); - } - - #endregion XLCell Left - - #region XLCell Right - - IXLCell IXLCell.CellRight() - { - return CellRight(); - } - - IXLCell IXLCell.CellRight(Int32 step) - { - return CellRight(step); - } - - public XLCell CellRight() - { - return CellRight(1); - } - - public XLCell CellRight(Int32 step) - { - return CellShift(0, step); - } - - #endregion XLCell Right - - public Boolean HasFormula { get { return !XLHelper.IsNullOrWhiteSpace(FormulaA1); } } - - public IXLRangeAddress FormulaReference { get; set; } - } -} +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; + +namespace ClosedXML.Excel +{ + using Attributes; + using FastMember; + + internal class XLCell : IXLCell, IXLStylized + { + public static readonly DateTime BaseDate = new DateTime(1899, 12, 30); + private static Dictionary _formatCodes; + + private static readonly Regex A1Regex = new Regex( + @"(?<=\W)(\$?[a-zA-Z]{1,3}\$?\d{1,7})(?=\W)" // A1 + + @"|(?<=\W)(\$?\d{1,7}:\$?\d{1,7})(?=\W)" // 1:1 + + @"|(?<=\W)(\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})(?=\W)", RegexOptions.Compiled); // A:A + + public static readonly Regex A1SimpleRegex = new Regex( + // @"(?<=\W)" // Start with non word + @"(?" // Start Group to pick + + @"(?" // Start Sheet Name, optional + + @"(" + + @"\'([^\[\]\*/\\\?:\']+|\'\')\'" + // Sheet name with special characters, surrounding apostrophes are required + + @"|" + + @"\'?\w+\'?" // Sheet name with letters and numbers, surrounding apostrophes are optional + + @")" + + @"!)?" // End Sheet Name, optional + + @"(?" // Start range + + @"\$?[a-zA-Z]{1,3}\$?\d{1,7}" // A1 Address 1 + + @"(?:\$?[a-zA-Z]{1,3}\$?\d{1,7})?" // A1 Address 2, optional + + @"|" + + @"(?\$?\d{1,7}:\$?\d{1,7})" // 1:1 + + @"|" + + @"(?\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})" // A:A + + @")" // End Range + + @")" // End Group to pick + //+ @"(?=\W)" // End with non word + , RegexOptions.Compiled); + + private static readonly Regex A1RowRegex = new Regex( + @"(\$?\d{1,7}:\$?\d{1,7})" // 1:1 + , RegexOptions.Compiled); + + private static readonly Regex A1ColumnRegex = new Regex( + @"(\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})" // A:A + , RegexOptions.Compiled); + + private static readonly Regex R1C1Regex = new Regex( + @"(?<=\W)([Rr](?:\[-?\d{0,7}\]|\d{0,7})?[Cc](?:\[-?\d{0,7}\]|\d{0,7})?)(?=\W)" // R1C1 + + @"|(?<=\W)([Rr]\[?-?\d{0,7}\]?:[Rr]\[?-?\d{0,7}\]?)(?=\W)" // R:R + + @"|(?<=\W)([Cc]\[?-?\d{0,5}\]?:[Cc]\[?-?\d{0,5}\]?)(?=\W)", RegexOptions.Compiled); // C:C + + private static readonly Regex utfPattern = new Regex(@"(?(T value) + { + FormulaA1 = String.Empty; + _richText = null; + var style = GetStyleForRead(); + if (value is String || value is char) + { + _cellValue = value.ToString(); + _dataType = XLCellValues.Text; + if (_cellValue.Contains(Environment.NewLine) && !GetStyleForRead().Alignment.WrapText) + Style.Alignment.WrapText = true; + } + else if (value is TimeSpan) + { + _cellValue = value.ToString(); + _dataType = XLCellValues.TimeSpan; + if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) + Style.NumberFormat.NumberFormatId = 46; + } + else if (value is DateTime) + { + _dataType = XLCellValues.DateTime; + var dtTest = (DateTime)Convert.ChangeType(value, typeof(DateTime)); + if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) + Style.NumberFormat.NumberFormatId = dtTest.Date == dtTest ? 14 : 22; + + _cellValue = dtTest.ToOADate().ToInvariantString(); + } + else if (value.GetType().IsNumber()) + { + if ((value is double || value is float) && (Double.IsNaN((Double)Convert.ChangeType(value, typeof(Double))) + || Double.IsInfinity((Double)Convert.ChangeType(value, typeof(Double))))) + { + _cellValue = value.ToString(); + _dataType = XLCellValues.Text; + } + else + { + _dataType = XLCellValues.Number; + _cellValue = ((Double)Convert.ChangeType(value, typeof(Double))).ToInvariantString(); + } + } + else if (value is Boolean) + { + _dataType = XLCellValues.Boolean; + _cellValue = (Boolean)Convert.ChangeType(value, typeof(Boolean)) ? "1" : "0"; + } + else + { + _cellValue = Convert.ToString(value); + _dataType = XLCellValues.Text; + } + + return this; + } + + public T GetValue() + { + T retVal; + if (TryGetValue(out retVal)) + return retVal; + + throw new Exception("Cannot convert cell value to " + typeof(T)); + } + + public string GetString() + { + return GetValue(); + } + + public double GetDouble() + { + return GetValue(); + } + + public bool GetBoolean() + { + return GetValue(); + } + + public DateTime GetDateTime() + { + return GetValue(); + } + + public TimeSpan GetTimeSpan() + { + return GetValue(); + } + + public string GetFormattedString() + { + String cValue; + if (FormulaA1.Length > 0) + { + try + { + cValue = GetString(); + } + catch + { + cValue = String.Empty; + } + } + else + { + cValue = _cellValue; + } + + if (_dataType == XLCellValues.Boolean) + return (cValue != "0").ToString(); + if (_dataType == XLCellValues.TimeSpan) + return cValue; + if (_dataType == XLCellValues.DateTime || IsDateFormat()) + { + double dTest; + if (Double.TryParse(cValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out dTest) + && dTest.IsValidOADateNumber()) + { + var format = GetFormat(); + return DateTime.FromOADate(dTest).ToString(format); + } + + return cValue; + } + + if (_dataType == XLCellValues.Number) + { + double dTest; + if (Double.TryParse(cValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out dTest)) + { + var format = GetFormat(); + return dTest.ToString(format); + } + + return cValue; + } + + return cValue; + } + + public object Value + { + get + { + var fA1 = FormulaA1; + if (!XLHelper.IsNullOrWhiteSpace(fA1)) + { + if (fA1[0] == '{') + fA1 = fA1.Substring(1, fA1.Length - 2); + + string sName; + string cAddress; + if (fA1.Contains('!')) + { + sName = fA1.Substring(0, fA1.IndexOf('!')); + if (sName[0] == '\'') + sName = sName.Substring(1, sName.Length - 2); + + cAddress = fA1.Substring(fA1.IndexOf('!') + 1); + } + else + { + sName = Worksheet.Name; + cAddress = fA1; + } + + if (_worksheet.Workbook.WorksheetsInternal.Any( + w => String.Compare(w.Name, sName, true) == 0) + && XLHelper.IsValidA1Address(cAddress) + ) + return _worksheet.Workbook.Worksheet(sName).Cell(cAddress).Value; + + var retVal = Worksheet.Evaluate(fA1); + var retValEnumerable = retVal as IEnumerable; + + if (retValEnumerable != null && !(retVal is String)) + foreach (var v in retValEnumerable) + return v; + + return retVal; + } + + var cellValue = HasRichText ? _richText.ToString() : _cellValue; + + if (_dataType == XLCellValues.Boolean) + return cellValue != "0"; + + if (_dataType == XLCellValues.DateTime) + { + Double d; + if (Double.TryParse(cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out d) + && d.IsValidOADateNumber()) + return DateTime.FromOADate(d); + } + + if (_dataType == XLCellValues.Number) + { + Double d; + if (double.TryParse(cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out d)) + return d; + } + + if (_dataType == XLCellValues.TimeSpan) + { + TimeSpan t; + if (TimeSpan.TryParse(cellValue, out t)) + return t; + } + + return cellValue; + } + + set + { + FormulaA1 = String.Empty; + + if (value as XLCells != null) throw new ArgumentException("Cannot assign IXLCells object to the cell value."); + + if (SetRangeRows(value)) return; + + if (SetRangeColumns(value)) return; + + if (SetEnumerable(value)) return; + + if (SetRange(value)) return; + + if (!SetRichText(value)) + SetValue(value); + + if (_cellValue.Length > 32767) throw new ArgumentException("Cells can only hold 32,767 characters."); + } + } + + public IXLTable InsertTable(IEnumerable data) + { + return InsertTable(data, null, true); + } + + public IXLTable InsertTable(IEnumerable data, bool createTable) + { + return InsertTable(data, null, createTable); + } + + public IXLTable InsertTable(IEnumerable data, string tableName) + { + return InsertTable(data, tableName, true); + } + + public IXLTable InsertTable(IEnumerable data, string tableName, bool createTable) + { + if (data != null && data.GetType() != typeof(String)) + { + var ro = Address.RowNumber + 1; + var fRo = Address.RowNumber; + var hasTitles = false; + var maxCo = 0; + var isDataTable = false; + var isDataReader = false; + var itemType = data.GetItemType(); + + if (!data.Any()) + { + if (itemType.IsPrimitive || itemType == typeof(String) || itemType == typeof(DateTime) || itemType.IsNumber()) + maxCo = Address.ColumnNumber + 1; + else + maxCo = Address.ColumnNumber + itemType.GetFields().Length + itemType.GetProperties().Length; + } + else if (itemType.IsPrimitive || itemType == typeof(String) || itemType == typeof(DateTime) || itemType.IsNumber()) + { + foreach (object o in data) + { + var co = Address.ColumnNumber; + + if (!hasTitles) + { + var fieldName = XLColumnAttribute.GetHeader(itemType); + if (XLHelper.IsNullOrWhiteSpace(fieldName)) + fieldName = itemType.Name; + + SetValue(fieldName, fRo, co); + hasTitles = true; + co = Address.ColumnNumber; + } + + SetValue(o, ro, co); + co++; + + if (co > maxCo) + maxCo = co; + + ro++; + } + } + else + { + const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance; + var memberCache = new Dictionary>(); + var accessorCache = new Dictionary(); + IEnumerable members = null; + TypeAccessor accessor = null; + bool isPlainObject = itemType == typeof(object); + + if (!isPlainObject) + { + members = itemType.GetFields(bindingFlags).Cast() + .Concat(itemType.GetProperties(bindingFlags)) + .Where(mi => !XLColumnAttribute.IgnoreMember(mi)) + .OrderBy(mi => XLColumnAttribute.GetOrder(mi)); + accessor = TypeAccessor.Create(itemType); + } + + foreach (T m in data) + { + if (isPlainObject) + { + // In this case data is just IEnumerable, which means we have to determine the runtime type of each element + // This is very inefficient and we prefer type of T to be a concrete class or struct + var type = m.GetType(); + if (!memberCache.ContainsKey(type)) + { + var _accessor = TypeAccessor.Create(type); + + var _members = type.GetFields(bindingFlags).Cast() + .Concat(type.GetProperties(bindingFlags)) + .Where(mi => !XLColumnAttribute.IgnoreMember(mi)) + .OrderBy(mi => XLColumnAttribute.GetOrder(mi)); + + memberCache.Add(type, _members); + accessorCache.Add(type, _accessor); + } + + members = memberCache[type]; + accessor = accessorCache[type]; + } + + var co = Address.ColumnNumber; + + if (itemType.IsArray) + { + foreach (var item in (m as Array)) + { + SetValue(item, ro, co); + co++; + } + } + else if (isDataTable || m is DataRow) + { + var row = m as DataRow; + if (!isDataTable) + isDataTable = true; + + if (!hasTitles) + { + foreach (var fieldName in from DataColumn column in row.Table.Columns + select XLHelper.IsNullOrWhiteSpace(column.Caption) + ? column.ColumnName + : column.Caption) + { + SetValue(fieldName, fRo, co); + co++; + } + + co = Address.ColumnNumber; + hasTitles = true; + } + + foreach (var item in row.ItemArray) + { + SetValue(item, ro, co); + co++; + } + } + else if (isDataReader || m is IDataRecord) + { + if (!isDataReader) + isDataReader = true; + + var record = m as IDataRecord; + + var fieldCount = record.FieldCount; + if (!hasTitles) + { + for (var i = 0; i < fieldCount; i++) + { + SetValue(record.GetName(i), fRo, co); + co++; + } + + co = Address.ColumnNumber; + hasTitles = true; + } + + for (var i = 0; i < fieldCount; i++) + { + SetValue(record[i], ro, co); + co++; + } + } + else + { + if (!hasTitles) + { + foreach (var mi in members) + { + if ((mi as IEnumerable) == null) + { + var fieldName = XLColumnAttribute.GetHeader(mi); + if (XLHelper.IsNullOrWhiteSpace(fieldName)) + fieldName = mi.Name; + + SetValue(fieldName, fRo, co); + } + + co++; + } + + co = Address.ColumnNumber; + hasTitles = true; + } + + foreach (var mi in members) + { + SetValue(accessor[m, mi.Name], ro, co); + co++; + } + } + + if (co > maxCo) + maxCo = co; + + ro++; + } + } + + ClearMerged(); + var range = _worksheet.Range( + Address.RowNumber, + Address.ColumnNumber, + ro - 1, + maxCo - 1); + + if (createTable) + return tableName == null ? range.CreateTable() : range.CreateTable(tableName); + return tableName == null ? range.AsTable() : range.AsTable(tableName); + } + + return null; + } + + public IXLTable InsertTable(DataTable data) + { + return InsertTable(data, null, true); + } + + public IXLTable InsertTable(DataTable data, bool createTable) + { + return InsertTable(data, null, createTable); + } + + public IXLTable InsertTable(DataTable data, string tableName) + { + return InsertTable(data, tableName, true); + } + + public IXLTable InsertTable(DataTable data, string tableName, bool createTable) + { + if (data == null) return null; + + if (data.Rows.Count > 0) return InsertTable(data.AsEnumerable(), tableName, createTable); + + var ro = Address.RowNumber; + var co = Address.ColumnNumber; + + foreach (DataColumn col in data.Columns) + { + SetValue(col.ColumnName, ro, co); + co++; + } + + ClearMerged(); + var range = _worksheet.Range( + Address.RowNumber, + Address.ColumnNumber, + ro, + co - 1); + + if (createTable) return tableName == null ? range.CreateTable() : range.CreateTable(tableName); + + return tableName == null ? range.AsTable() : range.AsTable(tableName); + } + + public IXLRange InsertData(IEnumerable data) + { + if (data != null && data.GetType() != typeof(String)) + { + var ro = Address.RowNumber; + var maxCo = 0; + var isDataTable = false; + var isDataReader = false; + + const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance; + var memberCache = new Dictionary>(); + var accessorCache = new Dictionary(); + IEnumerable members = null; + TypeAccessor accessor = null; + + foreach (var m in data) + { + var itemType = m.GetType(); + if (!memberCache.ContainsKey(itemType)) + { + var _accessor = TypeAccessor.Create(itemType); + + var _members = itemType.GetFields(bindingFlags).Cast() + .Concat(itemType.GetProperties(bindingFlags)) + .Where(mi => !XLColumnAttribute.IgnoreMember(mi)) + .OrderBy(mi => XLColumnAttribute.GetOrder(mi)); + + memberCache.Add(itemType, _members); + accessorCache.Add(itemType, _accessor); + } + + members = memberCache[itemType]; + accessor = accessorCache[itemType]; + + var co = Address.ColumnNumber; + + if (itemType.IsPrimitive || itemType == typeof(String) || itemType == typeof(DateTime) || itemType.IsNumber()) + { + SetValue(m, ro, co); + co++; + } + else if (itemType.IsArray) + { + // dynamic arr = m; + foreach (var item in (Array)m) + { + SetValue(item, ro, co); + co++; + } + } + else if (isDataTable || m is DataRow) + { + if (!isDataTable) + isDataTable = true; + + foreach (var item in (m as DataRow).ItemArray) + { + SetValue(item, ro, co); + co++; + } + } + else if (isDataReader || m is IDataRecord) + { + if (!isDataReader) + isDataReader = true; + + var record = m as IDataRecord; + + var fieldCount = record.FieldCount; + for (var i = 0; i < fieldCount; i++) + { + SetValue(record[i], ro, co); + co++; + } + } + else + { + foreach (var mi in members) + { + SetValue(accessor[m, mi.Name], ro, co); + co++; + } + } + + if (co > maxCo) + maxCo = co; + + ro++; + } + + ClearMerged(); + return _worksheet.Range( + Address.RowNumber, + Address.ColumnNumber, + ro - 1, + maxCo - 1); + } + + return null; + } + + public IXLStyle Style + { + get { return GetStyle(); } + + set { SetStyle(value); } + } + + public IXLCell SetDataType(XLCellValues dataType) + { + DataType = dataType; + return this; + } + + public XLCellValues DataType + { + get { return _dataType; } + set + { + if (_dataType == value) return; + + if (_richText != null) + { + _cellValue = _richText.ToString(); + _richText = null; + } + + if (_cellValue.Length > 0) + { + if (value == XLCellValues.Boolean) + { + bool bTest; + if (Boolean.TryParse(_cellValue, out bTest)) + _cellValue = bTest ? "1" : "0"; + else + _cellValue = _cellValue == "0" || String.IsNullOrEmpty(_cellValue) ? "0" : "1"; + } + else if (value == XLCellValues.DateTime) + { + DateTime dtTest; + double dblTest; + if (DateTime.TryParse(_cellValue, out dtTest)) + _cellValue = dtTest.ToOADate().ToInvariantString(); + else if (Double.TryParse(_cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out dblTest)) + _cellValue = dblTest.ToInvariantString(); + else + { + throw new ArgumentException( + string.Format( + "Cannot set data type to DateTime because '{0}' is not recognized as a date.", + _cellValue)); + } + var style = GetStyleForRead(); + if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) + Style.NumberFormat.NumberFormatId = _cellValue.Contains('.') ? 22 : 14; + } + else if (value == XLCellValues.TimeSpan) + { + TimeSpan tsTest; + if (TimeSpan.TryParse(_cellValue, out tsTest)) + { + _cellValue = tsTest.ToString(); + var style = GetStyleForRead(); + if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) + Style.NumberFormat.NumberFormatId = 46; + } + else + { + try + { + _cellValue = (DateTime.FromOADate(Double.Parse(_cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture)) - BaseDate).ToString(); + } + catch + { + throw new ArgumentException( + string.Format( + "Cannot set data type to TimeSpan because '{0}' is not recognized as a TimeSpan.", + _cellValue)); + } + } + } + else if (value == XLCellValues.Number) + { + double dTest; + if (Double.TryParse(_cellValue, XLHelper.NumberStyle, CultureInfo.InvariantCulture, out dTest)) + _cellValue = dTest.ToInvariantString(); + else + { + throw new ArgumentException( + string.Format( + "Cannot set data type to Number because '{0}' is not recognized as a number.", + _cellValue)); + } + } + else + { + if (_dataType == XLCellValues.Boolean) + _cellValue = (_cellValue != "0").ToString(); + else if (_dataType == XLCellValues.TimeSpan) + _cellValue = BaseDate.Add(GetTimeSpan()).ToOADate().ToInvariantString(); + } + } + + _dataType = value; + } + } + + public IXLCell Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + return Clear(clearOptions, false); + } + + internal IXLCell Clear(XLClearOptions clearOptions, bool calledFromRange) + { + //Note: We have to check if the cell is part of a merged range. If so we have to clear the whole range + //Checking if called from range to avoid stack overflow + if (IsMerged() && !calledFromRange) + { + using (var asRange = AsRange()) + { + var firstOrDefault = Worksheet.Internals.MergedRanges.FirstOrDefault(asRange.Intersects); + if (firstOrDefault != null) + firstOrDefault.Clear(clearOptions); + } + } + else + { + if (clearOptions == XLClearOptions.Contents || clearOptions == XLClearOptions.ContentsAndFormats) + { + Hyperlink = null; + _richText = null; + //_comment = null; + _cellValue = String.Empty; + FormulaA1 = String.Empty; + } + + if (clearOptions == XLClearOptions.Formats || clearOptions == XLClearOptions.ContentsAndFormats) + { + if (HasDataValidation) + DataValidation.Clear(); + + SetStyle(Worksheet.Style); + } + } + + return this; + } + + public void Delete(XLShiftDeletedCells shiftDeleteCells) + { + _worksheet.Range(Address, Address).Delete(shiftDeleteCells); + } + + public string FormulaA1 + { + get + { + if (XLHelper.IsNullOrWhiteSpace(_formulaA1)) + { + if (!XLHelper.IsNullOrWhiteSpace(_formulaR1C1)) + { + _formulaA1 = GetFormulaA1(_formulaR1C1); + return FormulaA1; + } + + return String.Empty; + } + + if (_formulaA1.Trim()[0] == '=') + return _formulaA1.Substring(1); + + if (_formulaA1.Trim().StartsWith("{=")) + return "{" + _formulaA1.Substring(2); + + return _formulaA1; + } + + set + { + _formulaA1 = XLHelper.IsNullOrWhiteSpace(value) ? null : value; + + _formulaR1C1 = null; + } + } + + public string FormulaR1C1 + { + get + { + if (XLHelper.IsNullOrWhiteSpace(_formulaR1C1)) + _formulaR1C1 = GetFormulaR1C1(FormulaA1); + + return _formulaR1C1; + } + + set + { + _formulaR1C1 = XLHelper.IsNullOrWhiteSpace(value) ? null : value; + } + } + + public bool ShareString { get; set; } + + public XLHyperlink Hyperlink + { + get + { + if (_hyperlink == null) + Hyperlink = new XLHyperlink(); + + return _hyperlink; + } + + set + { + if (_worksheet.Hyperlinks.Any(hl => Address.Equals(hl.Cell.Address))) + _worksheet.Hyperlinks.Delete(Address); + + _hyperlink = value; + + if (_hyperlink == null) return; + + _hyperlink.Worksheet = _worksheet; + _hyperlink.Cell = this; + + _worksheet.Hyperlinks.Add(_hyperlink); + + if (SettingHyperlink) return; + + if (GetStyleForRead().Font.FontColor.Equals(_worksheet.Style.Font.FontColor)) + Style.Font.FontColor = XLColor.FromTheme(XLThemeColor.Hyperlink); + + if (GetStyleForRead().Font.Underline == _worksheet.Style.Font.Underline) + Style.Font.Underline = XLFontUnderlineValues.Single; + } + } + + public IXLCells InsertCellsAbove(int numberOfRows) + { + return AsRange().InsertRowsAbove(numberOfRows).Cells(); + } + + public IXLCells InsertCellsBelow(int numberOfRows) + { + return AsRange().InsertRowsBelow(numberOfRows).Cells(); + } + + public IXLCells InsertCellsAfter(int numberOfColumns) + { + return AsRange().InsertColumnsAfter(numberOfColumns).Cells(); + } + + public IXLCells InsertCellsBefore(int numberOfColumns) + { + return AsRange().InsertColumnsBefore(numberOfColumns).Cells(); + } + + public IXLCell AddToNamed(string rangeName) + { + AsRange().AddToNamed(rangeName); + return this; + } + + public IXLCell AddToNamed(string rangeName, XLScope scope) + { + AsRange().AddToNamed(rangeName, scope); + return this; + } + + public IXLCell AddToNamed(string rangeName, XLScope scope, string comment) + { + AsRange().AddToNamed(rangeName, scope, comment); + return this; + } + + public string ValueCached { get; internal set; } + + public IXLRichText RichText + { + get + { + if (_richText == null) + { + var style = GetStyleForRead(); + _richText = _cellValue.Length == 0 + ? new XLRichText(style.Font) + : new XLRichText(GetFormattedString(), style.Font); + } + + return _richText; + } + } + + public bool HasRichText + { + get { return _richText != null; } + } + + IXLComment IXLCell.Comment + { + get { return Comment; } + } + + public bool HasComment + { + get { return _comment != null; } + } + + public Boolean IsMerged() + { + return Worksheet.Internals.MergedRanges.Any(r => r.Contains(this)); + } + + public Boolean IsEmpty() + { + return IsEmpty(false); + } + + public Boolean IsEmpty(Boolean includeFormats) + { + if (InnerText.Length > 0) + return false; + + if (includeFormats) + { + if (!Style.Equals(Worksheet.Style) || IsMerged() || HasComment || HasDataValidation) + return false; + + if (_style == null) + { + XLRow row; + if (Worksheet.Internals.RowsCollection.TryGetValue(Address.RowNumber, out row) && !row.Style.Equals(Worksheet.Style)) + return false; + + XLColumn column; + if (Worksheet.Internals.ColumnsCollection.TryGetValue(Address.ColumnNumber, out column) && !column.Style.Equals(Worksheet.Style)) + return false; + } + + if (Worksheet.ConditionalFormats.Any(cf => cf.Range.Contains(this))) + return false; + } + return true; + } + + public IXLColumn WorksheetColumn() + { + return Worksheet.Column(Address.ColumnNumber); + } + + public IXLRow WorksheetRow() + { + return Worksheet.Row(Address.RowNumber); + } + + public IXLCell CopyTo(IXLCell target) + { + (target as XLCell).CopyFrom(this, true); + return target; + } + + public IXLCell CopyTo(String target) + { + return CopyTo(GetTargetCell(target, Worksheet)); + } + + public IXLCell CopyFrom(IXLCell otherCell) + { + return CopyFrom(otherCell as XLCell, true); + } + + public IXLCell CopyFrom(String otherCell) + { + return CopyFrom(GetTargetCell(otherCell, Worksheet)); + } + + public IXLCell SetFormulaA1(String formula) + { + FormulaA1 = formula; + return this; + } + + public IXLCell SetFormulaR1C1(String formula) + { + FormulaR1C1 = formula; + return this; + } + + public Boolean HasDataValidation + { + get + { + using (var asRange = AsRange()) + return Worksheet.DataValidations.Any(dv => dv.Ranges.Contains(asRange) && dv.IsDirty()); + } + } + + public IXLDataValidation SetDataValidation() + { + return DataValidation; + } + + public void Select() + { + AsRange().Select(); + } + + public IXLConditionalFormat AddConditionalFormat() + { + using (var r = AsRange()) + return r.AddConditionalFormat(); + } + + public Boolean Active + { + get { return Worksheet.ActiveCell == this; } + set + { + if (value) + Worksheet.ActiveCell = this; + else if (Active) + Worksheet.ActiveCell = null; + } + } + + public IXLCell SetActive(Boolean value = true) + { + Active = value; + return this; + } + + public Boolean HasHyperlink + { + get { return _hyperlink != null; } + } + + public XLHyperlink GetHyperlink() + { + if (HasHyperlink) + return Hyperlink; + + return Value as XLHyperlink; + } + + public Boolean TryGetValue(out T value) + { + var currValue = Value; + + if (currValue == null) + { + value = default(T); + return true; + } + + bool b; + if (TryGetTimeSpanValue(out value, currValue, out b)) return b; + + if (TryGetRichStringValue(out value)) return true; + + if (TryGetStringValue(out value, currValue)) return true; + + var strValue = currValue.ToString(); + if (typeof(T) == typeof(bool)) return TryGetBasicValue(out value, strValue, bool.TryParse); + if (typeof(T) == typeof(sbyte)) return TryGetBasicValue(out value, strValue, sbyte.TryParse); + if (typeof(T) == typeof(byte)) return TryGetBasicValue(out value, strValue, byte.TryParse); + if (typeof(T) == typeof(short)) return TryGetBasicValue(out value, strValue, short.TryParse); + if (typeof(T) == typeof(ushort)) return TryGetBasicValue(out value, strValue, ushort.TryParse); + if (typeof(T) == typeof(int)) return TryGetBasicValue(out value, strValue, int.TryParse); + if (typeof(T) == typeof(uint)) return TryGetBasicValue(out value, strValue, uint.TryParse); + if (typeof(T) == typeof(long)) return TryGetBasicValue(out value, strValue, long.TryParse); + if (typeof(T) == typeof(ulong)) return TryGetBasicValue(out value, strValue, ulong.TryParse); + if (typeof(T) == typeof(float)) return TryGetBasicValue(out value, strValue, float.TryParse); + if (typeof(T) == typeof(double)) return TryGetBasicValue(out value, strValue, double.TryParse); + if (typeof(T) == typeof(decimal)) return TryGetBasicValue(out value, strValue, decimal.TryParse); + + if (typeof(T) == typeof(XLHyperlink)) + { + XLHyperlink tmp = GetHyperlink(); + if (tmp != null) + { + value = (T)Convert.ChangeType(tmp, typeof(T)); + return true; + } + + value = default(T); + return false; + } + + try + { + value = (T)Convert.ChangeType(currValue, typeof(T)); + return true; + } + catch + { + value = default(T); + return false; + } + } + + private static bool TryGetTimeSpanValue(out T value, object currValue, out bool b) + { + if (typeof(T) == typeof(TimeSpan)) + { + TimeSpan tmp; + Boolean retVal = true; + + if (currValue is TimeSpan) + { + tmp = (TimeSpan)currValue; + } + else if (!TimeSpan.TryParse(currValue.ToString(), out tmp)) + { + retVal = false; + } + + value = (T)Convert.ChangeType(tmp, typeof(T)); + { + b = retVal; + return true; + } + } + value = default(T); + b = false; + return false; + } + + private bool TryGetRichStringValue(out T value) + { + if (typeof(T) == typeof(IXLRichText)) + { + value = (T)RichText; + return true; + } + value = default(T); + return false; + } + + private static bool TryGetStringValue(out T value, object currValue) + { + if (typeof(T) == typeof(String)) + { + var valToUse = currValue.ToString(); + if (!utfPattern.Match(valToUse).Success) + { + value = (T)Convert.ChangeType(valToUse, typeof(T)); + return true; + } + + var sb = new StringBuilder(); + var lastIndex = 0; + foreach (Match match in utfPattern.Matches(valToUse)) + { + var matchString = match.Value; + var matchIndex = match.Index; + sb.Append(valToUse.Substring(lastIndex, matchIndex - lastIndex)); + + sb.Append((char)int.Parse(match.Groups[1].Value, NumberStyles.AllowHexSpecifier)); + + lastIndex = matchIndex + matchString.Length; + } + if (lastIndex < valToUse.Length) + sb.Append(valToUse.Substring(lastIndex)); + + value = (T)Convert.ChangeType(sb.ToString(), typeof(T)); + return true; + } + value = default(T); + return false; + } + + private static Boolean TryGetBooleanValue(out T value, object currValue) + { + if (typeof(T) == typeof(Boolean)) + { + Boolean tmp; + if (Boolean.TryParse(currValue.ToString(), out tmp)) + { + value = (T)Convert.ChangeType(tmp, typeof(T)); + { + return true; + } + } + } + value = default(T); + return false; + } + + private delegate Boolean Func(String input, out T output); + + private static Boolean TryGetBasicValue(out T value, String currValue, Func func) + { + U tmp; + if (func(currValue, out tmp)) + { + value = (T)Convert.ChangeType(tmp, typeof(T)); + { + return true; + } + } + value = default(T); + return false; + } + + #endregion IXLCell Members + + #region IXLStylized Members + + public Boolean StyleChanged { get; set; } + + public IEnumerable Styles + { + get + { + UpdatingStyle = true; + yield return Style; + UpdatingStyle = false; + } + } + + public bool UpdatingStyle { get; set; } + + public IXLStyle InnerStyle + { + get { return Style; } + set { Style = value; } + } + + public IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges { AsRange() }; + return retVal; + } + } + + #endregion IXLStylized Members + + private bool SetRangeColumns(object value) + { + var columns = value as XLRangeColumns; + if (columns == null) + return SetColumns(value); + + var cell = this; + foreach (var column in columns) + { + cell.SetRange(column); + cell = cell.CellRight(); + } + return true; + } + + private bool SetColumns(object value) + { + var columns = value as XLColumns; + if (columns == null) + return false; + + var cell = this; + foreach (var column in columns) + { + cell.SetRange(column); + cell = cell.CellRight(); + } + return true; + } + + private bool SetRangeRows(object value) + { + var rows = value as XLRangeRows; + if (rows == null) + return SetRows(value); + + var cell = this; + foreach (var row in rows) + { + cell.SetRange(row); + cell = cell.CellBelow(); + } + return true; + } + + private bool SetRows(object value) + { + var rows = value as XLRows; + if (rows == null) + return false; + + var cell = this; + foreach (var row in rows) + { + cell.SetRange(row); + cell = cell.CellBelow(); + } + return true; + } + + public XLRange AsRange() + { + return _worksheet.Range(Address, Address); + } + + private IXLStyle GetStyle() + { + if (_style != null) + return _style; + + return _style = new XLStyle(this, Worksheet.Workbook.GetStyleById(_styleCacheId)); + } + + public void DeleteComment() + { + _comment = null; + } + + private bool IsDateFormat() + { + var style = GetStyleForRead(); + return _dataType == XLCellValues.Number + && XLHelper.IsNullOrWhiteSpace(style.NumberFormat.Format) + && ((style.NumberFormat.NumberFormatId >= 14 + && style.NumberFormat.NumberFormatId <= 22) + || (style.NumberFormat.NumberFormatId >= 45 + && style.NumberFormat.NumberFormatId <= 47)); + } + + private string GetFormat() + { + var format = String.Empty; + var style = GetStyleForRead(); + if (XLHelper.IsNullOrWhiteSpace(style.NumberFormat.Format)) + { + var formatCodes = GetFormatCodes(); + if (formatCodes.ContainsKey(style.NumberFormat.NumberFormatId)) + format = formatCodes[style.NumberFormat.NumberFormatId]; + } + else + format = style.NumberFormat.Format; + return format; + } + + private bool SetRichText(object value) + { + var asRichString = value as XLRichText; + + if (asRichString == null) + return false; + + _richText = asRichString; + _dataType = XLCellValues.Text; + return true; + } + + private Boolean SetRange(Object rangeObject) + { + var asRange = rangeObject as XLRangeBase; + if (asRange == null) + { + var tmp = rangeObject as XLCell; + if (tmp != null) + asRange = tmp.AsRange(); + } + + if (asRange != null) + { + if (!(asRange is XLRow || asRange is XLColumn)) + { + var maxRows = asRange.RowCount(); + var maxColumns = asRange.ColumnCount(); + Worksheet.Range(Address.RowNumber, Address.ColumnNumber, maxRows, maxColumns).Clear(); + } + + var minRow = asRange.RangeAddress.FirstAddress.RowNumber; + var minColumn = asRange.RangeAddress.FirstAddress.ColumnNumber; + foreach (var sourceCell in asRange.CellsUsed(true)) + { + Worksheet.Cell( + Address.RowNumber + sourceCell.Address.RowNumber - minRow, + Address.ColumnNumber + sourceCell.Address.ColumnNumber - minColumn + ).CopyFrom(sourceCell, true); + } + + var rangesToMerge = (from mergedRange in (asRange.Worksheet).Internals.MergedRanges + where asRange.Contains(mergedRange) + let initialRo = + Address.RowNumber + + (mergedRange.RangeAddress.FirstAddress.RowNumber - + asRange.RangeAddress.FirstAddress.RowNumber) + let initialCo = + Address.ColumnNumber + + (mergedRange.RangeAddress.FirstAddress.ColumnNumber - + asRange.RangeAddress.FirstAddress.ColumnNumber) + select + Worksheet.Range(initialRo, initialCo, initialRo + mergedRange.RowCount() - 1, + initialCo + mergedRange.ColumnCount() - 1)).Cast(). + ToList(); + rangesToMerge.ForEach(r => r.Merge()); + + return true; + } + + return false; + } + + private bool SetEnumerable(object collectionObject) + { + // IXLRichText implements IEnumerable, but we don't want to handle this here. + if ((collectionObject as IXLRichText) != null) return false; + + var asEnumerable = collectionObject as IEnumerable; + return InsertData(asEnumerable) != null; + } + + private void ClearMerged() + { + List mergeToDelete; + using (var asRange = AsRange()) + mergeToDelete = Worksheet.Internals.MergedRanges.Where(merge => merge.Intersects(asRange)).ToList(); + + mergeToDelete.ForEach(m => Worksheet.Internals.MergedRanges.Remove(m)); + } + + private void SetValue(T value, int ro, int co) where T : class + { + if (value == null) + _worksheet.Cell(ro, co).SetValue(String.Empty); + else + { + if (value is IConvertible) + _worksheet.Cell(ro, co).SetValue((T)Convert.ChangeType(value, typeof(T))); + else + _worksheet.Cell(ro, co).SetValue(value); + } + } + + private void SetValue(object value) + { + FormulaA1 = String.Empty; + string val; + if (value == null) + val = string.Empty; + else if (value is DateTime) + val = ((DateTime)value).ToString("o"); + else if (value.IsNumber()) + val = Convert.ToDecimal(value).ToInvariantString(); + else + val = value.ToString(); + _richText = null; + if (val.Length == 0) + _dataType = XLCellValues.Text; + else + { + double dTest; + DateTime dtTest; + bool bTest; + TimeSpan tsTest; + var style = GetStyleForRead(); + if (style.NumberFormat.Format == "@") + { + _dataType = XLCellValues.Text; + if (val.Contains(Environment.NewLine) && !style.Alignment.WrapText) + Style.Alignment.WrapText = true; + } + else if (val[0] == '\'') + { + val = val.Substring(1, val.Length - 1); + _dataType = XLCellValues.Text; + if (val.Contains(Environment.NewLine) && !style.Alignment.WrapText) + Style.Alignment.WrapText = true; + } + else if (value is TimeSpan || (!Double.TryParse(val, XLHelper.NumberStyle, XLHelper.ParseCulture, out dTest) && TimeSpan.TryParse(val, out tsTest))) + { + if (!(value is TimeSpan) && TimeSpan.TryParse(val, out tsTest)) + val = tsTest.ToString(); + + _dataType = XLCellValues.TimeSpan; + if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) + Style.NumberFormat.NumberFormatId = 46; + } + else if (val.Trim() != "NaN" && Double.TryParse(val, XLHelper.NumberStyle, XLHelper.ParseCulture, out dTest)) + _dataType = XLCellValues.Number; + else if (DateTime.TryParse(val, out dtTest) && dtTest >= BaseDate) + { + _dataType = XLCellValues.DateTime; + + if (style.NumberFormat.Format == String.Empty && style.NumberFormat.NumberFormatId == 0) + Style.NumberFormat.NumberFormatId = dtTest.Date == dtTest ? 14 : 22; + { + DateTime forMillis; + if (value is DateTime && (forMillis = (DateTime)value).Millisecond > 0) + { + val = forMillis.ToOADate().ToInvariantString(); + } + else + { + val = dtTest.ToOADate().ToInvariantString(); + } + } + } + else if (Boolean.TryParse(val, out bTest)) + { + _dataType = XLCellValues.Boolean; + val = bTest ? "1" : "0"; + } + else + { + _dataType = XLCellValues.Text; + if (val.Contains(Environment.NewLine) && !style.Alignment.WrapText) + Style.Alignment.WrapText = true; + } + } + if (val.Length > 32767) throw new ArgumentException("Cells can only hold 32,767 characters."); + _cellValue = val; + } + + private static Dictionary GetFormatCodes() + { + if (_formatCodes == null) + { + var fCodes = new Dictionary + { + {0, string.Empty}, + {1, "0"}, + {2, "0.00"}, + {3, "#,##0"}, + {4, "#,##0.00"}, + {7, "$#,##0.00_);($#,##0.00)"}, + {9, "0%"}, + {10, "0.00%"}, + {11, "0.00E+00"}, + {12, "# ?/?"}, + {13, "# ??/??"}, + {14, "M/d/yyyy"}, + {15, "d-MMM-yy"}, + {16, "d-MMM"}, + {17, "MMM-yy"}, + {18, "h:mm tt"}, + {19, "h:mm:ss tt"}, + {20, "H:mm"}, + {21, "H:mm:ss"}, + {22, "M/d/yyyy H:mm"}, + {37, "#,##0 ;(#,##0)"}, + {38, "#,##0 ;[Red](#,##0)"}, + {39, "#,##0.00;(#,##0.00)"}, + {40, "#,##0.00;[Red](#,##0.00)"}, + {45, "mm:ss"}, + {46, "[h]:mm:ss"}, + {47, "mmss.0"}, + {48, "##0.0E+0"}, + {49, "@"} + }; + _formatCodes = fCodes; + } + + return _formatCodes; + } + + private string GetFormulaR1C1(string value) + { + return GetFormula(value, FormulaConversionType.A1ToR1C1, 0, 0); + } + + private string GetFormulaA1(string value) + { + return GetFormula(value, FormulaConversionType.R1C1ToA1, 0, 0); + } + + private string GetFormula(string strValue, FormulaConversionType conversionType, int rowsToShift, + int columnsToShift) + { + if (XLHelper.IsNullOrWhiteSpace(strValue)) + return String.Empty; + + var value = ">" + strValue + "<"; + + var regex = conversionType == FormulaConversionType.A1ToR1C1 ? A1Regex : R1C1Regex; + + var sb = new StringBuilder(); + var lastIndex = 0; + + foreach (var match in regex.Matches(value).Cast()) + { + var matchString = match.Value; + var matchIndex = match.Index; + if (value.Substring(0, matchIndex).CharCount('"') % 2 == 0 + && value.Substring(0, matchIndex).CharCount('\'') % 2 == 0) + { + // Check if the match is in between quotes + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); + sb.Append(conversionType == FormulaConversionType.A1ToR1C1 + ? GetR1C1Address(matchString, rowsToShift, columnsToShift) + : GetA1Address(matchString, rowsToShift, columnsToShift)); + } + else + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex + matchString.Length)); + lastIndex = matchIndex + matchString.Length; + } + + if (lastIndex < value.Length) + sb.Append(value.Substring(lastIndex)); + + var retVal = sb.ToString(); + return retVal.Substring(1, retVal.Length - 2); + } + + private string GetA1Address(string r1C1Address, int rowsToShift, int columnsToShift) + { + var addressToUse = r1C1Address.ToUpper(); + + if (addressToUse.Contains(':')) + { + var parts = addressToUse.Split(':'); + var p1 = parts[0]; + var p2 = parts[1]; + string leftPart; + string rightPart; + if (p1.StartsWith("R")) + { + leftPart = GetA1Row(p1, rowsToShift); + rightPart = GetA1Row(p2, rowsToShift); + } + else + { + leftPart = GetA1Column(p1, columnsToShift); + rightPart = GetA1Column(p2, columnsToShift); + } + + return leftPart + ":" + rightPart; + } + + var rowPart = addressToUse.Substring(0, addressToUse.IndexOf("C")); + var rowToReturn = GetA1Row(rowPart, rowsToShift); + + var columnPart = addressToUse.Substring(addressToUse.IndexOf("C")); + var columnToReturn = GetA1Column(columnPart, columnsToShift); + + var retAddress = columnToReturn + rowToReturn; + return retAddress; + } + + private string GetA1Column(string columnPart, int columnsToShift) + { + string columnToReturn; + if (columnPart == "C") + columnToReturn = XLHelper.GetColumnLetterFromNumber(Address.ColumnNumber + columnsToShift); + else + { + var bIndex = columnPart.IndexOf("["); + var mIndex = columnPart.IndexOf("-"); + if (bIndex >= 0) + { + columnToReturn = XLHelper.GetColumnLetterFromNumber( + Address.ColumnNumber + + Int32.Parse(columnPart.Substring(bIndex + 1, columnPart.Length - bIndex - 2)) + columnsToShift + ); + } + else if (mIndex >= 0) + { + columnToReturn = XLHelper.GetColumnLetterFromNumber( + Address.ColumnNumber + Int32.Parse(columnPart.Substring(mIndex)) + columnsToShift + ); + } + else + { + columnToReturn = "$" + + XLHelper.GetColumnLetterFromNumber(Int32.Parse(columnPart.Substring(1)) + + columnsToShift); + } + } + + return columnToReturn; + } + + private string GetA1Row(string rowPart, int rowsToShift) + { + string rowToReturn; + if (rowPart == "R") + rowToReturn = (Address.RowNumber + rowsToShift).ToString(); + else + { + var bIndex = rowPart.IndexOf("["); + if (bIndex >= 0) + { + rowToReturn = + (Address.RowNumber + Int32.Parse(rowPart.Substring(bIndex + 1, rowPart.Length - bIndex - 2)) + + rowsToShift).ToString(); + } + else + rowToReturn = "$" + (Int32.Parse(rowPart.Substring(1)) + rowsToShift); + } + + return rowToReturn; + } + + private string GetR1C1Address(string a1Address, int rowsToShift, int columnsToShift) + { + if (a1Address.Contains(':')) + { + var parts = a1Address.Split(':'); + var p1 = parts[0]; + var p2 = parts[1]; + int row1; + if (Int32.TryParse(p1.Replace("$", string.Empty), out row1)) + { + var row2 = Int32.Parse(p2.Replace("$", string.Empty)); + var leftPart = GetR1C1Row(row1, p1.Contains('$'), rowsToShift); + var rightPart = GetR1C1Row(row2, p2.Contains('$'), rowsToShift); + return leftPart + ":" + rightPart; + } + else + { + var column1 = XLHelper.GetColumnNumberFromLetter(p1.Replace("$", string.Empty)); + var column2 = XLHelper.GetColumnNumberFromLetter(p2.Replace("$", string.Empty)); + var leftPart = GetR1C1Column(column1, p1.Contains('$'), columnsToShift); + var rightPart = GetR1C1Column(column2, p2.Contains('$'), columnsToShift); + return leftPart + ":" + rightPart; + } + } + + var address = XLAddress.Create(_worksheet, a1Address); + + var rowPart = GetR1C1Row(address.RowNumber, address.FixedRow, rowsToShift); + var columnPart = GetR1C1Column(address.ColumnNumber, address.FixedColumn, columnsToShift); + + return rowPart + columnPart; + } + + private string GetR1C1Row(int rowNumber, bool fixedRow, int rowsToShift) + { + string rowPart; + rowNumber += rowsToShift; + var rowDiff = rowNumber - Address.RowNumber; + if (rowDiff != 0 || fixedRow) + rowPart = fixedRow ? String.Format("R{0}", rowNumber) : String.Format("R[{0}]", rowDiff); + else + rowPart = "R"; + + return rowPart; + } + + private string GetR1C1Column(int columnNumber, bool fixedColumn, int columnsToShift) + { + string columnPart; + columnNumber += columnsToShift; + var columnDiff = columnNumber - Address.ColumnNumber; + if (columnDiff != 0 || fixedColumn) + columnPart = fixedColumn ? String.Format("C{0}", columnNumber) : String.Format("C[{0}]", columnDiff); + else + columnPart = "C"; + + return columnPart; + } + + internal void CopyValuesFrom(XLCell source) + { + _cellValue = source._cellValue; + _dataType = source._dataType; + FormulaR1C1 = source.FormulaR1C1; + _richText = source._richText == null ? null : new XLRichText(source._richText, source.Style.Font); + _comment = source._comment == null ? null : new XLComment(this, source._comment, source.Style.Font); + + if (source._hyperlink != null) + { + SettingHyperlink = true; + Hyperlink = new XLHyperlink(source.Hyperlink); + SettingHyperlink = false; + } + } + + private IXLCell GetTargetCell(String target, XLWorksheet defaultWorksheet) + { + var pair = target.Split('!'); + if (pair.Length == 1) + return defaultWorksheet.Cell(target); + + var wsName = pair[0]; + if (wsName.StartsWith("'")) + wsName = wsName.Substring(1, wsName.Length - 2); + return defaultWorksheet.Workbook.Worksheet(wsName).Cell(pair[1]); + } + + public IXLCell CopyFrom(IXLCell otherCell, Boolean copyDataValidations) + { + var source = otherCell as XLCell; // To expose GetFormulaR1C1, etc + //var source = castedOtherCell; + CopyValuesFrom(source); + + SetStyle(source._style ?? source.Worksheet.Workbook.GetStyleById(source._styleCacheId)); + + var conditionalFormats = source.Worksheet.ConditionalFormats.Where(c => c.Range.Contains(source)).ToList(); + foreach (var cf in conditionalFormats) + { + var c = new XLConditionalFormat(cf as XLConditionalFormat) { Range = AsRange() }; + var oldValues = c.Values.Values.ToList(); + c.Values.Clear(); + foreach (var v in oldValues) + { + var f = v.Value; + if (v.IsFormula) + { + var r1c1 = source.GetFormulaR1C1(f); + f = GetFormulaA1(r1c1); + } + + c.Values.Add(new XLFormula { _value = f, IsFormula = v.IsFormula }); + } + + _worksheet.ConditionalFormats.Add(c); + } + + if (copyDataValidations) + { + var eventTracking = Worksheet.EventTrackingEnabled; + Worksheet.EventTrackingEnabled = false; + if (source.HasDataValidation) + CopyDataValidation(source, source.DataValidation); + else if (HasDataValidation) + { + using (var asRange = AsRange()) + Worksheet.DataValidations.Delete(asRange); + } + Worksheet.EventTrackingEnabled = eventTracking; + } + + return this; + } + + internal void CopyDataValidation(XLCell otherCell, XLDataValidation otherDv) + { + var thisDv = DataValidation; + thisDv.CopyFrom(otherDv); + thisDv.Value = GetFormulaA1(otherCell.GetFormulaR1C1(otherDv.Value)); + thisDv.MinValue = GetFormulaA1(otherCell.GetFormulaR1C1(otherDv.MinValue)); + thisDv.MaxValue = GetFormulaA1(otherCell.GetFormulaR1C1(otherDv.MaxValue)); + } + + internal void ShiftFormulaRows(XLRange shiftedRange, int rowsShifted) + { + _formulaA1 = ShiftFormulaRows(FormulaA1, Worksheet, shiftedRange, rowsShifted); + } + + internal static String ShiftFormulaRows(String formulaA1, XLWorksheet worksheetInAction, XLRange shiftedRange, + int rowsShifted) + { + if (XLHelper.IsNullOrWhiteSpace(formulaA1)) return String.Empty; + + var value = formulaA1; // ">" + formulaA1 + "<"; + + var regex = A1SimpleRegex; + + var sb = new StringBuilder(); + var lastIndex = 0; + + var shiftedWsName = shiftedRange.Worksheet.Name; + foreach (var match in regex.Matches(value).Cast()) + { + var matchString = match.Value; + var matchIndex = match.Index; + if (value.Substring(0, matchIndex).CharCount('"') % 2 == 0) + { + // Check that the match is not between quotes + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); + string sheetName; + var useSheetName = false; + if (matchString.Contains('!')) + { + sheetName = matchString.Substring(0, matchString.IndexOf('!')); + if (sheetName[0] == '\'') + sheetName = sheetName.Substring(1, sheetName.Length - 2); + useSheetName = true; + } + else + sheetName = worksheetInAction.Name; + + if (String.Compare(sheetName, shiftedWsName, true) == 0) + { + var rangeAddress = matchString.Substring(matchString.IndexOf('!') + 1); + if (!A1ColumnRegex.IsMatch(rangeAddress)) + { + var matchRange = worksheetInAction.Workbook.Worksheet(sheetName).Range(rangeAddress); + if (shiftedRange.RangeAddress.FirstAddress.RowNumber <= matchRange.RangeAddress.LastAddress.RowNumber + && shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= matchRange.RangeAddress.FirstAddress.ColumnNumber + && shiftedRange.RangeAddress.LastAddress.ColumnNumber >= matchRange.RangeAddress.LastAddress.ColumnNumber) + { + if (A1RowRegex.IsMatch(rangeAddress)) + { + var rows = rangeAddress.Split(':'); + var row1String = rows[0]; + var row2String = rows[1]; + string row1; + if (row1String[0] == '$') + { + row1 = "$" + + (Int32.Parse(row1String.Substring(1)) + rowsShifted).ToInvariantString(); + } + else + row1 = (Int32.Parse(row1String) + rowsShifted).ToInvariantString(); + + string row2; + if (row2String[0] == '$') + { + row2 = "$" + + (Int32.Parse(row2String.Substring(1)) + rowsShifted).ToInvariantString(); + } + else + row2 = (Int32.Parse(row2String) + rowsShifted).ToInvariantString(); + + sb.Append(useSheetName + ? String.Format("'{0}'!{1}:{2}", sheetName, row1, row2) + : String.Format("{0}:{1}", row1, row2)); + } + else if (shiftedRange.RangeAddress.FirstAddress.RowNumber <= + matchRange.RangeAddress.FirstAddress.RowNumber) + { + if (rangeAddress.Contains(':')) + { + if (useSheetName) + { + sb.Append(String.Format("'{0}'!{1}:{2}", + sheetName, + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + FirstAddress.RowNumber + + rowsShifted, + matchRange.RangeAddress. + FirstAddress.ColumnLetter, + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn), + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + LastAddress.RowNumber + + rowsShifted, + matchRange.RangeAddress. + LastAddress.ColumnLetter, + matchRange.RangeAddress. + LastAddress.FixedRow, + matchRange.RangeAddress. + LastAddress.FixedColumn))); + } + else + { + sb.Append(String.Format("{0}:{1}", + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + FirstAddress.RowNumber + + rowsShifted, + matchRange.RangeAddress. + FirstAddress.ColumnLetter, + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn), + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + LastAddress.RowNumber + + rowsShifted, + matchRange.RangeAddress. + LastAddress.ColumnLetter, + matchRange.RangeAddress. + LastAddress.FixedRow, + matchRange.RangeAddress. + LastAddress.FixedColumn))); + } + } + else + { + if (useSheetName) + { + sb.Append(String.Format("'{0}'!{1}", + sheetName, + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + FirstAddress.RowNumber + + rowsShifted, + matchRange.RangeAddress. + FirstAddress.ColumnLetter, + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn))); + } + else + { + sb.Append(String.Format("{0}", + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + FirstAddress.RowNumber + + rowsShifted, + matchRange.RangeAddress. + FirstAddress.ColumnLetter, + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn))); + } + } + } + else + { + if (useSheetName) + { + sb.Append(String.Format("'{0}'!{1}:{2}", + sheetName, + matchRange.RangeAddress.FirstAddress, + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + LastAddress.RowNumber + + rowsShifted, + matchRange.RangeAddress. + LastAddress.ColumnLetter, + matchRange.RangeAddress. + LastAddress.FixedRow, + matchRange.RangeAddress. + LastAddress.FixedColumn))); + } + else + { + sb.Append(String.Format("{0}:{1}", + matchRange.RangeAddress.FirstAddress, + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + LastAddress.RowNumber + + rowsShifted, + matchRange.RangeAddress. + LastAddress.ColumnLetter, + matchRange.RangeAddress. + LastAddress.FixedRow, + matchRange.RangeAddress. + LastAddress.FixedColumn))); + } + } + } + else + sb.Append(matchString); + } + else + sb.Append(matchString); + } + else + sb.Append(matchString); + } + else + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex + matchString.Length)); + lastIndex = matchIndex + matchString.Length; + } + + if (lastIndex < value.Length) + sb.Append(value.Substring(lastIndex)); + + return sb.ToString(); + + //string retVal = sb.ToString(); + //return retVal.Substring(1, retVal.Length - 2); + } + + internal void ShiftFormulaColumns(XLRange shiftedRange, int columnsShifted) + { + _formulaA1 = ShiftFormulaColumns(FormulaA1, Worksheet, shiftedRange, columnsShifted); + } + + internal static String ShiftFormulaColumns(String formulaA1, XLWorksheet worksheetInAction, XLRange shiftedRange, + int columnsShifted) + { + if (XLHelper.IsNullOrWhiteSpace(formulaA1)) return String.Empty; + + var value = formulaA1; // ">" + formulaA1 + "<"; + + var regex = A1SimpleRegex; + + var sb = new StringBuilder(); + var lastIndex = 0; + + foreach (var match in regex.Matches(value).Cast()) + { + var matchString = match.Value; + var matchIndex = match.Index; + if (value.Substring(0, matchIndex).CharCount('"') % 2 == 0) + { + // Check that the match is not between quotes + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); + string sheetName; + var useSheetName = false; + if (matchString.Contains('!')) + { + sheetName = matchString.Substring(0, matchString.IndexOf('!')); + if (sheetName[0] == '\'') + sheetName = sheetName.Substring(1, sheetName.Length - 2); + useSheetName = true; + } + else + sheetName = worksheetInAction.Name; + + if (String.Compare(sheetName, shiftedRange.Worksheet.Name, true) == 0) + { + var rangeAddress = matchString.Substring(matchString.IndexOf('!') + 1); + if (!A1RowRegex.IsMatch(rangeAddress)) + { + var matchRange = worksheetInAction.Workbook.Worksheet(sheetName).Range(rangeAddress); + if (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= + matchRange.RangeAddress.LastAddress.ColumnNumber + && + shiftedRange.RangeAddress.FirstAddress.RowNumber <= + matchRange.RangeAddress.FirstAddress.RowNumber + && + shiftedRange.RangeAddress.LastAddress.RowNumber >= + matchRange.RangeAddress.LastAddress.RowNumber) + { + if (A1ColumnRegex.IsMatch(rangeAddress)) + { + var columns = rangeAddress.Split(':'); + var column1String = columns[0]; + var column2String = columns[1]; + string column1; + if (column1String[0] == '$') + { + column1 = "$" + + XLHelper.GetColumnLetterFromNumber( + XLHelper.GetColumnNumberFromLetter( + column1String.Substring(1)) + columnsShifted); + } + else + { + column1 = + XLHelper.GetColumnLetterFromNumber( + XLHelper.GetColumnNumberFromLetter(column1String) + + columnsShifted); + } + + string column2; + if (column2String[0] == '$') + { + column2 = "$" + + XLHelper.GetColumnLetterFromNumber( + XLHelper.GetColumnNumberFromLetter( + column2String.Substring(1)) + columnsShifted); + } + else + { + column2 = + XLHelper.GetColumnLetterFromNumber( + XLHelper.GetColumnNumberFromLetter(column2String) + + columnsShifted); + } + + sb.Append(useSheetName + ? String.Format("'{0}'!{1}:{2}", sheetName, column1, column2) + : String.Format("{0}:{1}", column1, column2)); + } + else if (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= + matchRange.RangeAddress.FirstAddress.ColumnNumber) + { + if (rangeAddress.Contains(':')) + { + if (useSheetName) + { + sb.Append(String.Format("'{0}'!{1}:{2}", + sheetName, + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + FirstAddress.RowNumber, + matchRange.RangeAddress. + FirstAddress.ColumnNumber + + columnsShifted, + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn), + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + LastAddress.RowNumber, + matchRange.RangeAddress. + LastAddress.ColumnNumber + + columnsShifted, + matchRange.RangeAddress. + LastAddress.FixedRow, + matchRange.RangeAddress. + LastAddress.FixedColumn))); + } + else + { + sb.Append(String.Format("{0}:{1}", + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + FirstAddress.RowNumber, + matchRange.RangeAddress. + FirstAddress.ColumnNumber + + columnsShifted, + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn), + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + LastAddress.RowNumber, + matchRange.RangeAddress. + LastAddress.ColumnNumber + + columnsShifted, + matchRange.RangeAddress. + LastAddress.FixedRow, + matchRange.RangeAddress. + LastAddress.FixedColumn))); + } + } + else + { + if (useSheetName) + { + sb.Append(String.Format("'{0}'!{1}", + sheetName, + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + FirstAddress.RowNumber, + matchRange.RangeAddress. + FirstAddress.ColumnNumber + + columnsShifted, + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn))); + } + else + { + sb.Append(String.Format("{0}", + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + FirstAddress.RowNumber, + matchRange.RangeAddress. + FirstAddress.ColumnNumber + + columnsShifted, + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn))); + } + } + } + else + { + if (useSheetName) + { + sb.Append(String.Format("'{0}'!{1}:{2}", + sheetName, + matchRange.RangeAddress.FirstAddress, + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + LastAddress.RowNumber, + matchRange.RangeAddress. + LastAddress.ColumnNumber + + columnsShifted, + matchRange.RangeAddress. + LastAddress.FixedRow, + matchRange.RangeAddress. + LastAddress.FixedColumn))); + } + else + { + sb.Append(String.Format("{0}:{1}", + matchRange.RangeAddress.FirstAddress, + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + LastAddress.RowNumber, + matchRange.RangeAddress. + LastAddress.ColumnNumber + + columnsShifted, + matchRange.RangeAddress. + LastAddress.FixedRow, + matchRange.RangeAddress. + LastAddress.FixedColumn))); + } + } + } + else + sb.Append(matchString); + } + else + sb.Append(matchString); + } + else + sb.Append(matchString); + } + else + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex + matchString.Length)); + lastIndex = matchIndex + matchString.Length; + } + + if (lastIndex < value.Length) + sb.Append(value.Substring(lastIndex)); + + return sb.ToString(); + + //string retVal = sb.ToString(); + //return retVal.Substring(1, retVal.Length - 2); + } + + // -- + + private XLCell CellShift(Int32 rowsToShift, Int32 columnsToShift) + { + return Worksheet.Cell(Address.RowNumber + rowsToShift, Address.ColumnNumber + columnsToShift); + } + + #region Nested type: FormulaConversionType + + private enum FormulaConversionType + { + A1ToR1C1, + R1C1ToA1 + }; + + #endregion Nested type: FormulaConversionType + + #region XLCell Above + + IXLCell IXLCell.CellAbove() + { + return CellAbove(); + } + + IXLCell IXLCell.CellAbove(Int32 step) + { + return CellAbove(step); + } + + public XLCell CellAbove() + { + return CellAbove(1); + } + + public XLCell CellAbove(Int32 step) + { + return CellShift(step * -1, 0); + } + + #endregion XLCell Above + + #region XLCell Below + + IXLCell IXLCell.CellBelow() + { + return CellBelow(); + } + + IXLCell IXLCell.CellBelow(Int32 step) + { + return CellBelow(step); + } + + public XLCell CellBelow() + { + return CellBelow(1); + } + + public XLCell CellBelow(Int32 step) + { + return CellShift(step, 0); + } + + #endregion XLCell Below + + #region XLCell Left + + IXLCell IXLCell.CellLeft() + { + return CellLeft(); + } + + IXLCell IXLCell.CellLeft(Int32 step) + { + return CellLeft(step); + } + + public XLCell CellLeft() + { + return CellLeft(1); + } + + public XLCell CellLeft(Int32 step) + { + return CellShift(0, step * -1); + } + + #endregion XLCell Left + + #region XLCell Right + + IXLCell IXLCell.CellRight() + { + return CellRight(); + } + + IXLCell IXLCell.CellRight(Int32 step) + { + return CellRight(step); + } + + public XLCell CellRight() + { + return CellRight(1); + } + + public XLCell CellRight(Int32 step) + { + return CellShift(0, step); + } + + #endregion XLCell Right + + public Boolean HasFormula { get { return !XLHelper.IsNullOrWhiteSpace(FormulaA1); } } + + public IXLRangeAddress FormulaReference { get; set; } + } +} diff --git a/ClosedXML/Excel/Cells/XLCells.cs b/ClosedXML/Excel/Cells/XLCells.cs index 7b7eb6e..5f49b98 100644 --- a/ClosedXML/Excel/Cells/XLCells.cs +++ b/ClosedXML/Excel/Cells/XLCells.cs @@ -1,280 +1,280 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - using System.Linq; - - internal class XLCells : IXLCells, IXLStylized, IEnumerable - { - public Boolean StyleChanged { get; set; } - #region Fields - - private readonly bool _includeFormats; - private readonly List _rangeAddresses = new List(); - private readonly bool _usedCellsOnly; - private IXLStyle _style; - private readonly Func _predicate; - #endregion - - #region Constructor - - public XLCells(bool usedCellsOnly, bool includeFormats, Func predicate = null) - { - _style = new XLStyle(this, XLWorkbook.DefaultStyle); - _usedCellsOnly = usedCellsOnly; - _includeFormats = includeFormats; - _predicate = predicate; - } - - #endregion - - #region IEnumerable Members - - public IEnumerator GetEnumerator() - { - var cellsInRanges = new Dictionary>(); - Boolean oneRange = _rangeAddresses.Count == 1; - foreach (XLRangeAddress range in _rangeAddresses) - { - HashSet hash; - if (cellsInRanges.ContainsKey(range.Worksheet)) - hash = cellsInRanges[range.Worksheet]; - else - { - hash = new HashSet(); - cellsInRanges.Add(range.Worksheet, hash); - } - - if (_usedCellsOnly) - { - if (oneRange) - { - var cellRange = range.Worksheet.Internals.CellsCollection - .GetCells( - range.FirstAddress.RowNumber, - range.FirstAddress.ColumnNumber, - range.LastAddress.RowNumber, - range.LastAddress.ColumnNumber) - .Where(c => - !c.IsEmpty(_includeFormats) - && (_predicate == null || _predicate(c)) - ); - - foreach(var cell in cellRange) - { - yield return cell; - } - } - else - { - var tmpRange = range; - var addressList = range.Worksheet.Internals.CellsCollection - .GetSheetPoints( - tmpRange.FirstAddress.RowNumber, - tmpRange.FirstAddress.ColumnNumber, - tmpRange.LastAddress.RowNumber, - tmpRange.LastAddress.ColumnNumber); - - foreach (XLSheetPoint a in addressList.Where(a => !hash.Contains(a))) - { - hash.Add(a); - } - } - } - else - { - var mm = new MinMax - { - MinRow = range.FirstAddress.RowNumber, - MaxRow = range.LastAddress.RowNumber, - MinColumn = range.FirstAddress.ColumnNumber, - MaxColumn = range.LastAddress.ColumnNumber - }; - if (mm.MaxRow > 0 && mm.MaxColumn > 0) - { - for (Int32 ro = mm.MinRow; ro <= mm.MaxRow; ro++) - { - for (Int32 co = mm.MinColumn; co <= mm.MaxColumn; co++) - { - if (oneRange) - { - var c = range.Worksheet.Cell(ro, co); - if (_predicate == null || _predicate(c)) - yield return c; - } - else - { - var address = new XLSheetPoint(ro, co); - if (!hash.Contains(address)) - hash.Add(address); - } - } - } - } - } - } - - if (!oneRange) - { - if (_usedCellsOnly) - { - var cellRange = cellsInRanges.SelectMany( - cir => - cir.Value.Select(a => cir.Key.Internals.CellsCollection.GetCell(a)).Where( - cell => cell != null && ( - !cell.IsEmpty(_includeFormats) - && (_predicate == null || _predicate(cell)) - ))); - - foreach (var cell in cellRange) - { - yield return cell; - } - } - else - { - foreach (var cir in cellsInRanges) - { - foreach (XLSheetPoint a in cir.Value) - { - var c = cir.Key.Cell(a.Row, a.Column); - if (_predicate == null || _predicate(c)) - yield return c; - } - } - } - } - } - - #endregion - - #region IXLCells Members - - IEnumerator IEnumerable.GetEnumerator() - { - foreach (XLCell cell in this) - yield return cell; - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IXLStyle Style - { - get { return _style; } - set - { - _style = new XLStyle(this, value); - this.ForEach(c => c.Style = _style); - } - } - - public Object Value - { - set { this.ForEach(c => c.Value = value); } - } - - public IXLCells SetDataType(XLCellValues dataType) - { - this.ForEach(c => c.DataType = dataType); - return this; - } - - public XLCellValues DataType - { - set { this.ForEach(c => c.DataType = value); } - } - - - public IXLCells Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - this.ForEach(c => c.Clear(clearOptions)); - return this; - } - - public void DeleteComments() { - this.ForEach(c => c.DeleteComment()); - } - - public String FormulaA1 - { - set { this.ForEach(c => c.FormulaA1 = value); } - } - - public String FormulaR1C1 - { - set { this.ForEach(c => c.FormulaR1C1 = value); } - } - - #endregion - - #region IXLStylized Members - - public IEnumerable Styles - { - get - { - UpdatingStyle = true; - yield return _style; - foreach (XLCell c in this) - yield return c.Style; - UpdatingStyle = false; - } - } - - public Boolean UpdatingStyle { get; set; } - - public IXLStyle InnerStyle - { - get { return _style; } - set { _style = new XLStyle(this, value); } - } - - public IXLRanges RangesUsed - { - get - { - var retVal = new XLRanges(); - this.ForEach(c => retVal.Add(c.AsRange())); - return retVal; - } - } - - #endregion - - public void Add(XLRangeAddress rangeAddress) - { - _rangeAddresses.Add(rangeAddress); - } - - public void Add(XLCell cell) - { - _rangeAddresses.Add(new XLRangeAddress(cell.Address, cell.Address)); - } - - //-- - - #region Nested type: MinMax - - private struct MinMax - { - public Int32 MaxColumn; - public Int32 MaxRow; - public Int32 MinColumn; - public Int32 MinRow; - } - - #endregion - - public void Select() - { - foreach (var cell in this) - cell.Select(); - } - } +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Linq; + + internal class XLCells : IXLCells, IXLStylized, IEnumerable + { + public Boolean StyleChanged { get; set; } + #region Fields + + private readonly bool _includeFormats; + private readonly List _rangeAddresses = new List(); + private readonly bool _usedCellsOnly; + private IXLStyle _style; + private readonly Func _predicate; + #endregion + + #region Constructor + + public XLCells(bool usedCellsOnly, bool includeFormats, Func predicate = null) + { + _style = new XLStyle(this, XLWorkbook.DefaultStyle); + _usedCellsOnly = usedCellsOnly; + _includeFormats = includeFormats; + _predicate = predicate; + } + + #endregion + + #region IEnumerable Members + + public IEnumerator GetEnumerator() + { + var cellsInRanges = new Dictionary>(); + Boolean oneRange = _rangeAddresses.Count == 1; + foreach (XLRangeAddress range in _rangeAddresses) + { + HashSet hash; + if (cellsInRanges.ContainsKey(range.Worksheet)) + hash = cellsInRanges[range.Worksheet]; + else + { + hash = new HashSet(); + cellsInRanges.Add(range.Worksheet, hash); + } + + if (_usedCellsOnly) + { + if (oneRange) + { + var cellRange = range.Worksheet.Internals.CellsCollection + .GetCells( + range.FirstAddress.RowNumber, + range.FirstAddress.ColumnNumber, + range.LastAddress.RowNumber, + range.LastAddress.ColumnNumber) + .Where(c => + !c.IsEmpty(_includeFormats) + && (_predicate == null || _predicate(c)) + ); + + foreach(var cell in cellRange) + { + yield return cell; + } + } + else + { + var tmpRange = range; + var addressList = range.Worksheet.Internals.CellsCollection + .GetSheetPoints( + tmpRange.FirstAddress.RowNumber, + tmpRange.FirstAddress.ColumnNumber, + tmpRange.LastAddress.RowNumber, + tmpRange.LastAddress.ColumnNumber); + + foreach (XLSheetPoint a in addressList.Where(a => !hash.Contains(a))) + { + hash.Add(a); + } + } + } + else + { + var mm = new MinMax + { + MinRow = range.FirstAddress.RowNumber, + MaxRow = range.LastAddress.RowNumber, + MinColumn = range.FirstAddress.ColumnNumber, + MaxColumn = range.LastAddress.ColumnNumber + }; + if (mm.MaxRow > 0 && mm.MaxColumn > 0) + { + for (Int32 ro = mm.MinRow; ro <= mm.MaxRow; ro++) + { + for (Int32 co = mm.MinColumn; co <= mm.MaxColumn; co++) + { + if (oneRange) + { + var c = range.Worksheet.Cell(ro, co); + if (_predicate == null || _predicate(c)) + yield return c; + } + else + { + var address = new XLSheetPoint(ro, co); + if (!hash.Contains(address)) + hash.Add(address); + } + } + } + } + } + } + + if (!oneRange) + { + if (_usedCellsOnly) + { + var cellRange = cellsInRanges.SelectMany( + cir => + cir.Value.Select(a => cir.Key.Internals.CellsCollection.GetCell(a)).Where( + cell => cell != null && ( + !cell.IsEmpty(_includeFormats) + && (_predicate == null || _predicate(cell)) + ))); + + foreach (var cell in cellRange) + { + yield return cell; + } + } + else + { + foreach (var cir in cellsInRanges) + { + foreach (XLSheetPoint a in cir.Value) + { + var c = cir.Key.Cell(a.Row, a.Column); + if (_predicate == null || _predicate(c)) + yield return c; + } + } + } + } + } + + #endregion + + #region IXLCells Members + + IEnumerator IEnumerable.GetEnumerator() + { + foreach (XLCell cell in this) + yield return cell; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLStyle Style + { + get { return _style; } + set + { + _style = new XLStyle(this, value); + this.ForEach(c => c.Style = _style); + } + } + + public Object Value + { + set { this.ForEach(c => c.Value = value); } + } + + public IXLCells SetDataType(XLCellValues dataType) + { + this.ForEach(c => c.DataType = dataType); + return this; + } + + public XLCellValues DataType + { + set { this.ForEach(c => c.DataType = value); } + } + + + public IXLCells Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + this.ForEach(c => c.Clear(clearOptions)); + return this; + } + + public void DeleteComments() { + this.ForEach(c => c.DeleteComment()); + } + + public String FormulaA1 + { + set { this.ForEach(c => c.FormulaA1 = value); } + } + + public String FormulaR1C1 + { + set { this.ForEach(c => c.FormulaR1C1 = value); } + } + + #endregion + + #region IXLStylized Members + + public IEnumerable Styles + { + get + { + UpdatingStyle = true; + yield return _style; + foreach (XLCell c in this) + yield return c.Style; + UpdatingStyle = false; + } + } + + public Boolean UpdatingStyle { get; set; } + + public IXLStyle InnerStyle + { + get { return _style; } + set { _style = new XLStyle(this, value); } + } + + public IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion + + public void Add(XLRangeAddress rangeAddress) + { + _rangeAddresses.Add(rangeAddress); + } + + public void Add(XLCell cell) + { + _rangeAddresses.Add(new XLRangeAddress(cell.Address, cell.Address)); + } + + //-- + + #region Nested type: MinMax + + private struct MinMax + { + public Int32 MaxColumn; + public Int32 MaxRow; + public Int32 MinColumn; + public Int32 MinRow; + } + + #endregion + + public void Select() + { + foreach (var cell in this) + cell.Select(); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Cells/XLCellsCollection.cs b/ClosedXML/Excel/Cells/XLCellsCollection.cs index 6d91072..32a89aa 100644 --- a/ClosedXML/Excel/Cells/XLCellsCollection.cs +++ b/ClosedXML/Excel/Cells/XLCellsCollection.cs @@ -1,497 +1,497 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLCellsCollection - { - - private readonly Dictionary> rowsCollection = new Dictionary>(); - public readonly Dictionary ColumnsUsed = new Dictionary(); - public readonly Dictionary> deleted = new Dictionary>(); - - internal Dictionary> RowsCollection - { - get { return rowsCollection; } - } - - public Int32 MaxColumnUsed; - public Int32 MaxRowUsed; - public Dictionary RowsUsed = new Dictionary(); - - public XLCellsCollection() - { - Clear(); - } - - public Int32 Count { get; private set; } - - - public void Add(XLSheetPoint sheetPoint, XLCell cell) - { - Add(sheetPoint.Row, sheetPoint.Column, cell); - } - - public void Add(Int32 row, Int32 column, XLCell cell) - { - Count++; - - IncrementUsage(RowsUsed, row); - IncrementUsage(ColumnsUsed, column); - - Dictionary columnsCollection; - if (!rowsCollection.TryGetValue(row, out columnsCollection)) - { - columnsCollection = new Dictionary(); - rowsCollection.Add(row, columnsCollection); - } - columnsCollection.Add(column, cell); - if (row > MaxRowUsed) MaxRowUsed = row; - if (column > MaxColumnUsed) MaxColumnUsed = column; - - HashSet delHash; - if (deleted.TryGetValue(row, out delHash)) - delHash.Remove(column); - } - - private static void IncrementUsage(Dictionary dictionary, Int32 key) - { - if (dictionary.ContainsKey(key)) - dictionary[key]++; - else - dictionary.Add(key, 1); - } - - private static void DecrementUsage(Dictionary dictionary, Int32 key) - { - Int32 count; - if (!dictionary.TryGetValue(key, out count)) return; - - if (count > 0) - dictionary[key]--; - else - dictionary.Remove(key); - } - - public void Clear() - { - Count = 0; - RowsUsed.Clear(); - ColumnsUsed.Clear(); - - rowsCollection.Clear(); - MaxRowUsed = 0; - MaxColumnUsed = 0; - } - - public void Remove(XLSheetPoint sheetPoint) - { - Remove(sheetPoint.Row, sheetPoint.Column); - } - - public void Remove(Int32 row, Int32 column) - { - Count--; - DecrementUsage(RowsUsed, row); - DecrementUsage(ColumnsUsed, row); - - HashSet delHash; - if (deleted.TryGetValue(row, out delHash)) - { - if (!delHash.Contains(column)) - delHash.Add(column); - } - else - { - delHash = new HashSet(); - delHash.Add(column); - deleted.Add(row, delHash); - } - - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(row, out columnsCollection)) - { - columnsCollection.Remove(column); - if (columnsCollection.Count == 0) - { - rowsCollection.Remove(row); - } - } - - - } - - internal IEnumerable GetCells(Int32 rowStart, Int32 columnStart, - Int32 rowEnd, Int32 columnEnd, - Func predicate = null) - { - int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; - int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; - for (int ro = rowStart; ro <= finalRow; ro++) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(ro, out columnsCollection)) - { - for (int co = columnStart; co <= finalColumn; co++) - { - XLCell cell; - if (columnsCollection.TryGetValue(co, out cell) - && (predicate == null || predicate(cell))) - yield return cell; - } - } - } - } - - internal HashSet GetStyleIds(Int32 initial) - { - HashSet ids = new HashSet(); - ids.Add(initial); - foreach (var row in rowsCollection) - { - foreach (var column in row.Value) - { - var id = column.Value.GetStyleId(); - if (!ids.Contains(id)) - { - ids.Add(id); - } - } - } - return ids; - } - - - internal IEnumerable GetCellsUsed(Int32 rowStart, Int32 columnStart, - Int32 rowEnd, Int32 columnEnd, - Boolean includeFormats, Func predicate = null) - { - int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; - int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; - for (int ro = rowStart; ro <= finalRow; ro++) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(ro, out columnsCollection)) - { - for (int co = columnStart; co <= finalColumn; co++) - { - XLCell cell; - if (columnsCollection.TryGetValue(co, out cell) - && !cell.IsEmpty(includeFormats) - && (predicate == null || predicate(cell))) - yield return cell; - } - } - } - - } - - public XLSheetPoint FirstPointUsed(Int32 rowStart, Int32 columnStart, - Int32 rowEnd, Int32 columnEnd, Boolean includeFormats = false, Func predicate = null) - { - int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; - int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; - - var firstRow = FirstRowUsed(rowStart, columnStart, finalRow, finalColumn, includeFormats, predicate); - if (firstRow == 0) return new XLSheetPoint(0, 0); - - var firstColumn = FirstColumnUsed(rowStart, columnStart, finalRow, finalColumn, includeFormats, predicate); - if (firstColumn == 0) return new XLSheetPoint(0, 0); - - return new XLSheetPoint(firstRow, firstColumn); - } - - public XLSheetPoint LastPointUsed(Int32 rowStart, Int32 columnStart, - Int32 rowEnd, Int32 columnEnd, Boolean includeFormats = false, Func predicate = null) - { - int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; - int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; - - var firstRow = LastRowUsed(rowStart, columnStart, finalRow, finalColumn, includeFormats, predicate); - if (firstRow == 0) return new XLSheetPoint(0, 0); - - var firstColumn = LastColumnUsed(rowStart, columnStart, finalRow, finalColumn, includeFormats, predicate); - if (firstColumn == 0) return new XLSheetPoint(0, 0); - - return new XLSheetPoint(firstRow, firstColumn); - } - - public int FirstRowUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, Boolean includeFormats, - Func predicate = null) - { - int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; - int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; - for (int ro = rowStart; ro <= finalRow; ro++) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(ro, out columnsCollection)) - { - for (int co = columnStart; co <= finalColumn; co++) - { - XLCell cell; - if (columnsCollection.TryGetValue(co, out cell) - && !cell.IsEmpty(includeFormats) - && (predicate == null || predicate(cell))) - return ro; - } - } - } - - return 0; - } - - public int FirstColumnUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, Boolean includeFormats, Func predicate = null) - { - int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; - int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; - for (int ro = rowStart; ro <= finalRow; ro++) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(ro, out columnsCollection)) - { - for (int co = columnStart; co <= finalColumn; co++) - { - XLCell cell; - if (columnsCollection.TryGetValue(co, out cell) - && !cell.IsEmpty(includeFormats) - && (predicate == null || predicate(cell))) - return co; - } - } - } - - return 0; - } - - - public int LastRowUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, Boolean includeFormats, Func predicate = null) - { - int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; - int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; - for (int ro = finalRow; ro >= rowStart; ro--) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(ro, out columnsCollection)) - { - for (int co = finalColumn; co >= columnStart; co--) - { - XLCell cell; - if (columnsCollection.TryGetValue(co, out cell) - && !cell.IsEmpty(includeFormats) - && (predicate == null || predicate(cell))) - return ro; - } - } - } - return 0; - } - - public int LastColumnUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, Boolean includeFormats, Func predicate = null) - { - int maxCo = 0; - int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; - int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; - for (int ro = finalRow; ro >= rowStart; ro--) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(ro, out columnsCollection)) - { - for (int co = finalColumn; co >= columnStart && co > maxCo; co--) - { - XLCell cell; - if (columnsCollection.TryGetValue(co, out cell) - && !cell.IsEmpty(includeFormats) - && (predicate == null || predicate(cell))) - maxCo = co; - } - } - } - return maxCo; - } - - public void RemoveAll(Int32 rowStart, Int32 columnStart, - Int32 rowEnd, Int32 columnEnd) - { - int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; - int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; - for (int ro = rowStart; ro <= finalRow; ro++) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(ro, out columnsCollection)) - { - for (int co = columnStart; co <= finalColumn; co++) - { - if (columnsCollection.ContainsKey(co)) - Remove(ro, co); - } - } - } - } - - public IEnumerable GetSheetPoints(Int32 rowStart, Int32 columnStart, - Int32 rowEnd, Int32 columnEnd) - { - int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; - int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; - for (int ro = rowStart; ro <= finalRow; ro++) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(ro, out columnsCollection)) - { - for (int co = columnStart; co <= finalColumn; co++) - { - if (columnsCollection.ContainsKey(co)) - yield return new XLSheetPoint(ro, co); - } - } - } - } - - public XLCell GetCell(Int32 row, Int32 column) - { - if (row > MaxRowUsed || column > MaxColumnUsed) - return null; - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(row, out columnsCollection)) - { - XLCell cell; - return columnsCollection.TryGetValue(column, out cell) ? cell : null; - } - return null; - } - - public XLCell GetCell(XLSheetPoint sp) - { - return GetCell(sp.Row, sp.Column); - } - - internal void SwapRanges(XLSheetRange sheetRange1, XLSheetRange sheetRange2, XLWorksheet worksheet) - { - Int32 rowCount = sheetRange1.LastPoint.Row - sheetRange1.FirstPoint.Row + 1; - Int32 columnCount = sheetRange1.LastPoint.Column - sheetRange1.FirstPoint.Column + 1; - for (int row = 0; row < rowCount; row++) - { - for (int column = 0; column < columnCount; column++) - { - var sp1 = new XLSheetPoint(sheetRange1.FirstPoint.Row + row, sheetRange1.FirstPoint.Column + column); - var sp2 = new XLSheetPoint(sheetRange2.FirstPoint.Row + row, sheetRange2.FirstPoint.Column + column); - var cell1 = GetCell(sp1); - var cell2 = GetCell(sp2); - - if (cell1 == null) cell1 = worksheet.Cell(sp1.Row, sp1.Column); - if (cell2 == null) cell2 = worksheet.Cell(sp2.Row, sp2.Column); - - //if (cell1 != null) - //{ - cell1.Address = new XLAddress(cell1.Worksheet, sp2.Row, sp2.Column, false, false); - Remove(sp1); - //if (cell2 != null) - Add(sp1, cell2); - //} - - //if (cell2 == null) continue; - - cell2.Address = new XLAddress(cell2.Worksheet, sp1.Row, sp1.Column, false, false); - Remove(sp2); - //if (cell1 != null) - Add(sp2, cell1); - } - } - } - - internal IEnumerable GetCells() - { - return GetCells(1, 1, MaxRowUsed, MaxColumnUsed); - } - - internal IEnumerable GetCells(Func predicate) - { - for (int ro = 1; ro <= MaxRowUsed; ro++) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(ro, out columnsCollection)) - { - for (int co = 1; co <= MaxColumnUsed; co++) - { - XLCell cell; - if (columnsCollection.TryGetValue(co, out cell) - && (predicate == null || predicate(cell))) - yield return cell; - } - } - } - - } - - public Boolean Contains(Int32 row, Int32 column) - { - Dictionary columnsCollection; - return rowsCollection.TryGetValue(row, out columnsCollection) && columnsCollection.ContainsKey(column); - } - - public Int32 MinRowInColumn(Int32 column) - { - for (int row = 1; row <= MaxRowUsed; row++) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(row, out columnsCollection)) - { - if (columnsCollection.ContainsKey(column)) - return row; - } - } - - return 0; - } - - public Int32 MaxRowInColumn(Int32 column) - { - for (int row = MaxRowUsed; row >= 1; row--) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(row, out columnsCollection)) - { - if (columnsCollection.ContainsKey(column)) - return row; - } - } - - return 0; - } - - public Int32 MinColumnInRow(Int32 row) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(row, out columnsCollection)) - { - if (columnsCollection.Count > 0) - return columnsCollection.Keys.Min(); - } - - return 0; - } - - public Int32 MaxColumnInRow(Int32 row) - { - Dictionary columnsCollection; - if (rowsCollection.TryGetValue(row, out columnsCollection)) - { - if (columnsCollection.Count > 0) - return columnsCollection.Keys.Max(); - } - - return 0; - } - - public IEnumerable GetCellsInColumn(Int32 column) - { - return GetCells(1, column, MaxRowUsed, column); - } - - public IEnumerable GetCellsInRow(Int32 row) - { - return GetCells(row, 1, row, MaxColumnUsed); - } - } +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLCellsCollection + { + + private readonly Dictionary> rowsCollection = new Dictionary>(); + public readonly Dictionary ColumnsUsed = new Dictionary(); + public readonly Dictionary> deleted = new Dictionary>(); + + internal Dictionary> RowsCollection + { + get { return rowsCollection; } + } + + public Int32 MaxColumnUsed; + public Int32 MaxRowUsed; + public Dictionary RowsUsed = new Dictionary(); + + public XLCellsCollection() + { + Clear(); + } + + public Int32 Count { get; private set; } + + + public void Add(XLSheetPoint sheetPoint, XLCell cell) + { + Add(sheetPoint.Row, sheetPoint.Column, cell); + } + + public void Add(Int32 row, Int32 column, XLCell cell) + { + Count++; + + IncrementUsage(RowsUsed, row); + IncrementUsage(ColumnsUsed, column); + + Dictionary columnsCollection; + if (!rowsCollection.TryGetValue(row, out columnsCollection)) + { + columnsCollection = new Dictionary(); + rowsCollection.Add(row, columnsCollection); + } + columnsCollection.Add(column, cell); + if (row > MaxRowUsed) MaxRowUsed = row; + if (column > MaxColumnUsed) MaxColumnUsed = column; + + HashSet delHash; + if (deleted.TryGetValue(row, out delHash)) + delHash.Remove(column); + } + + private static void IncrementUsage(Dictionary dictionary, Int32 key) + { + if (dictionary.ContainsKey(key)) + dictionary[key]++; + else + dictionary.Add(key, 1); + } + + private static void DecrementUsage(Dictionary dictionary, Int32 key) + { + Int32 count; + if (!dictionary.TryGetValue(key, out count)) return; + + if (count > 0) + dictionary[key]--; + else + dictionary.Remove(key); + } + + public void Clear() + { + Count = 0; + RowsUsed.Clear(); + ColumnsUsed.Clear(); + + rowsCollection.Clear(); + MaxRowUsed = 0; + MaxColumnUsed = 0; + } + + public void Remove(XLSheetPoint sheetPoint) + { + Remove(sheetPoint.Row, sheetPoint.Column); + } + + public void Remove(Int32 row, Int32 column) + { + Count--; + DecrementUsage(RowsUsed, row); + DecrementUsage(ColumnsUsed, row); + + HashSet delHash; + if (deleted.TryGetValue(row, out delHash)) + { + if (!delHash.Contains(column)) + delHash.Add(column); + } + else + { + delHash = new HashSet(); + delHash.Add(column); + deleted.Add(row, delHash); + } + + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(row, out columnsCollection)) + { + columnsCollection.Remove(column); + if (columnsCollection.Count == 0) + { + rowsCollection.Remove(row); + } + } + + + } + + internal IEnumerable GetCells(Int32 rowStart, Int32 columnStart, + Int32 rowEnd, Int32 columnEnd, + Func predicate = null) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = rowStart; ro <= finalRow; ro++) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(ro, out columnsCollection)) + { + for (int co = columnStart; co <= finalColumn; co++) + { + XLCell cell; + if (columnsCollection.TryGetValue(co, out cell) + && (predicate == null || predicate(cell))) + yield return cell; + } + } + } + } + + internal HashSet GetStyleIds(Int32 initial) + { + HashSet ids = new HashSet(); + ids.Add(initial); + foreach (var row in rowsCollection) + { + foreach (var column in row.Value) + { + var id = column.Value.GetStyleId(); + if (!ids.Contains(id)) + { + ids.Add(id); + } + } + } + return ids; + } + + + internal IEnumerable GetCellsUsed(Int32 rowStart, Int32 columnStart, + Int32 rowEnd, Int32 columnEnd, + Boolean includeFormats, Func predicate = null) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = rowStart; ro <= finalRow; ro++) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(ro, out columnsCollection)) + { + for (int co = columnStart; co <= finalColumn; co++) + { + XLCell cell; + if (columnsCollection.TryGetValue(co, out cell) + && !cell.IsEmpty(includeFormats) + && (predicate == null || predicate(cell))) + yield return cell; + } + } + } + + } + + public XLSheetPoint FirstPointUsed(Int32 rowStart, Int32 columnStart, + Int32 rowEnd, Int32 columnEnd, Boolean includeFormats = false, Func predicate = null) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + + var firstRow = FirstRowUsed(rowStart, columnStart, finalRow, finalColumn, includeFormats, predicate); + if (firstRow == 0) return new XLSheetPoint(0, 0); + + var firstColumn = FirstColumnUsed(rowStart, columnStart, finalRow, finalColumn, includeFormats, predicate); + if (firstColumn == 0) return new XLSheetPoint(0, 0); + + return new XLSheetPoint(firstRow, firstColumn); + } + + public XLSheetPoint LastPointUsed(Int32 rowStart, Int32 columnStart, + Int32 rowEnd, Int32 columnEnd, Boolean includeFormats = false, Func predicate = null) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + + var firstRow = LastRowUsed(rowStart, columnStart, finalRow, finalColumn, includeFormats, predicate); + if (firstRow == 0) return new XLSheetPoint(0, 0); + + var firstColumn = LastColumnUsed(rowStart, columnStart, finalRow, finalColumn, includeFormats, predicate); + if (firstColumn == 0) return new XLSheetPoint(0, 0); + + return new XLSheetPoint(firstRow, firstColumn); + } + + public int FirstRowUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, Boolean includeFormats, + Func predicate = null) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = rowStart; ro <= finalRow; ro++) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(ro, out columnsCollection)) + { + for (int co = columnStart; co <= finalColumn; co++) + { + XLCell cell; + if (columnsCollection.TryGetValue(co, out cell) + && !cell.IsEmpty(includeFormats) + && (predicate == null || predicate(cell))) + return ro; + } + } + } + + return 0; + } + + public int FirstColumnUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, Boolean includeFormats, Func predicate = null) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = rowStart; ro <= finalRow; ro++) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(ro, out columnsCollection)) + { + for (int co = columnStart; co <= finalColumn; co++) + { + XLCell cell; + if (columnsCollection.TryGetValue(co, out cell) + && !cell.IsEmpty(includeFormats) + && (predicate == null || predicate(cell))) + return co; + } + } + } + + return 0; + } + + + public int LastRowUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, Boolean includeFormats, Func predicate = null) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = finalRow; ro >= rowStart; ro--) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(ro, out columnsCollection)) + { + for (int co = finalColumn; co >= columnStart; co--) + { + XLCell cell; + if (columnsCollection.TryGetValue(co, out cell) + && !cell.IsEmpty(includeFormats) + && (predicate == null || predicate(cell))) + return ro; + } + } + } + return 0; + } + + public int LastColumnUsed(int rowStart, int columnStart, int rowEnd, int columnEnd, Boolean includeFormats, Func predicate = null) + { + int maxCo = 0; + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = finalRow; ro >= rowStart; ro--) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(ro, out columnsCollection)) + { + for (int co = finalColumn; co >= columnStart && co > maxCo; co--) + { + XLCell cell; + if (columnsCollection.TryGetValue(co, out cell) + && !cell.IsEmpty(includeFormats) + && (predicate == null || predicate(cell))) + maxCo = co; + } + } + } + return maxCo; + } + + public void RemoveAll(Int32 rowStart, Int32 columnStart, + Int32 rowEnd, Int32 columnEnd) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = rowStart; ro <= finalRow; ro++) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(ro, out columnsCollection)) + { + for (int co = columnStart; co <= finalColumn; co++) + { + if (columnsCollection.ContainsKey(co)) + Remove(ro, co); + } + } + } + } + + public IEnumerable GetSheetPoints(Int32 rowStart, Int32 columnStart, + Int32 rowEnd, Int32 columnEnd) + { + int finalRow = rowEnd > MaxRowUsed ? MaxRowUsed : rowEnd; + int finalColumn = columnEnd > MaxColumnUsed ? MaxColumnUsed : columnEnd; + for (int ro = rowStart; ro <= finalRow; ro++) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(ro, out columnsCollection)) + { + for (int co = columnStart; co <= finalColumn; co++) + { + if (columnsCollection.ContainsKey(co)) + yield return new XLSheetPoint(ro, co); + } + } + } + } + + public XLCell GetCell(Int32 row, Int32 column) + { + if (row > MaxRowUsed || column > MaxColumnUsed) + return null; + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(row, out columnsCollection)) + { + XLCell cell; + return columnsCollection.TryGetValue(column, out cell) ? cell : null; + } + return null; + } + + public XLCell GetCell(XLSheetPoint sp) + { + return GetCell(sp.Row, sp.Column); + } + + internal void SwapRanges(XLSheetRange sheetRange1, XLSheetRange sheetRange2, XLWorksheet worksheet) + { + Int32 rowCount = sheetRange1.LastPoint.Row - sheetRange1.FirstPoint.Row + 1; + Int32 columnCount = sheetRange1.LastPoint.Column - sheetRange1.FirstPoint.Column + 1; + for (int row = 0; row < rowCount; row++) + { + for (int column = 0; column < columnCount; column++) + { + var sp1 = new XLSheetPoint(sheetRange1.FirstPoint.Row + row, sheetRange1.FirstPoint.Column + column); + var sp2 = new XLSheetPoint(sheetRange2.FirstPoint.Row + row, sheetRange2.FirstPoint.Column + column); + var cell1 = GetCell(sp1); + var cell2 = GetCell(sp2); + + if (cell1 == null) cell1 = worksheet.Cell(sp1.Row, sp1.Column); + if (cell2 == null) cell2 = worksheet.Cell(sp2.Row, sp2.Column); + + //if (cell1 != null) + //{ + cell1.Address = new XLAddress(cell1.Worksheet, sp2.Row, sp2.Column, false, false); + Remove(sp1); + //if (cell2 != null) + Add(sp1, cell2); + //} + + //if (cell2 == null) continue; + + cell2.Address = new XLAddress(cell2.Worksheet, sp1.Row, sp1.Column, false, false); + Remove(sp2); + //if (cell1 != null) + Add(sp2, cell1); + } + } + } + + internal IEnumerable GetCells() + { + return GetCells(1, 1, MaxRowUsed, MaxColumnUsed); + } + + internal IEnumerable GetCells(Func predicate) + { + for (int ro = 1; ro <= MaxRowUsed; ro++) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(ro, out columnsCollection)) + { + for (int co = 1; co <= MaxColumnUsed; co++) + { + XLCell cell; + if (columnsCollection.TryGetValue(co, out cell) + && (predicate == null || predicate(cell))) + yield return cell; + } + } + } + + } + + public Boolean Contains(Int32 row, Int32 column) + { + Dictionary columnsCollection; + return rowsCollection.TryGetValue(row, out columnsCollection) && columnsCollection.ContainsKey(column); + } + + public Int32 MinRowInColumn(Int32 column) + { + for (int row = 1; row <= MaxRowUsed; row++) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(row, out columnsCollection)) + { + if (columnsCollection.ContainsKey(column)) + return row; + } + } + + return 0; + } + + public Int32 MaxRowInColumn(Int32 column) + { + for (int row = MaxRowUsed; row >= 1; row--) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(row, out columnsCollection)) + { + if (columnsCollection.ContainsKey(column)) + return row; + } + } + + return 0; + } + + public Int32 MinColumnInRow(Int32 row) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(row, out columnsCollection)) + { + if (columnsCollection.Count > 0) + return columnsCollection.Keys.Min(); + } + + return 0; + } + + public Int32 MaxColumnInRow(Int32 row) + { + Dictionary columnsCollection; + if (rowsCollection.TryGetValue(row, out columnsCollection)) + { + if (columnsCollection.Count > 0) + return columnsCollection.Keys.Max(); + } + + return 0; + } + + public IEnumerable GetCellsInColumn(Int32 column) + { + return GetCells(1, column, MaxRowUsed, column); + } + + public IEnumerable GetCellsInRow(Int32 row) + { + return GetCells(row, 1, row, MaxColumnUsed); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Charts/IXLChart.cs b/ClosedXML/Excel/Charts/IXLChart.cs index 63af704..7cfc813 100644 --- a/ClosedXML/Excel/Charts/IXLChart.cs +++ b/ClosedXML/Excel/Charts/IXLChart.cs @@ -1,90 +1,90 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLChartType { - Area, - Area3D, - AreaStacked, - AreaStacked100Percent, - AreaStacked100Percent3D, - AreaStacked3D, - BarClustered, - BarClustered3D, - BarStacked, - BarStacked100Percent, - BarStacked100Percent3D, - BarStacked3D, - Bubble, - Bubble3D, - Column3D, - ColumnClustered, - ColumnClustered3D, - ColumnStacked, - ColumnStacked100Percent, - ColumnStacked100Percent3D, - ColumnStacked3D, - Cone, - ConeClustered, - ConeHorizontalClustered, - ConeHorizontalStacked, - ConeHorizontalStacked100Percent, - ConeStacked, - ConeStacked100Percent, - Cylinder, - CylinderClustered, - CylinderHorizontalClustered, - CylinderHorizontalStacked, - CylinderHorizontalStacked100Percent, - CylinderStacked, - CylinderStacked100Percent, - Doughnut, - DoughnutExploded, - Line, - Line3D, - LineStacked, - LineStacked100Percent, - LineWithMarkers, - LineWithMarkersStacked, - LineWithMarkersStacked100Percent, - Pie, - Pie3D, - PieExploded, - PieExploded3D, - PieToBar, - PieToPie, - Pyramid, - PyramidClustered, - PyramidHorizontalClustered, - PyramidHorizontalStacked, - PyramidHorizontalStacked100Percent, - PyramidStacked, - PyramidStacked100Percent, - Radar, - RadarFilled, - RadarWithMarkers, - StockHighLowClose, - StockOpenHighLowClose, - StockVolumeHighLowClose, - StockVolumeOpenHighLowClose, - Surface, - SurfaceContour, - SurfaceContourWireframe, - SurfaceWireframe, - XYScatterMarkers, - XYScatterSmoothLinesNoMarkers, - XYScatterSmoothLinesWithMarkers, - XYScatterStraightLinesNoMarkers, - XYScatterStraightLinesWithMarkers - } - public interface IXLChart: IXLDrawing - { - Boolean RightAngleAxes { get; set; } - IXLChart SetRightAngleAxes(); - IXLChart SetRightAngleAxes(Boolean rightAngleAxes); - - XLChartType ChartType { get; set; } - IXLChart SetChartType(XLChartType chartType); - - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLChartType { + Area, + Area3D, + AreaStacked, + AreaStacked100Percent, + AreaStacked100Percent3D, + AreaStacked3D, + BarClustered, + BarClustered3D, + BarStacked, + BarStacked100Percent, + BarStacked100Percent3D, + BarStacked3D, + Bubble, + Bubble3D, + Column3D, + ColumnClustered, + ColumnClustered3D, + ColumnStacked, + ColumnStacked100Percent, + ColumnStacked100Percent3D, + ColumnStacked3D, + Cone, + ConeClustered, + ConeHorizontalClustered, + ConeHorizontalStacked, + ConeHorizontalStacked100Percent, + ConeStacked, + ConeStacked100Percent, + Cylinder, + CylinderClustered, + CylinderHorizontalClustered, + CylinderHorizontalStacked, + CylinderHorizontalStacked100Percent, + CylinderStacked, + CylinderStacked100Percent, + Doughnut, + DoughnutExploded, + Line, + Line3D, + LineStacked, + LineStacked100Percent, + LineWithMarkers, + LineWithMarkersStacked, + LineWithMarkersStacked100Percent, + Pie, + Pie3D, + PieExploded, + PieExploded3D, + PieToBar, + PieToPie, + Pyramid, + PyramidClustered, + PyramidHorizontalClustered, + PyramidHorizontalStacked, + PyramidHorizontalStacked100Percent, + PyramidStacked, + PyramidStacked100Percent, + Radar, + RadarFilled, + RadarWithMarkers, + StockHighLowClose, + StockOpenHighLowClose, + StockVolumeHighLowClose, + StockVolumeOpenHighLowClose, + Surface, + SurfaceContour, + SurfaceContourWireframe, + SurfaceWireframe, + XYScatterMarkers, + XYScatterSmoothLinesNoMarkers, + XYScatterSmoothLinesWithMarkers, + XYScatterStraightLinesNoMarkers, + XYScatterStraightLinesWithMarkers + } + public interface IXLChart: IXLDrawing + { + Boolean RightAngleAxes { get; set; } + IXLChart SetRightAngleAxes(); + IXLChart SetRightAngleAxes(Boolean rightAngleAxes); + + XLChartType ChartType { get; set; } + IXLChart SetChartType(XLChartType chartType); + + } +} diff --git a/ClosedXML/Excel/Charts/IXLCharts.cs b/ClosedXML/Excel/Charts/IXLCharts.cs index 2e21d09..70c1478 100644 --- a/ClosedXML/Excel/Charts/IXLCharts.cs +++ b/ClosedXML/Excel/Charts/IXLCharts.cs @@ -1,9 +1,9 @@ -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLCharts: IEnumerable - { - void Add(IXLChart chart); - } -} +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLCharts: IEnumerable + { + void Add(IXLChart chart); + } +} diff --git a/ClosedXML/Excel/Charts/XLChart.cs b/ClosedXML/Excel/Charts/XLChart.cs index 75de711..d928e6c 100644 --- a/ClosedXML/Excel/Charts/XLChart.cs +++ b/ClosedXML/Excel/Charts/XLChart.cs @@ -1,161 +1,161 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal enum XLChartTypeCategory { Bar3D } - internal enum XLBarOrientation { Vertical, Horizontal } - internal enum XLBarGrouping { Clustered, Percent, Stacked, Standard } - internal class XLChart: XLDrawing, IXLChart - { - internal IXLWorksheet worksheet; - public XLChart(XLWorksheet worksheet) - { - Container = this; - this.worksheet = worksheet; - Int32 zOrder; - if (worksheet.Charts.Any()) - zOrder = worksheet.Charts.Max(c => c.ZOrder) + 1; - else - zOrder = 1; - ZOrder = zOrder; - ShapeId = worksheet.Workbook.ShapeIdManager.GetNext(); - RightAngleAxes = true; - } - - public Boolean RightAngleAxes { get; set; } - public IXLChart SetRightAngleAxes() - { - RightAngleAxes = true; - return this; - } - public IXLChart SetRightAngleAxes(Boolean rightAngleAxes) - { - RightAngleAxes = rightAngleAxes; - return this; - } - - public XLChartType ChartType { get; set; } - public IXLChart SetChartType(XLChartType chartType) - { - ChartType = chartType; - return this; - } - - public XLChartTypeCategory ChartTypeCategory - { - get - { - if (Bar3DCharts.Contains(ChartType)) - return XLChartTypeCategory.Bar3D; - else - throw new NotImplementedException(); - - } - } - - private HashSet Bar3DCharts = new HashSet { - XLChartType.BarClustered3D, - XLChartType.BarStacked100Percent3D, - XLChartType.BarStacked3D, - XLChartType.Column3D, - XLChartType.ColumnClustered3D, - XLChartType.ColumnStacked100Percent3D, - XLChartType.ColumnStacked3D - }; - - public XLBarOrientation BarOrientation - { - get - { - if (HorizontalCharts.Contains(ChartType)) - return XLBarOrientation.Horizontal; - else - return XLBarOrientation.Vertical; - } - } - - private HashSet HorizontalCharts = new HashSet{ - XLChartType.BarClustered, - XLChartType.BarClustered3D, - XLChartType.BarStacked, - XLChartType.BarStacked100Percent, - XLChartType.BarStacked100Percent3D, - XLChartType.BarStacked3D, - XLChartType.ConeHorizontalClustered, - XLChartType.ConeHorizontalStacked, - XLChartType.ConeHorizontalStacked100Percent, - XLChartType.CylinderHorizontalClustered, - XLChartType.CylinderHorizontalStacked, - XLChartType.CylinderHorizontalStacked100Percent, - XLChartType.PyramidHorizontalClustered, - XLChartType.PyramidHorizontalStacked, - XLChartType.PyramidHorizontalStacked100Percent - }; - - public XLBarGrouping BarGrouping - { - get - { - if (ClusteredCharts.Contains(ChartType)) - return XLBarGrouping.Clustered; - else if (PercentCharts.Contains(ChartType)) - return XLBarGrouping.Percent; - else if (StackedCharts.Contains(ChartType)) - return XLBarGrouping.Stacked; - else - return XLBarGrouping.Standard; - } - } - - public HashSet ClusteredCharts = new HashSet() - { - XLChartType.BarClustered, - XLChartType.BarClustered3D, - XLChartType.ColumnClustered, - XLChartType.ColumnClustered3D, - XLChartType.ConeClustered, - XLChartType.ConeHorizontalClustered, - XLChartType.CylinderClustered, - XLChartType.CylinderHorizontalClustered, - XLChartType.PyramidClustered, - XLChartType.PyramidHorizontalClustered - }; - - public HashSet PercentCharts = new HashSet() { - XLChartType.AreaStacked100Percent, - XLChartType.AreaStacked100Percent3D, - XLChartType.BarStacked100Percent, - XLChartType.BarStacked100Percent3D, - XLChartType.ColumnStacked100Percent, - XLChartType.ColumnStacked100Percent3D, - XLChartType.ConeHorizontalStacked100Percent, - XLChartType.ConeStacked100Percent, - XLChartType.CylinderHorizontalStacked100Percent, - XLChartType.CylinderStacked100Percent, - XLChartType.LineStacked100Percent, - XLChartType.LineWithMarkersStacked100Percent, - XLChartType.PyramidHorizontalStacked100Percent, - XLChartType.PyramidStacked100Percent - }; - - public HashSet StackedCharts = new HashSet() - { - XLChartType.AreaStacked, - XLChartType.AreaStacked3D, - XLChartType.BarStacked, - XLChartType.BarStacked3D, - XLChartType.ColumnStacked, - XLChartType.ColumnStacked3D, - XLChartType.ConeHorizontalStacked, - XLChartType.ConeStacked, - XLChartType.CylinderHorizontalStacked, - XLChartType.CylinderStacked, - XLChartType.LineStacked, - XLChartType.LineWithMarkersStacked, - XLChartType.PyramidHorizontalStacked, - XLChartType.PyramidStacked - }; - } -} +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal enum XLChartTypeCategory { Bar3D } + internal enum XLBarOrientation { Vertical, Horizontal } + internal enum XLBarGrouping { Clustered, Percent, Stacked, Standard } + internal class XLChart: XLDrawing, IXLChart + { + internal IXLWorksheet worksheet; + public XLChart(XLWorksheet worksheet) + { + Container = this; + this.worksheet = worksheet; + Int32 zOrder; + if (worksheet.Charts.Any()) + zOrder = worksheet.Charts.Max(c => c.ZOrder) + 1; + else + zOrder = 1; + ZOrder = zOrder; + ShapeId = worksheet.Workbook.ShapeIdManager.GetNext(); + RightAngleAxes = true; + } + + public Boolean RightAngleAxes { get; set; } + public IXLChart SetRightAngleAxes() + { + RightAngleAxes = true; + return this; + } + public IXLChart SetRightAngleAxes(Boolean rightAngleAxes) + { + RightAngleAxes = rightAngleAxes; + return this; + } + + public XLChartType ChartType { get; set; } + public IXLChart SetChartType(XLChartType chartType) + { + ChartType = chartType; + return this; + } + + public XLChartTypeCategory ChartTypeCategory + { + get + { + if (Bar3DCharts.Contains(ChartType)) + return XLChartTypeCategory.Bar3D; + else + throw new NotImplementedException(); + + } + } + + private HashSet Bar3DCharts = new HashSet { + XLChartType.BarClustered3D, + XLChartType.BarStacked100Percent3D, + XLChartType.BarStacked3D, + XLChartType.Column3D, + XLChartType.ColumnClustered3D, + XLChartType.ColumnStacked100Percent3D, + XLChartType.ColumnStacked3D + }; + + public XLBarOrientation BarOrientation + { + get + { + if (HorizontalCharts.Contains(ChartType)) + return XLBarOrientation.Horizontal; + else + return XLBarOrientation.Vertical; + } + } + + private HashSet HorizontalCharts = new HashSet{ + XLChartType.BarClustered, + XLChartType.BarClustered3D, + XLChartType.BarStacked, + XLChartType.BarStacked100Percent, + XLChartType.BarStacked100Percent3D, + XLChartType.BarStacked3D, + XLChartType.ConeHorizontalClustered, + XLChartType.ConeHorizontalStacked, + XLChartType.ConeHorizontalStacked100Percent, + XLChartType.CylinderHorizontalClustered, + XLChartType.CylinderHorizontalStacked, + XLChartType.CylinderHorizontalStacked100Percent, + XLChartType.PyramidHorizontalClustered, + XLChartType.PyramidHorizontalStacked, + XLChartType.PyramidHorizontalStacked100Percent + }; + + public XLBarGrouping BarGrouping + { + get + { + if (ClusteredCharts.Contains(ChartType)) + return XLBarGrouping.Clustered; + else if (PercentCharts.Contains(ChartType)) + return XLBarGrouping.Percent; + else if (StackedCharts.Contains(ChartType)) + return XLBarGrouping.Stacked; + else + return XLBarGrouping.Standard; + } + } + + public HashSet ClusteredCharts = new HashSet() + { + XLChartType.BarClustered, + XLChartType.BarClustered3D, + XLChartType.ColumnClustered, + XLChartType.ColumnClustered3D, + XLChartType.ConeClustered, + XLChartType.ConeHorizontalClustered, + XLChartType.CylinderClustered, + XLChartType.CylinderHorizontalClustered, + XLChartType.PyramidClustered, + XLChartType.PyramidHorizontalClustered + }; + + public HashSet PercentCharts = new HashSet() { + XLChartType.AreaStacked100Percent, + XLChartType.AreaStacked100Percent3D, + XLChartType.BarStacked100Percent, + XLChartType.BarStacked100Percent3D, + XLChartType.ColumnStacked100Percent, + XLChartType.ColumnStacked100Percent3D, + XLChartType.ConeHorizontalStacked100Percent, + XLChartType.ConeStacked100Percent, + XLChartType.CylinderHorizontalStacked100Percent, + XLChartType.CylinderStacked100Percent, + XLChartType.LineStacked100Percent, + XLChartType.LineWithMarkersStacked100Percent, + XLChartType.PyramidHorizontalStacked100Percent, + XLChartType.PyramidStacked100Percent + }; + + public HashSet StackedCharts = new HashSet() + { + XLChartType.AreaStacked, + XLChartType.AreaStacked3D, + XLChartType.BarStacked, + XLChartType.BarStacked3D, + XLChartType.ColumnStacked, + XLChartType.ColumnStacked3D, + XLChartType.ConeHorizontalStacked, + XLChartType.ConeStacked, + XLChartType.CylinderHorizontalStacked, + XLChartType.CylinderStacked, + XLChartType.LineStacked, + XLChartType.LineWithMarkersStacked, + XLChartType.PyramidHorizontalStacked, + XLChartType.PyramidStacked + }; + } +} diff --git a/ClosedXML/Excel/Charts/XLCharts.cs b/ClosedXML/Excel/Charts/XLCharts.cs index 46ff4e0..112a6fc 100644 --- a/ClosedXML/Excel/Charts/XLCharts.cs +++ b/ClosedXML/Excel/Charts/XLCharts.cs @@ -1,23 +1,23 @@ -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - internal class XLCharts: IXLCharts - { - private List charts = new List(); - public IEnumerator GetEnumerator() - { - return charts.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void Add(IXLChart chart) - { - charts.Add(chart); - } - } -} +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLCharts: IXLCharts + { + private List charts = new List(); + public IEnumerator GetEnumerator() + { + return charts.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(IXLChart chart) + { + charts.Add(chart); + } + } +} diff --git a/ClosedXML/Excel/Columns/IXLColumn.cs b/ClosedXML/Excel/Columns/IXLColumn.cs index 990ed2d..d0c64fd 100644 --- a/ClosedXML/Excel/Columns/IXLColumn.cs +++ b/ClosedXML/Excel/Columns/IXLColumn.cs @@ -1,185 +1,185 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLColumn : IXLRangeBase - { - - /// - /// Gets or sets the width of this column. - /// - /// - /// The width of this column. - /// - Double Width { get; set; } - - /// - /// Deletes this column and shifts the columns at the right of this one accordingly. - /// - void Delete(); - - /// - /// Gets this column's number - /// - Int32 ColumnNumber(); - - /// - /// Gets this column's letter - /// - String ColumnLetter(); - - /// - /// Inserts X number of columns at the right of this one. - /// All columns at the right will be shifted accordingly. - /// - /// The number of columns to insert. - IXLColumns InsertColumnsAfter(Int32 numberOfColumns); - - /// - /// Inserts X number of columns at the left of this one. - /// This column and all at the right will be shifted accordingly. - /// - /// The number of columns to insert. - IXLColumns InsertColumnsBefore(Int32 numberOfColumns); - - /// - /// Gets the cell in the specified row. - /// - /// The cell's row. - IXLCell Cell(Int32 rowNumber); - - /// - /// Returns the specified group of cells, separated by commas. - /// e.g. Cells("1"), Cells("1:5"), Cells("1,3:5") - /// - /// The column cells to return. - new IXLCells Cells(String cellsInColumn); - - /// - /// Returns the specified group of cells. - /// - /// The first row in the group of cells to return. - /// The last row in the group of cells to return. - IXLCells Cells(Int32 firstRow, Int32 lastRow); - - /// - /// Adjusts the width of the column based on its contents. - /// - IXLColumn AdjustToContents(); - /// - /// Adjusts the width of the column based on its contents, starting from the startRow. - /// - /// The row to start calculating the column width. - IXLColumn 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. - IXLColumn AdjustToContents(Int32 startRow, Int32 endRow); - - IXLColumn AdjustToContents(Double minWidth, Double maxWidth); - IXLColumn AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth); - IXLColumn AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth); - - /// - /// Hides this column. - /// - IXLColumn Hide(); - - /// Unhides this column. - IXLColumn Unhide(); - - /// - /// Gets a value indicating whether this column is hidden or not. - /// - /// - /// true if this column is hidden; otherwise, false. - /// - Boolean IsHidden { get; } - - /// - /// Gets or sets the outline level of this column. - /// - /// - /// The outline level of this column. - /// - Int32 OutlineLevel { get; set; } - - /// - /// Adds this column to the next outline level (Increments the outline level for this column by 1). - /// - IXLColumn Group(); - - /// - /// Adds this column to the next outline level (Increments the outline level for this column by 1). - /// - /// If set to true the column will be shown collapsed. - IXLColumn Group(Boolean collapse); - - /// - /// Sets outline level for this column. - /// - /// The outline level. - IXLColumn Group(Int32 outlineLevel); - - /// - /// Sets outline level for this column. - /// - /// The outline level. - /// If set to true the column will be shown collapsed. - IXLColumn Group(Int32 outlineLevel, Boolean collapse); - - /// - /// Adds this column to the previous outline level (decrements the outline level for this column by 1). - /// - IXLColumn Ungroup(); - - /// - /// Adds this column to the previous outline level (decrements the outline level for this column by 1). - /// - /// If set to true it will remove this column from all outline levels. - IXLColumn Ungroup(Boolean fromAll); - - /// - /// Show this column as collapsed. - /// - IXLColumn Collapse(); - - /// Expands this column (if it's collapsed). - IXLColumn Expand(); - - Int32 CellCount(); - - IXLRangeColumn CopyTo(IXLCell cell); - IXLRangeColumn CopyTo(IXLRangeBase range); - IXLColumn CopyTo(IXLColumn column); - - IXLColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - - IXLRangeColumn Column(Int32 start, Int32 end); - IXLRangeColumn Column(IXLCell start, IXLCell end); - IXLRangeColumns Columns(String columns); - - /// - /// Adds a vertical page break after this column. - /// - IXLColumn AddVerticalPageBreak(); - - IXLColumn SetDataType(XLCellValues dataType); - - IXLColumn ColumnLeft(); - IXLColumn ColumnLeft(Int32 step); - IXLColumn ColumnRight(); - IXLColumn ColumnRight(Int32 step); - - /// - /// Clears the contents of this column. - /// - /// Specify what you want to clear. - new IXLColumn Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - IXLRangeColumn ColumnUsed(Boolean includeFormats = false); - - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLColumn : IXLRangeBase + { + + /// + /// Gets or sets the width of this column. + /// + /// + /// The width of this column. + /// + Double Width { get; set; } + + /// + /// Deletes this column and shifts the columns at the right of this one accordingly. + /// + void Delete(); + + /// + /// Gets this column's number + /// + Int32 ColumnNumber(); + + /// + /// Gets this column's letter + /// + String ColumnLetter(); + + /// + /// Inserts X number of columns at the right of this one. + /// All columns at the right will be shifted accordingly. + /// + /// The number of columns to insert. + IXLColumns InsertColumnsAfter(Int32 numberOfColumns); + + /// + /// Inserts X number of columns at the left of this one. + /// This column and all at the right will be shifted accordingly. + /// + /// The number of columns to insert. + IXLColumns InsertColumnsBefore(Int32 numberOfColumns); + + /// + /// Gets the cell in the specified row. + /// + /// The cell's row. + IXLCell Cell(Int32 rowNumber); + + /// + /// Returns the specified group of cells, separated by commas. + /// e.g. Cells("1"), Cells("1:5"), Cells("1,3:5") + /// + /// The column cells to return. + new IXLCells Cells(String cellsInColumn); + + /// + /// Returns the specified group of cells. + /// + /// The first row in the group of cells to return. + /// The last row in the group of cells to return. + IXLCells Cells(Int32 firstRow, Int32 lastRow); + + /// + /// Adjusts the width of the column based on its contents. + /// + IXLColumn AdjustToContents(); + /// + /// Adjusts the width of the column based on its contents, starting from the startRow. + /// + /// The row to start calculating the column width. + IXLColumn 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. + IXLColumn AdjustToContents(Int32 startRow, Int32 endRow); + + IXLColumn AdjustToContents(Double minWidth, Double maxWidth); + IXLColumn AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth); + IXLColumn AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth); + + /// + /// Hides this column. + /// + IXLColumn Hide(); + + /// Unhides this column. + IXLColumn Unhide(); + + /// + /// Gets a value indicating whether this column is hidden or not. + /// + /// + /// true if this column is hidden; otherwise, false. + /// + Boolean IsHidden { get; } + + /// + /// Gets or sets the outline level of this column. + /// + /// + /// The outline level of this column. + /// + Int32 OutlineLevel { get; set; } + + /// + /// Adds this column to the next outline level (Increments the outline level for this column by 1). + /// + IXLColumn Group(); + + /// + /// Adds this column to the next outline level (Increments the outline level for this column by 1). + /// + /// If set to true the column will be shown collapsed. + IXLColumn Group(Boolean collapse); + + /// + /// Sets outline level for this column. + /// + /// The outline level. + IXLColumn Group(Int32 outlineLevel); + + /// + /// Sets outline level for this column. + /// + /// The outline level. + /// If set to true the column will be shown collapsed. + IXLColumn Group(Int32 outlineLevel, Boolean collapse); + + /// + /// Adds this column to the previous outline level (decrements the outline level for this column by 1). + /// + IXLColumn Ungroup(); + + /// + /// Adds this column to the previous outline level (decrements the outline level for this column by 1). + /// + /// If set to true it will remove this column from all outline levels. + IXLColumn Ungroup(Boolean fromAll); + + /// + /// Show this column as collapsed. + /// + IXLColumn Collapse(); + + /// Expands this column (if it's collapsed). + IXLColumn Expand(); + + Int32 CellCount(); + + IXLRangeColumn CopyTo(IXLCell cell); + IXLRangeColumn CopyTo(IXLRangeBase range); + IXLColumn CopyTo(IXLColumn column); + + IXLColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRangeColumn Column(Int32 start, Int32 end); + IXLRangeColumn Column(IXLCell start, IXLCell end); + IXLRangeColumns Columns(String columns); + + /// + /// Adds a vertical page break after this column. + /// + IXLColumn AddVerticalPageBreak(); + + IXLColumn SetDataType(XLCellValues dataType); + + IXLColumn ColumnLeft(); + IXLColumn ColumnLeft(Int32 step); + IXLColumn ColumnRight(); + IXLColumn ColumnRight(Int32 step); + + /// + /// Clears the contents of this column. + /// + /// Specify what you want to clear. + new IXLColumn Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + IXLRangeColumn ColumnUsed(Boolean includeFormats = false); + + } +} diff --git a/ClosedXML/Excel/Columns/IXLColumns.cs b/ClosedXML/Excel/Columns/IXLColumns.cs index bb23287..a362fca 100644 --- a/ClosedXML/Excel/Columns/IXLColumns.cs +++ b/ClosedXML/Excel/Columns/IXLColumns.cs @@ -1,125 +1,125 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLColumns: IEnumerable, IDisposable - { - /// - /// Sets the width of all columns. - /// - /// - /// The width of all columns. - /// - Double Width { set; } - - /// - /// Deletes all columns and shifts the columns at the right of them accordingly. - /// - void Delete(); - - /// - /// Adjusts the width of all columns based on its contents. - /// - IXLColumns AdjustToContents(); - /// - /// Adjusts the width of all columns based on its contents, starting from the startRow. - /// - /// The row to start calculating the column width. - IXLColumns 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. - IXLColumns AdjustToContents(Int32 startRow, Int32 endRow); - - IXLColumns AdjustToContents(Double minWidth, Double maxWidth); - IXLColumns AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth); - IXLColumns AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth); - - /// - /// Hides all columns. - /// - void Hide(); - - /// Unhides all columns. - void Unhide(); - - /// - /// Increments the outline level of all columns by 1. - /// - void Group(); - - /// - /// Increments the outline level of all columns by 1. - /// - /// If set to true the columns will be shown collapsed. - void Group(Boolean collapse); - - /// - /// Sets outline level for all columns. - /// - /// The outline level. - void Group(Int32 outlineLevel); - - /// - /// Sets outline level for all columns. - /// - /// The outline level. - /// If set to true the columns will be shown collapsed. - void Group(Int32 outlineLevel, Boolean collapse); - - /// - /// Decrements the outline level of all columns by 1. - /// - void Ungroup(); - - /// - /// Decrements the outline level of all columns by 1. - /// - /// If set to true it will remove the columns from all outline levels. - void Ungroup(Boolean fromAll); - - /// - /// Show all columns as collapsed. - /// - void Collapse(); - - /// Expands all columns (if they're collapsed). - void Expand(); - - /// - /// Returns the collection of cells. - /// - IXLCells Cells(); - - /// - /// Returns the collection of cells that have a value. - /// - IXLCells CellsUsed(); - - /// - /// Returns the collection of cells that have a value. - /// - /// if set to true will return all cells with a value or a style different than the default. - IXLCells CellsUsed(Boolean includeFormats); - - IXLStyle Style { get; set; } - - /// - /// Adds a vertical page break after these columns. - /// - IXLColumns AddVerticalPageBreaks(); - - IXLColumns SetDataType(XLCellValues dataType); - - /// - /// Clears the contents of these columns. - /// - /// Specify what you want to clear. - IXLColumns Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - void Select(); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLColumns: IEnumerable, IDisposable + { + /// + /// Sets the width of all columns. + /// + /// + /// The width of all columns. + /// + Double Width { set; } + + /// + /// Deletes all columns and shifts the columns at the right of them accordingly. + /// + void Delete(); + + /// + /// Adjusts the width of all columns based on its contents. + /// + IXLColumns AdjustToContents(); + /// + /// Adjusts the width of all columns based on its contents, starting from the startRow. + /// + /// The row to start calculating the column width. + IXLColumns 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. + IXLColumns AdjustToContents(Int32 startRow, Int32 endRow); + + IXLColumns AdjustToContents(Double minWidth, Double maxWidth); + IXLColumns AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth); + IXLColumns AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth); + + /// + /// Hides all columns. + /// + void Hide(); + + /// Unhides all columns. + void Unhide(); + + /// + /// Increments the outline level of all columns by 1. + /// + void Group(); + + /// + /// Increments the outline level of all columns by 1. + /// + /// If set to true the columns will be shown collapsed. + void Group(Boolean collapse); + + /// + /// Sets outline level for all columns. + /// + /// The outline level. + void Group(Int32 outlineLevel); + + /// + /// Sets outline level for all columns. + /// + /// The outline level. + /// If set to true the columns will be shown collapsed. + void Group(Int32 outlineLevel, Boolean collapse); + + /// + /// Decrements the outline level of all columns by 1. + /// + void Ungroup(); + + /// + /// Decrements the outline level of all columns by 1. + /// + /// If set to true it will remove the columns from all outline levels. + void Ungroup(Boolean fromAll); + + /// + /// Show all columns as collapsed. + /// + void Collapse(); + + /// Expands all columns (if they're collapsed). + void Expand(); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + IXLCells CellsUsed(Boolean includeFormats); + + IXLStyle Style { get; set; } + + /// + /// Adds a vertical page break after these columns. + /// + IXLColumns AddVerticalPageBreaks(); + + IXLColumns SetDataType(XLCellValues dataType); + + /// + /// Clears the contents of these columns. + /// + /// Specify what you want to clear. + IXLColumns Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Columns/XLColumn.cs b/ClosedXML/Excel/Columns/XLColumn.cs index 6a266c6..b8036d4 100644 --- a/ClosedXML/Excel/Columns/XLColumn.cs +++ b/ClosedXML/Excel/Columns/XLColumn.cs @@ -1,790 +1,790 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Drawing; - - -namespace ClosedXML.Excel -{ - internal class XLColumn : XLRangeBase, IXLColumn - { - #region Private fields - - private bool _collapsed; - private bool _isHidden; - private int _outlineLevel; - - 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, XLHelper.MaxRowNumber, column, false, - false))) - { - SetColumnNumber(column); - - IsReference = xlColumnParameters.IsReference; - if (IsReference) - SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); - else - { - SetStyle(xlColumnParameters.DefaultStyleId); - _width = xlColumnParameters.Worksheet.ColumnWidth; - } - } - - public XLColumn(XLColumn column) - : base( - new XLRangeAddress(new XLAddress(column.Worksheet, 1, column.ColumnNumber(), false, false), - new XLAddress(column.Worksheet, XLHelper.MaxRowNumber, column.ColumnNumber(), - false, false))) - { - _width = column._width; - IsReference = column.IsReference; - if (IsReference) - SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); - _collapsed = column._collapsed; - _isHidden = column._isHidden; - _outlineLevel = column._outlineLevel; - SetStyle(column.GetStyleId()); - } - - #endregion - - public Boolean IsReference { get; private set; } - - public override IEnumerable Styles - { - get - { - UpdatingStyle = true; - - yield return Style; - - int column = ColumnNumber(); - - foreach (XLCell cell in Worksheet.Internals.CellsCollection.GetCellsInColumn(column)) - yield return cell.Style; - - UpdatingStyle = false; - } - } - - public override Boolean UpdatingStyle { get; set; } - - public override IXLStyle InnerStyle - { - get - { - return IsReference - ? Worksheet.Internals.ColumnsCollection[ColumnNumber()].InnerStyle - : GetStyle(); - } - set - { - if (IsReference) - Worksheet.Internals.ColumnsCollection[ColumnNumber()].InnerStyle = value; - else - SetStyle(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 { return IsReference ? Worksheet.Internals.ColumnsCollection[ColumnNumber()].Width : _width; } - set - { - if (IsReference) - Worksheet.Internals.ColumnsCollection[ColumnNumber()].Width = value; - else - _width = value; - } - } - - public void Delete() - { - int columnNumber = ColumnNumber(); - using (var asRange = AsRange()) - { - asRange.Delete(XLShiftDeletedCells.ShiftCellsLeft); - } - - Worksheet.Internals.ColumnsCollection.Remove(columnNumber); - 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); - } - } - - public new IXLColumn Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - base.Clear(clearOptions); - return this; - } - - public IXLCell Cell(Int32 rowNumber) - { - return Cell(rowNumber, 1); - } - - public new IXLCells Cells(String cellsInColumn) - { - var retVal = new XLCells(false, false); - var rangePairs = cellsInColumn.Split(','); - foreach (string pair in rangePairs) - retVal.Add(Range(pair.Trim()).RangeAddress); - return retVal; - } - - public new IXLCells Cells() - { - return Cells(true, true); - } - - public new IXLCells Cells(Boolean usedCellsOnly) - { - if (usedCellsOnly) - return Cells(true, true); - else - return Cells(FirstCellUsed().Address.RowNumber, LastCellUsed().Address.RowNumber); - } - - public IXLCells Cells(Int32 firstRow, Int32 lastRow) - { - return Cells(firstRow + ":" + lastRow); - } - - public override IXLStyle Style - { - get { return IsReference ? Worksheet.Internals.ColumnsCollection[ColumnNumber()].Style : GetStyle(); } - set - { - if (IsReference) - Worksheet.Internals.ColumnsCollection[ColumnNumber()].Style = value; - else - { - SetStyle(value); - - Int32 minRow = 1; - Int32 maxRow = 0; - int column = ColumnNumber(); - if (Worksheet.Internals.CellsCollection.ColumnsUsed.ContainsKey(column)) - { - minRow = Worksheet.Internals.CellsCollection.MinRowInColumn(column); - maxRow = Worksheet.Internals.CellsCollection.MaxRowInColumn(column); - } - - if (Worksheet.Internals.RowsCollection.Count > 0) - { - Int32 minInCollection = Worksheet.Internals.RowsCollection.Keys.Min(); - Int32 maxInCollection = Worksheet.Internals.RowsCollection.Keys.Max(); - if (minInCollection < minRow) - minRow = minInCollection; - if (maxInCollection > maxRow) - maxRow = maxInCollection; - } - - if (minRow > 0 && maxRow > 0) - { - for (Int32 ro = minRow; ro <= maxRow; ro++) - Worksheet.Cell(ro, column).Style = value; - } - } - } - } - - public new IXLColumns InsertColumnsAfter(Int32 numberOfColumns) - { - int columnNum = ColumnNumber(); - Worksheet.Internals.ColumnsCollection.ShiftColumnsRight(columnNum + 1, numberOfColumns); - using (var column = Worksheet.Column(columnNum)) - { - using (var asRange = column.AsRange()) - { - asRange.InsertColumnsAfterVoid(true, numberOfColumns); - } - } - - var newColumns = Worksheet.Columns(columnNum + 1, columnNum + numberOfColumns); - CopyColumns(newColumns); - return newColumns; - } - - public new IXLColumns InsertColumnsBefore(Int32 numberOfColumns) - { - int columnNum = ColumnNumber(); - if (columnNum > 1) - { - using (var column = Worksheet.Column(columnNum - 1)) - { - return column.InsertColumnsAfter(numberOfColumns); - } - } - - Worksheet.Internals.ColumnsCollection.ShiftColumnsRight(columnNum, numberOfColumns); - - using (var column = Worksheet.Column(columnNum)) - { - using (var asRange = column.AsRange()) - { - asRange.InsertColumnsBeforeVoid(true, numberOfColumns); - } - } - - return Worksheet.Columns(columnNum, columnNum + numberOfColumns - 1); - } - - private void CopyColumns(IXLColumns newColumns) - { - foreach (var newColumn in newColumns) - { - var internalColumn = Worksheet.Internals.ColumnsCollection[newColumn.ColumnNumber()]; - internalColumn._width = Width; - internalColumn.SetStyle(Style); - internalColumn._collapsed = Collapsed; - internalColumn._isHidden = IsHidden; - internalColumn._outlineLevel = OutlineLevel; - } - } - - public IXLColumn AdjustToContents() - { - return AdjustToContents(1); - } - - public IXLColumn AdjustToContents(Int32 startRow) - { - return AdjustToContents(startRow, XLHelper.MaxRowNumber); - } - - public IXLColumn AdjustToContents(Int32 startRow, Int32 endRow) - { - return AdjustToContents(startRow, endRow, 0, Double.MaxValue); - } - - public IXLColumn AdjustToContents(Double minWidth, Double maxWidth) - { - return AdjustToContents(1, XLHelper.MaxRowNumber, minWidth, maxWidth); - } - - public IXLColumn AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth) - { - return AdjustToContents(startRow, XLHelper.MaxRowNumber, minWidth, maxWidth); - } - - public IXLColumn AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth) - { - var fontCache = new Dictionary(); - Double colMaxWidth = minWidth; - - List autoFilterRows = new List(); - if (this.Worksheet.AutoFilter != null && this.Worksheet.AutoFilter.Range != null) - autoFilterRows.Add(this.Worksheet.AutoFilter.Range.FirstRow().RowNumber()); - - autoFilterRows.AddRange(Worksheet.Tables.Where(t => - t.AutoFilter != null - && t.AutoFilter.Range != null - && !autoFilterRows.Contains(t.AutoFilter.Range.FirstRow().RowNumber())) - .Select(t => t.AutoFilter.Range.FirstRow().RowNumber())); - - foreach (XLCell c in Column(startRow, endRow).CellsUsed()) - { - if (c.IsMerged()) continue; - - Double thisWidthMax = 0; - Int32 textRotation = c.Style.Alignment.TextRotation; - if (c.HasRichText || textRotation != 0 || c.InnerText.Contains(Environment.NewLine)) - { - var kpList = new List>(); - - #region if (c.HasRichText) - - if (c.HasRichText) - { - foreach (IXLRichString rt in c.RichText) - { - String formattedString = rt.Text; - var arr = formattedString.Split(new[] {Environment.NewLine}, StringSplitOptions.None); - Int32 arrCount = arr.Count(); - for (Int32 i = 0; i < arrCount; i++) - { - String s = arr[i]; - if (i < arrCount - 1) - s += Environment.NewLine; - kpList.Add(new KeyValuePair(rt, s)); - } - } - } - else - { - String formattedString = c.GetFormattedString(); - var arr = formattedString.Split(new[] {Environment.NewLine}, StringSplitOptions.None); - Int32 arrCount = arr.Count(); - for (Int32 i = 0; i < arrCount; i++) - { - String s = arr[i]; - if (i < arrCount - 1) - s += Environment.NewLine; - kpList.Add(new KeyValuePair(c.Style.Font, s)); - } - } - - #endregion - - #region foreach (var kp in kpList) - - Double runningWidth = 0; - Boolean rotated = false; - Double maxLineWidth = 0; - Int32 lineCount = 1; - foreach (KeyValuePair kp in kpList) - { - 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), fontCache); - - if (runningWidth > thisWidthMax) - thisWidthMax = runningWidth; - - runningWidth = newLinePosition < formattedString.Length - 2 - ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) - : 0; - } - else - runningWidth += f.GetWidth(formattedString, fontCache); - - #endregion - } - else - { - #region if (textRotation == 255) - - if (textRotation == 255) - { - if (runningWidth <= 0) - runningWidth = f.GetWidth("X", fontCache); - - if (newLinePosition >= 0) - runningWidth += f.GetWidth("X", fontCache); - } - else - { - rotated = true; - Double vWidth = f.GetWidth("X", fontCache); - if (vWidth > maxLineWidth) - maxLineWidth = vWidth; - - if (newLinePosition >= 0) - { - lineCount++; - - if (newLinePosition > 0) - runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition), fontCache); - - if (runningWidth > thisWidthMax) - thisWidthMax = runningWidth; - - runningWidth = newLinePosition < formattedString.Length - 2 - ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) - : 0; - } - else - runningWidth += f.GetWidth(formattedString, fontCache); - } - - #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; - - Double r = DegreeToRadian(rotation); - - thisWidthMax = (thisWidthMax * Math.Cos(r)) + (maxLineWidth * lineCount); - } - - #endregion - } - else - thisWidthMax = c.Style.Font.GetWidth(c.GetFormattedString(), fontCache); - - if (autoFilterRows.Contains(c.Address.RowNumber)) - thisWidthMax += 2.7148; // Allow room for arrow icon in autofilter - - - if (thisWidthMax >= maxWidth) - { - colMaxWidth = maxWidth; - break; - } - - if (thisWidthMax > colMaxWidth) - colMaxWidth = thisWidthMax + 1; - } - - if (colMaxWidth <= 0) - colMaxWidth = Worksheet.ColumnWidth; - - Width = colMaxWidth; - - foreach (IDisposable font in fontCache.Values) - { - font.Dispose(); - } - return this; - } - - - public IXLColumn Hide() - { - IsHidden = true; - return this; - } - - public IXLColumn Unhide() - { - IsHidden = false; - return this; - } - - public Boolean IsHidden - { - get { return IsReference ? Worksheet.Internals.ColumnsCollection[ColumnNumber()].IsHidden : _isHidden; } - set - { - if (IsReference) - Worksheet.Internals.ColumnsCollection[ColumnNumber()].IsHidden = value; - else - _isHidden = value; - } - } - - public Int32 OutlineLevel - { - get { return IsReference ? Worksheet.Internals.ColumnsCollection[ColumnNumber()].OutlineLevel : _outlineLevel; } - 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); - Worksheet.DecrementColumnOutline(_outlineLevel); - _outlineLevel = value; - } - } - } - - public IXLColumn Group() - { - return Group(false); - } - - public IXLColumn Group(Boolean collapse) - { - if (OutlineLevel < 8) - OutlineLevel += 1; - - Collapsed = collapse; - return this; - } - - public IXLColumn Group(Int32 outlineLevel) - { - return Group(outlineLevel, false); - } - - public IXLColumn Group(Int32 outlineLevel, Boolean collapse) - { - OutlineLevel = outlineLevel; - Collapsed = collapse; - return this; - } - - public IXLColumn Ungroup() - { - return Ungroup(false); - } - - public IXLColumn Ungroup(Boolean ungroupFromAll) - { - if (ungroupFromAll) - OutlineLevel = 0; - else - { - if (OutlineLevel > 0) - OutlineLevel -= 1; - } - return this; - } - - public IXLColumn Collapse() - { - Collapsed = true; - return Hide(); - } - - public IXLColumn Expand() - { - Collapsed = false; - return Unhide(); - } - - public Int32 CellCount() - { - return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; - } - - public IXLColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, - Boolean ignoreBlanks = true) - { - Sort(1, sortOrder, matchCase, ignoreBlanks); - return this; - } - - - IXLRangeColumn IXLColumn.CopyTo(IXLCell target) - { - using (var asRange = AsRange()) - using (var copy = asRange.CopyTo(target)) - return copy.Column(1); - } - - IXLRangeColumn IXLColumn.CopyTo(IXLRangeBase target) - { - using (var asRange = AsRange()) - using (var copy = asRange.CopyTo(target)) - return copy.Column(1); - } - - public IXLColumn CopyTo(IXLColumn column) - { - column.Clear(); - var newColumn = (XLColumn)column; - newColumn._width = _width; - newColumn.Style = GetStyle(); - - using (var asRange = AsRange()) - asRange.CopyTo(column).Dispose(); - - return newColumn; - } - - public IXLRangeColumn Column(Int32 start, Int32 end) - { - return Range(start, 1, end, 1).Column(1); - } - - public IXLRangeColumn Column(IXLCell start, IXLCell end) - { - return Column(start.Address.RowNumber, end.Address.RowNumber); - } - - public IXLRangeColumns Columns(String columns) - { - var retVal = new XLRangeColumns(); - var columnPairs = columns.Split(','); - foreach (string pair in columnPairs) - using (var asRange = AsRange()) - asRange.Columns(pair.Trim()).ForEach(retVal.Add); - return retVal; - } - - /// - /// Adds a vertical page break after this column. - /// - public IXLColumn AddVerticalPageBreak() - { - Worksheet.PageSetup.AddVerticalPageBreak(ColumnNumber()); - return this; - } - - public IXLColumn SetDataType(XLCellValues dataType) - { - DataType = dataType; - return this; - } - - public IXLRangeColumn ColumnUsed(Boolean includeFormats = false) - { - return Column(FirstCellUsed(includeFormats), LastCellUsed(includeFormats)); - } - - #endregion - - public override XLRange AsRange() - { - return Range(1, 1, XLHelper.MaxRowNumber, 1); - } - - 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, - XLHelper.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; - } - - - private XLColumn ColumnShift(Int32 columnsToShift) - { - return Worksheet.Column(ColumnNumber() + columnsToShift); - } - - #region XLColumn Left - - IXLColumn IXLColumn.ColumnLeft() - { - return ColumnLeft(); - } - - IXLColumn IXLColumn.ColumnLeft(Int32 step) - { - return ColumnLeft(step); - } - - public XLColumn ColumnLeft() - { - return ColumnLeft(1); - } - - public XLColumn ColumnLeft(Int32 step) - { - return ColumnShift(step * -1); - } - - #endregion - - #region XLColumn Right - - IXLColumn IXLColumn.ColumnRight() - { - return ColumnRight(); - } - - IXLColumn IXLColumn.ColumnRight(Int32 step) - { - return ColumnRight(step); - } - - public XLColumn ColumnRight() - { - return ColumnRight(1); - } - - public XLColumn ColumnRight(Int32 step) - { - return ColumnShift(step); - } - - #endregion - - public new Boolean IsEmpty() - { - return IsEmpty(false); - } - - public new Boolean IsEmpty(Boolean includeFormats) - { - if (includeFormats && !Style.Equals(Worksheet.Style)) - return false; - - return base.IsEmpty(includeFormats); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Drawing; + + +namespace ClosedXML.Excel +{ + internal class XLColumn : XLRangeBase, IXLColumn + { + #region Private fields + + private bool _collapsed; + private bool _isHidden; + private int _outlineLevel; + + 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, XLHelper.MaxRowNumber, column, false, + false))) + { + SetColumnNumber(column); + + IsReference = xlColumnParameters.IsReference; + if (IsReference) + SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); + else + { + SetStyle(xlColumnParameters.DefaultStyleId); + _width = xlColumnParameters.Worksheet.ColumnWidth; + } + } + + public XLColumn(XLColumn column) + : base( + new XLRangeAddress(new XLAddress(column.Worksheet, 1, column.ColumnNumber(), false, false), + new XLAddress(column.Worksheet, XLHelper.MaxRowNumber, column.ColumnNumber(), + false, false))) + { + _width = column._width; + IsReference = column.IsReference; + if (IsReference) + SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); + _collapsed = column._collapsed; + _isHidden = column._isHidden; + _outlineLevel = column._outlineLevel; + SetStyle(column.GetStyleId()); + } + + #endregion + + public Boolean IsReference { get; private set; } + + public override IEnumerable Styles + { + get + { + UpdatingStyle = true; + + yield return Style; + + int column = ColumnNumber(); + + foreach (XLCell cell in Worksheet.Internals.CellsCollection.GetCellsInColumn(column)) + yield return cell.Style; + + UpdatingStyle = false; + } + } + + public override Boolean UpdatingStyle { get; set; } + + public override IXLStyle InnerStyle + { + get + { + return IsReference + ? Worksheet.Internals.ColumnsCollection[ColumnNumber()].InnerStyle + : GetStyle(); + } + set + { + if (IsReference) + Worksheet.Internals.ColumnsCollection[ColumnNumber()].InnerStyle = value; + else + SetStyle(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 { return IsReference ? Worksheet.Internals.ColumnsCollection[ColumnNumber()].Width : _width; } + set + { + if (IsReference) + Worksheet.Internals.ColumnsCollection[ColumnNumber()].Width = value; + else + _width = value; + } + } + + public void Delete() + { + int columnNumber = ColumnNumber(); + using (var asRange = AsRange()) + { + asRange.Delete(XLShiftDeletedCells.ShiftCellsLeft); + } + + Worksheet.Internals.ColumnsCollection.Remove(columnNumber); + 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); + } + } + + public new IXLColumn Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + base.Clear(clearOptions); + return this; + } + + public IXLCell Cell(Int32 rowNumber) + { + return Cell(rowNumber, 1); + } + + public new IXLCells Cells(String cellsInColumn) + { + var retVal = new XLCells(false, false); + var rangePairs = cellsInColumn.Split(','); + foreach (string pair in rangePairs) + retVal.Add(Range(pair.Trim()).RangeAddress); + return retVal; + } + + public new IXLCells Cells() + { + return Cells(true, true); + } + + public new IXLCells Cells(Boolean usedCellsOnly) + { + if (usedCellsOnly) + return Cells(true, true); + else + return Cells(FirstCellUsed().Address.RowNumber, LastCellUsed().Address.RowNumber); + } + + public IXLCells Cells(Int32 firstRow, Int32 lastRow) + { + return Cells(firstRow + ":" + lastRow); + } + + public override IXLStyle Style + { + get { return IsReference ? Worksheet.Internals.ColumnsCollection[ColumnNumber()].Style : GetStyle(); } + set + { + if (IsReference) + Worksheet.Internals.ColumnsCollection[ColumnNumber()].Style = value; + else + { + SetStyle(value); + + Int32 minRow = 1; + Int32 maxRow = 0; + int column = ColumnNumber(); + if (Worksheet.Internals.CellsCollection.ColumnsUsed.ContainsKey(column)) + { + minRow = Worksheet.Internals.CellsCollection.MinRowInColumn(column); + maxRow = Worksheet.Internals.CellsCollection.MaxRowInColumn(column); + } + + if (Worksheet.Internals.RowsCollection.Count > 0) + { + Int32 minInCollection = Worksheet.Internals.RowsCollection.Keys.Min(); + Int32 maxInCollection = Worksheet.Internals.RowsCollection.Keys.Max(); + if (minInCollection < minRow) + minRow = minInCollection; + if (maxInCollection > maxRow) + maxRow = maxInCollection; + } + + if (minRow > 0 && maxRow > 0) + { + for (Int32 ro = minRow; ro <= maxRow; ro++) + Worksheet.Cell(ro, column).Style = value; + } + } + } + } + + public new IXLColumns InsertColumnsAfter(Int32 numberOfColumns) + { + int columnNum = ColumnNumber(); + Worksheet.Internals.ColumnsCollection.ShiftColumnsRight(columnNum + 1, numberOfColumns); + using (var column = Worksheet.Column(columnNum)) + { + using (var asRange = column.AsRange()) + { + asRange.InsertColumnsAfterVoid(true, numberOfColumns); + } + } + + var newColumns = Worksheet.Columns(columnNum + 1, columnNum + numberOfColumns); + CopyColumns(newColumns); + return newColumns; + } + + public new IXLColumns InsertColumnsBefore(Int32 numberOfColumns) + { + int columnNum = ColumnNumber(); + if (columnNum > 1) + { + using (var column = Worksheet.Column(columnNum - 1)) + { + return column.InsertColumnsAfter(numberOfColumns); + } + } + + Worksheet.Internals.ColumnsCollection.ShiftColumnsRight(columnNum, numberOfColumns); + + using (var column = Worksheet.Column(columnNum)) + { + using (var asRange = column.AsRange()) + { + asRange.InsertColumnsBeforeVoid(true, numberOfColumns); + } + } + + return Worksheet.Columns(columnNum, columnNum + numberOfColumns - 1); + } + + private void CopyColumns(IXLColumns newColumns) + { + foreach (var newColumn in newColumns) + { + var internalColumn = Worksheet.Internals.ColumnsCollection[newColumn.ColumnNumber()]; + internalColumn._width = Width; + internalColumn.SetStyle(Style); + internalColumn._collapsed = Collapsed; + internalColumn._isHidden = IsHidden; + internalColumn._outlineLevel = OutlineLevel; + } + } + + public IXLColumn AdjustToContents() + { + return AdjustToContents(1); + } + + public IXLColumn AdjustToContents(Int32 startRow) + { + return AdjustToContents(startRow, XLHelper.MaxRowNumber); + } + + public IXLColumn AdjustToContents(Int32 startRow, Int32 endRow) + { + return AdjustToContents(startRow, endRow, 0, Double.MaxValue); + } + + public IXLColumn AdjustToContents(Double minWidth, Double maxWidth) + { + return AdjustToContents(1, XLHelper.MaxRowNumber, minWidth, maxWidth); + } + + public IXLColumn AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth) + { + return AdjustToContents(startRow, XLHelper.MaxRowNumber, minWidth, maxWidth); + } + + public IXLColumn AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth) + { + var fontCache = new Dictionary(); + Double colMaxWidth = minWidth; + + List autoFilterRows = new List(); + if (this.Worksheet.AutoFilter != null && this.Worksheet.AutoFilter.Range != null) + autoFilterRows.Add(this.Worksheet.AutoFilter.Range.FirstRow().RowNumber()); + + autoFilterRows.AddRange(Worksheet.Tables.Where(t => + t.AutoFilter != null + && t.AutoFilter.Range != null + && !autoFilterRows.Contains(t.AutoFilter.Range.FirstRow().RowNumber())) + .Select(t => t.AutoFilter.Range.FirstRow().RowNumber())); + + foreach (XLCell c in Column(startRow, endRow).CellsUsed()) + { + if (c.IsMerged()) continue; + + Double thisWidthMax = 0; + Int32 textRotation = c.Style.Alignment.TextRotation; + if (c.HasRichText || textRotation != 0 || c.InnerText.Contains(Environment.NewLine)) + { + var kpList = new List>(); + + #region if (c.HasRichText) + + if (c.HasRichText) + { + foreach (IXLRichString rt in c.RichText) + { + String formattedString = rt.Text; + var arr = formattedString.Split(new[] {Environment.NewLine}, StringSplitOptions.None); + Int32 arrCount = arr.Count(); + for (Int32 i = 0; i < arrCount; i++) + { + String s = arr[i]; + if (i < arrCount - 1) + s += Environment.NewLine; + kpList.Add(new KeyValuePair(rt, s)); + } + } + } + else + { + String formattedString = c.GetFormattedString(); + var arr = formattedString.Split(new[] {Environment.NewLine}, StringSplitOptions.None); + Int32 arrCount = arr.Count(); + for (Int32 i = 0; i < arrCount; i++) + { + String s = arr[i]; + if (i < arrCount - 1) + s += Environment.NewLine; + kpList.Add(new KeyValuePair(c.Style.Font, s)); + } + } + + #endregion + + #region foreach (var kp in kpList) + + Double runningWidth = 0; + Boolean rotated = false; + Double maxLineWidth = 0; + Int32 lineCount = 1; + foreach (KeyValuePair kp in kpList) + { + 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), fontCache); + + if (runningWidth > thisWidthMax) + thisWidthMax = runningWidth; + + runningWidth = newLinePosition < formattedString.Length - 2 + ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) + : 0; + } + else + runningWidth += f.GetWidth(formattedString, fontCache); + + #endregion + } + else + { + #region if (textRotation == 255) + + if (textRotation == 255) + { + if (runningWidth <= 0) + runningWidth = f.GetWidth("X", fontCache); + + if (newLinePosition >= 0) + runningWidth += f.GetWidth("X", fontCache); + } + else + { + rotated = true; + Double vWidth = f.GetWidth("X", fontCache); + if (vWidth > maxLineWidth) + maxLineWidth = vWidth; + + if (newLinePosition >= 0) + { + lineCount++; + + if (newLinePosition > 0) + runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition), fontCache); + + if (runningWidth > thisWidthMax) + thisWidthMax = runningWidth; + + runningWidth = newLinePosition < formattedString.Length - 2 + ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) + : 0; + } + else + runningWidth += f.GetWidth(formattedString, fontCache); + } + + #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; + + Double r = DegreeToRadian(rotation); + + thisWidthMax = (thisWidthMax * Math.Cos(r)) + (maxLineWidth * lineCount); + } + + #endregion + } + else + thisWidthMax = c.Style.Font.GetWidth(c.GetFormattedString(), fontCache); + + if (autoFilterRows.Contains(c.Address.RowNumber)) + thisWidthMax += 2.7148; // Allow room for arrow icon in autofilter + + + if (thisWidthMax >= maxWidth) + { + colMaxWidth = maxWidth; + break; + } + + if (thisWidthMax > colMaxWidth) + colMaxWidth = thisWidthMax + 1; + } + + if (colMaxWidth <= 0) + colMaxWidth = Worksheet.ColumnWidth; + + Width = colMaxWidth; + + foreach (IDisposable font in fontCache.Values) + { + font.Dispose(); + } + return this; + } + + + public IXLColumn Hide() + { + IsHidden = true; + return this; + } + + public IXLColumn Unhide() + { + IsHidden = false; + return this; + } + + public Boolean IsHidden + { + get { return IsReference ? Worksheet.Internals.ColumnsCollection[ColumnNumber()].IsHidden : _isHidden; } + set + { + if (IsReference) + Worksheet.Internals.ColumnsCollection[ColumnNumber()].IsHidden = value; + else + _isHidden = value; + } + } + + public Int32 OutlineLevel + { + get { return IsReference ? Worksheet.Internals.ColumnsCollection[ColumnNumber()].OutlineLevel : _outlineLevel; } + 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); + Worksheet.DecrementColumnOutline(_outlineLevel); + _outlineLevel = value; + } + } + } + + public IXLColumn Group() + { + return Group(false); + } + + public IXLColumn Group(Boolean collapse) + { + if (OutlineLevel < 8) + OutlineLevel += 1; + + Collapsed = collapse; + return this; + } + + public IXLColumn Group(Int32 outlineLevel) + { + return Group(outlineLevel, false); + } + + public IXLColumn Group(Int32 outlineLevel, Boolean collapse) + { + OutlineLevel = outlineLevel; + Collapsed = collapse; + return this; + } + + public IXLColumn Ungroup() + { + return Ungroup(false); + } + + public IXLColumn Ungroup(Boolean ungroupFromAll) + { + if (ungroupFromAll) + OutlineLevel = 0; + else + { + if (OutlineLevel > 0) + OutlineLevel -= 1; + } + return this; + } + + public IXLColumn Collapse() + { + Collapsed = true; + return Hide(); + } + + public IXLColumn Expand() + { + Collapsed = false; + return Unhide(); + } + + public Int32 CellCount() + { + return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; + } + + public IXLColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, + Boolean ignoreBlanks = true) + { + Sort(1, sortOrder, matchCase, ignoreBlanks); + return this; + } + + + IXLRangeColumn IXLColumn.CopyTo(IXLCell target) + { + using (var asRange = AsRange()) + using (var copy = asRange.CopyTo(target)) + return copy.Column(1); + } + + IXLRangeColumn IXLColumn.CopyTo(IXLRangeBase target) + { + using (var asRange = AsRange()) + using (var copy = asRange.CopyTo(target)) + return copy.Column(1); + } + + public IXLColumn CopyTo(IXLColumn column) + { + column.Clear(); + var newColumn = (XLColumn)column; + newColumn._width = _width; + newColumn.Style = GetStyle(); + + using (var asRange = AsRange()) + asRange.CopyTo(column).Dispose(); + + return newColumn; + } + + public IXLRangeColumn Column(Int32 start, Int32 end) + { + return Range(start, 1, end, 1).Column(1); + } + + public IXLRangeColumn Column(IXLCell start, IXLCell end) + { + return Column(start.Address.RowNumber, end.Address.RowNumber); + } + + public IXLRangeColumns Columns(String columns) + { + var retVal = new XLRangeColumns(); + var columnPairs = columns.Split(','); + foreach (string pair in columnPairs) + using (var asRange = AsRange()) + asRange.Columns(pair.Trim()).ForEach(retVal.Add); + return retVal; + } + + /// + /// Adds a vertical page break after this column. + /// + public IXLColumn AddVerticalPageBreak() + { + Worksheet.PageSetup.AddVerticalPageBreak(ColumnNumber()); + return this; + } + + public IXLColumn SetDataType(XLCellValues dataType) + { + DataType = dataType; + return this; + } + + public IXLRangeColumn ColumnUsed(Boolean includeFormats = false) + { + return Column(FirstCellUsed(includeFormats), LastCellUsed(includeFormats)); + } + + #endregion + + public override XLRange AsRange() + { + return Range(1, 1, XLHelper.MaxRowNumber, 1); + } + + 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, + XLHelper.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; + } + + + private XLColumn ColumnShift(Int32 columnsToShift) + { + return Worksheet.Column(ColumnNumber() + columnsToShift); + } + + #region XLColumn Left + + IXLColumn IXLColumn.ColumnLeft() + { + return ColumnLeft(); + } + + IXLColumn IXLColumn.ColumnLeft(Int32 step) + { + return ColumnLeft(step); + } + + public XLColumn ColumnLeft() + { + return ColumnLeft(1); + } + + public XLColumn ColumnLeft(Int32 step) + { + return ColumnShift(step * -1); + } + + #endregion + + #region XLColumn Right + + IXLColumn IXLColumn.ColumnRight() + { + return ColumnRight(); + } + + IXLColumn IXLColumn.ColumnRight(Int32 step) + { + return ColumnRight(step); + } + + public XLColumn ColumnRight() + { + return ColumnRight(1); + } + + public XLColumn ColumnRight(Int32 step) + { + return ColumnShift(step); + } + + #endregion + + public new Boolean IsEmpty() + { + return IsEmpty(false); + } + + public new Boolean IsEmpty(Boolean includeFormats) + { + if (includeFormats && !Style.Equals(Worksheet.Style)) + return false; + + return base.IsEmpty(includeFormats); + } + } +} diff --git a/ClosedXML/Excel/Columns/XLColumnCollection.cs b/ClosedXML/Excel/Columns/XLColumnCollection.cs index 9d5f440..7140fed 100644 --- a/ClosedXML/Excel/Columns/XLColumnCollection.cs +++ b/ClosedXML/Excel/Columns/XLColumnCollection.cs @@ -1,133 +1,133 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLColumnsCollection : IDictionary, IDisposable - { - public void ShiftColumnsRight(Int32 startingColumn, Int32 columnsToShift) - { - foreach (var ro in _dictionary.Keys.Where(k => k >= startingColumn).OrderByDescending(k => k)) - { - var columnToMove = _dictionary[ro]; - Int32 newColumnNum = ro + columnsToShift; - if (newColumnNum <= XLHelper.MaxColumnNumber) - { - var newColumn = new XLColumn(columnToMove) - { - RangeAddress = - { - FirstAddress = new XLAddress(1, newColumnNum, false, false), - LastAddress = - new XLAddress(XLHelper.MaxRowNumber, newColumnNum, false, false) - } - }; - - _dictionary.Add(newColumnNum, newColumn); - } - _dictionary.Remove(ro); - } - - } - - private readonly Dictionary _dictionary = new Dictionary(); - - public void Add(int key, XLColumn value) - { - _dictionary.Add(key, value); - } - - public bool ContainsKey(int key) - { - return _dictionary.ContainsKey(key); - } - - public ICollection Keys - { - get { return _dictionary.Keys; } - } - - public bool Remove(int key) - { - return _dictionary.Remove(key); - } - - public bool TryGetValue(int key, out XLColumn value) - { - return _dictionary.TryGetValue(key, out value); - } - - public ICollection Values - { - get { return _dictionary.Values; } - } - - public XLColumn this[int key] - { - get - { - return _dictionary[key]; - } - set - { - _dictionary[key] = value; - } - } - - public void Add(KeyValuePair item) - { - _dictionary.Add(item.Key, item.Value); - } - - public void Clear() - { - _dictionary.Clear(); - } - - public bool Contains(KeyValuePair item) - { - return _dictionary.Contains(item); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - throw new NotImplementedException(); - } - - public int Count - { - get { return _dictionary.Count; } - } - - public bool IsReadOnly - { - get { return false; } - } - - public bool Remove(KeyValuePair item) - { - return _dictionary.Remove(item.Key); - } - - public IEnumerator> GetEnumerator() - { - return _dictionary.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return _dictionary.GetEnumerator(); - } - - public void RemoveAll(Func predicate) - { - _dictionary.RemoveAll(predicate); - } - - public void Dispose() - { - _dictionary.Values.ForEach(c=>c.Dispose()); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLColumnsCollection : IDictionary, IDisposable + { + public void ShiftColumnsRight(Int32 startingColumn, Int32 columnsToShift) + { + foreach (var ro in _dictionary.Keys.Where(k => k >= startingColumn).OrderByDescending(k => k)) + { + var columnToMove = _dictionary[ro]; + Int32 newColumnNum = ro + columnsToShift; + if (newColumnNum <= XLHelper.MaxColumnNumber) + { + var newColumn = new XLColumn(columnToMove) + { + RangeAddress = + { + FirstAddress = new XLAddress(1, newColumnNum, false, false), + LastAddress = + new XLAddress(XLHelper.MaxRowNumber, newColumnNum, false, false) + } + }; + + _dictionary.Add(newColumnNum, newColumn); + } + _dictionary.Remove(ro); + } + + } + + private readonly Dictionary _dictionary = new Dictionary(); + + public void Add(int key, XLColumn value) + { + _dictionary.Add(key, value); + } + + public bool ContainsKey(int key) + { + return _dictionary.ContainsKey(key); + } + + public ICollection Keys + { + get { return _dictionary.Keys; } + } + + public bool Remove(int key) + { + return _dictionary.Remove(key); + } + + public bool TryGetValue(int key, out XLColumn value) + { + return _dictionary.TryGetValue(key, out value); + } + + public ICollection Values + { + get { return _dictionary.Values; } + } + + public XLColumn this[int key] + { + get + { + return _dictionary[key]; + } + set + { + _dictionary[key] = value; + } + } + + public void Add(KeyValuePair item) + { + _dictionary.Add(item.Key, item.Value); + } + + public void Clear() + { + _dictionary.Clear(); + } + + public bool Contains(KeyValuePair item) + { + return _dictionary.Contains(item); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public int Count + { + get { return _dictionary.Count; } + } + + public bool IsReadOnly + { + get { return false; } + } + + public bool Remove(KeyValuePair item) + { + return _dictionary.Remove(item.Key); + } + + public IEnumerator> GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + public void RemoveAll(Func predicate) + { + _dictionary.RemoveAll(predicate); + } + + public void Dispose() + { + _dictionary.Values.ForEach(c=>c.Dispose()); + } + } +} diff --git a/ClosedXML/Excel/Columns/XLColumnParameters.cs b/ClosedXML/Excel/Columns/XLColumnParameters.cs index 4353f20..2842a5b 100644 --- a/ClosedXML/Excel/Columns/XLColumnParameters.cs +++ b/ClosedXML/Excel/Columns/XLColumnParameters.cs @@ -1,18 +1,18 @@ -using System; - - -namespace ClosedXML.Excel -{ - internal class XLColumnParameters - { - public XLColumnParameters(XLWorksheet worksheet, Int32 defaultStyleId, Boolean isReference) - { - Worksheet = worksheet; - DefaultStyleId = defaultStyleId; - IsReference = isReference; - } - public Int32 DefaultStyleId { get; set; } - public XLWorksheet Worksheet { get; private set; } - public Boolean IsReference { get; private set; } - } -} +using System; + + +namespace ClosedXML.Excel +{ + internal class XLColumnParameters + { + public XLColumnParameters(XLWorksheet worksheet, Int32 defaultStyleId, Boolean isReference) + { + Worksheet = worksheet; + DefaultStyleId = defaultStyleId; + IsReference = isReference; + } + public Int32 DefaultStyleId { get; set; } + public XLWorksheet Worksheet { get; private set; } + public Boolean IsReference { get; private set; } + } +} diff --git a/ClosedXML/Excel/Columns/XLColumns.cs b/ClosedXML/Excel/Columns/XLColumns.cs index f62761c..570f2fc 100644 --- a/ClosedXML/Excel/Columns/XLColumns.cs +++ b/ClosedXML/Excel/Columns/XLColumns.cs @@ -1,287 +1,287 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - using System.Collections; - - internal class XLColumns : IXLColumns, IXLStylized - { - public Boolean StyleChanged { get; set; } - private readonly List _columns = new List(); - private readonly XLWorksheet _worksheet; - internal IXLStyle style; - - public XLColumns(XLWorksheet worksheet) - { - _worksheet = worksheet; - style = new XLStyle(this, XLWorkbook.DefaultStyle); - } - - #region IXLColumns Members - - public IEnumerator GetEnumerator() - { - return _columns.Cast().OrderBy(r => r.ColumnNumber()).GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IXLStyle Style - { - get { return style; } - set - { - style = new XLStyle(this, value); - - if (_worksheet != null) - _worksheet.Style = value; - else - { - foreach (XLColumn column in _columns) - column.Style = value; - } - } - } - - public Double Width - { - set - { - _columns.ForEach(c => c.Width = value); - - if (_worksheet == null) return; - - _worksheet.ColumnWidth = value; - _worksheet.Internals.ColumnsCollection.ForEach(c => c.Value.Width = value); - } - } - - public void Delete() - { - if (_worksheet != null) - { - _worksheet.Internals.ColumnsCollection.Clear(); - _worksheet.Internals.CellsCollection.Clear(); - } - else - { - var toDelete = new Dictionary>(); - foreach (XLColumn c in _columns) - { - if (!toDelete.ContainsKey(c.Worksheet)) - toDelete.Add(c.Worksheet, new List()); - - toDelete[c.Worksheet].Add(c.ColumnNumber()); - } - - foreach (KeyValuePair> kp in toDelete) - { - foreach (int c in kp.Value.OrderByDescending(c => c)) - kp.Key.Column(c).Delete(); - } - } - } - - public IXLColumns AdjustToContents() - { - _columns.ForEach(c => c.AdjustToContents()); - return this; - } - - public IXLColumns AdjustToContents(Int32 startRow) - { - _columns.ForEach(c => c.AdjustToContents(startRow)); - return this; - } - - public IXLColumns AdjustToContents(Int32 startRow, Int32 endRow) - { - _columns.ForEach(c => c.AdjustToContents(startRow, endRow)); - return this; - } - - public IXLColumns AdjustToContents(Double minWidth, Double maxWidth) - { - _columns.ForEach(c => c.AdjustToContents(minWidth, maxWidth)); - return this; - } - - public IXLColumns AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth) - { - _columns.ForEach(c => c.AdjustToContents(startRow, minWidth, maxWidth)); - return this; - } - - public IXLColumns AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth) - { - _columns.ForEach(c => c.AdjustToContents(startRow, endRow, minWidth, maxWidth)); - return this; - } - - public void Hide() - { - _columns.ForEach(c => c.Hide()); - } - - public void Unhide() - { - _columns.ForEach(c => c.Unhide()); - } - - public void Group() - { - Group(false); - } - - public void Group(Int32 outlineLevel) - { - Group(outlineLevel, false); - } - - public void Ungroup() - { - Ungroup(false); - } - - public void Group(Boolean collapse) - { - _columns.ForEach(c => c.Group(collapse)); - } - - public void Group(Int32 outlineLevel, Boolean collapse) - { - _columns.ForEach(c => c.Group(outlineLevel, collapse)); - } - - public void Ungroup(Boolean ungroupFromAll) - { - _columns.ForEach(c => c.Ungroup(ungroupFromAll)); - } - - public void Collapse() - { - _columns.ForEach(c => c.Collapse()); - } - - public void Expand() - { - _columns.ForEach(c => c.Expand()); - } - - public IXLCells Cells() - { - var cells = new XLCells(false, false); - foreach (XLColumn container in _columns) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed() - { - var cells = new XLCells(true, false); - foreach (XLColumn container in _columns) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed(Boolean includeFormats) - { - var cells = new XLCells(true, includeFormats); - foreach (XLColumn container in _columns) - cells.Add(container.RangeAddress); - return cells; - } - - /// - /// Adds a vertical page break after this column. - /// - public IXLColumns AddVerticalPageBreaks() - { - foreach (XLColumn col in _columns) - col.Worksheet.PageSetup.AddVerticalPageBreak(col.ColumnNumber()); - return this; - } - - public IXLColumns SetDataType(XLCellValues dataType) - { - _columns.ForEach(c => c.DataType = dataType); - return this; - } - - #endregion - - #region IXLStylized Members - - public IEnumerable Styles - { - get - { - UpdatingStyle = true; - yield return style; - if (_worksheet != null) - yield return _worksheet.Style; - else - { - foreach (IXLStyle s in _columns.SelectMany(col => col.Styles)) - { - yield return s; - } - } - UpdatingStyle = false; - } - } - - public Boolean UpdatingStyle { get; set; } - - public IXLStyle InnerStyle - { - get { return style; } - set { style = new XLStyle(this, value); } - } - - public IXLRanges RangesUsed - { - get - { - var retVal = new XLRanges(); - this.ForEach(c => retVal.Add(c.AsRange())); - return retVal; - } - } - - #endregion - - public void Add(XLColumn column) - { - _columns.Add(column); - } - - public void CollapseOnly() - { - _columns.ForEach(c => c.Collapsed = true); - } - - public IXLColumns Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - _columns.ForEach(c=>c.Clear(clearOptions)); - return this; - } - - public void Dispose() - { - if (_columns != null) - _columns.ForEach(c => c.Dispose()); - } - - public void Select() - { - foreach (var range in this) - range.Select(); - } - } +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLColumns : IXLColumns, IXLStylized + { + public Boolean StyleChanged { get; set; } + private readonly List _columns = new List(); + private readonly XLWorksheet _worksheet; + internal IXLStyle style; + + public XLColumns(XLWorksheet worksheet) + { + _worksheet = worksheet; + style = new XLStyle(this, XLWorkbook.DefaultStyle); + } + + #region IXLColumns Members + + public IEnumerator GetEnumerator() + { + return _columns.Cast().OrderBy(r => r.ColumnNumber()).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLStyle Style + { + get { return style; } + set + { + style = new XLStyle(this, value); + + if (_worksheet != null) + _worksheet.Style = value; + else + { + foreach (XLColumn column in _columns) + column.Style = value; + } + } + } + + public Double Width + { + set + { + _columns.ForEach(c => c.Width = value); + + if (_worksheet == null) return; + + _worksheet.ColumnWidth = value; + _worksheet.Internals.ColumnsCollection.ForEach(c => c.Value.Width = value); + } + } + + public void Delete() + { + if (_worksheet != null) + { + _worksheet.Internals.ColumnsCollection.Clear(); + _worksheet.Internals.CellsCollection.Clear(); + } + else + { + var toDelete = new Dictionary>(); + foreach (XLColumn c in _columns) + { + if (!toDelete.ContainsKey(c.Worksheet)) + toDelete.Add(c.Worksheet, new List()); + + toDelete[c.Worksheet].Add(c.ColumnNumber()); + } + + foreach (KeyValuePair> kp in toDelete) + { + foreach (int c in kp.Value.OrderByDescending(c => c)) + kp.Key.Column(c).Delete(); + } + } + } + + public IXLColumns AdjustToContents() + { + _columns.ForEach(c => c.AdjustToContents()); + return this; + } + + public IXLColumns AdjustToContents(Int32 startRow) + { + _columns.ForEach(c => c.AdjustToContents(startRow)); + return this; + } + + public IXLColumns AdjustToContents(Int32 startRow, Int32 endRow) + { + _columns.ForEach(c => c.AdjustToContents(startRow, endRow)); + return this; + } + + public IXLColumns AdjustToContents(Double minWidth, Double maxWidth) + { + _columns.ForEach(c => c.AdjustToContents(minWidth, maxWidth)); + return this; + } + + public IXLColumns AdjustToContents(Int32 startRow, Double minWidth, Double maxWidth) + { + _columns.ForEach(c => c.AdjustToContents(startRow, minWidth, maxWidth)); + return this; + } + + public IXLColumns AdjustToContents(Int32 startRow, Int32 endRow, Double minWidth, Double maxWidth) + { + _columns.ForEach(c => c.AdjustToContents(startRow, endRow, minWidth, maxWidth)); + return this; + } + + public void Hide() + { + _columns.ForEach(c => c.Hide()); + } + + public void Unhide() + { + _columns.ForEach(c => c.Unhide()); + } + + public void Group() + { + Group(false); + } + + public void Group(Int32 outlineLevel) + { + Group(outlineLevel, false); + } + + public void Ungroup() + { + Ungroup(false); + } + + public void Group(Boolean collapse) + { + _columns.ForEach(c => c.Group(collapse)); + } + + public void Group(Int32 outlineLevel, Boolean collapse) + { + _columns.ForEach(c => c.Group(outlineLevel, collapse)); + } + + public void Ungroup(Boolean ungroupFromAll) + { + _columns.ForEach(c => c.Ungroup(ungroupFromAll)); + } + + public void Collapse() + { + _columns.ForEach(c => c.Collapse()); + } + + public void Expand() + { + _columns.ForEach(c => c.Expand()); + } + + public IXLCells Cells() + { + var cells = new XLCells(false, false); + foreach (XLColumn container in _columns) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(true, false); + foreach (XLColumn container in _columns) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed(Boolean includeFormats) + { + var cells = new XLCells(true, includeFormats); + foreach (XLColumn container in _columns) + cells.Add(container.RangeAddress); + return cells; + } + + /// + /// Adds a vertical page break after this column. + /// + public IXLColumns AddVerticalPageBreaks() + { + foreach (XLColumn col in _columns) + col.Worksheet.PageSetup.AddVerticalPageBreak(col.ColumnNumber()); + return this; + } + + public IXLColumns SetDataType(XLCellValues dataType) + { + _columns.ForEach(c => c.DataType = dataType); + return this; + } + + #endregion + + #region IXLStylized Members + + public IEnumerable Styles + { + get + { + UpdatingStyle = true; + yield return style; + if (_worksheet != null) + yield return _worksheet.Style; + else + { + foreach (IXLStyle s in _columns.SelectMany(col => col.Styles)) + { + yield return s; + } + } + UpdatingStyle = false; + } + } + + public Boolean UpdatingStyle { get; set; } + + public IXLStyle InnerStyle + { + get { return style; } + set { style = new XLStyle(this, value); } + } + + public IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion + + public void Add(XLColumn column) + { + _columns.Add(column); + } + + public void CollapseOnly() + { + _columns.ForEach(c => c.Collapsed = true); + } + + public IXLColumns Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + _columns.ForEach(c=>c.Clear(clearOptions)); + return this; + } + + public void Dispose() + { + if (_columns != null) + _columns.ForEach(c => c.Dispose()); + } + + public void Select() + { + foreach (var range in this) + range.Select(); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Comments/IXLComment.cs b/ClosedXML/Excel/Comments/IXLComment.cs index cddc435..9b3b30e 100644 --- a/ClosedXML/Excel/Comments/IXLComment.cs +++ b/ClosedXML/Excel/Comments/IXLComment.cs @@ -1,26 +1,26 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLComment : IXLFormattedText, IXLDrawing - { - /// - /// Gets or sets this comment's author's name - /// - String Author { get; set; } - /// - /// Sets the name of the comment's author - /// - /// Author's name - IXLComment SetAuthor(String value); - - /// - /// Adds a bolded line with the author's name - /// - IXLRichString AddSignature(); - - void Delete(); - } - -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLComment : IXLFormattedText, IXLDrawing + { + /// + /// Gets or sets this comment's author's name + /// + String Author { get; set; } + /// + /// Sets the name of the comment's author + /// + /// Author's name + IXLComment SetAuthor(String value); + + /// + /// Adds a bolded line with the author's name + /// + IXLRichString AddSignature(); + + void Delete(); + } + +} diff --git a/ClosedXML/Excel/Comments/XLComment.cs b/ClosedXML/Excel/Comments/XLComment.cs index 87cae88..c841e0a 100644 --- a/ClosedXML/Excel/Comments/XLComment.cs +++ b/ClosedXML/Excel/Comments/XLComment.cs @@ -1,207 +1,207 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLComment : XLFormattedText, IXLComment - { - private XLCell _cell; - - public XLComment(XLCell cell, IXLFontBase defaultFont) - : base(defaultFont) - { - Initialize(cell); - } - - public XLComment(XLCell cell, XLFormattedText defaultComment, IXLFontBase defaultFont) - : base(defaultComment, defaultFont) - { - Initialize(cell); - } - - public XLComment(XLCell cell, String text, IXLFontBase defaultFont) - : base(text, defaultFont) - { - Initialize(cell); - } - - #region IXLComment Members - - public String Author { get; set; } - - public IXLComment SetAuthor(String value) - { - Author = value; - return this; - } - - public IXLRichString AddSignature() - { - AddText(Author + ":").SetBold(); - return AddText(Environment.NewLine); - } - - public void Delete() - { - _cell.DeleteComment(); - } - - #endregion - - #region IXLDrawing - - public String Name { get; set; } - public String Description { get; set; } - public XLDrawingAnchor Anchor { get; set; } - public Boolean HorizontalFlip { get; set; } - public Boolean VerticalFlip { get; set; } - public Int32 Rotation { get; set; } - public Int32 ExtentLength { get; set; } - public Int32 ExtentWidth { get; set; } - public Int32 ShapeId { get; internal set; } - - private Boolean _visible; - - public Boolean Visible - { - get - { - return _visible; - } - set - { - _visible = value; - } - } - - public IXLComment SetVisible() - { - Visible = true; - return Container; - } - - public IXLComment SetVisible(Boolean hidden) - { - Visible = hidden; - return Container; - } - - public IXLDrawingPosition Position { get; private set; } - - public Int32 ZOrder { get; set; } - - public IXLComment SetZOrder(Int32 zOrder) - { - ZOrder = zOrder; - return Container; - } - - public IXLDrawingStyle Style { get; private set; } - - public IXLComment SetName(String name) - { - Name = name; - return Container; - } - - public IXLComment SetDescription(String description) - { - Description = description; - return Container; - } - - public IXLComment SetHorizontalFlip() - { - HorizontalFlip = true; - return Container; - } - - public IXLComment SetHorizontalFlip(Boolean horizontalFlip) - { - HorizontalFlip = horizontalFlip; - return Container; - } - - public IXLComment SetVerticalFlip() - { - VerticalFlip = true; - return Container; - } - - public IXLComment SetVerticalFlip(Boolean verticalFlip) - { - VerticalFlip = verticalFlip; - return Container; - } - - public IXLComment SetRotation(Int32 rotation) - { - Rotation = rotation; - return Container; - } - - public IXLComment SetExtentLength(Int32 extentLength) - { - ExtentLength = extentLength; - return Container; - } - - public IXLComment SetExtentWidth(Int32 extentWidth) - { - ExtentWidth = extentWidth; - return Container; - } - - #endregion - - private void Initialize(XLCell cell) - { - Author = cell.Worksheet.Author; - Container = this; - Anchor = XLDrawingAnchor.MoveAndSizeWithCells; - Style = new XLDrawingStyle(); - Int32 pRow = cell.Address.RowNumber; - Double pRowOffset = 0; - if (pRow > 1) - { - pRow--; - double prevHeight = cell.Worksheet.Row(pRow).Height; - if (prevHeight > 7) - pRowOffset = prevHeight - 7; - } - Position = new XLDrawingPosition - { - Column = cell.Address.ColumnNumber + 1, - ColumnOffset = 2, - Row = pRow, - RowOffset = pRowOffset - }; - - ZOrder = cell.Worksheet.ZOrder++; - Style - .Margins.SetLeft(0.1) - .Margins.SetRight(0.1) - .Margins.SetTop(0.05) - .Margins.SetBottom(0.05) - .Margins.SetAutomatic() - .Size.SetHeight(59.25) - .Size.SetWidth(19.2) - .ColorsAndLines.SetLineColor(XLColor.Black) - .ColorsAndLines.SetFillColor(XLColor.FromArgb(255, 255, 225)) - .ColorsAndLines.SetLineDash(XLDashStyle.Solid) - .ColorsAndLines.SetLineStyle(XLLineStyle.Single) - .ColorsAndLines.SetLineWeight(0.75) - .ColorsAndLines.SetFillTransparency(1) - .ColorsAndLines.SetLineTransparency(1) - .Alignment.SetHorizontal(XLDrawingHorizontalAlignment.Left) - .Alignment.SetVertical(XLDrawingVerticalAlignment.Top) - .Alignment.SetDirection(XLDrawingTextDirection.Context) - .Alignment.SetOrientation(XLDrawingTextOrientation.LeftToRight) - .Properties.SetPositioning(XLDrawingAnchor.Absolute) - .Protection.SetLocked() - .Protection.SetLockText(); - - _cell = cell; - ShapeId = cell.Worksheet.Workbook.ShapeIdManager.GetNext(); - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLComment : XLFormattedText, IXLComment + { + private XLCell _cell; + + public XLComment(XLCell cell, IXLFontBase defaultFont) + : base(defaultFont) + { + Initialize(cell); + } + + public XLComment(XLCell cell, XLFormattedText defaultComment, IXLFontBase defaultFont) + : base(defaultComment, defaultFont) + { + Initialize(cell); + } + + public XLComment(XLCell cell, String text, IXLFontBase defaultFont) + : base(text, defaultFont) + { + Initialize(cell); + } + + #region IXLComment Members + + public String Author { get; set; } + + public IXLComment SetAuthor(String value) + { + Author = value; + return this; + } + + public IXLRichString AddSignature() + { + AddText(Author + ":").SetBold(); + return AddText(Environment.NewLine); + } + + public void Delete() + { + _cell.DeleteComment(); + } + + #endregion + + #region IXLDrawing + + public String Name { get; set; } + public String Description { get; set; } + public XLDrawingAnchor Anchor { get; set; } + public Boolean HorizontalFlip { get; set; } + public Boolean VerticalFlip { get; set; } + public Int32 Rotation { get; set; } + public Int32 ExtentLength { get; set; } + public Int32 ExtentWidth { get; set; } + public Int32 ShapeId { get; internal set; } + + private Boolean _visible; + + public Boolean Visible + { + get + { + return _visible; + } + set + { + _visible = value; + } + } + + public IXLComment SetVisible() + { + Visible = true; + return Container; + } + + public IXLComment SetVisible(Boolean hidden) + { + Visible = hidden; + return Container; + } + + public IXLDrawingPosition Position { get; private set; } + + public Int32 ZOrder { get; set; } + + public IXLComment SetZOrder(Int32 zOrder) + { + ZOrder = zOrder; + return Container; + } + + public IXLDrawingStyle Style { get; private set; } + + public IXLComment SetName(String name) + { + Name = name; + return Container; + } + + public IXLComment SetDescription(String description) + { + Description = description; + return Container; + } + + public IXLComment SetHorizontalFlip() + { + HorizontalFlip = true; + return Container; + } + + public IXLComment SetHorizontalFlip(Boolean horizontalFlip) + { + HorizontalFlip = horizontalFlip; + return Container; + } + + public IXLComment SetVerticalFlip() + { + VerticalFlip = true; + return Container; + } + + public IXLComment SetVerticalFlip(Boolean verticalFlip) + { + VerticalFlip = verticalFlip; + return Container; + } + + public IXLComment SetRotation(Int32 rotation) + { + Rotation = rotation; + return Container; + } + + public IXLComment SetExtentLength(Int32 extentLength) + { + ExtentLength = extentLength; + return Container; + } + + public IXLComment SetExtentWidth(Int32 extentWidth) + { + ExtentWidth = extentWidth; + return Container; + } + + #endregion + + private void Initialize(XLCell cell) + { + Author = cell.Worksheet.Author; + Container = this; + Anchor = XLDrawingAnchor.MoveAndSizeWithCells; + Style = new XLDrawingStyle(); + Int32 pRow = cell.Address.RowNumber; + Double pRowOffset = 0; + if (pRow > 1) + { + pRow--; + double prevHeight = cell.Worksheet.Row(pRow).Height; + if (prevHeight > 7) + pRowOffset = prevHeight - 7; + } + Position = new XLDrawingPosition + { + Column = cell.Address.ColumnNumber + 1, + ColumnOffset = 2, + Row = pRow, + RowOffset = pRowOffset + }; + + ZOrder = cell.Worksheet.ZOrder++; + Style + .Margins.SetLeft(0.1) + .Margins.SetRight(0.1) + .Margins.SetTop(0.05) + .Margins.SetBottom(0.05) + .Margins.SetAutomatic() + .Size.SetHeight(59.25) + .Size.SetWidth(19.2) + .ColorsAndLines.SetLineColor(XLColor.Black) + .ColorsAndLines.SetFillColor(XLColor.FromArgb(255, 255, 225)) + .ColorsAndLines.SetLineDash(XLDashStyle.Solid) + .ColorsAndLines.SetLineStyle(XLLineStyle.Single) + .ColorsAndLines.SetLineWeight(0.75) + .ColorsAndLines.SetFillTransparency(1) + .ColorsAndLines.SetLineTransparency(1) + .Alignment.SetHorizontal(XLDrawingHorizontalAlignment.Left) + .Alignment.SetVertical(XLDrawingVerticalAlignment.Top) + .Alignment.SetDirection(XLDrawingTextDirection.Context) + .Alignment.SetOrientation(XLDrawingTextOrientation.LeftToRight) + .Properties.SetPositioning(XLDrawingAnchor.Absolute) + .Protection.SetLocked() + .Protection.SetLockText(); + + _cell = cell; + ShapeId = cell.Worksheet.Workbook.ShapeIdManager.GetNext(); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMax.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMax.cs index c147515..40217cd 100644 --- a/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMax.cs +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMax.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLCFColorScaleMax - { - void Maximum(XLCFContentType type, String value, XLColor color); - void Maximum(XLCFContentType type, Double value, XLColor color); - void HighestValue(XLColor color); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLCFColorScaleMax + { + void Maximum(XLCFContentType type, String value, XLColor color); + void Maximum(XLCFContentType type, Double value, XLColor color); + void HighestValue(XLColor color); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMid.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMid.cs index f36fdae..95e5145 100644 --- a/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMid.cs +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMid.cs @@ -1,16 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLCFColorScaleMid - { - IXLCFColorScaleMax Midpoint(XLCFContentType type, String value, XLColor color); - IXLCFColorScaleMax Midpoint(XLCFContentType type, Double value, XLColor color); - void Maximum(XLCFContentType type, String value, XLColor color); - void Maximum(XLCFContentType type, Double value, XLColor color); - void HighestValue(XLColor color); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLCFColorScaleMid + { + IXLCFColorScaleMax Midpoint(XLCFContentType type, String value, XLColor color); + IXLCFColorScaleMax Midpoint(XLCFContentType type, Double value, XLColor color); + void Maximum(XLCFContentType type, String value, XLColor color); + void Maximum(XLCFContentType type, Double value, XLColor color); + void HighestValue(XLColor color); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMin.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMin.cs index 6e942a3..7abc9ea 100644 --- a/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMin.cs +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFColorScaleMin.cs @@ -1,15 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public enum XLCFContentType { Number, Percent, Formula, Percentile, Minimum, Maximum } - public interface IXLCFColorScaleMin - { - IXLCFColorScaleMid Minimum(XLCFContentType type, String value, XLColor color); - IXLCFColorScaleMid Minimum(XLCFContentType type, Double value, XLColor color); - IXLCFColorScaleMid LowestValue(XLColor color); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLCFContentType { Number, Percent, Formula, Percentile, Minimum, Maximum } + public interface IXLCFColorScaleMin + { + IXLCFColorScaleMid Minimum(XLCFContentType type, String value, XLColor color); + IXLCFColorScaleMid Minimum(XLCFContentType type, Double value, XLColor color); + IXLCFColorScaleMid LowestValue(XLColor color); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMax.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMax.cs index 16341e3..05df66a 100644 --- a/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMax.cs +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMax.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLCFDataBarMax - { - void Maximum(XLCFContentType type, String value); - void Maximum(XLCFContentType type, Double value); - void HighestValue(); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLCFDataBarMax + { + void Maximum(XLCFContentType type, String value); + void Maximum(XLCFContentType type, Double value); + void HighestValue(); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMin.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMin.cs index a3d5e73..cd1236f 100644 --- a/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMin.cs +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFDataBarMin.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLCFDataBarMin - { - IXLCFDataBarMax Minimum(XLCFContentType type, String value); - IXLCFDataBarMax Minimum(XLCFContentType type, Double value); - IXLCFDataBarMax LowestValue(); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLCFDataBarMin + { + IXLCFDataBarMax Minimum(XLCFContentType type, String value); + IXLCFDataBarMax Minimum(XLCFContentType type, Double value); + IXLCFDataBarMax LowestValue(); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLCFIconSet.cs b/ClosedXML/Excel/ConditionalFormats/IXLCFIconSet.cs index a5a361f..e9f8073 100644 --- a/ClosedXML/Excel/ConditionalFormats/IXLCFIconSet.cs +++ b/ClosedXML/Excel/ConditionalFormats/IXLCFIconSet.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public enum XLCFIconSetOperator {GreaterThan, EqualOrGreaterThan} - public interface IXLCFIconSet - { - IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, String value, XLCFContentType type); - IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, Double value, XLCFContentType type); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLCFIconSetOperator {GreaterThan, EqualOrGreaterThan} + public interface IXLCFIconSet + { + IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, String value, XLCFContentType type); + IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, Double value, XLCFContentType type); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs index c211f7a..962cc21 100644 --- a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs +++ b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormat.cs @@ -1,124 +1,124 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public enum XLTimePeriod - { - Yesterday, - Today, - Tomorrow, - InTheLast7Days, - LastWeek, - ThisWeek, - NextWeek, - LastMonth, - ThisMonth, - NextMonth - } - public enum XLIconSetStyle - { - ThreeArrows, - ThreeArrowsGray, - ThreeFlags, - ThreeTrafficLights1, - ThreeTrafficLights2, - ThreeSigns, - ThreeSymbols, - ThreeSymbols2, - FourArrows, - FourArrowsGray, - FourRedToBlack, - FourRating, - FourTrafficLights, - FiveArrows, - FiveArrowsGray, - FiveRating, - FiveQuarters - } - public enum XLConditionalFormatType - { - Expression, - CellIs, - ColorScale, - DataBar, - IconSet, - Top10, - IsUnique, - IsDuplicate, - ContainsText, - NotContainsText, - StartsWith, - EndsWith, - IsBlank, - NotBlank, - IsError, - NotError, - TimePeriod, - AboveAverage - } - public enum XLCFOperator { Equal, NotEqual, GreaterThan, LessThan, EqualOrGreaterThan, EqualOrLessThan, Between, NotBetween, Contains, NotContains, StartsWith, EndsWith } - public interface IXLConditionalFormat - { - IXLStyle Style { get; set; } - - IXLStyle WhenIsBlank(); - IXLStyle WhenNotBlank(); - IXLStyle WhenIsError(); - IXLStyle WhenNotError(); - IXLStyle WhenDateIs(XLTimePeriod timePeriod ); - IXLStyle WhenContains(String value); - IXLStyle WhenNotContains(String value); - IXLStyle WhenStartsWith(String value); - IXLStyle WhenEndsWith(String value); - IXLStyle WhenEquals(String value); - IXLStyle WhenNotEquals(String value); - IXLStyle WhenGreaterThan(String value); - IXLStyle WhenLessThan(String value); - IXLStyle WhenEqualOrGreaterThan(String value); - IXLStyle WhenEqualOrLessThan(String value); - IXLStyle WhenBetween(String minValue, String maxValue); - IXLStyle WhenNotBetween(String minValue, String maxValue); - - IXLStyle WhenEquals(Double value); - IXLStyle WhenNotEquals(Double value); - IXLStyle WhenGreaterThan(Double value); - IXLStyle WhenLessThan(Double value); - IXLStyle WhenEqualOrGreaterThan(Double value); - IXLStyle WhenEqualOrLessThan(Double value); - IXLStyle WhenBetween(Double minValue, Double maxValue); - IXLStyle WhenNotBetween(Double minValue, Double maxValue); - - IXLStyle WhenIsDuplicate(); - IXLStyle WhenIsUnique(); - IXLStyle WhenIsTrue(String formula); - IXLStyle WhenIsTop(Int32 value, XLTopBottomType topBottomType = XLTopBottomType.Items); - IXLStyle WhenIsBottom(Int32 value, XLTopBottomType topBottomType); - - IXLCFColorScaleMin ColorScale(); - IXLCFDataBarMin DataBar(XLColor color, Boolean showBarOnly = false); - IXLCFIconSet IconSet(XLIconSetStyle iconSetStyle, Boolean reverseIconOrder = false, Boolean showIconOnly = false); - - XLConditionalFormatType ConditionalFormatType { get; } - XLIconSetStyle IconSetStyle { get; } - XLTimePeriod TimePeriod { get; } - Boolean ReverseIconOrder { get; } - Boolean ShowIconOnly { get; } - Boolean ShowBarOnly { get; } - IXLRange Range { get; set; } - - XLDictionary Values { get; } - XLDictionary Colors { get; } - XLDictionary ContentTypes { get; } - XLDictionary IconSetOperators { get; } - - XLCFOperator Operator { get; } - Boolean Bottom { get; } - Boolean Percent { get; } - - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLTimePeriod + { + Yesterday, + Today, + Tomorrow, + InTheLast7Days, + LastWeek, + ThisWeek, + NextWeek, + LastMonth, + ThisMonth, + NextMonth + } + public enum XLIconSetStyle + { + ThreeArrows, + ThreeArrowsGray, + ThreeFlags, + ThreeTrafficLights1, + ThreeTrafficLights2, + ThreeSigns, + ThreeSymbols, + ThreeSymbols2, + FourArrows, + FourArrowsGray, + FourRedToBlack, + FourRating, + FourTrafficLights, + FiveArrows, + FiveArrowsGray, + FiveRating, + FiveQuarters + } + public enum XLConditionalFormatType + { + Expression, + CellIs, + ColorScale, + DataBar, + IconSet, + Top10, + IsUnique, + IsDuplicate, + ContainsText, + NotContainsText, + StartsWith, + EndsWith, + IsBlank, + NotBlank, + IsError, + NotError, + TimePeriod, + AboveAverage + } + public enum XLCFOperator { Equal, NotEqual, GreaterThan, LessThan, EqualOrGreaterThan, EqualOrLessThan, Between, NotBetween, Contains, NotContains, StartsWith, EndsWith } + public interface IXLConditionalFormat + { + IXLStyle Style { get; set; } + + IXLStyle WhenIsBlank(); + IXLStyle WhenNotBlank(); + IXLStyle WhenIsError(); + IXLStyle WhenNotError(); + IXLStyle WhenDateIs(XLTimePeriod timePeriod ); + IXLStyle WhenContains(String value); + IXLStyle WhenNotContains(String value); + IXLStyle WhenStartsWith(String value); + IXLStyle WhenEndsWith(String value); + IXLStyle WhenEquals(String value); + IXLStyle WhenNotEquals(String value); + IXLStyle WhenGreaterThan(String value); + IXLStyle WhenLessThan(String value); + IXLStyle WhenEqualOrGreaterThan(String value); + IXLStyle WhenEqualOrLessThan(String value); + IXLStyle WhenBetween(String minValue, String maxValue); + IXLStyle WhenNotBetween(String minValue, String maxValue); + + IXLStyle WhenEquals(Double value); + IXLStyle WhenNotEquals(Double value); + IXLStyle WhenGreaterThan(Double value); + IXLStyle WhenLessThan(Double value); + IXLStyle WhenEqualOrGreaterThan(Double value); + IXLStyle WhenEqualOrLessThan(Double value); + IXLStyle WhenBetween(Double minValue, Double maxValue); + IXLStyle WhenNotBetween(Double minValue, Double maxValue); + + IXLStyle WhenIsDuplicate(); + IXLStyle WhenIsUnique(); + IXLStyle WhenIsTrue(String formula); + IXLStyle WhenIsTop(Int32 value, XLTopBottomType topBottomType = XLTopBottomType.Items); + IXLStyle WhenIsBottom(Int32 value, XLTopBottomType topBottomType); + + IXLCFColorScaleMin ColorScale(); + IXLCFDataBarMin DataBar(XLColor color, Boolean showBarOnly = false); + IXLCFIconSet IconSet(XLIconSetStyle iconSetStyle, Boolean reverseIconOrder = false, Boolean showIconOnly = false); + + XLConditionalFormatType ConditionalFormatType { get; } + XLIconSetStyle IconSetStyle { get; } + XLTimePeriod TimePeriod { get; } + Boolean ReverseIconOrder { get; } + Boolean ShowIconOnly { get; } + Boolean ShowBarOnly { get; } + IXLRange Range { get; set; } + + XLDictionary Values { get; } + XLDictionary Colors { get; } + XLDictionary ContentTypes { get; } + XLDictionary IconSetOperators { get; } + + XLCFOperator Operator { get; } + Boolean Bottom { get; } + Boolean Percent { get; } + + + } +} \ No newline at end of file diff --git a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs index 94fe02a..8ccfbdd 100644 --- a/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs +++ b/ClosedXML/Excel/ConditionalFormats/IXLConditionalFormats.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLConditionalFormats: IEnumerable - { - void Add(IXLConditionalFormat conditionalFormat); - void RemoveAll(); - void Remove(Predicate predicate); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLConditionalFormats: IEnumerable + { + void Add(IXLConditionalFormat conditionalFormat); + void RemoveAll(); + void Remove(Predicate predicate); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverter.cs index d885fea..bfa1778 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/IXLCFConverter.cs @@ -1,13 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal interface IXLCFConverter - { - ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal interface IXLCFConverter + { + ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context); + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFCellIsConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFCellIsConverter.cs index a39690d..98c63ef 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFCellIsConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFCellIsConverter.cs @@ -1,46 +1,46 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFCellIsConverter : IXLCFConverter - { - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) - { - String val = GetQuoted(cf.Values[1]); - - - var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = cf.Operator.ToOpenXml(), Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var formula = new Formula(); - if (cf.Operator == XLCFOperator.Equal || cf.Operator == XLCFOperator.NotEqual) - formula.Text = val; - else - formula.Text = val; - conditionalFormattingRule.Append(formula); - - if(cf.Operator == XLCFOperator.Between || cf.Operator == XLCFOperator.NotBetween) - { - var formula2 = new Formula { Text = GetQuoted(cf.Values[2]) }; - conditionalFormattingRule.Append(formula2); - } - - return conditionalFormattingRule; - } - - private String GetQuoted(XLFormula formula) - { - String value = formula.Value; - Double num; - if ((!Double.TryParse(value, out num) && !formula.IsFormula) && value[0] != '\"' && !value.EndsWith("\"")) - return String.Format("\"{0}\"", value.Replace("\"", "\"\"")); - - return value; - } - - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFCellIsConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + String val = GetQuoted(cf.Values[1]); + + + var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = cf.Operator.ToOpenXml(), Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var formula = new Formula(); + if (cf.Operator == XLCFOperator.Equal || cf.Operator == XLCFOperator.NotEqual) + formula.Text = val; + else + formula.Text = val; + conditionalFormattingRule.Append(formula); + + if(cf.Operator == XLCFOperator.Between || cf.Operator == XLCFOperator.NotBetween) + { + var formula2 = new Formula { Text = GetQuoted(cf.Values[2]) }; + conditionalFormattingRule.Append(formula2); + } + + return conditionalFormattingRule; + } + + private String GetQuoted(XLFormula formula) + { + String value = formula.Value; + Double num; + if ((!Double.TryParse(value, out num) && !formula.IsFormula) && value[0] != '\"' && !value.EndsWith("\"")) + return String.Format("\"{0}\"", value.Replace("\"", "\"\"")); + + return value; + } + + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs index 6f38667..952a72d 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs @@ -1,40 +1,40 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFColorScaleConverter : IXLCFConverter - { - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context) - { - var conditionalFormattingRule = new ConditionalFormattingRule { Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var colorScale = new ColorScale(); - for (Int32 i = 1; i <= cf.ContentTypes.Count; i++) - { - var type = cf.ContentTypes[i].ToOpenXml(); - var val = (cf.Values.ContainsKey(i) && cf.Values[i] != null) ? cf.Values[i].Value : null; - - var conditionalFormatValueObject = new ConditionalFormatValueObject { Type = type }; - if (val != null) - conditionalFormatValueObject.Val = val; - - colorScale.Append(conditionalFormatValueObject); - } - - for (Int32 i = 1; i <= cf.Colors.Count; i++) - { - Color color = new Color { Rgb = cf.Colors[i].Color.ToHex() }; - colorScale.Append(color); - } - - conditionalFormattingRule.Append(colorScale); - - return conditionalFormattingRule; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFColorScaleConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = new ConditionalFormattingRule { Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var colorScale = new ColorScale(); + for (Int32 i = 1; i <= cf.ContentTypes.Count; i++) + { + var type = cf.ContentTypes[i].ToOpenXml(); + var val = (cf.Values.ContainsKey(i) && cf.Values[i] != null) ? cf.Values[i].Value : null; + + var conditionalFormatValueObject = new ConditionalFormatValueObject { Type = type }; + if (val != null) + conditionalFormatValueObject.Val = val; + + colorScale.Append(conditionalFormatValueObject); + } + + for (Int32 i = 1; i <= cf.Colors.Count; i++) + { + Color color = new Color { Rgb = cf.Colors[i].Color.ToHex() }; + colorScale.Append(color); + } + + conditionalFormattingRule.Append(colorScale); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs index 83ccf67..c12c3b8 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFContainsConverter.cs @@ -1,25 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFContainsConverter : IXLCFConverter - { - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) - { - String val = cf.Values[1].Value; - var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.ContainsText, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var formula = new Formula { Text = "NOT(ISERROR(SEARCH(\"" + val + "\"," + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + ")))" }; - - conditionalFormattingRule.Append(formula); - - return conditionalFormattingRule; - } - - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFContainsConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + String val = cf.Values[1].Value; + var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.ContainsText, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var formula = new Formula { Text = "NOT(ISERROR(SEARCH(\"" + val + "\"," + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + ")))" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs index e4ed8bb..fc84360 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFConverters.cs @@ -1,37 +1,37 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFConverters - { - private static readonly Dictionary Converters; - static XLCFConverters() - { - Converters = new Dictionary(); - Converters.Add(XLConditionalFormatType.ColorScale, new XLCFColorScaleConverter()); - Converters.Add(XLConditionalFormatType.StartsWith, new XLCFStartsWithConverter()); - Converters.Add(XLConditionalFormatType.EndsWith, new XLCFEndsWithConverter()); - Converters.Add(XLConditionalFormatType.IsBlank, new XLCFIsBlankConverter()); - Converters.Add(XLConditionalFormatType.NotBlank, new XLCFNotBlankConverter()); - Converters.Add(XLConditionalFormatType.IsError, new XLCFIsErrorConverter()); - Converters.Add(XLConditionalFormatType.NotError, new XLCFNotErrorConverter()); - Converters.Add(XLConditionalFormatType.ContainsText, new XLCFContainsConverter()); - Converters.Add(XLConditionalFormatType.NotContainsText, new XLCFNotContainsConverter()); - Converters.Add(XLConditionalFormatType.CellIs, new XLCFCellIsConverter()); - Converters.Add(XLConditionalFormatType.IsUnique, new XLCFUniqueConverter()); - Converters.Add(XLConditionalFormatType.IsDuplicate, new XLCFUniqueConverter()); - Converters.Add(XLConditionalFormatType.Expression, new XLCFCellIsConverter()); - Converters.Add(XLConditionalFormatType.Top10, new XLCFTopConverter()); - Converters.Add(XLConditionalFormatType.DataBar, new XLCFDataBarConverter()); - Converters.Add(XLConditionalFormatType.IconSet, new XLCFIconSetConverter()); - } - public static ConditionalFormattingRule Convert(IXLConditionalFormat conditionalFormat, Int32 priority, XLWorkbook.SaveContext context) - { - return Converters[conditionalFormat.ConditionalFormatType].Convert(conditionalFormat, priority, context); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFConverters + { + private static readonly Dictionary Converters; + static XLCFConverters() + { + Converters = new Dictionary(); + Converters.Add(XLConditionalFormatType.ColorScale, new XLCFColorScaleConverter()); + Converters.Add(XLConditionalFormatType.StartsWith, new XLCFStartsWithConverter()); + Converters.Add(XLConditionalFormatType.EndsWith, new XLCFEndsWithConverter()); + Converters.Add(XLConditionalFormatType.IsBlank, new XLCFIsBlankConverter()); + Converters.Add(XLConditionalFormatType.NotBlank, new XLCFNotBlankConverter()); + Converters.Add(XLConditionalFormatType.IsError, new XLCFIsErrorConverter()); + Converters.Add(XLConditionalFormatType.NotError, new XLCFNotErrorConverter()); + Converters.Add(XLConditionalFormatType.ContainsText, new XLCFContainsConverter()); + Converters.Add(XLConditionalFormatType.NotContainsText, new XLCFNotContainsConverter()); + Converters.Add(XLConditionalFormatType.CellIs, new XLCFCellIsConverter()); + Converters.Add(XLConditionalFormatType.IsUnique, new XLCFUniqueConverter()); + Converters.Add(XLConditionalFormatType.IsDuplicate, new XLCFUniqueConverter()); + Converters.Add(XLConditionalFormatType.Expression, new XLCFCellIsConverter()); + Converters.Add(XLConditionalFormatType.Top10, new XLCFTopConverter()); + Converters.Add(XLConditionalFormatType.DataBar, new XLCFDataBarConverter()); + Converters.Add(XLConditionalFormatType.IconSet, new XLCFIconSetConverter()); + } + public static ConditionalFormattingRule Convert(IXLConditionalFormat conditionalFormat, Int32 priority, XLWorkbook.SaveContext context) + { + return Converters[conditionalFormat.ConditionalFormatType].Convert(conditionalFormat, priority, context); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs index 1b2f0be..f0bd151 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs @@ -1,34 +1,34 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFDataBarConverter:IXLCFConverter - { - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context) - { - var conditionalFormattingRule = new ConditionalFormattingRule { Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var dataBar = new DataBar {ShowValue = !cf.ShowBarOnly}; - var conditionalFormatValueObject1 = new ConditionalFormatValueObject { Type = cf.ContentTypes[1].ToOpenXml()}; - if (cf.Values.Count >= 1) conditionalFormatValueObject1.Val = cf.Values[1].Value; - - var conditionalFormatValueObject2 = new ConditionalFormatValueObject { Type = cf.ContentTypes[2].ToOpenXml()}; - if (cf.Values.Count >= 2) conditionalFormatValueObject2.Val = cf.Values[2].Value; - - var color = new Color { Rgb = cf.Colors[1].Color.ToHex() }; - - dataBar.Append(conditionalFormatValueObject1); - dataBar.Append(conditionalFormatValueObject2); - dataBar.Append(color); - - conditionalFormattingRule.Append(dataBar); - - return conditionalFormattingRule; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFDataBarConverter:IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = new ConditionalFormattingRule { Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var dataBar = new DataBar {ShowValue = !cf.ShowBarOnly}; + var conditionalFormatValueObject1 = new ConditionalFormatValueObject { Type = cf.ContentTypes[1].ToOpenXml()}; + if (cf.Values.Count >= 1) conditionalFormatValueObject1.Val = cf.Values[1].Value; + + var conditionalFormatValueObject2 = new ConditionalFormatValueObject { Type = cf.ContentTypes[2].ToOpenXml()}; + if (cf.Values.Count >= 2) conditionalFormatValueObject2.Val = cf.Values[2].Value; + + var color = new Color { Rgb = cf.Colors[1].Color.ToHex() }; + + dataBar.Append(conditionalFormatValueObject1); + dataBar.Append(conditionalFormatValueObject2); + dataBar.Append(color); + + conditionalFormattingRule.Append(dataBar); + + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs index 1425fc6..4c1f2f8 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFEndsWithConverter.cs @@ -1,25 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFEndsWithConverter : IXLCFConverter - { - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) - { - String val = cf.Values[1].Value; - var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.EndsWith, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var formula = new Formula { Text = "RIGHT(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "," + val.Length.ToString() + ")=\"" + val + "\"" }; - - conditionalFormattingRule.Append(formula); - - return conditionalFormattingRule; - } - - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFEndsWithConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + String val = cf.Values[1].Value; + var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.EndsWith, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var formula = new Formula { Text = "RIGHT(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "," + val.Length.ToString() + ")=\"" + val + "\"" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs index b5922ec..bdb78d2 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIconSetConverter.cs @@ -1,28 +1,28 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFIconSetConverter:IXLCFConverter - { - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context) - { - var conditionalFormattingRule = new ConditionalFormattingRule { Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var iconSet = new IconSet {ShowValue = !cf.ShowIconOnly, Reverse = cf.ReverseIconOrder, IconSetValue = cf.IconSetStyle.ToOpenXml()}; - Int32 count = cf.Values.Count; - for(Int32 i=1;i<= count; i++ ) - { - var conditionalFormatValueObject = new ConditionalFormatValueObject { Type = cf.ContentTypes[i].ToOpenXml(), Val = cf.Values[i].Value, GreaterThanOrEqual = cf.IconSetOperators[i] == XLCFIconSetOperator.EqualOrGreaterThan}; - iconSet.Append(conditionalFormatValueObject); - - } - conditionalFormattingRule.Append(iconSet); - return conditionalFormattingRule; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFIconSetConverter:IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, Int32 priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = new ConditionalFormattingRule { Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var iconSet = new IconSet {ShowValue = !cf.ShowIconOnly, Reverse = cf.ReverseIconOrder, IconSetValue = cf.IconSetStyle.ToOpenXml()}; + Int32 count = cf.Values.Count; + for(Int32 i=1;i<= count; i++ ) + { + var conditionalFormatValueObject = new ConditionalFormatValueObject { Type = cf.ContentTypes[i].ToOpenXml(), Val = cf.Values[i].Value, GreaterThanOrEqual = cf.IconSetOperators[i] == XLCFIconSetOperator.EqualOrGreaterThan}; + iconSet.Append(conditionalFormatValueObject); + + } + conditionalFormattingRule.Append(iconSet); + return conditionalFormattingRule; + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs index 21e5e65..0a37418 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsBlankConverter.cs @@ -1,24 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFIsBlankConverter : IXLCFConverter - { - - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) - { - var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var formula = new Formula { Text = "LEN(TRIM(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))=0" }; - - conditionalFormattingRule.Append(formula); - - return conditionalFormattingRule; - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFIsBlankConverter : IXLCFConverter + { + + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var formula = new Formula { Text = "LEN(TRIM(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))=0" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs index 7fc1d7a..7faacff 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFIsErrorConverter.cs @@ -1,24 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFIsErrorConverter : IXLCFConverter - { - - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) - { - var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var formula = new Formula { Text = "ISERROR(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + ")" }; - - conditionalFormattingRule.Append(formula); - - return conditionalFormattingRule; - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFIsErrorConverter : IXLCFConverter + { + + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var formula = new Formula { Text = "ISERROR(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + ")" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs index aaeef02..ebebc5b 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotBlankConverter.cs @@ -1,24 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFNotBlankConverter : IXLCFConverter - { - - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) - { - var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var formula = new Formula { Text = "LEN(TRIM(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))>0" }; - - conditionalFormattingRule.Append(formula); - - return conditionalFormattingRule; - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFNotBlankConverter : IXLCFConverter + { + + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var formula = new Formula { Text = "LEN(TRIM(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))>0" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs index 6d86b12..6b46bf4 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotContainsConverter.cs @@ -1,25 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFNotContainsConverter : IXLCFConverter - { - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) - { - String val = cf.Values[1].Value; - var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.NotContains, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var formula = new Formula { Text = "ISERROR(SEARCH(\"" + val + "\"," + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))" }; - - conditionalFormattingRule.Append(formula); - - return conditionalFormattingRule; - } - - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFNotContainsConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + String val = cf.Values[1].Value; + var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.NotContains, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var formula = new Formula { Text = "ISERROR(SEARCH(\"" + val + "\"," + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs index 2510a0a..63f9ba9 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFNotErrorConverter.cs @@ -1,24 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFNotErrorConverter : IXLCFConverter - { - - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) - { - var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var formula = new Formula { Text = "NOT(ISERROR(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))" }; - - conditionalFormattingRule.Append(formula); - - return conditionalFormattingRule; - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFNotErrorConverter : IXLCFConverter + { + + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var formula = new Formula { Text = "NOT(ISERROR(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "))" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs index 7cee965..20cb843 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFStartsWithConverter.cs @@ -1,25 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFStartsWithConverter : IXLCFConverter - { - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) - { - String val = cf.Values[1].Value; - var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.BeginsWith, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - - var formula = new Formula { Text = "LEFT(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "," + val.Length.ToString() + ")=\"" + val + "\"" }; - - conditionalFormattingRule.Append(formula); - - return conditionalFormattingRule; - } - - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFStartsWithConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + String val = cf.Values[1].Value; + var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Operator = ConditionalFormattingOperatorValues.BeginsWith, Text = val, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + + var formula = new Formula { Text = "LEFT(" + cf.Range.RangeAddress.FirstAddress.ToStringRelative(false) + "," + val.Length.ToString() + ")=\"" + val + "\"" }; + + conditionalFormattingRule.Append(formula); + + return conditionalFormattingRule; + } + + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs index 57b90f3..277144d 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFTopConverter.cs @@ -1,20 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFTopConverter : IXLCFConverter - { - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) - { - UInt32 val = UInt32.Parse(cf.Values[1].Value); - var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Percent = cf.Percent, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority, Rank = val, Bottom = cf.Bottom}; - return conditionalFormattingRule; - } - - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFTopConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + UInt32 val = UInt32.Parse(cf.Values[1].Value); + var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Percent = cf.Percent, Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority, Rank = val, Bottom = cf.Bottom}; + return conditionalFormattingRule; + } + + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs b/ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs index c6b4ef9..da68ca8 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFUniqueConverter.cs @@ -1,19 +1,19 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLCFUniqueConverter : IXLCFConverter - { - public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) - { - var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; - return conditionalFormattingRule; - } - - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLCFUniqueConverter : IXLCFConverter + { + public ConditionalFormattingRule Convert(IXLConditionalFormat cf, int priority, XLWorkbook.SaveContext context) + { + var conditionalFormattingRule = new ConditionalFormattingRule { FormatId = (UInt32)context.DifferentialFormats[cf.Style], Type = cf.ConditionalFormatType.ToOpenXml(), Priority = priority }; + return conditionalFormattingRule; + } + + + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMax.cs b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMax.cs index 7fdf8de..8d4cd00 100644 --- a/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMax.cs +++ b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMax.cs @@ -1,30 +1,30 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLCFColorScaleMax : IXLCFColorScaleMax - { - private readonly XLConditionalFormat _conditionalFormat; - public XLCFColorScaleMax(XLConditionalFormat conditionalFormat) - { - _conditionalFormat = conditionalFormat; - } - - public void Maximum(XLCFContentType type, String value, XLColor color) - { - _conditionalFormat.Values.Add(new XLFormula { Value = value }); - _conditionalFormat.Colors.Add(color); - _conditionalFormat.ContentTypes.Add(type); - } - public void Maximum(XLCFContentType type, Double value, XLColor color) - { - Maximum(type, value.ToInvariantString(), color); - } - public void HighestValue(XLColor color) - { - _conditionalFormat.Values.Add(null); - _conditionalFormat.Colors.Add(color); - _conditionalFormat.ContentTypes.Add(XLCFContentType.Maximum); - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFColorScaleMax : IXLCFColorScaleMax + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFColorScaleMax(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + + public void Maximum(XLCFContentType type, String value, XLColor color) + { + _conditionalFormat.Values.Add(new XLFormula { Value = value }); + _conditionalFormat.Colors.Add(color); + _conditionalFormat.ContentTypes.Add(type); + } + public void Maximum(XLCFContentType type, Double value, XLColor color) + { + Maximum(type, value.ToInvariantString(), color); + } + public void HighestValue(XLColor color) + { + _conditionalFormat.Values.Add(null); + _conditionalFormat.Colors.Add(color); + _conditionalFormat.ContentTypes.Add(XLCFContentType.Maximum); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMid.cs b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMid.cs index d868a73..222649e 100644 --- a/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMid.cs +++ b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMid.cs @@ -1,38 +1,38 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLCFColorScaleMid : IXLCFColorScaleMid - { - private readonly XLConditionalFormat _conditionalFormat; - public XLCFColorScaleMid(XLConditionalFormat conditionalFormat) - { - _conditionalFormat = conditionalFormat; - } - public IXLCFColorScaleMax Midpoint(XLCFContentType type, String value, XLColor color) - { - _conditionalFormat.Values.Add(new XLFormula { Value = value }); - _conditionalFormat.Colors.Add(color); - _conditionalFormat.ContentTypes.Add(type); - return new XLCFColorScaleMax(_conditionalFormat); - } - public IXLCFColorScaleMax Midpoint(XLCFContentType type, Double value, XLColor color) - { - return Midpoint(type, value.ToInvariantString(), color); - } - public void Maximum(XLCFContentType type, String value, XLColor color) - { - Midpoint(type, value, color); - } - public void Maximum(XLCFContentType type, Double value, XLColor color) - { - Maximum(type, value.ToInvariantString(), color); - } - public void HighestValue(XLColor color) - { - _conditionalFormat.Values.Initialize(null); - _conditionalFormat.Colors.Add(color); - _conditionalFormat.ContentTypes.Add(XLCFContentType.Maximum); - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFColorScaleMid : IXLCFColorScaleMid + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFColorScaleMid(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + public IXLCFColorScaleMax Midpoint(XLCFContentType type, String value, XLColor color) + { + _conditionalFormat.Values.Add(new XLFormula { Value = value }); + _conditionalFormat.Colors.Add(color); + _conditionalFormat.ContentTypes.Add(type); + return new XLCFColorScaleMax(_conditionalFormat); + } + public IXLCFColorScaleMax Midpoint(XLCFContentType type, Double value, XLColor color) + { + return Midpoint(type, value.ToInvariantString(), color); + } + public void Maximum(XLCFContentType type, String value, XLColor color) + { + Midpoint(type, value, color); + } + public void Maximum(XLCFContentType type, Double value, XLColor color) + { + Maximum(type, value.ToInvariantString(), color); + } + public void HighestValue(XLColor color) + { + _conditionalFormat.Values.Initialize(null); + _conditionalFormat.Colors.Add(color); + _conditionalFormat.ContentTypes.Add(XLCFContentType.Maximum); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMin.cs b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMin.cs index 9f2b647..35c9a78 100644 --- a/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMin.cs +++ b/ClosedXML/Excel/ConditionalFormats/XLCFColorScaleMin.cs @@ -1,36 +1,36 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLCFColorScaleMin : IXLCFColorScaleMin - { - private readonly XLConditionalFormat _conditionalFormat; - public XLCFColorScaleMin(XLConditionalFormat conditionalFormat) - { - _conditionalFormat = conditionalFormat; - } - - public IXLCFColorScaleMid Minimum(XLCFContentType type, String value, XLColor color) - { - _conditionalFormat.Values.Initialize(new XLFormula { Value = value }); - _conditionalFormat.Colors.Initialize(color); - _conditionalFormat.ContentTypes.Initialize(type); - return new XLCFColorScaleMid(_conditionalFormat); - } - public IXLCFColorScaleMid Minimum(XLCFContentType type, Double value, XLColor color) - { - return Minimum(type, value.ToInvariantString(), color); - } - - public IXLCFColorScaleMid LowestValue(XLColor color) - { - _conditionalFormat.Values.Initialize(null); - _conditionalFormat.Colors.Initialize(color); - _conditionalFormat.ContentTypes.Initialize(XLCFContentType.Minimum); - return new XLCFColorScaleMid(_conditionalFormat); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLCFColorScaleMin : IXLCFColorScaleMin + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFColorScaleMin(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + + public IXLCFColorScaleMid Minimum(XLCFContentType type, String value, XLColor color) + { + _conditionalFormat.Values.Initialize(new XLFormula { Value = value }); + _conditionalFormat.Colors.Initialize(color); + _conditionalFormat.ContentTypes.Initialize(type); + return new XLCFColorScaleMid(_conditionalFormat); + } + public IXLCFColorScaleMid Minimum(XLCFContentType type, Double value, XLColor color) + { + return Minimum(type, value.ToInvariantString(), color); + } + + public IXLCFColorScaleMid LowestValue(XLColor color) + { + _conditionalFormat.Values.Initialize(null); + _conditionalFormat.Colors.Initialize(color); + _conditionalFormat.ContentTypes.Initialize(XLCFContentType.Minimum); + return new XLCFColorScaleMid(_conditionalFormat); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMax.cs b/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMax.cs index cfedb03..50658ac 100644 --- a/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMax.cs +++ b/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMax.cs @@ -1,31 +1,31 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLCFDataBarMax : IXLCFDataBarMax - { - private readonly XLConditionalFormat _conditionalFormat; - public XLCFDataBarMax(XLConditionalFormat conditionalFormat) - { - _conditionalFormat = conditionalFormat; - } - - public void Maximum(XLCFContentType type, String value) - { - _conditionalFormat.ContentTypes.Add(type); - _conditionalFormat.Values.Add(new XLFormula { Value = value }); - } - public void Maximum(XLCFContentType type, Double value) - { - Maximum(type, value.ToInvariantString()); - } - - public void HighestValue() - { - Maximum(XLCFContentType.Maximum, "0"); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLCFDataBarMax : IXLCFDataBarMax + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFDataBarMax(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + + public void Maximum(XLCFContentType type, String value) + { + _conditionalFormat.ContentTypes.Add(type); + _conditionalFormat.Values.Add(new XLFormula { Value = value }); + } + public void Maximum(XLCFContentType type, Double value) + { + Maximum(type, value.ToInvariantString()); + } + + public void HighestValue() + { + Maximum(XLCFContentType.Maximum, "0"); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMin.cs b/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMin.cs index 11770f8..b6803dc 100644 --- a/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMin.cs +++ b/ClosedXML/Excel/ConditionalFormats/XLCFDataBarMin.cs @@ -1,32 +1,32 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLCFDataBarMin : IXLCFDataBarMin - { - private readonly XLConditionalFormat _conditionalFormat; - public XLCFDataBarMin(XLConditionalFormat conditionalFormat) - { - _conditionalFormat = conditionalFormat; - } - - public IXLCFDataBarMax Minimum(XLCFContentType type, String value) - { - _conditionalFormat.ContentTypes.Initialize(type); - _conditionalFormat.Values.Initialize(new XLFormula { Value = value }); - return new XLCFDataBarMax(_conditionalFormat); - } - public IXLCFDataBarMax Minimum(XLCFContentType type, Double value) - { - return Minimum(type, value.ToInvariantString()); - } - - public IXLCFDataBarMax LowestValue() - { - return Minimum(XLCFContentType.Minimum, "0"); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLCFDataBarMin : IXLCFDataBarMin + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFDataBarMin(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + + public IXLCFDataBarMax Minimum(XLCFContentType type, String value) + { + _conditionalFormat.ContentTypes.Initialize(type); + _conditionalFormat.Values.Initialize(new XLFormula { Value = value }); + return new XLCFDataBarMax(_conditionalFormat); + } + public IXLCFDataBarMax Minimum(XLCFContentType type, Double value) + { + return Minimum(type, value.ToInvariantString()); + } + + public IXLCFDataBarMax LowestValue() + { + return Minimum(XLCFContentType.Minimum, "0"); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLCFIconSet.cs b/ClosedXML/Excel/ConditionalFormats/XLCFIconSet.cs index 6210197..2c88ea5 100644 --- a/ClosedXML/Excel/ConditionalFormats/XLCFIconSet.cs +++ b/ClosedXML/Excel/ConditionalFormats/XLCFIconSet.cs @@ -1,24 +1,24 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLCFIconSet : IXLCFIconSet - { - private readonly XLConditionalFormat _conditionalFormat; - public XLCFIconSet(XLConditionalFormat conditionalFormat) - { - _conditionalFormat = conditionalFormat; - } - public IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, String value, XLCFContentType type) - { - _conditionalFormat.IconSetOperators.Add(setOperator); - _conditionalFormat.Values.Add(new XLFormula { Value = value }); - _conditionalFormat.ContentTypes.Add(type); - return new XLCFIconSet(_conditionalFormat); - } - public IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, Double value, XLCFContentType type) - { - return AddValue(setOperator, value.ToInvariantString(), type); - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLCFIconSet : IXLCFIconSet + { + private readonly XLConditionalFormat _conditionalFormat; + public XLCFIconSet(XLConditionalFormat conditionalFormat) + { + _conditionalFormat = conditionalFormat; + } + public IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, String value, XLCFContentType type) + { + _conditionalFormat.IconSetOperators.Add(setOperator); + _conditionalFormat.Values.Add(new XLFormula { Value = value }); + _conditionalFormat.ContentTypes.Add(type); + return new XLCFIconSet(_conditionalFormat); + } + public IXLCFIconSet AddValue(XLCFIconSetOperator setOperator, Double value, XLCFContentType type) + { + return AddValue(setOperator, value.ToInvariantString(), type); + } + } +} diff --git a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs index d42b9fc..96847d6 100644 --- a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs +++ b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormat.cs @@ -1,357 +1,357 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLConditionalFormat: IXLConditionalFormat, IXLStylized - { - - public XLConditionalFormat(XLRange range, Boolean copyDefaultModify = false) - { - Range = range; - Style = new XLStyle(this, range.Worksheet.Style); - Values = new XLDictionary(); - Colors = new XLDictionary(); - ContentTypes = new XLDictionary(); - IconSetOperators = new XLDictionary(); - CopyDefaultModify = copyDefaultModify; - } - public XLConditionalFormat(XLConditionalFormat other) - { - Range = other.Range; - Style = new XLStyle(this, other.Style); - Values = new XLDictionary(other.Values); - Colors = new XLDictionary(other.Colors); - ContentTypes = new XLDictionary(other.ContentTypes); - IconSetOperators = new XLDictionary(other.IconSetOperators); - - - ConditionalFormatType = other.ConditionalFormatType; - TimePeriod = other.TimePeriod; - IconSetStyle = other.IconSetStyle; - Operator = other.Operator; - Bottom = other.Bottom; - Percent = other.Percent; - ReverseIconOrder = other.ReverseIconOrder; - ShowIconOnly = other.ShowIconOnly; - ShowBarOnly = other.ShowBarOnly; - } - - public Boolean CopyDefaultModify { get; set; } - private IXLStyle _style; - private Int32 _styleCacheId; - public IXLStyle Style{ get { return GetStyle(); } set { SetStyle(value); } } - private IXLStyle GetStyle() - { - //return _style; - if (_style != null) - return _style; - - return _style = new XLStyle(this, Range.Worksheet.Workbook.GetStyleById(_styleCacheId), CopyDefaultModify); - } - private void SetStyle(IXLStyle styleToUse) - { - //_style = new XLStyle(this, styleToUse); - _styleCacheId = Range.Worksheet.Workbook.GetStyleId(styleToUse); - _style = null; - StyleChanged = false; - } - - public IEnumerable Styles - { - get - { - UpdatingStyle = true; - yield return Style; - UpdatingStyle = false; - } - } - - public bool UpdatingStyle { get; set; } - - public IXLStyle InnerStyle { get; set; } - - public IXLRanges RangesUsed - { - get { return new XLRanges(); } - } - - public bool StyleChanged { get; set; } - public XLDictionary Values { get; private set; } - public XLDictionary Colors { get; private set; } - public XLDictionary ContentTypes { get; private set; } - public XLDictionary IconSetOperators { get; private set; } - - public IXLRange Range { get; set; } - public XLConditionalFormatType ConditionalFormatType { get; set; } - public XLTimePeriod TimePeriod { get; set; } - public XLIconSetStyle IconSetStyle { get; set; } - public XLCFOperator Operator { get; set; } - public Boolean Bottom { get; set; } - public Boolean Percent { get; set; } - public Boolean ReverseIconOrder { get; set; } - public Boolean ShowIconOnly { get; set; } - public Boolean ShowBarOnly { get; set; } - - public void CopyFrom(IXLConditionalFormat other) - { - Style = other.Style; - ConditionalFormatType = other.ConditionalFormatType; - TimePeriod = other.TimePeriod; - IconSetStyle = other.IconSetStyle; - Operator = other.Operator; - Bottom = other.Bottom; - Percent = other.Percent; - ReverseIconOrder = other.ReverseIconOrder; - ShowIconOnly = other.ShowIconOnly; - ShowBarOnly = other.ShowBarOnly; - - Values.Clear(); - other.Values.ForEach(kp => Values.Add(kp.Key, new XLFormula(kp.Value))); - //CopyDictionary(Values, other.Values); - CopyDictionary(Colors, other.Colors); - CopyDictionary(ContentTypes, other.ContentTypes); - CopyDictionary(IconSetOperators, other.IconSetOperators); - } - - private void CopyDictionary(XLDictionary target, XLDictionary source) - { - target.Clear(); - source.ForEach(kp => target.Add(kp.Key, kp.Value)); - } - - public IXLStyle WhenIsBlank() - { - ConditionalFormatType = XLConditionalFormatType.IsBlank; - return Style; - } - public IXLStyle WhenNotBlank() - { - ConditionalFormatType = XLConditionalFormatType.NotBlank; - return Style; - } - public IXLStyle WhenIsError() - { - ConditionalFormatType = XLConditionalFormatType.IsError; - return Style; - } - public IXLStyle WhenNotError() - { - ConditionalFormatType = XLConditionalFormatType.NotError; - return Style; - } - public IXLStyle WhenDateIs(XLTimePeriod timePeriod) - { - TimePeriod = timePeriod; - ConditionalFormatType = XLConditionalFormatType.TimePeriod; - return Style; - } - public IXLStyle WhenContains(String value) - { - Values.Initialize(new XLFormula { Value = value }); - ConditionalFormatType = XLConditionalFormatType.ContainsText; - Operator = XLCFOperator.Contains; - return Style; - } - public IXLStyle WhenNotContains(String value) - { - Values.Initialize(new XLFormula { Value = value }); - ConditionalFormatType = XLConditionalFormatType.NotContainsText; - Operator = XLCFOperator.NotContains; - return Style; - } - public IXLStyle WhenStartsWith(String value) - { - Values.Initialize(new XLFormula { Value = value }); - ConditionalFormatType = XLConditionalFormatType.StartsWith; - Operator = XLCFOperator.StartsWith; - return Style; - } - public IXLStyle WhenEndsWith(String value) - { - Values.Initialize(new XLFormula { Value = value }); - ConditionalFormatType = XLConditionalFormatType.EndsWith; - Operator = XLCFOperator.EndsWith; - return Style; - } - - public IXLStyle WhenEquals(String value) - { - Values.Initialize(new XLFormula { Value = value }); - Operator = XLCFOperator.Equal; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenNotEquals(String value) - { - Values.Initialize(new XLFormula { Value = value }); - Operator = XLCFOperator.NotEqual; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenGreaterThan(String value) - { - Values.Initialize(new XLFormula { Value = value }); - Operator = XLCFOperator.GreaterThan; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenLessThan(String value) - { - Values.Initialize(new XLFormula { Value = value }); - Operator = XLCFOperator.LessThan; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenEqualOrGreaterThan(String value) - { - Values.Initialize(new XLFormula { Value = value }); - Operator = XLCFOperator.EqualOrGreaterThan; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenEqualOrLessThan(String value) - { - Values.Initialize(new XLFormula { Value = value }); - Operator = XLCFOperator.EqualOrLessThan; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenBetween(String minValue, String maxValue) - { - Values.Initialize(new XLFormula { Value = minValue }); - Values.Add(new XLFormula { Value = maxValue }); - Operator = XLCFOperator.Between; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenNotBetween(String minValue, String maxValue) - { - Values.Initialize(new XLFormula { Value = minValue }); - Values.Add(new XLFormula { Value = maxValue }); - Operator = XLCFOperator.NotBetween; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - - public IXLStyle WhenEquals(Double value) - { - Values.Initialize(new XLFormula(value)); - Operator = XLCFOperator.Equal; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenNotEquals(Double value) - { - Values.Initialize(new XLFormula(value)); - Operator = XLCFOperator.NotEqual; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenGreaterThan(Double value) - { - Values.Initialize(new XLFormula(value)); - Operator = XLCFOperator.GreaterThan; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenLessThan(Double value) - { - Values.Initialize(new XLFormula(value)); - Operator = XLCFOperator.LessThan; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenEqualOrGreaterThan(Double value) - { - Values.Initialize(new XLFormula(value)); - Operator = XLCFOperator.EqualOrGreaterThan; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenEqualOrLessThan(Double value) - { - Values.Initialize(new XLFormula(value)); - Operator = XLCFOperator.EqualOrLessThan; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenBetween(Double minValue, Double maxValue) - { - Values.Initialize(new XLFormula (minValue)); - Values.Add(new XLFormula(maxValue)); - Operator = XLCFOperator.Between; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - public IXLStyle WhenNotBetween(Double minValue, Double maxValue) - { - Values.Initialize(new XLFormula(minValue)); - Values.Add(new XLFormula(maxValue)); - Operator = XLCFOperator.NotBetween; - ConditionalFormatType = XLConditionalFormatType.CellIs; - return Style; - } - - public IXLStyle WhenIsDuplicate() - { - ConditionalFormatType = XLConditionalFormatType.IsDuplicate; - return Style; - } - public IXLStyle WhenIsUnique() - { - ConditionalFormatType = XLConditionalFormatType.IsUnique; - return Style; - } - public IXLStyle WhenIsTrue(String formula) - { - String f = formula.TrimStart()[0] == '=' ? formula : "=" + formula; - Values.Initialize(new XLFormula {Value = f}); - ConditionalFormatType = XLConditionalFormatType.Expression; - return Style; - } - public IXLStyle WhenIsTop(Int32 value, XLTopBottomType topBottomType = XLTopBottomType.Items) - { - Values.Initialize(new XLFormula(value)); - Percent = topBottomType == XLTopBottomType.Percent; - ConditionalFormatType = XLConditionalFormatType.Top10; - Bottom = false; - return Style; - } - public IXLStyle WhenIsBottom(Int32 value, XLTopBottomType topBottomType = XLTopBottomType.Items) - { - Values.Initialize(new XLFormula(value)); - Percent = topBottomType == XLTopBottomType.Percent; - ConditionalFormatType = XLConditionalFormatType.Top10; - Bottom = true; - return Style; - } - - public IXLCFColorScaleMin ColorScale() - { - ConditionalFormatType = XLConditionalFormatType.ColorScale; - return new XLCFColorScaleMin(this); - } - public IXLCFDataBarMin DataBar(XLColor color, Boolean showBarOnly = false) - { - Colors.Initialize(color); - ShowBarOnly = showBarOnly; - ConditionalFormatType = XLConditionalFormatType.DataBar; - return new XLCFDataBarMin(this); - } - public IXLCFIconSet IconSet(XLIconSetStyle iconSetStyle, Boolean reverseIconOrder = false, Boolean showIconOnly = false) - { - IconSetOperators.Clear(); - Values.Clear(); - ContentTypes.Clear(); - ConditionalFormatType = XLConditionalFormatType.IconSet; - IconSetStyle = iconSetStyle; - ReverseIconOrder = reverseIconOrder; - ShowIconOnly = showIconOnly; - return new XLCFIconSet(this); - } - } -} - +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLConditionalFormat: IXLConditionalFormat, IXLStylized + { + + public XLConditionalFormat(XLRange range, Boolean copyDefaultModify = false) + { + Range = range; + Style = new XLStyle(this, range.Worksheet.Style); + Values = new XLDictionary(); + Colors = new XLDictionary(); + ContentTypes = new XLDictionary(); + IconSetOperators = new XLDictionary(); + CopyDefaultModify = copyDefaultModify; + } + public XLConditionalFormat(XLConditionalFormat other) + { + Range = other.Range; + Style = new XLStyle(this, other.Style); + Values = new XLDictionary(other.Values); + Colors = new XLDictionary(other.Colors); + ContentTypes = new XLDictionary(other.ContentTypes); + IconSetOperators = new XLDictionary(other.IconSetOperators); + + + ConditionalFormatType = other.ConditionalFormatType; + TimePeriod = other.TimePeriod; + IconSetStyle = other.IconSetStyle; + Operator = other.Operator; + Bottom = other.Bottom; + Percent = other.Percent; + ReverseIconOrder = other.ReverseIconOrder; + ShowIconOnly = other.ShowIconOnly; + ShowBarOnly = other.ShowBarOnly; + } + + public Boolean CopyDefaultModify { get; set; } + private IXLStyle _style; + private Int32 _styleCacheId; + public IXLStyle Style{ get { return GetStyle(); } set { SetStyle(value); } } + private IXLStyle GetStyle() + { + //return _style; + if (_style != null) + return _style; + + return _style = new XLStyle(this, Range.Worksheet.Workbook.GetStyleById(_styleCacheId), CopyDefaultModify); + } + private void SetStyle(IXLStyle styleToUse) + { + //_style = new XLStyle(this, styleToUse); + _styleCacheId = Range.Worksheet.Workbook.GetStyleId(styleToUse); + _style = null; + StyleChanged = false; + } + + public IEnumerable Styles + { + get + { + UpdatingStyle = true; + yield return Style; + UpdatingStyle = false; + } + } + + public bool UpdatingStyle { get; set; } + + public IXLStyle InnerStyle { get; set; } + + public IXLRanges RangesUsed + { + get { return new XLRanges(); } + } + + public bool StyleChanged { get; set; } + public XLDictionary Values { get; private set; } + public XLDictionary Colors { get; private set; } + public XLDictionary ContentTypes { get; private set; } + public XLDictionary IconSetOperators { get; private set; } + + public IXLRange Range { get; set; } + public XLConditionalFormatType ConditionalFormatType { get; set; } + public XLTimePeriod TimePeriod { get; set; } + public XLIconSetStyle IconSetStyle { get; set; } + public XLCFOperator Operator { get; set; } + public Boolean Bottom { get; set; } + public Boolean Percent { get; set; } + public Boolean ReverseIconOrder { get; set; } + public Boolean ShowIconOnly { get; set; } + public Boolean ShowBarOnly { get; set; } + + public void CopyFrom(IXLConditionalFormat other) + { + Style = other.Style; + ConditionalFormatType = other.ConditionalFormatType; + TimePeriod = other.TimePeriod; + IconSetStyle = other.IconSetStyle; + Operator = other.Operator; + Bottom = other.Bottom; + Percent = other.Percent; + ReverseIconOrder = other.ReverseIconOrder; + ShowIconOnly = other.ShowIconOnly; + ShowBarOnly = other.ShowBarOnly; + + Values.Clear(); + other.Values.ForEach(kp => Values.Add(kp.Key, new XLFormula(kp.Value))); + //CopyDictionary(Values, other.Values); + CopyDictionary(Colors, other.Colors); + CopyDictionary(ContentTypes, other.ContentTypes); + CopyDictionary(IconSetOperators, other.IconSetOperators); + } + + private void CopyDictionary(XLDictionary target, XLDictionary source) + { + target.Clear(); + source.ForEach(kp => target.Add(kp.Key, kp.Value)); + } + + public IXLStyle WhenIsBlank() + { + ConditionalFormatType = XLConditionalFormatType.IsBlank; + return Style; + } + public IXLStyle WhenNotBlank() + { + ConditionalFormatType = XLConditionalFormatType.NotBlank; + return Style; + } + public IXLStyle WhenIsError() + { + ConditionalFormatType = XLConditionalFormatType.IsError; + return Style; + } + public IXLStyle WhenNotError() + { + ConditionalFormatType = XLConditionalFormatType.NotError; + return Style; + } + public IXLStyle WhenDateIs(XLTimePeriod timePeriod) + { + TimePeriod = timePeriod; + ConditionalFormatType = XLConditionalFormatType.TimePeriod; + return Style; + } + public IXLStyle WhenContains(String value) + { + Values.Initialize(new XLFormula { Value = value }); + ConditionalFormatType = XLConditionalFormatType.ContainsText; + Operator = XLCFOperator.Contains; + return Style; + } + public IXLStyle WhenNotContains(String value) + { + Values.Initialize(new XLFormula { Value = value }); + ConditionalFormatType = XLConditionalFormatType.NotContainsText; + Operator = XLCFOperator.NotContains; + return Style; + } + public IXLStyle WhenStartsWith(String value) + { + Values.Initialize(new XLFormula { Value = value }); + ConditionalFormatType = XLConditionalFormatType.StartsWith; + Operator = XLCFOperator.StartsWith; + return Style; + } + public IXLStyle WhenEndsWith(String value) + { + Values.Initialize(new XLFormula { Value = value }); + ConditionalFormatType = XLConditionalFormatType.EndsWith; + Operator = XLCFOperator.EndsWith; + return Style; + } + + public IXLStyle WhenEquals(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.Equal; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenNotEquals(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.NotEqual; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenGreaterThan(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.GreaterThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenLessThan(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.LessThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenEqualOrGreaterThan(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.EqualOrGreaterThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenEqualOrLessThan(String value) + { + Values.Initialize(new XLFormula { Value = value }); + Operator = XLCFOperator.EqualOrLessThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenBetween(String minValue, String maxValue) + { + Values.Initialize(new XLFormula { Value = minValue }); + Values.Add(new XLFormula { Value = maxValue }); + Operator = XLCFOperator.Between; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenNotBetween(String minValue, String maxValue) + { + Values.Initialize(new XLFormula { Value = minValue }); + Values.Add(new XLFormula { Value = maxValue }); + Operator = XLCFOperator.NotBetween; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenEquals(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.Equal; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenNotEquals(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.NotEqual; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenGreaterThan(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.GreaterThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenLessThan(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.LessThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenEqualOrGreaterThan(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.EqualOrGreaterThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenEqualOrLessThan(Double value) + { + Values.Initialize(new XLFormula(value)); + Operator = XLCFOperator.EqualOrLessThan; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenBetween(Double minValue, Double maxValue) + { + Values.Initialize(new XLFormula (minValue)); + Values.Add(new XLFormula(maxValue)); + Operator = XLCFOperator.Between; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + public IXLStyle WhenNotBetween(Double minValue, Double maxValue) + { + Values.Initialize(new XLFormula(minValue)); + Values.Add(new XLFormula(maxValue)); + Operator = XLCFOperator.NotBetween; + ConditionalFormatType = XLConditionalFormatType.CellIs; + return Style; + } + + public IXLStyle WhenIsDuplicate() + { + ConditionalFormatType = XLConditionalFormatType.IsDuplicate; + return Style; + } + public IXLStyle WhenIsUnique() + { + ConditionalFormatType = XLConditionalFormatType.IsUnique; + return Style; + } + public IXLStyle WhenIsTrue(String formula) + { + String f = formula.TrimStart()[0] == '=' ? formula : "=" + formula; + Values.Initialize(new XLFormula {Value = f}); + ConditionalFormatType = XLConditionalFormatType.Expression; + return Style; + } + public IXLStyle WhenIsTop(Int32 value, XLTopBottomType topBottomType = XLTopBottomType.Items) + { + Values.Initialize(new XLFormula(value)); + Percent = topBottomType == XLTopBottomType.Percent; + ConditionalFormatType = XLConditionalFormatType.Top10; + Bottom = false; + return Style; + } + public IXLStyle WhenIsBottom(Int32 value, XLTopBottomType topBottomType = XLTopBottomType.Items) + { + Values.Initialize(new XLFormula(value)); + Percent = topBottomType == XLTopBottomType.Percent; + ConditionalFormatType = XLConditionalFormatType.Top10; + Bottom = true; + return Style; + } + + public IXLCFColorScaleMin ColorScale() + { + ConditionalFormatType = XLConditionalFormatType.ColorScale; + return new XLCFColorScaleMin(this); + } + public IXLCFDataBarMin DataBar(XLColor color, Boolean showBarOnly = false) + { + Colors.Initialize(color); + ShowBarOnly = showBarOnly; + ConditionalFormatType = XLConditionalFormatType.DataBar; + return new XLCFDataBarMin(this); + } + public IXLCFIconSet IconSet(XLIconSetStyle iconSetStyle, Boolean reverseIconOrder = false, Boolean showIconOnly = false) + { + IconSetOperators.Clear(); + Values.Clear(); + ContentTypes.Clear(); + ConditionalFormatType = XLConditionalFormatType.IconSet; + IconSetStyle = iconSetStyle; + ReverseIconOrder = reverseIconOrder; + ShowIconOnly = showIconOnly; + return new XLCFIconSet(this); + } + } +} + diff --git a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs index 0b221ad..5d1ea42 100644 --- a/ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs +++ b/ClosedXML/Excel/ConditionalFormats/XLConditionalFormats.cs @@ -1,36 +1,36 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLConditionalFormats: IXLConditionalFormats - { - private readonly List _conditionalFormats = new List(); - public void Add(IXLConditionalFormat conditionalFormat) - { - _conditionalFormats.Add(conditionalFormat); - } - - public IEnumerator GetEnumerator() - { - return _conditionalFormats.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void Remove(Predicate predicate) - { - _conditionalFormats.RemoveAll(predicate); - } - - public void RemoveAll() - { - _conditionalFormats.Clear(); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLConditionalFormats: IXLConditionalFormats + { + private readonly List _conditionalFormats = new List(); + public void Add(IXLConditionalFormat conditionalFormat) + { + _conditionalFormats.Add(conditionalFormat); + } + + public IEnumerator GetEnumerator() + { + return _conditionalFormats.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Remove(Predicate predicate) + { + _conditionalFormats.RemoveAll(predicate); + } + + public void RemoveAll() + { + _conditionalFormats.Clear(); + } + } +} diff --git a/ClosedXML/Excel/Coordinates/IXLAddress.cs b/ClosedXML/Excel/Coordinates/IXLAddress.cs index 48ad531..bc70a90 100644 --- a/ClosedXML/Excel/Coordinates/IXLAddress.cs +++ b/ClosedXML/Excel/Coordinates/IXLAddress.cs @@ -1,22 +1,22 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLAddress : IEqualityComparer, IEquatable - { - IXLWorksheet Worksheet { get; } - Int32 RowNumber { get; } - Int32 ColumnNumber { get; } - String ColumnLetter { get; } - Boolean FixedRow { get; } - Boolean FixedColumn { get; } - String ToStringRelative(); - String ToStringRelative(Boolean includeSheet); - String ToStringFixed(); - String ToStringFixed(XLReferenceStyle referenceStyle); - String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet); - String ToString(XLReferenceStyle referenceStyle); - String UniqueId { get; } - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLAddress : IEqualityComparer, IEquatable + { + IXLWorksheet Worksheet { get; } + Int32 RowNumber { get; } + Int32 ColumnNumber { get; } + String ColumnLetter { get; } + Boolean FixedRow { get; } + Boolean FixedColumn { get; } + String ToStringRelative(); + String ToStringRelative(Boolean includeSheet); + String ToStringFixed(); + String ToStringFixed(XLReferenceStyle referenceStyle); + String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet); + String ToString(XLReferenceStyle referenceStyle); + String UniqueId { get; } + } +} diff --git a/ClosedXML/Excel/Coordinates/XLAddress.cs b/ClosedXML/Excel/Coordinates/XLAddress.cs index cdd0703..ee54bf0 100644 --- a/ClosedXML/Excel/Coordinates/XLAddress.cs +++ b/ClosedXML/Excel/Coordinates/XLAddress.cs @@ -1,383 +1,383 @@ -using System; -using System.Diagnostics; - -namespace ClosedXML.Excel -{ - internal class XLAddress : IXLAddress - { - #region Static - /// - /// Create address without worksheet. For calculation only! - /// - /// - /// - public static XLAddress Create(string cellAddressString) - { - return Create(null, cellAddressString); - } - - public static XLAddress Create(XLAddress cellAddress) - { - return new XLAddress(cellAddress.Worksheet, cellAddress.RowNumber, cellAddress.ColumnNumber, cellAddress.FixedRow, cellAddress.FixedColumn); - } - - public static XLAddress Create(XLWorksheet worksheet, string cellAddressString) - { - var fixedColumn = cellAddressString[0] == '$'; - Int32 startPos; - if (fixedColumn) - { - startPos = 1; - } - else - { - startPos = 0; - } - - int rowPos = startPos; - while (cellAddressString[rowPos] > '9') - { - rowPos++; - } - - var fixedRow = cellAddressString[rowPos] == '$'; - string columnLetter; - int rowNumber; - if (fixedRow) - { - if (fixedColumn) - { - columnLetter = cellAddressString.Substring(startPos, rowPos - 1); - } - else - { - columnLetter = cellAddressString.Substring(startPos, rowPos); - } - - rowNumber = int.Parse(cellAddressString.Substring(rowPos + 1), XLHelper.NumberStyle, XLHelper.ParseCulture); - } - else - { - if (fixedColumn) - { - columnLetter = cellAddressString.Substring(startPos, rowPos - 1); - } - else - { - columnLetter = cellAddressString.Substring(startPos, rowPos); - } - - rowNumber = Int32.Parse(cellAddressString.Substring(rowPos), XLHelper.NumberStyle, XLHelper.ParseCulture); - } - return new XLAddress(worksheet, rowNumber, columnLetter, fixedRow, fixedColumn); - } - #endregion - #region Private fields - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private bool _fixedRow; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private bool _fixedColumn; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private string _columnLetter; - - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly int _rowNumber; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly int _columnNumber; - private string _trimmedAddress; - #endregion - #region Constructors - /// - /// Initializes a new struct using a mixed notation. Attention: without worksheet for calculation only! - /// - /// The row number of the cell address. - /// The column letter of the cell address. - /// - /// - public XLAddress(int rowNumber, string columnLetter, bool fixedRow, bool fixedColumn) - : this(null, rowNumber, columnLetter, fixedRow, fixedColumn) - { - } - /// - /// Initializes a new struct using a mixed notation. - /// - /// - /// The row number of the cell address. - /// The column letter of the cell address. - /// - /// - public XLAddress(XLWorksheet worksheet, int rowNumber, string columnLetter, bool fixedRow, bool fixedColumn) - : this(worksheet, rowNumber, XLHelper.GetColumnNumberFromLetter(columnLetter), fixedRow, fixedColumn) - { - _columnLetter = columnLetter; - } - - /// - /// Initializes a new struct using R1C1 notation. Attention: without worksheet for calculation only! - /// - /// The row number of the cell address. - /// The column number of the cell address. - /// - /// - public XLAddress(int rowNumber, int columnNumber, bool fixedRow, bool fixedColumn) - : this(null, rowNumber, columnNumber, fixedRow, fixedColumn) - { - } - /// - /// Initializes a new struct using R1C1 notation. - /// - /// - /// The row number of the cell address. - /// The column number of the cell address. - /// - /// - public XLAddress(XLWorksheet worksheet, int rowNumber, int columnNumber, bool fixedRow, bool fixedColumn) - - { - Worksheet = worksheet; - - _rowNumber = rowNumber; - _columnNumber = columnNumber; - _columnLetter = null; - _fixedColumn = fixedColumn; - _fixedRow = fixedRow; - - - } - #endregion - #region Properties - public XLWorksheet Worksheet { get; internal set; } - IXLWorksheet IXLAddress.Worksheet - { - [DebuggerStepThrough] - get { return Worksheet; } - } - - public bool HasWorksheet - { - [DebuggerStepThrough] - get { return Worksheet != null; } - } - - public bool FixedRow - { - get { return _fixedRow; } - set { _fixedRow = value; } - } - - public bool FixedColumn - { - get { return _fixedColumn; } - set { _fixedColumn = value; } - } - - /// - /// Gets the row number of this address. - /// - public Int32 RowNumber - { - get { return _rowNumber; } - } - - /// - /// Gets the column number of this address. - /// - public Int32 ColumnNumber - { - get { return _columnNumber; } - } - - /// - /// Gets the column letter(s) of this address. - /// - public String ColumnLetter - { - get { return _columnLetter ?? (_columnLetter = XLHelper.GetColumnLetterFromNumber(_columnNumber)); } - } - #endregion - #region Overrides - public override string ToString() - { - String retVal = ColumnLetter; - if (_fixedColumn) - { - retVal = "$" + retVal; - } - if (_fixedRow) - { - retVal += "$"; - } - retVal += _rowNumber.ToInvariantString(); - return retVal; - } - - public string ToString(XLReferenceStyle referenceStyle) - { - if (referenceStyle == XLReferenceStyle.A1) - { - return ColumnLetter + _rowNumber.ToInvariantString(); - } - if (referenceStyle == XLReferenceStyle.R1C1) - { - return String.Format("R{0}C{1}", _rowNumber.ToInvariantString(), ColumnNumber); - } - if (HasWorksheet && Worksheet.Workbook.ReferenceStyle == XLReferenceStyle.R1C1) - { - return String.Format("R{0}C{1}", _rowNumber.ToInvariantString(), ColumnNumber); - } - return ColumnLetter + _rowNumber.ToInvariantString(); - } - #endregion - #region Methods - public string GetTrimmedAddress() - { - return _trimmedAddress ?? (_trimmedAddress = ColumnLetter + _rowNumber.ToInvariantString()); - } - - - - #endregion - #region Operator Overloads - public static XLAddress operator +(XLAddress left, XLAddress right) - { - return new XLAddress(left.Worksheet, - left.RowNumber + right.RowNumber, - left.ColumnNumber + right.ColumnNumber, - left._fixedRow, - left._fixedColumn); - } - - public static XLAddress operator -(XLAddress left, XLAddress right) - { - return new XLAddress(left.Worksheet, - left.RowNumber - right.RowNumber, - left.ColumnNumber - right.ColumnNumber, - left._fixedRow, - left._fixedColumn); - } - - public static XLAddress operator +(XLAddress left, Int32 right) - { - return new XLAddress(left.Worksheet, - left.RowNumber + right, - left.ColumnNumber + right, - left._fixedRow, - left._fixedColumn); - } - - public static XLAddress operator -(XLAddress left, Int32 right) - { - return new XLAddress(left.Worksheet, - left.RowNumber - right, - left.ColumnNumber - right, - left._fixedRow, - left._fixedColumn); - } - - public static Boolean operator ==(XLAddress left, XLAddress right) - { - if (ReferenceEquals(left, right)) - { - return true; - } - return !ReferenceEquals(left, null) && left.Equals(right); - } - - public static Boolean operator !=(XLAddress left, XLAddress right) - { - return !(left == right); - } - #endregion - #region Interface Requirements - #region IEqualityComparer Members - public Boolean Equals(IXLAddress x, IXLAddress y) - { - return x == y; - } - - public Int32 GetHashCode(IXLAddress obj) - { - return obj.GetHashCode(); - } - - public new Boolean Equals(object x, object y) - { - return x == y; - } - - public Int32 GetHashCode(object obj) - { - return (obj).GetHashCode(); - } - - public override int GetHashCode() - { - return _rowNumber ^ _columnNumber; - } - #endregion - #region IEquatable Members - public bool Equals(IXLAddress other) - { - var right = other as XLAddress; - if (ReferenceEquals(right, null)) - { - return false; - } - return _rowNumber == right._rowNumber && _columnNumber == right._columnNumber; - } - - public override Boolean Equals(Object other) - { - return Equals((XLAddress) other); - } - #endregion - #endregion - - public String ToStringRelative() - { - return ToStringRelative(false); - } - - public String ToStringFixed() - { - return ToStringFixed(XLReferenceStyle.Default); - } - - public String ToStringRelative(Boolean includeSheet) - { - if (includeSheet) - return String.Format("'{0}'!{1}", - Worksheet.Name, - GetTrimmedAddress()); - - return GetTrimmedAddress(); - } - - public String ToStringFixed(XLReferenceStyle referenceStyle) - { - return ToStringFixed(referenceStyle, false); - } - - public String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet) - { - String address; - if (referenceStyle == XLReferenceStyle.A1) - address = String.Format("${0}${1}", ColumnLetter, _rowNumber.ToInvariantString()); - else if (referenceStyle == XLReferenceStyle.R1C1) - address = String.Format("R{0}C{1}", _rowNumber.ToInvariantString(), ColumnNumber); - else if (HasWorksheet && Worksheet.Workbook.ReferenceStyle == XLReferenceStyle.R1C1) - address = String.Format("R{0}C{1}", _rowNumber.ToInvariantString(), ColumnNumber); - else - address = String.Format("${0}${1}", ColumnLetter, _rowNumber.ToInvariantString()); - - if (includeSheet) - return String.Format("'{0}'!{1}", - Worksheet.Name, - address); - - return address; - } - - public String UniqueId { get { return RowNumber.ToString("0000000") + ColumnNumber.ToString("00000"); } } - } -} +using System; +using System.Diagnostics; + +namespace ClosedXML.Excel +{ + internal class XLAddress : IXLAddress + { + #region Static + /// + /// Create address without worksheet. For calculation only! + /// + /// + /// + public static XLAddress Create(string cellAddressString) + { + return Create(null, cellAddressString); + } + + public static XLAddress Create(XLAddress cellAddress) + { + return new XLAddress(cellAddress.Worksheet, cellAddress.RowNumber, cellAddress.ColumnNumber, cellAddress.FixedRow, cellAddress.FixedColumn); + } + + public static XLAddress Create(XLWorksheet worksheet, string cellAddressString) + { + var fixedColumn = cellAddressString[0] == '$'; + Int32 startPos; + if (fixedColumn) + { + startPos = 1; + } + else + { + startPos = 0; + } + + int rowPos = startPos; + while (cellAddressString[rowPos] > '9') + { + rowPos++; + } + + var fixedRow = cellAddressString[rowPos] == '$'; + string columnLetter; + int rowNumber; + if (fixedRow) + { + if (fixedColumn) + { + columnLetter = cellAddressString.Substring(startPos, rowPos - 1); + } + else + { + columnLetter = cellAddressString.Substring(startPos, rowPos); + } + + rowNumber = int.Parse(cellAddressString.Substring(rowPos + 1), XLHelper.NumberStyle, XLHelper.ParseCulture); + } + else + { + if (fixedColumn) + { + columnLetter = cellAddressString.Substring(startPos, rowPos - 1); + } + else + { + columnLetter = cellAddressString.Substring(startPos, rowPos); + } + + rowNumber = Int32.Parse(cellAddressString.Substring(rowPos), XLHelper.NumberStyle, XLHelper.ParseCulture); + } + return new XLAddress(worksheet, rowNumber, columnLetter, fixedRow, fixedColumn); + } + #endregion + #region Private fields + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private bool _fixedRow; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private bool _fixedColumn; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private string _columnLetter; + + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly int _rowNumber; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly int _columnNumber; + private string _trimmedAddress; + #endregion + #region Constructors + /// + /// Initializes a new struct using a mixed notation. Attention: without worksheet for calculation only! + /// + /// The row number of the cell address. + /// The column letter of the cell address. + /// + /// + public XLAddress(int rowNumber, string columnLetter, bool fixedRow, bool fixedColumn) + : this(null, rowNumber, columnLetter, fixedRow, fixedColumn) + { + } + /// + /// Initializes a new struct using a mixed notation. + /// + /// + /// The row number of the cell address. + /// The column letter of the cell address. + /// + /// + public XLAddress(XLWorksheet worksheet, int rowNumber, string columnLetter, bool fixedRow, bool fixedColumn) + : this(worksheet, rowNumber, XLHelper.GetColumnNumberFromLetter(columnLetter), fixedRow, fixedColumn) + { + _columnLetter = columnLetter; + } + + /// + /// Initializes a new struct using R1C1 notation. Attention: without worksheet for calculation only! + /// + /// The row number of the cell address. + /// The column number of the cell address. + /// + /// + public XLAddress(int rowNumber, int columnNumber, bool fixedRow, bool fixedColumn) + : this(null, rowNumber, columnNumber, fixedRow, fixedColumn) + { + } + /// + /// Initializes a new struct using R1C1 notation. + /// + /// + /// The row number of the cell address. + /// The column number of the cell address. + /// + /// + public XLAddress(XLWorksheet worksheet, int rowNumber, int columnNumber, bool fixedRow, bool fixedColumn) + + { + Worksheet = worksheet; + + _rowNumber = rowNumber; + _columnNumber = columnNumber; + _columnLetter = null; + _fixedColumn = fixedColumn; + _fixedRow = fixedRow; + + + } + #endregion + #region Properties + public XLWorksheet Worksheet { get; internal set; } + IXLWorksheet IXLAddress.Worksheet + { + [DebuggerStepThrough] + get { return Worksheet; } + } + + public bool HasWorksheet + { + [DebuggerStepThrough] + get { return Worksheet != null; } + } + + public bool FixedRow + { + get { return _fixedRow; } + set { _fixedRow = value; } + } + + public bool FixedColumn + { + get { return _fixedColumn; } + set { _fixedColumn = value; } + } + + /// + /// Gets the row number of this address. + /// + public Int32 RowNumber + { + get { return _rowNumber; } + } + + /// + /// Gets the column number of this address. + /// + public Int32 ColumnNumber + { + get { return _columnNumber; } + } + + /// + /// Gets the column letter(s) of this address. + /// + public String ColumnLetter + { + get { return _columnLetter ?? (_columnLetter = XLHelper.GetColumnLetterFromNumber(_columnNumber)); } + } + #endregion + #region Overrides + public override string ToString() + { + String retVal = ColumnLetter; + if (_fixedColumn) + { + retVal = "$" + retVal; + } + if (_fixedRow) + { + retVal += "$"; + } + retVal += _rowNumber.ToInvariantString(); + return retVal; + } + + public string ToString(XLReferenceStyle referenceStyle) + { + if (referenceStyle == XLReferenceStyle.A1) + { + return ColumnLetter + _rowNumber.ToInvariantString(); + } + if (referenceStyle == XLReferenceStyle.R1C1) + { + return String.Format("R{0}C{1}", _rowNumber.ToInvariantString(), ColumnNumber); + } + if (HasWorksheet && Worksheet.Workbook.ReferenceStyle == XLReferenceStyle.R1C1) + { + return String.Format("R{0}C{1}", _rowNumber.ToInvariantString(), ColumnNumber); + } + return ColumnLetter + _rowNumber.ToInvariantString(); + } + #endregion + #region Methods + public string GetTrimmedAddress() + { + return _trimmedAddress ?? (_trimmedAddress = ColumnLetter + _rowNumber.ToInvariantString()); + } + + + + #endregion + #region Operator Overloads + public static XLAddress operator +(XLAddress left, XLAddress right) + { + return new XLAddress(left.Worksheet, + left.RowNumber + right.RowNumber, + left.ColumnNumber + right.ColumnNumber, + left._fixedRow, + left._fixedColumn); + } + + public static XLAddress operator -(XLAddress left, XLAddress right) + { + return new XLAddress(left.Worksheet, + left.RowNumber - right.RowNumber, + left.ColumnNumber - right.ColumnNumber, + left._fixedRow, + left._fixedColumn); + } + + public static XLAddress operator +(XLAddress left, Int32 right) + { + return new XLAddress(left.Worksheet, + left.RowNumber + right, + left.ColumnNumber + right, + left._fixedRow, + left._fixedColumn); + } + + public static XLAddress operator -(XLAddress left, Int32 right) + { + return new XLAddress(left.Worksheet, + left.RowNumber - right, + left.ColumnNumber - right, + left._fixedRow, + left._fixedColumn); + } + + public static Boolean operator ==(XLAddress left, XLAddress right) + { + if (ReferenceEquals(left, right)) + { + return true; + } + return !ReferenceEquals(left, null) && left.Equals(right); + } + + public static Boolean operator !=(XLAddress left, XLAddress right) + { + return !(left == right); + } + #endregion + #region Interface Requirements + #region IEqualityComparer Members + public Boolean Equals(IXLAddress x, IXLAddress y) + { + return x == y; + } + + public Int32 GetHashCode(IXLAddress obj) + { + return obj.GetHashCode(); + } + + public new Boolean Equals(object x, object y) + { + return x == y; + } + + public Int32 GetHashCode(object obj) + { + return (obj).GetHashCode(); + } + + public override int GetHashCode() + { + return _rowNumber ^ _columnNumber; + } + #endregion + #region IEquatable Members + public bool Equals(IXLAddress other) + { + var right = other as XLAddress; + if (ReferenceEquals(right, null)) + { + return false; + } + return _rowNumber == right._rowNumber && _columnNumber == right._columnNumber; + } + + public override Boolean Equals(Object other) + { + return Equals((XLAddress) other); + } + #endregion + #endregion + + public String ToStringRelative() + { + return ToStringRelative(false); + } + + public String ToStringFixed() + { + return ToStringFixed(XLReferenceStyle.Default); + } + + public String ToStringRelative(Boolean includeSheet) + { + if (includeSheet) + return String.Format("'{0}'!{1}", + Worksheet.Name, + GetTrimmedAddress()); + + return GetTrimmedAddress(); + } + + public String ToStringFixed(XLReferenceStyle referenceStyle) + { + return ToStringFixed(referenceStyle, false); + } + + public String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet) + { + String address; + if (referenceStyle == XLReferenceStyle.A1) + address = String.Format("${0}${1}", ColumnLetter, _rowNumber.ToInvariantString()); + else if (referenceStyle == XLReferenceStyle.R1C1) + address = String.Format("R{0}C{1}", _rowNumber.ToInvariantString(), ColumnNumber); + else if (HasWorksheet && Worksheet.Workbook.ReferenceStyle == XLReferenceStyle.R1C1) + address = String.Format("R{0}C{1}", _rowNumber.ToInvariantString(), ColumnNumber); + else + address = String.Format("${0}${1}", ColumnLetter, _rowNumber.ToInvariantString()); + + if (includeSheet) + return String.Format("'{0}'!{1}", + Worksheet.Name, + address); + + return address; + } + + public String UniqueId { get { return RowNumber.ToString("0000000") + ColumnNumber.ToString("00000"); } } + } +} diff --git a/ClosedXML/Excel/Coordinates/XLSheetPoint.cs b/ClosedXML/Excel/Coordinates/XLSheetPoint.cs index 1d71682..f1c3cea 100644 --- a/ClosedXML/Excel/Coordinates/XLSheetPoint.cs +++ b/ClosedXML/Excel/Coordinates/XLSheetPoint.cs @@ -1,41 +1,41 @@ -using System; - -namespace ClosedXML.Excel -{ - internal struct XLSheetPoint:IEquatable - { - public XLSheetPoint(Int32 row, Int32 column) - { - Row = row; - Column = column; - } - - public readonly Int32 Row; - public readonly Int32 Column; - - public override bool Equals(object obj) - { - return Equals((XLSheetPoint)obj); - } - - public bool Equals(XLSheetPoint other) - { - return Row == other.Row && Column == other.Column; - } - - public override int GetHashCode() - { - return (Row * -1) ^ Column; - } - - public static bool operator==(XLSheetPoint a, XLSheetPoint b) - { - return a.Row == b.Row && a.Column == b.Column; - } - - public static bool operator !=(XLSheetPoint a, XLSheetPoint b) - { - return a.Row != b.Row || a.Column != b.Column; - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal struct XLSheetPoint:IEquatable + { + public XLSheetPoint(Int32 row, Int32 column) + { + Row = row; + Column = column; + } + + public readonly Int32 Row; + public readonly Int32 Column; + + public override bool Equals(object obj) + { + return Equals((XLSheetPoint)obj); + } + + public bool Equals(XLSheetPoint other) + { + return Row == other.Row && Column == other.Column; + } + + public override int GetHashCode() + { + return (Row * -1) ^ Column; + } + + public static bool operator==(XLSheetPoint a, XLSheetPoint b) + { + return a.Row == b.Row && a.Column == b.Column; + } + + public static bool operator !=(XLSheetPoint a, XLSheetPoint b) + { + return a.Row != b.Row || a.Column != b.Column; + } + } +} diff --git a/ClosedXML/Excel/Coordinates/XLSheetRange.cs b/ClosedXML/Excel/Coordinates/XLSheetRange.cs index 2845011..9fb23a2 100644 --- a/ClosedXML/Excel/Coordinates/XLSheetRange.cs +++ b/ClosedXML/Excel/Coordinates/XLSheetRange.cs @@ -1,26 +1,26 @@ -using System; - -namespace ClosedXML.Excel -{ - internal struct XLSheetRange:IEquatable - { - public XLSheetRange(XLSheetPoint firstPoint, XLSheetPoint lastPoint) - { - FirstPoint = firstPoint; - LastPoint = lastPoint; - } - - public readonly XLSheetPoint FirstPoint; - public readonly XLSheetPoint LastPoint; - - public bool Equals(XLSheetRange other) - { - return FirstPoint.Equals(other.FirstPoint) && LastPoint.Equals(other.LastPoint); - } - - public override int GetHashCode() - { - return FirstPoint.GetHashCode() ^ LastPoint.GetHashCode(); - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal struct XLSheetRange:IEquatable + { + public XLSheetRange(XLSheetPoint firstPoint, XLSheetPoint lastPoint) + { + FirstPoint = firstPoint; + LastPoint = lastPoint; + } + + public readonly XLSheetPoint FirstPoint; + public readonly XLSheetPoint LastPoint; + + public bool Equals(XLSheetRange other) + { + return FirstPoint.Equals(other.FirstPoint) && LastPoint.Equals(other.LastPoint); + } + + public override int GetHashCode() + { + return FirstPoint.GetHashCode() ^ LastPoint.GetHashCode(); + } + } +} diff --git a/ClosedXML/Excel/CustomProperties/IXLCustomProperties.cs b/ClosedXML/Excel/CustomProperties/IXLCustomProperties.cs index afdbff2..83e906a 100644 --- a/ClosedXML/Excel/CustomProperties/IXLCustomProperties.cs +++ b/ClosedXML/Excel/CustomProperties/IXLCustomProperties.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLCustomProperties: IEnumerable - { - void Add(IXLCustomProperty customProperty); - void Add(String name, T value); - void Delete(String name); - IXLCustomProperty CustomProperty(String name); - - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLCustomProperties: IEnumerable + { + void Add(IXLCustomProperty customProperty); + void Add(String name, T value); + void Delete(String name); + IXLCustomProperty CustomProperty(String name); + + } +} diff --git a/ClosedXML/Excel/CustomProperties/IXLCustomProperty.cs b/ClosedXML/Excel/CustomProperties/IXLCustomProperty.cs index f34e306..cfed06e 100644 --- a/ClosedXML/Excel/CustomProperties/IXLCustomProperty.cs +++ b/ClosedXML/Excel/CustomProperties/IXLCustomProperty.cs @@ -1,13 +1,13 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLCustomPropertyType { Text, Number, Date, Boolean} - public interface IXLCustomProperty - { - String Name { get; set; } - XLCustomPropertyType Type { get; } - Object Value { get; set; } - T GetValue(); - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLCustomPropertyType { Text, Number, Date, Boolean} + public interface IXLCustomProperty + { + String Name { get; set; } + XLCustomPropertyType Type { get; } + Object Value { get; set; } + T GetValue(); + } +} diff --git a/ClosedXML/Excel/CustomProperties/XLCustomProperties.cs b/ClosedXML/Excel/CustomProperties/XLCustomProperties.cs index 98e98ac..0322069 100644 --- a/ClosedXML/Excel/CustomProperties/XLCustomProperties.cs +++ b/ClosedXML/Excel/CustomProperties/XLCustomProperties.cs @@ -1,46 +1,46 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - internal class XLCustomProperties: IXLCustomProperties, IEnumerable - { - XLWorkbook workbook; - public XLCustomProperties(XLWorkbook workbook) - { - this.workbook = workbook; - } - - private Dictionary customProperties = new Dictionary(); - public void Add(IXLCustomProperty customProperty) - { - customProperties.Add(customProperty.Name, customProperty); - } - public void Add(String name, T value) - { - var cp = new XLCustomProperty(workbook) { Name = name, Value = value }; - Add(cp); - } - - public void Delete(String name) - { - customProperties.Remove(name); - } - public IXLCustomProperty CustomProperty(String name) - { - return customProperties[name]; - } - - public IEnumerator GetEnumerator() - { - return customProperties.Values.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLCustomProperties: IXLCustomProperties, IEnumerable + { + XLWorkbook workbook; + public XLCustomProperties(XLWorkbook workbook) + { + this.workbook = workbook; + } + + private Dictionary customProperties = new Dictionary(); + public void Add(IXLCustomProperty customProperty) + { + customProperties.Add(customProperty.Name, customProperty); + } + public void Add(String name, T value) + { + var cp = new XLCustomProperty(workbook) { Name = name, Value = value }; + Add(cp); + } + + public void Delete(String name) + { + customProperties.Remove(name); + } + public IXLCustomProperty CustomProperty(String name) + { + return customProperties[name]; + } + + public IEnumerator GetEnumerator() + { + return customProperties.Values.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + + } +} diff --git a/ClosedXML/Excel/CustomProperties/XLCustomProperty.cs b/ClosedXML/Excel/CustomProperties/XLCustomProperty.cs index 36e6f56..bd5f5c6 100644 --- a/ClosedXML/Excel/CustomProperties/XLCustomProperty.cs +++ b/ClosedXML/Excel/CustomProperties/XLCustomProperty.cs @@ -1,59 +1,59 @@ -using System; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLCustomProperty : IXLCustomProperty - { - private readonly XLWorkbook _workbook; - - private String name; - - public XLCustomProperty(XLWorkbook workbook) - { - _workbook = workbook; - } - - #region IXLCustomProperty Members - - public String Name - { - get { return name; } - set - { - if (_workbook.CustomProperties.Any(t => t.Name == value)) - throw new ArgumentException( - String.Format("This workbook already contains a custom property named '{0}'", value)); - - name = value; - } - } - - public XLCustomPropertyType Type - { - get - { - Double dTest; - if (Value is DateTime) - return XLCustomPropertyType.Date; - - if (Value is Boolean) - return XLCustomPropertyType.Boolean; - - if (Double.TryParse(Value.ToString(), out dTest)) - return XLCustomPropertyType.Number; - - return XLCustomPropertyType.Text; - } - } - - public Object Value { get; set; } - - public T GetValue() - { - return (T)Convert.ChangeType(Value, typeof(T)); - } - - #endregion - } +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLCustomProperty : IXLCustomProperty + { + private readonly XLWorkbook _workbook; + + private String name; + + public XLCustomProperty(XLWorkbook workbook) + { + _workbook = workbook; + } + + #region IXLCustomProperty Members + + public String Name + { + get { return name; } + set + { + if (_workbook.CustomProperties.Any(t => t.Name == value)) + throw new ArgumentException( + String.Format("This workbook already contains a custom property named '{0}'", value)); + + name = value; + } + } + + public XLCustomPropertyType Type + { + get + { + Double dTest; + if (Value is DateTime) + return XLCustomPropertyType.Date; + + if (Value is Boolean) + return XLCustomPropertyType.Boolean; + + if (Double.TryParse(Value.ToString(), out dTest)) + return XLCustomPropertyType.Number; + + return XLCustomPropertyType.Text; + } + } + + public Object Value { get; set; } + + public T GetValue() + { + return (T)Convert.ChangeType(Value, typeof(T)); + } + + #endregion + } } \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/IXLDataValidation.cs b/ClosedXML/Excel/DataValidation/IXLDataValidation.cs index f2072de..1c7b9fd 100644 --- a/ClosedXML/Excel/DataValidation/IXLDataValidation.cs +++ b/ClosedXML/Excel/DataValidation/IXLDataValidation.cs @@ -1,44 +1,44 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLErrorStyle { Stop, Warning, Information } - public enum XLAllowedValues { AnyValue, WholeNumber, Decimal, Date, Time, TextLength, List, Custom } - public enum XLOperator { EqualTo, NotEqualTo, GreaterThan, LessThan, EqualOrGreaterThan, EqualOrLessThan, Between, NotBetween } - public interface IXLDataValidation - { - IXLRanges Ranges { get; set; } - //void Delete(); - //void CopyFrom(IXLDataValidation dataValidation); - Boolean ShowInputMessage { get; set; } - Boolean ShowErrorMessage { get; set; } - Boolean IgnoreBlanks { get; set; } - Boolean InCellDropdown { get; set; } - String InputTitle { get; set; } - String InputMessage { get; set; } - String ErrorTitle { get; set; } - String ErrorMessage { get; set; } - XLErrorStyle ErrorStyle { get; set; } - XLAllowedValues AllowedValues { get; set; } - XLOperator Operator { get; set; } - - String Value { get; set; } - String MinValue { get; set; } - String MaxValue { get; set; } - - XLWholeNumberCriteria WholeNumber { get; } - XLDecimalCriteria Decimal { get; } - XLDateCriteria Date { get; } - XLTimeCriteria Time { get; } - XLTextLengthCriteria TextLength { get; } - - void List(String list); - void List(String list, Boolean inCellDropdown); - void List(IXLRange range); - void List(IXLRange range, Boolean inCellDropdown); - - void Custom(String customValidation); - void Clear(); - Boolean IsDirty(); - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLErrorStyle { Stop, Warning, Information } + public enum XLAllowedValues { AnyValue, WholeNumber, Decimal, Date, Time, TextLength, List, Custom } + public enum XLOperator { EqualTo, NotEqualTo, GreaterThan, LessThan, EqualOrGreaterThan, EqualOrLessThan, Between, NotBetween } + public interface IXLDataValidation + { + IXLRanges Ranges { get; set; } + //void Delete(); + //void CopyFrom(IXLDataValidation dataValidation); + Boolean ShowInputMessage { get; set; } + Boolean ShowErrorMessage { get; set; } + Boolean IgnoreBlanks { get; set; } + Boolean InCellDropdown { get; set; } + String InputTitle { get; set; } + String InputMessage { get; set; } + String ErrorTitle { get; set; } + String ErrorMessage { get; set; } + XLErrorStyle ErrorStyle { get; set; } + XLAllowedValues AllowedValues { get; set; } + XLOperator Operator { get; set; } + + String Value { get; set; } + String MinValue { get; set; } + String MaxValue { get; set; } + + XLWholeNumberCriteria WholeNumber { get; } + XLDecimalCriteria Decimal { get; } + XLDateCriteria Date { get; } + XLTimeCriteria Time { get; } + XLTextLengthCriteria TextLength { get; } + + void List(String list); + void List(String list, Boolean inCellDropdown); + void List(IXLRange range); + void List(IXLRange range, Boolean inCellDropdown); + + void Custom(String customValidation); + void Clear(); + Boolean IsDirty(); + } +} diff --git a/ClosedXML/Excel/DataValidation/IXLDataValidations.cs b/ClosedXML/Excel/DataValidation/IXLDataValidations.cs index eb8aa6b..9dfca5f 100644 --- a/ClosedXML/Excel/DataValidation/IXLDataValidations.cs +++ b/ClosedXML/Excel/DataValidation/IXLDataValidations.cs @@ -1,12 +1,12 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLDataValidations: IEnumerable - { - void Add(IXLDataValidation dataValidation); - Boolean ContainsSingle(IXLRange range); - - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLDataValidations: IEnumerable + { + void Add(IXLDataValidation dataValidation); + Boolean ContainsSingle(IXLRange range); + + } +} diff --git a/ClosedXML/Excel/DataValidation/IXLValidationCriteria.cs b/ClosedXML/Excel/DataValidation/IXLValidationCriteria.cs index b5be419..9463193 100644 --- a/ClosedXML/Excel/DataValidation/IXLValidationCriteria.cs +++ b/ClosedXML/Excel/DataValidation/IXLValidationCriteria.cs @@ -1,34 +1,34 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLValidationCriteria - { - void EqualTo(String value); - void NotEqualTo(String value); - void GreaterThan(String value); - void LessThan(String value); - void EqualOrGreaterThan(String value); - void EqualOrLessThan(String value); - void Between(String minValue, String maxValue); - void NotBetween(String minValue, String maxValue); - - void EqualTo(IXLRange range); - void NotEqualTo(IXLRange range); - void GreaterThan(IXLRange range); - void LessThan(IXLRange range); - void EqualOrGreaterThan(IXLRange range); - void EqualOrLessThan(IXLRange range); - void Between(IXLRange minValue, IXLRange maxValue); - void NotBetween(IXLRange minValue, IXLRange maxValue); - - void EqualTo(IXLCell cell); - void NotEqualTo(IXLCell cell); - void GreaterThan(IXLCell cell); - void LessThan(IXLCell cell); - void EqualOrGreaterThan(IXLCell cell); - void EqualOrLessThan(IXLCell cell); - void Between(IXLCell minValue, IXLCell maxValue); - void NotBetween(IXLCell minValue, IXLCell maxValue); - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLValidationCriteria + { + void EqualTo(String value); + void NotEqualTo(String value); + void GreaterThan(String value); + void LessThan(String value); + void EqualOrGreaterThan(String value); + void EqualOrLessThan(String value); + void Between(String minValue, String maxValue); + void NotBetween(String minValue, String maxValue); + + void EqualTo(IXLRange range); + void NotEqualTo(IXLRange range); + void GreaterThan(IXLRange range); + void LessThan(IXLRange range); + void EqualOrGreaterThan(IXLRange range); + void EqualOrLessThan(IXLRange range); + void Between(IXLRange minValue, IXLRange maxValue); + void NotBetween(IXLRange minValue, IXLRange maxValue); + + void EqualTo(IXLCell cell); + void NotEqualTo(IXLCell cell); + void GreaterThan(IXLCell cell); + void LessThan(IXLCell cell); + void EqualOrGreaterThan(IXLCell cell); + void EqualOrLessThan(IXLCell cell); + void Between(IXLCell minValue, IXLCell maxValue); + void NotBetween(IXLCell minValue, IXLCell maxValue); + } +} diff --git a/ClosedXML/Excel/DataValidation/XLDataValidation.cs b/ClosedXML/Excel/DataValidation/XLDataValidation.cs index 2371e2b..321e6d8 100644 --- a/ClosedXML/Excel/DataValidation/XLDataValidation.cs +++ b/ClosedXML/Excel/DataValidation/XLDataValidation.cs @@ -1,194 +1,194 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLDataValidation : IXLDataValidation - { - public XLDataValidation(IXLRanges ranges) - { - - Ranges = new XLRanges(); - ranges.ForEach(r=> - { - var newR = - new XLRange(new XLRangeParameters(r.RangeAddress as XLRangeAddress, - r.Worksheet.Style) {IgnoreEvents = true}); - (Ranges as XLRanges).Add(newR); - } ); - Initialize(); - } - - private void Initialize() - { - AllowedValues = XLAllowedValues.AnyValue; - IgnoreBlanks = true; - ShowErrorMessage = true; - ShowInputMessage = true; - InCellDropdown = true; - InputTitle = String.Empty; - InputMessage = String.Empty; - ErrorTitle = String.Empty; - ErrorMessage = String.Empty; - ErrorStyle = XLErrorStyle.Stop; - Operator = XLOperator.Between; - Value = String.Empty; - MinValue = String.Empty; - MaxValue = String.Empty; - } - - public Boolean IsDirty() - { - return - AllowedValues != XLAllowedValues.AnyValue - || (ShowInputMessage && - (!XLHelper.IsNullOrWhiteSpace(InputTitle) || !XLHelper.IsNullOrWhiteSpace(InputMessage))) - ||(ShowErrorMessage && - (!XLHelper.IsNullOrWhiteSpace(ErrorTitle) || !XLHelper.IsNullOrWhiteSpace(ErrorMessage))); - - } - - public XLDataValidation(IXLDataValidation dataValidation) - { - CopyFrom(dataValidation); - } - - #region IXLDataValidation Members - - public IXLRanges Ranges { get; set; } - - - public Boolean IgnoreBlanks { get; set; } - public Boolean InCellDropdown { get; set; } - public Boolean ShowInputMessage { get; set; } - public String InputTitle { get; set; } - public String InputMessage { get; set; } - public Boolean ShowErrorMessage { get; set; } - public String ErrorTitle { get; set; } - public String ErrorMessage { get; set; } - public XLErrorStyle ErrorStyle { get; set; } - private XLAllowedValues _allowedValues; - public XLAllowedValues AllowedValues - { - get { return _allowedValues; } - set { _allowedValues = value; } - } - - public XLOperator Operator { get; set; } - - public String Value - { - get { return MinValue; } - set { MinValue = value; } - } - - public String MinValue { get; set; } - public String MaxValue { get; set; } - - public XLWholeNumberCriteria WholeNumber - { - get - { - AllowedValues = XLAllowedValues.WholeNumber; - return new XLWholeNumberCriteria(this); - } - } - - public XLDecimalCriteria Decimal - { - get - { - AllowedValues = XLAllowedValues.Decimal; - return new XLDecimalCriteria(this); - } - } - - public XLDateCriteria Date - { - get - { - AllowedValues = XLAllowedValues.Date; - return new XLDateCriteria(this); - } - } - - public XLTimeCriteria Time - { - get - { - AllowedValues = XLAllowedValues.Time; - return new XLTimeCriteria(this); - } - } - - public XLTextLengthCriteria TextLength - { - get - { - AllowedValues = XLAllowedValues.TextLength; - return new XLTextLengthCriteria(this); - } - } - - public void List(String list) - { - List(list, true); - } - - public void List(String list, Boolean inCellDropdown) - { - AllowedValues = XLAllowedValues.List; - InCellDropdown = inCellDropdown; - Value = list; - } - - public void List(IXLRange range) - { - List(range, true); - } - - public void List(IXLRange range, Boolean inCellDropdown) - { - List(range.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true)); - } - - public void Custom(String customValidation) - { - AllowedValues = XLAllowedValues.Custom; - Value = customValidation; - } - - #endregion - - public void CopyFrom(IXLDataValidation dataValidation) - { - if (dataValidation == this) return; - - if (Ranges == null && dataValidation.Ranges != null) - { - Ranges = new XLRanges(); - dataValidation.Ranges.ForEach(r => Ranges.Add(r)); - } - - - IgnoreBlanks = dataValidation.IgnoreBlanks; - InCellDropdown = dataValidation.InCellDropdown; - ShowErrorMessage = dataValidation.ShowErrorMessage; - ShowInputMessage = dataValidation.ShowInputMessage; - InputTitle = dataValidation.InputTitle; - InputMessage = dataValidation.InputMessage; - ErrorTitle = dataValidation.ErrorTitle; - ErrorMessage = dataValidation.ErrorMessage; - ErrorStyle = dataValidation.ErrorStyle; - AllowedValues = dataValidation.AllowedValues; - Operator = dataValidation.Operator; - MinValue = dataValidation.MinValue; - MaxValue = dataValidation.MaxValue; - - } - - public void Clear() - { - Initialize(); - } - } +using System; + +namespace ClosedXML.Excel +{ + internal class XLDataValidation : IXLDataValidation + { + public XLDataValidation(IXLRanges ranges) + { + + Ranges = new XLRanges(); + ranges.ForEach(r=> + { + var newR = + new XLRange(new XLRangeParameters(r.RangeAddress as XLRangeAddress, + r.Worksheet.Style) {IgnoreEvents = true}); + (Ranges as XLRanges).Add(newR); + } ); + Initialize(); + } + + private void Initialize() + { + AllowedValues = XLAllowedValues.AnyValue; + IgnoreBlanks = true; + ShowErrorMessage = true; + ShowInputMessage = true; + InCellDropdown = true; + InputTitle = String.Empty; + InputMessage = String.Empty; + ErrorTitle = String.Empty; + ErrorMessage = String.Empty; + ErrorStyle = XLErrorStyle.Stop; + Operator = XLOperator.Between; + Value = String.Empty; + MinValue = String.Empty; + MaxValue = String.Empty; + } + + public Boolean IsDirty() + { + return + AllowedValues != XLAllowedValues.AnyValue + || (ShowInputMessage && + (!XLHelper.IsNullOrWhiteSpace(InputTitle) || !XLHelper.IsNullOrWhiteSpace(InputMessage))) + ||(ShowErrorMessage && + (!XLHelper.IsNullOrWhiteSpace(ErrorTitle) || !XLHelper.IsNullOrWhiteSpace(ErrorMessage))); + + } + + public XLDataValidation(IXLDataValidation dataValidation) + { + CopyFrom(dataValidation); + } + + #region IXLDataValidation Members + + public IXLRanges Ranges { get; set; } + + + public Boolean IgnoreBlanks { get; set; } + public Boolean InCellDropdown { get; set; } + public Boolean ShowInputMessage { get; set; } + public String InputTitle { get; set; } + public String InputMessage { get; set; } + public Boolean ShowErrorMessage { get; set; } + public String ErrorTitle { get; set; } + public String ErrorMessage { get; set; } + public XLErrorStyle ErrorStyle { get; set; } + private XLAllowedValues _allowedValues; + public XLAllowedValues AllowedValues + { + get { return _allowedValues; } + set { _allowedValues = value; } + } + + public XLOperator Operator { get; set; } + + public String Value + { + get { return MinValue; } + set { MinValue = value; } + } + + public String MinValue { get; set; } + public String MaxValue { get; set; } + + public XLWholeNumberCriteria WholeNumber + { + get + { + AllowedValues = XLAllowedValues.WholeNumber; + return new XLWholeNumberCriteria(this); + } + } + + public XLDecimalCriteria Decimal + { + get + { + AllowedValues = XLAllowedValues.Decimal; + return new XLDecimalCriteria(this); + } + } + + public XLDateCriteria Date + { + get + { + AllowedValues = XLAllowedValues.Date; + return new XLDateCriteria(this); + } + } + + public XLTimeCriteria Time + { + get + { + AllowedValues = XLAllowedValues.Time; + return new XLTimeCriteria(this); + } + } + + public XLTextLengthCriteria TextLength + { + get + { + AllowedValues = XLAllowedValues.TextLength; + return new XLTextLengthCriteria(this); + } + } + + public void List(String list) + { + List(list, true); + } + + public void List(String list, Boolean inCellDropdown) + { + AllowedValues = XLAllowedValues.List; + InCellDropdown = inCellDropdown; + Value = list; + } + + public void List(IXLRange range) + { + List(range, true); + } + + public void List(IXLRange range, Boolean inCellDropdown) + { + List(range.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true)); + } + + public void Custom(String customValidation) + { + AllowedValues = XLAllowedValues.Custom; + Value = customValidation; + } + + #endregion + + public void CopyFrom(IXLDataValidation dataValidation) + { + if (dataValidation == this) return; + + if (Ranges == null && dataValidation.Ranges != null) + { + Ranges = new XLRanges(); + dataValidation.Ranges.ForEach(r => Ranges.Add(r)); + } + + + IgnoreBlanks = dataValidation.IgnoreBlanks; + InCellDropdown = dataValidation.InCellDropdown; + ShowErrorMessage = dataValidation.ShowErrorMessage; + ShowInputMessage = dataValidation.ShowInputMessage; + InputTitle = dataValidation.InputTitle; + InputMessage = dataValidation.InputMessage; + ErrorTitle = dataValidation.ErrorTitle; + ErrorMessage = dataValidation.ErrorMessage; + ErrorStyle = dataValidation.ErrorStyle; + AllowedValues = dataValidation.AllowedValues; + Operator = dataValidation.Operator; + MinValue = dataValidation.MinValue; + MaxValue = dataValidation.MaxValue; + + } + + public void Clear() + { + Initialize(); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLDataValidations.cs b/ClosedXML/Excel/DataValidation/XLDataValidations.cs index 8ebd76f..eb95d43 100644 --- a/ClosedXML/Excel/DataValidation/XLDataValidations.cs +++ b/ClosedXML/Excel/DataValidation/XLDataValidations.cs @@ -1,54 +1,54 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - using System.Collections; - using System.Linq; - - internal class XLDataValidations : IXLDataValidations - { - private readonly List _dataValidations = new List(); - - #region IXLDataValidations Members - - public void Add(IXLDataValidation dataValidation) - { - _dataValidations.Add(dataValidation); - } - - public IEnumerator GetEnumerator() - { - return _dataValidations.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public Boolean ContainsSingle(IXLRange range) - { - Int32 count = 0; - foreach (var xlDataValidation in _dataValidations.Where(dv => dv.Ranges.Contains(range))) - { - count++; - if (count > 1) return false; - } - - return count == 1; - } - - #endregion - - public void Delete(IXLDataValidation dataValidation) - { - _dataValidations.RemoveAll(dv => dv.Ranges.Equals(dataValidation.Ranges)); - } - - public void Delete(IXLRange range) - { - _dataValidations.RemoveAll(dv => dv.Ranges.Contains(range)); - } - } +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + using System.Collections; + using System.Linq; + + internal class XLDataValidations : IXLDataValidations + { + private readonly List _dataValidations = new List(); + + #region IXLDataValidations Members + + public void Add(IXLDataValidation dataValidation) + { + _dataValidations.Add(dataValidation); + } + + public IEnumerator GetEnumerator() + { + return _dataValidations.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public Boolean ContainsSingle(IXLRange range) + { + Int32 count = 0; + foreach (var xlDataValidation in _dataValidations.Where(dv => dv.Ranges.Contains(range))) + { + count++; + if (count > 1) return false; + } + + return count == 1; + } + + #endregion + + public void Delete(IXLDataValidation dataValidation) + { + _dataValidations.RemoveAll(dv => dv.Ranges.Equals(dataValidation.Ranges)); + } + + public void Delete(IXLRange range) + { + _dataValidations.RemoveAll(dv => dv.Ranges.Contains(range)); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLDateCriteria.cs b/ClosedXML/Excel/DataValidation/XLDateCriteria.cs index 8962b0a..9f9bac0 100644 --- a/ClosedXML/Excel/DataValidation/XLDateCriteria.cs +++ b/ClosedXML/Excel/DataValidation/XLDateCriteria.cs @@ -1,63 +1,63 @@ -using System; -using System.Globalization; - -namespace ClosedXML.Excel -{ - public class XLDateCriteria : XLValidationCriteria - { - public XLDateCriteria(IXLDataValidation dataValidation) - : base(dataValidation) - { - } - - public void EqualTo(DateTime value) - { - dataValidation.Value = value.ToOADate().ToInvariantString(); - dataValidation.Operator = XLOperator.EqualTo; - } - - public void NotEqualTo(DateTime value) - { - dataValidation.Value = value.ToOADate().ToInvariantString(); - dataValidation.Operator = XLOperator.NotEqualTo; - } - - public void GreaterThan(DateTime value) - { - dataValidation.Value = value.ToOADate().ToInvariantString(); - dataValidation.Operator = XLOperator.GreaterThan; - } - - public void LessThan(DateTime value) - { - dataValidation.Value = value.ToOADate().ToInvariantString(); - dataValidation.Operator = XLOperator.LessThan; - } - - public void EqualOrGreaterThan(DateTime value) - { - dataValidation.Value = value.ToOADate().ToInvariantString(); - dataValidation.Operator = XLOperator.EqualOrGreaterThan; - } - - public void EqualOrLessThan(DateTime value) - { - dataValidation.Value = value.ToOADate().ToInvariantString(); - dataValidation.Operator = XLOperator.EqualOrLessThan; - } - - public void Between(DateTime minValue, DateTime maxValue) - { - dataValidation.MinValue = minValue.ToOADate().ToInvariantString(); - dataValidation.MaxValue = maxValue.ToOADate().ToInvariantString(); - dataValidation.Operator = XLOperator.Between; - } - - public void NotBetween(DateTime minValue, DateTime maxValue) - { - dataValidation.MinValue = minValue.ToOADate().ToInvariantString(); - dataValidation.MaxValue = maxValue.ToOADate().ToInvariantString(); - dataValidation.Operator = XLOperator.NotBetween; - } - } +using System; +using System.Globalization; + +namespace ClosedXML.Excel +{ + public class XLDateCriteria : XLValidationCriteria + { + public XLDateCriteria(IXLDataValidation dataValidation) + : base(dataValidation) + { + } + + public void EqualTo(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(DateTime value) + { + dataValidation.Value = value.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(DateTime minValue, DateTime maxValue) + { + dataValidation.MinValue = minValue.ToOADate().ToInvariantString(); + dataValidation.MaxValue = maxValue.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(DateTime minValue, DateTime maxValue) + { + dataValidation.MinValue = minValue.ToOADate().ToInvariantString(); + dataValidation.MaxValue = maxValue.ToOADate().ToInvariantString(); + dataValidation.Operator = XLOperator.NotBetween; + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLDecimalCriteria.cs b/ClosedXML/Excel/DataValidation/XLDecimalCriteria.cs index 93f190b..88088a1 100644 --- a/ClosedXML/Excel/DataValidation/XLDecimalCriteria.cs +++ b/ClosedXML/Excel/DataValidation/XLDecimalCriteria.cs @@ -1,62 +1,62 @@ -using System; - -namespace ClosedXML.Excel -{ - public class XLDecimalCriteria : XLValidationCriteria - { - public XLDecimalCriteria(IXLDataValidation dataValidation) - : base(dataValidation) - { - } - - public void EqualTo(Double value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.EqualTo; - } - - public void NotEqualTo(Double value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.NotEqualTo; - } - - public void GreaterThan(Double value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.GreaterThan; - } - - public void LessThan(Double value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.LessThan; - } - - public void EqualOrGreaterThan(Double value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.EqualOrGreaterThan; - } - - public void EqualOrLessThan(Double value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.EqualOrLessThan; - } - - public void Between(Double minValue, Double maxValue) - { - dataValidation.MinValue = minValue.ToString(); - dataValidation.MaxValue = maxValue.ToString(); - dataValidation.Operator = XLOperator.Between; - } - - public void NotBetween(Double minValue, Double maxValue) - { - dataValidation.MinValue = minValue.ToString(); - dataValidation.MaxValue = maxValue.ToString(); - dataValidation.Operator = XLOperator.NotBetween; - } - } +using System; + +namespace ClosedXML.Excel +{ + public class XLDecimalCriteria : XLValidationCriteria + { + public XLDecimalCriteria(IXLDataValidation dataValidation) + : base(dataValidation) + { + } + + public void EqualTo(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(Double value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(Double minValue, Double maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(Double minValue, Double maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.NotBetween; + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLTextLengthCriteria.cs b/ClosedXML/Excel/DataValidation/XLTextLengthCriteria.cs index 876b802..6a1ce41 100644 --- a/ClosedXML/Excel/DataValidation/XLTextLengthCriteria.cs +++ b/ClosedXML/Excel/DataValidation/XLTextLengthCriteria.cs @@ -1,62 +1,62 @@ -using System; - -namespace ClosedXML.Excel -{ - public class XLTextLengthCriteria : XLValidationCriteria - { - public XLTextLengthCriteria(IXLDataValidation dataValidation) - : base(dataValidation) - { - } - - public void EqualTo(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.EqualTo; - } - - public void NotEqualTo(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.NotEqualTo; - } - - public void GreaterThan(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.GreaterThan; - } - - public void LessThan(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.LessThan; - } - - public void EqualOrGreaterThan(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.EqualOrGreaterThan; - } - - public void EqualOrLessThan(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.EqualOrLessThan; - } - - public void Between(Int32 minValue, Int32 maxValue) - { - dataValidation.MinValue = minValue.ToString(); - dataValidation.MaxValue = maxValue.ToString(); - dataValidation.Operator = XLOperator.Between; - } - - public void NotBetween(Int32 minValue, Int32 maxValue) - { - dataValidation.MinValue = minValue.ToString(); - dataValidation.MaxValue = maxValue.ToString(); - dataValidation.Operator = XLOperator.NotBetween; - } - } +using System; + +namespace ClosedXML.Excel +{ + public class XLTextLengthCriteria : XLValidationCriteria + { + public XLTextLengthCriteria(IXLDataValidation dataValidation) + : base(dataValidation) + { + } + + public void EqualTo(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(Int32 minValue, Int32 maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(Int32 minValue, Int32 maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.NotBetween; + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLTimeCriteria.cs b/ClosedXML/Excel/DataValidation/XLTimeCriteria.cs index 5d93a2e..51a4f80 100644 --- a/ClosedXML/Excel/DataValidation/XLTimeCriteria.cs +++ b/ClosedXML/Excel/DataValidation/XLTimeCriteria.cs @@ -1,67 +1,67 @@ -using System; - -namespace ClosedXML.Excel -{ - public class XLTimeCriteria : XLValidationCriteria - { - public XLTimeCriteria(IXLDataValidation dataValidation) - : base(dataValidation) - { - } - - private static String GetXLTime(TimeSpan value) - { - return (value.TotalHours / 24.0).ToString(); - } - - public void EqualTo(TimeSpan value) - { - dataValidation.Value = GetXLTime(value); - dataValidation.Operator = XLOperator.EqualTo; - } - - public void NotEqualTo(TimeSpan value) - { - dataValidation.Value = GetXLTime(value); - dataValidation.Operator = XLOperator.NotEqualTo; - } - - public void GreaterThan(TimeSpan value) - { - dataValidation.Value = GetXLTime(value); - dataValidation.Operator = XLOperator.GreaterThan; - } - - public void LessThan(TimeSpan value) - { - dataValidation.Value = GetXLTime(value); - dataValidation.Operator = XLOperator.LessThan; - } - - public void EqualOrGreaterThan(TimeSpan value) - { - dataValidation.Value = GetXLTime(value); - dataValidation.Operator = XLOperator.EqualOrGreaterThan; - } - - public void EqualOrLessThan(TimeSpan value) - { - dataValidation.Value = GetXLTime(value); - dataValidation.Operator = XLOperator.EqualOrLessThan; - } - - public void Between(TimeSpan minValue, TimeSpan maxValue) - { - dataValidation.MinValue = GetXLTime(minValue); - dataValidation.MaxValue = GetXLTime(maxValue); - dataValidation.Operator = XLOperator.Between; - } - - public void NotBetween(TimeSpan minValue, TimeSpan maxValue) - { - dataValidation.MinValue = GetXLTime(minValue); - dataValidation.MaxValue = GetXLTime(maxValue); - dataValidation.Operator = XLOperator.NotBetween; - } - } +using System; + +namespace ClosedXML.Excel +{ + public class XLTimeCriteria : XLValidationCriteria + { + public XLTimeCriteria(IXLDataValidation dataValidation) + : base(dataValidation) + { + } + + private static String GetXLTime(TimeSpan value) + { + return (value.TotalHours / 24.0).ToString(); + } + + public void EqualTo(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(TimeSpan value) + { + dataValidation.Value = GetXLTime(value); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(TimeSpan minValue, TimeSpan maxValue) + { + dataValidation.MinValue = GetXLTime(minValue); + dataValidation.MaxValue = GetXLTime(maxValue); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(TimeSpan minValue, TimeSpan maxValue) + { + dataValidation.MinValue = GetXLTime(minValue); + dataValidation.MaxValue = GetXLTime(maxValue); + dataValidation.Operator = XLOperator.NotBetween; + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLValidationCriteria.cs b/ClosedXML/Excel/DataValidation/XLValidationCriteria.cs index 449e688..8932e7f 100644 --- a/ClosedXML/Excel/DataValidation/XLValidationCriteria.cs +++ b/ClosedXML/Excel/DataValidation/XLValidationCriteria.cs @@ -1,169 +1,169 @@ -using System; - -namespace ClosedXML.Excel -{ - public abstract class XLValidationCriteria : IXLValidationCriteria - { - protected IXLDataValidation dataValidation; - - internal XLValidationCriteria(IXLDataValidation dataValidation) - { - this.dataValidation = dataValidation; - } - - #region IXLValidationCriteria Members - - public void EqualTo(String value) - { - dataValidation.Value = value; - dataValidation.Operator = XLOperator.EqualTo; - } - - public void NotEqualTo(String value) - { - dataValidation.Value = value; - dataValidation.Operator = XLOperator.NotEqualTo; - } - - public void GreaterThan(String value) - { - dataValidation.Value = value; - dataValidation.Operator = XLOperator.GreaterThan; - } - - public void LessThan(String value) - { - dataValidation.Value = value; - dataValidation.Operator = XLOperator.LessThan; - } - - public void EqualOrGreaterThan(String value) - { - dataValidation.Value = value; - dataValidation.Operator = XLOperator.EqualOrGreaterThan; - } - - public void EqualOrLessThan(String value) - { - dataValidation.Value = value; - dataValidation.Operator = XLOperator.EqualOrLessThan; - } - - public void Between(String minValue, String maxValue) - { - dataValidation.MinValue = minValue; - dataValidation.MaxValue = maxValue; - dataValidation.Operator = XLOperator.Between; - } - - public void NotBetween(String minValue, String maxValue) - { - dataValidation.MinValue = minValue; - dataValidation.MaxValue = maxValue; - dataValidation.Operator = XLOperator.NotBetween; - } - - - public void EqualTo(IXLRange range) - { - dataValidation.Value = range.RangeAddress.ToStringFixed(); - dataValidation.Operator = XLOperator.EqualTo; - } - - public void NotEqualTo(IXLRange range) - { - dataValidation.Value = range.RangeAddress.ToStringFixed(); - dataValidation.Operator = XLOperator.NotEqualTo; - } - - public void GreaterThan(IXLRange range) - { - dataValidation.Value = range.RangeAddress.ToStringFixed(); - dataValidation.Operator = XLOperator.GreaterThan; - } - - public void LessThan(IXLRange range) - { - dataValidation.Value = range.RangeAddress.ToStringFixed(); - dataValidation.Operator = XLOperator.LessThan; - } - - public void EqualOrGreaterThan(IXLRange range) - { - dataValidation.Value = range.RangeAddress.ToStringFixed(); - dataValidation.Operator = XLOperator.EqualOrGreaterThan; - } - - public void EqualOrLessThan(IXLRange range) - { - dataValidation.Value = range.RangeAddress.ToStringFixed(); - dataValidation.Operator = XLOperator.EqualOrLessThan; - } - - public void Between(IXLRange minValue, IXLRange maxValue) - { - dataValidation.MinValue = minValue.RangeAddress.ToStringFixed(); - dataValidation.MaxValue = maxValue.RangeAddress.ToStringFixed(); - dataValidation.Operator = XLOperator.Between; - } - - public void NotBetween(IXLRange minValue, IXLRange maxValue) - { - dataValidation.MinValue = minValue.RangeAddress.ToStringFixed(); - dataValidation.MaxValue = maxValue.RangeAddress.ToStringFixed(); - dataValidation.Operator = XLOperator.NotBetween; - } - - public void EqualTo(IXLCell cell) - { - dataValidation.Value = cell.Address.ToStringFixed(); - dataValidation.Operator = XLOperator.EqualTo; - } - - public void NotEqualTo(IXLCell cell) - { - dataValidation.Value = cell.Address.ToStringFixed(); - dataValidation.Operator = XLOperator.NotEqualTo; - } - - public void GreaterThan(IXLCell cell) - { - dataValidation.Value = cell.Address.ToStringFixed(); - dataValidation.Operator = XLOperator.GreaterThan; - } - - public void LessThan(IXLCell cell) - { - dataValidation.Value = cell.Address.ToStringFixed(); - dataValidation.Operator = XLOperator.LessThan; - } - - public void EqualOrGreaterThan(IXLCell cell) - { - dataValidation.Value = cell.Address.ToStringFixed(); - dataValidation.Operator = XLOperator.EqualOrGreaterThan; - } - - public void EqualOrLessThan(IXLCell cell) - { - dataValidation.Value = cell.Address.ToStringFixed(); - dataValidation.Operator = XLOperator.EqualOrLessThan; - } - - public void Between(IXLCell minValue, IXLCell maxValue) - { - dataValidation.MinValue = minValue.Address.ToStringFixed(); - dataValidation.MaxValue = maxValue.Address.ToStringFixed(); - dataValidation.Operator = XLOperator.Between; - } - - public void NotBetween(IXLCell minValue, IXLCell maxValue) - { - dataValidation.MinValue = minValue.Address.ToStringFixed(); - dataValidation.MaxValue = maxValue.Address.ToStringFixed(); - dataValidation.Operator = XLOperator.NotBetween; - } - - #endregion - } +using System; + +namespace ClosedXML.Excel +{ + public abstract class XLValidationCriteria : IXLValidationCriteria + { + protected IXLDataValidation dataValidation; + + internal XLValidationCriteria(IXLDataValidation dataValidation) + { + this.dataValidation = dataValidation; + } + + #region IXLValidationCriteria Members + + public void EqualTo(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(String value) + { + dataValidation.Value = value; + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(String minValue, String maxValue) + { + dataValidation.MinValue = minValue; + dataValidation.MaxValue = maxValue; + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(String minValue, String maxValue) + { + dataValidation.MinValue = minValue; + dataValidation.MaxValue = maxValue; + dataValidation.Operator = XLOperator.NotBetween; + } + + + public void EqualTo(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(IXLRange range) + { + dataValidation.Value = range.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(IXLRange minValue, IXLRange maxValue) + { + dataValidation.MinValue = minValue.RangeAddress.ToStringFixed(); + dataValidation.MaxValue = maxValue.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(IXLRange minValue, IXLRange maxValue) + { + dataValidation.MinValue = minValue.RangeAddress.ToStringFixed(); + dataValidation.MaxValue = maxValue.RangeAddress.ToStringFixed(); + dataValidation.Operator = XLOperator.NotBetween; + } + + public void EqualTo(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualTo; + } + + public void NotEqualTo(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + + public void GreaterThan(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.GreaterThan; + } + + public void LessThan(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.LessThan; + } + + public void EqualOrGreaterThan(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + + public void EqualOrLessThan(IXLCell cell) + { + dataValidation.Value = cell.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + + public void Between(IXLCell minValue, IXLCell maxValue) + { + dataValidation.MinValue = minValue.Address.ToStringFixed(); + dataValidation.MaxValue = maxValue.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.Between; + } + + public void NotBetween(IXLCell minValue, IXLCell maxValue) + { + dataValidation.MinValue = minValue.Address.ToStringFixed(); + dataValidation.MaxValue = maxValue.Address.ToStringFixed(); + dataValidation.Operator = XLOperator.NotBetween; + } + + #endregion + } } \ No newline at end of file diff --git a/ClosedXML/Excel/DataValidation/XLWholeNumberCriteria.cs b/ClosedXML/Excel/DataValidation/XLWholeNumberCriteria.cs index 01c8dba..2fdcef1 100644 --- a/ClosedXML/Excel/DataValidation/XLWholeNumberCriteria.cs +++ b/ClosedXML/Excel/DataValidation/XLWholeNumberCriteria.cs @@ -1,57 +1,57 @@ -using System; - -namespace ClosedXML.Excel -{ - public class XLWholeNumberCriteria : XLValidationCriteria - { - public XLWholeNumberCriteria(IXLDataValidation dataValidation): base(dataValidation) - { - - } - - public void EqualTo(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.EqualTo; - } - public void NotEqualTo(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.NotEqualTo; - } - public void GreaterThan(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.GreaterThan; - } - public void LessThan(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.LessThan; - } - public void EqualOrGreaterThan(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.EqualOrGreaterThan; - } - public void EqualOrLessThan(Int32 value) - { - dataValidation.Value = value.ToString(); - dataValidation.Operator = XLOperator.EqualOrLessThan; - } - public void Between(Int32 minValue, Int32 maxValue) - { - dataValidation.MinValue = minValue.ToString(); - dataValidation.MaxValue = maxValue.ToString(); - dataValidation.Operator = XLOperator.Between; - } - public void NotBetween(Int32 minValue, Int32 maxValue) - { - dataValidation.MinValue = minValue.ToString(); - dataValidation.MaxValue = maxValue.ToString(); - dataValidation.Operator = XLOperator.NotBetween; - } - - - } -} +using System; + +namespace ClosedXML.Excel +{ + public class XLWholeNumberCriteria : XLValidationCriteria + { + public XLWholeNumberCriteria(IXLDataValidation dataValidation): base(dataValidation) + { + + } + + public void EqualTo(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualTo; + } + public void NotEqualTo(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.NotEqualTo; + } + public void GreaterThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.GreaterThan; + } + public void LessThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.LessThan; + } + public void EqualOrGreaterThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrGreaterThan; + } + public void EqualOrLessThan(Int32 value) + { + dataValidation.Value = value.ToString(); + dataValidation.Operator = XLOperator.EqualOrLessThan; + } + public void Between(Int32 minValue, Int32 maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.Between; + } + public void NotBetween(Int32 minValue, Int32 maxValue) + { + dataValidation.MinValue = minValue.ToString(); + dataValidation.MaxValue = maxValue.ToString(); + dataValidation.Operator = XLOperator.NotBetween; + } + + + } +} diff --git a/ClosedXML/Excel/Drawings/IXLDrawing.cs b/ClosedXML/Excel/Drawings/IXLDrawing.cs index e83422a..c006315 100644 --- a/ClosedXML/Excel/Drawings/IXLDrawing.cs +++ b/ClosedXML/Excel/Drawings/IXLDrawing.cs @@ -1,45 +1,45 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLDrawingAnchor { MoveAndSizeWithCells, MoveWithCells, Absolute} - public interface IXLDrawing - { - Int32 ShapeId { get; } - - Boolean Visible { get; set; } - T SetVisible(); - T SetVisible(Boolean hidden); - - ////String Name { get; set; } - ////T SetName(String name); - - ////String Description { get; set; } - ////T SetDescription(String description); - - IXLDrawingPosition Position { get; } - - Int32 ZOrder { get; set; } - T SetZOrder(Int32 zOrder); - - //Boolean HorizontalFlip { get; set; } - //T SetHorizontalFlip(); - //T SetHorizontalFlip(Boolean horizontalFlip); - - //Boolean VerticalFlip { get; set; } - //T SetVerticalFlip(); - //T SetVerticalFlip(Boolean verticalFlip); - - //Int32 Rotation { get; set; } - //T SetRotation(Int32 rotation); - - //Int32 ExtentLength { get; set; } - //T SetExtentLength(Int32 ExtentLength); - - //Int32 ExtentWidth { get; set; } - //T SetExtentWidth(Int32 extentWidth); - - IXLDrawingStyle Style { get; } - - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLDrawingAnchor { MoveAndSizeWithCells, MoveWithCells, Absolute} + public interface IXLDrawing + { + Int32 ShapeId { get; } + + Boolean Visible { get; set; } + T SetVisible(); + T SetVisible(Boolean hidden); + + ////String Name { get; set; } + ////T SetName(String name); + + ////String Description { get; set; } + ////T SetDescription(String description); + + IXLDrawingPosition Position { get; } + + Int32 ZOrder { get; set; } + T SetZOrder(Int32 zOrder); + + //Boolean HorizontalFlip { get; set; } + //T SetHorizontalFlip(); + //T SetHorizontalFlip(Boolean horizontalFlip); + + //Boolean VerticalFlip { get; set; } + //T SetVerticalFlip(); + //T SetVerticalFlip(Boolean verticalFlip); + + //Int32 Rotation { get; set; } + //T SetRotation(Int32 rotation); + + //Int32 ExtentLength { get; set; } + //T SetExtentLength(Int32 ExtentLength); + + //Int32 ExtentWidth { get; set; } + //T SetExtentWidth(Int32 extentWidth); + + IXLDrawingStyle Style { get; } + + } +} diff --git a/ClosedXML/Excel/Drawings/IXLDrawingPosition.cs b/ClosedXML/Excel/Drawings/IXLDrawingPosition.cs index ac22822..2b33229 100644 --- a/ClosedXML/Excel/Drawings/IXLDrawingPosition.cs +++ b/ClosedXML/Excel/Drawings/IXLDrawingPosition.cs @@ -1,20 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLDrawingPosition - { - Int32 Column { get; set; } - IXLDrawingPosition SetColumn(Int32 column); - Double ColumnOffset { get; set; } - IXLDrawingPosition SetColumnOffset(Double columnOffset); - - Int32 Row { get; set; } - IXLDrawingPosition SetRow(Int32 row); - Double RowOffset { get; set; } - IXLDrawingPosition SetRowOffset(Double rowOffset); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingPosition + { + Int32 Column { get; set; } + IXLDrawingPosition SetColumn(Int32 column); + Double ColumnOffset { get; set; } + IXLDrawingPosition SetColumnOffset(Double columnOffset); + + Int32 Row { get; set; } + IXLDrawingPosition SetRow(Int32 row); + Double RowOffset { get; set; } + IXLDrawingPosition SetRowOffset(Double rowOffset); + } +} diff --git a/ClosedXML/Excel/Drawings/IXLMarker.cs b/ClosedXML/Excel/Drawings/IXLMarker.cs index fd52192..d5c2ef4 100644 --- a/ClosedXML/Excel/Drawings/IXLMarker.cs +++ b/ClosedXML/Excel/Drawings/IXLMarker.cs @@ -1,25 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Drawing; namespace ClosedXML.Excel.Drawings { - public interface IXLMarker + internal interface IXLMarker { - Int32 ColumnId { get; set; } - Int32 RowId { get; set; } - Double ColumnOffset { get; set; } - Double RowOffset { get; set; } - - /// - /// Get the zero-based column number. - /// - Int32 GetZeroBasedColumn(); - - /// - /// Get the zero-based row number. - /// - Int32 GetZeroBasedRow(); + IXLAddress Address { get; set; } + Point Offset { get; set; } } } diff --git a/ClosedXML/Excel/Drawings/IXLPicture.cs b/ClosedXML/Excel/Drawings/IXLPicture.cs index 84829b7..2c2f750 100644 --- a/ClosedXML/Excel/Drawings/IXLPicture.cs +++ b/ClosedXML/Excel/Drawings/IXLPicture.cs @@ -1,40 +1,70 @@ -using System; -using System.Collections.Generic; +using System; +using System.Drawing; using System.IO; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Packaging; namespace ClosedXML.Excel.Drawings { - public interface IXLPicture + public interface IXLPicture : IDisposable { - Stream ImageStream { get; set; } - - List GetMarkers(); - void AddMarker(IXLMarker marker); - - long MaxHeight { get; set; } - long MaxWidth { get; set; } - long Width { get; set; } - long Height { get; set; } - long OffsetX { get; set; } - long OffsetY { get; set; } - long RawOffsetX { get; set; } - long RawOffsetY { get; set; } - bool IsAbsolute { get; set; } + IXLAddress BottomRightCellAddress { get; } /// /// Type of image. The supported formats are defined by OpenXML's ImagePartType. /// Default value is "jpeg" /// - String Type { get; set; } + XLPictureFormat Format { get; } + + Int32 Height { get; set; } + + MemoryStream ImageStream { get; } + + Int32 Left { get; set; } String Name { get; set; } + Int32 OriginalHeight { get; } + + Int32 OriginalWidth { get; } + + XLPicturePlacement Placement { get; set; } + + Int32 Top { get; set; } + + IXLAddress TopLeftCellAddress { get; } + + Int32 Width { get; set; } + + IXLWorksheet Worksheet { get; } + /// - /// Get the enum representation of the Picture type. + /// Deletes this picture. /// - ImagePartType GetImagePartType(); + void Delete(); + + Point GetOffset(XLMarkerPosition position); + + IXLPicture MoveTo(Int32 left, Int32 top); + + IXLPicture MoveTo(IXLAddress cell); + + IXLPicture MoveTo(IXLAddress cell, Int32 xOffset, Int32 yOffset); + + IXLPicture MoveTo(IXLAddress cell, Point offset); + + IXLPicture MoveTo(IXLAddress fromCell, IXLAddress toCell); + + IXLPicture MoveTo(IXLAddress fromCell, Int32 fromCellXOffset, Int32 fromCellYOffset, IXLAddress toCell, Int32 toCellXOffset, Int32 toCellYOffset); + + IXLPicture MoveTo(IXLAddress fromCell, Point fromOffset, IXLAddress toCell, Point toOffset); + + IXLPicture Scale(Double factor, Boolean relativeToOriginal = false); + + IXLPicture ScaleHeight(Double factor, Boolean relativeToOriginal = false); + + IXLPicture ScaleWidth(Double factor, Boolean relativeToOriginal = false); + + IXLPicture WithPlacement(XLPicturePlacement value); + + IXLPicture WithSize(Int32 width, Int32 height); } } diff --git a/ClosedXML/Excel/Drawings/IXLPictures.cs b/ClosedXML/Excel/Drawings/IXLPictures.cs new file mode 100644 index 0000000..ff449cd --- /dev/null +++ b/ClosedXML/Excel/Drawings/IXLPictures.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; + +namespace ClosedXML.Excel.Drawings +{ + public interface IXLPictures : IEnumerable + { + int Count { get; } + + IXLPicture Add(Stream stream); + + IXLPicture Add(Stream stream, String name); + + IXLPicture Add(Stream stream, XLPictureFormat format); + + IXLPicture Add(Stream stream, XLPictureFormat format, String name); + + IXLPicture Add(Bitmap bitmap); + + IXLPicture Add(Bitmap bitmap, String name); + + IXLPicture Add(String imageFile); + + IXLPicture Add(String imageFile, String name); + + void Delete(String pictureName); + + void Delete(IXLPicture picture); + + IXLPicture Picture(String pictureName); + + bool TryGetPicture(string pictureName, out IXLPicture picture); + } +} diff --git a/ClosedXML/Excel/Drawings/PictureEnums.cs b/ClosedXML/Excel/Drawings/PictureEnums.cs new file mode 100644 index 0000000..3d76e73 --- /dev/null +++ b/ClosedXML/Excel/Drawings/PictureEnums.cs @@ -0,0 +1,28 @@ +namespace ClosedXML.Excel.Drawings +{ + public enum XLMarkerPosition + { + TopLeft, + BottomRight + } + + public enum XLPictureFormat + { + Bmp = 0, + Gif = 1, + Png = 2, + Tiff = 3, + Icon = 4, + Pcx = 5, + Jpeg = 6, + Emf = 7, + Wmf = 8 + } + + public enum XLPicturePlacement + { + MoveAndSize = 0, + Move = 1, + FreeFloating = 2 + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingAlignment.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingAlignment.cs index ab838a6..eb68bbb 100644 --- a/ClosedXML/Excel/Drawings/Style/IXLDrawingAlignment.cs +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingAlignment.cs @@ -1,38 +1,38 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public enum XLDrawingTextDirection - { - Context, - LeftToRight, - RightToLeft - } - public enum XLDrawingTextOrientation - { - LeftToRight, - Vertical, - BottomToTop, - TopToBottom - } - public enum XLDrawingHorizontalAlignment { Left, Justify, Center, Right, Distributed } - public enum XLDrawingVerticalAlignment { Top, Justify, Center, Bottom, Distributed } - public interface IXLDrawingAlignment - { - XLDrawingHorizontalAlignment Horizontal { get; set; } - XLDrawingVerticalAlignment Vertical { get; set; } - Boolean AutomaticSize { get; set; } - XLDrawingTextDirection Direction { get; set; } - XLDrawingTextOrientation Orientation { get; set; } - - IXLDrawingStyle SetHorizontal(XLDrawingHorizontalAlignment value); - IXLDrawingStyle SetVertical(XLDrawingVerticalAlignment value); - IXLDrawingStyle SetAutomaticSize(); IXLDrawingStyle SetAutomaticSize(Boolean value); - IXLDrawingStyle SetDirection(XLDrawingTextDirection value); - IXLDrawingStyle SetOrientation(XLDrawingTextOrientation value); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLDrawingTextDirection + { + Context, + LeftToRight, + RightToLeft + } + public enum XLDrawingTextOrientation + { + LeftToRight, + Vertical, + BottomToTop, + TopToBottom + } + public enum XLDrawingHorizontalAlignment { Left, Justify, Center, Right, Distributed } + public enum XLDrawingVerticalAlignment { Top, Justify, Center, Bottom, Distributed } + public interface IXLDrawingAlignment + { + XLDrawingHorizontalAlignment Horizontal { get; set; } + XLDrawingVerticalAlignment Vertical { get; set; } + Boolean AutomaticSize { get; set; } + XLDrawingTextDirection Direction { get; set; } + XLDrawingTextOrientation Orientation { get; set; } + + IXLDrawingStyle SetHorizontal(XLDrawingHorizontalAlignment value); + IXLDrawingStyle SetVertical(XLDrawingVerticalAlignment value); + IXLDrawingStyle SetAutomaticSize(); IXLDrawingStyle SetAutomaticSize(Boolean value); + IXLDrawingStyle SetDirection(XLDrawingTextDirection value); + IXLDrawingStyle SetOrientation(XLDrawingTextOrientation value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingColorsAndLines.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingColorsAndLines.cs index 135cc55..72a6fec 100644 --- a/ClosedXML/Excel/Drawings/Style/IXLDrawingColorsAndLines.cs +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingColorsAndLines.cs @@ -1,42 +1,42 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public enum XLDashStyle - { - Solid, - RoundDot, - SquareDot, - Dash, - DashDot, - LongDash, - LongDashDot, - LongDashDotDot - } - public enum XLLineStyle - { - Single, ThinThin, ThinThick, ThickThin, ThickBetweenThin - } - public interface IXLDrawingColorsAndLines - { - XLColor FillColor { get; set; } - Double FillTransparency { get; set; } - XLColor LineColor { get; set; } - Double LineTransparency { get; set; } - Double LineWeight { get; set; } - XLDashStyle LineDash { get; set; } - XLLineStyle LineStyle { get; set; } - - IXLDrawingStyle SetFillColor(XLColor value); - IXLDrawingStyle SetFillTransparency(Double value); - IXLDrawingStyle SetLineColor(XLColor value); - IXLDrawingStyle SetLineTransparency(Double value); - IXLDrawingStyle SetLineWeight(Double value); - IXLDrawingStyle SetLineDash(XLDashStyle value); - IXLDrawingStyle SetLineStyle(XLLineStyle value); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLDashStyle + { + Solid, + RoundDot, + SquareDot, + Dash, + DashDot, + LongDash, + LongDashDot, + LongDashDotDot + } + public enum XLLineStyle + { + Single, ThinThin, ThinThick, ThickThin, ThickBetweenThin + } + public interface IXLDrawingColorsAndLines + { + XLColor FillColor { get; set; } + Double FillTransparency { get; set; } + XLColor LineColor { get; set; } + Double LineTransparency { get; set; } + Double LineWeight { get; set; } + XLDashStyle LineDash { get; set; } + XLLineStyle LineStyle { get; set; } + + IXLDrawingStyle SetFillColor(XLColor value); + IXLDrawingStyle SetFillTransparency(Double value); + IXLDrawingStyle SetLineColor(XLColor value); + IXLDrawingStyle SetLineTransparency(Double value); + IXLDrawingStyle SetLineWeight(Double value); + IXLDrawingStyle SetLineDash(XLDashStyle value); + IXLDrawingStyle SetLineStyle(XLLineStyle value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingFont.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingFont.cs index d63ced5..94b6850 100644 --- a/ClosedXML/Excel/Drawings/Style/IXLDrawingFont.cs +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingFont.cs @@ -1,22 +1,22 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLDrawingFont : IXLFontBase - { - IXLDrawingStyle SetBold(); IXLDrawingStyle SetBold(Boolean value); - IXLDrawingStyle SetItalic(); IXLDrawingStyle SetItalic(Boolean value); - IXLDrawingStyle SetUnderline(); IXLDrawingStyle SetUnderline(XLFontUnderlineValues value); - IXLDrawingStyle SetStrikethrough(); IXLDrawingStyle SetStrikethrough(Boolean value); - IXLDrawingStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); - IXLDrawingStyle SetShadow(); IXLDrawingStyle SetShadow(Boolean value); - IXLDrawingStyle SetFontSize(Double value); - IXLDrawingStyle SetFontColor(XLColor value); - IXLDrawingStyle SetFontName(String value); - IXLDrawingStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingFont : IXLFontBase + { + IXLDrawingStyle SetBold(); IXLDrawingStyle SetBold(Boolean value); + IXLDrawingStyle SetItalic(); IXLDrawingStyle SetItalic(Boolean value); + IXLDrawingStyle SetUnderline(); IXLDrawingStyle SetUnderline(XLFontUnderlineValues value); + IXLDrawingStyle SetStrikethrough(); IXLDrawingStyle SetStrikethrough(Boolean value); + IXLDrawingStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); + IXLDrawingStyle SetShadow(); IXLDrawingStyle SetShadow(Boolean value); + IXLDrawingStyle SetFontSize(Double value); + IXLDrawingStyle SetFontColor(XLColor value); + IXLDrawingStyle SetFontName(String value); + IXLDrawingStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingMargins.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingMargins.cs index cce06e8..759cd44 100644 --- a/ClosedXML/Excel/Drawings/Style/IXLDrawingMargins.cs +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingMargins.cs @@ -1,25 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLDrawingMargins - { - Boolean Automatic { get; set; } - Double Left { get; set; } - Double Right { get; set; } - Double Top { get; set; } - Double Bottom { get; set; } - Double All { set; } - - IXLDrawingStyle SetAutomatic(); IXLDrawingStyle SetAutomatic(Boolean value); - IXLDrawingStyle SetLeft(Double value); - IXLDrawingStyle SetRight(Double value); - IXLDrawingStyle SetTop(Double value); - IXLDrawingStyle SetBottom(Double value); - IXLDrawingStyle SetAll(Double value); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingMargins + { + Boolean Automatic { get; set; } + Double Left { get; set; } + Double Right { get; set; } + Double Top { get; set; } + Double Bottom { get; set; } + Double All { set; } + + IXLDrawingStyle SetAutomatic(); IXLDrawingStyle SetAutomatic(Boolean value); + IXLDrawingStyle SetLeft(Double value); + IXLDrawingStyle SetRight(Double value); + IXLDrawingStyle SetTop(Double value); + IXLDrawingStyle SetBottom(Double value); + IXLDrawingStyle SetAll(Double value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingProperties.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingProperties.cs index cf2118b..6157946 100644 --- a/ClosedXML/Excel/Drawings/Style/IXLDrawingProperties.cs +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingProperties.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLDrawingProperties - { - XLDrawingAnchor Positioning { get; set; } - IXLDrawingStyle SetPositioning(XLDrawingAnchor value); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingProperties + { + XLDrawingAnchor Positioning { get; set; } + IXLDrawingStyle SetPositioning(XLDrawingAnchor value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingProtection.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingProtection.cs index 67ff8cd..36f896b 100644 --- a/ClosedXML/Excel/Drawings/Style/IXLDrawingProtection.cs +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingProtection.cs @@ -1,17 +1,17 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLDrawingProtection - { - Boolean Locked { get; set; } - Boolean LockText { get; set; } - - IXLDrawingStyle SetLocked(); IXLDrawingStyle SetLocked(Boolean value); - IXLDrawingStyle SetLockText(); IXLDrawingStyle SetLockText(Boolean value); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingProtection + { + Boolean Locked { get; set; } + Boolean LockText { get; set; } + + IXLDrawingStyle SetLocked(); IXLDrawingStyle SetLocked(Boolean value); + IXLDrawingStyle SetLockText(); IXLDrawingStyle SetLockText(Boolean value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingSize.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingSize.cs index 5025a9d..5b83d32 100644 --- a/ClosedXML/Excel/Drawings/Style/IXLDrawingSize.cs +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingSize.cs @@ -1,19 +1,19 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLDrawingSize - { - Boolean AutomaticSize { get; set; } - Double Height { get; set; } - Double Width { get; set; } - - IXLDrawingStyle SetAutomaticSize(); IXLDrawingStyle SetAutomaticSize(Boolean value); - IXLDrawingStyle SetHeight(Double value); - IXLDrawingStyle SetWidth(Double value); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingSize + { + Boolean AutomaticSize { get; set; } + Double Height { get; set; } + Double Width { get; set; } + + IXLDrawingStyle SetAutomaticSize(); IXLDrawingStyle SetAutomaticSize(Boolean value); + IXLDrawingStyle SetHeight(Double value); + IXLDrawingStyle SetWidth(Double value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingStyle.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingStyle.cs index fac4343..9eed6a8 100644 --- a/ClosedXML/Excel/Drawings/Style/IXLDrawingStyle.cs +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingStyle.cs @@ -1,19 +1,19 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLDrawingStyle - { - //IXLDrawingFont Font { get; } - IXLDrawingAlignment Alignment { get; } - IXLDrawingColorsAndLines ColorsAndLines { get; } - IXLDrawingSize Size { get; } - IXLDrawingProtection Protection { get; } - IXLDrawingProperties Properties { get; } - IXLDrawingMargins Margins { get; } - IXLDrawingWeb Web { get; } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingStyle + { + //IXLDrawingFont Font { get; } + IXLDrawingAlignment Alignment { get; } + IXLDrawingColorsAndLines ColorsAndLines { get; } + IXLDrawingSize Size { get; } + IXLDrawingProtection Protection { get; } + IXLDrawingProperties Properties { get; } + IXLDrawingMargins Margins { get; } + IXLDrawingWeb Web { get; } + } +} diff --git a/ClosedXML/Excel/Drawings/Style/IXLDrawingWeb.cs b/ClosedXML/Excel/Drawings/Style/IXLDrawingWeb.cs index abc5ccd..0032488 100644 --- a/ClosedXML/Excel/Drawings/Style/IXLDrawingWeb.cs +++ b/ClosedXML/Excel/Drawings/Style/IXLDrawingWeb.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLDrawingWeb - { - String AlternateText { get; set; } - IXLDrawingStyle SetAlternateText(String value); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLDrawingWeb + { + String AlternateText { get; set; } + IXLDrawingStyle SetAlternateText(String value); + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingAlignment.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingAlignment.cs index 789b5c4..3da9f89 100644 --- a/ClosedXML/Excel/Drawings/Style/XLDrawingAlignment.cs +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingAlignment.cs @@ -1,23 +1,23 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLDrawingAlignment: IXLDrawingAlignment - { - private readonly IXLDrawingStyle _style; - - public XLDrawingAlignment(IXLDrawingStyle style) - { - _style = style; - } - public XLDrawingHorizontalAlignment Horizontal { get; set; } public IXLDrawingStyle SetHorizontal(XLDrawingHorizontalAlignment value) { Horizontal = value; return _style; } - public XLDrawingVerticalAlignment Vertical { get; set; } public IXLDrawingStyle SetVertical(XLDrawingVerticalAlignment value) { Vertical = value; return _style; } - public Boolean AutomaticSize { get; set; } public IXLDrawingStyle SetAutomaticSize() { AutomaticSize = true; return _style; } public IXLDrawingStyle SetAutomaticSize(Boolean value) { AutomaticSize = value; return _style; } - public XLDrawingTextDirection Direction { get; set; } public IXLDrawingStyle SetDirection(XLDrawingTextDirection value) { Direction = value; return _style; } - public XLDrawingTextOrientation Orientation { get; set; } public IXLDrawingStyle SetOrientation(XLDrawingTextOrientation value) { Orientation = value; return _style; } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingAlignment: IXLDrawingAlignment + { + private readonly IXLDrawingStyle _style; + + public XLDrawingAlignment(IXLDrawingStyle style) + { + _style = style; + } + public XLDrawingHorizontalAlignment Horizontal { get; set; } public IXLDrawingStyle SetHorizontal(XLDrawingHorizontalAlignment value) { Horizontal = value; return _style; } + public XLDrawingVerticalAlignment Vertical { get; set; } public IXLDrawingStyle SetVertical(XLDrawingVerticalAlignment value) { Vertical = value; return _style; } + public Boolean AutomaticSize { get; set; } public IXLDrawingStyle SetAutomaticSize() { AutomaticSize = true; return _style; } public IXLDrawingStyle SetAutomaticSize(Boolean value) { AutomaticSize = value; return _style; } + public XLDrawingTextDirection Direction { get; set; } public IXLDrawingStyle SetDirection(XLDrawingTextDirection value) { Direction = value; return _style; } + public XLDrawingTextOrientation Orientation { get; set; } public IXLDrawingStyle SetOrientation(XLDrawingTextOrientation value) { Orientation = value; return _style; } + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingColorsAndLines.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingColorsAndLines.cs index 5ed7386..ec8e4db 100644 --- a/ClosedXML/Excel/Drawings/Style/XLDrawingColorsAndLines.cs +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingColorsAndLines.cs @@ -1,25 +1,25 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLDrawingColorsAndLines: IXLDrawingColorsAndLines - { - private readonly IXLDrawingStyle _style; - - public XLDrawingColorsAndLines(IXLDrawingStyle style) - { - _style = style; - } - public XLColor FillColor { get; set; } public IXLDrawingStyle SetFillColor(XLColor value) { FillColor = value; return _style; } - public Double FillTransparency { get; set; } public IXLDrawingStyle SetFillTransparency(Double value) { FillTransparency = value; return _style; } - public XLColor LineColor { get; set; } public IXLDrawingStyle SetLineColor(XLColor value) { LineColor = value; return _style; } - public Double LineTransparency { get; set; } public IXLDrawingStyle SetLineTransparency(Double value) { LineTransparency = value; return _style; } - public Double LineWeight { get; set; } public IXLDrawingStyle SetLineWeight(Double value) { LineWeight = value; return _style; } - public XLDashStyle LineDash { get; set; } public IXLDrawingStyle SetLineDash(XLDashStyle value) { LineDash = value; return _style; } - public XLLineStyle LineStyle { get; set; } public IXLDrawingStyle SetLineStyle(XLLineStyle value) { LineStyle = value; return _style; } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingColorsAndLines: IXLDrawingColorsAndLines + { + private readonly IXLDrawingStyle _style; + + public XLDrawingColorsAndLines(IXLDrawingStyle style) + { + _style = style; + } + public XLColor FillColor { get; set; } public IXLDrawingStyle SetFillColor(XLColor value) { FillColor = value; return _style; } + public Double FillTransparency { get; set; } public IXLDrawingStyle SetFillTransparency(Double value) { FillTransparency = value; return _style; } + public XLColor LineColor { get; set; } public IXLDrawingStyle SetLineColor(XLColor value) { LineColor = value; return _style; } + public Double LineTransparency { get; set; } public IXLDrawingStyle SetLineTransparency(Double value) { LineTransparency = value; return _style; } + public Double LineWeight { get; set; } public IXLDrawingStyle SetLineWeight(Double value) { LineWeight = value; return _style; } + public XLDashStyle LineDash { get; set; } public IXLDrawingStyle SetLineDash(XLDashStyle value) { LineDash = value; return _style; } + public XLLineStyle LineStyle { get; set; } public IXLDrawingStyle SetLineStyle(XLLineStyle value) { LineStyle = value; return _style; } + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingFont.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingFont.cs index a96b07e..886e249 100644 --- a/ClosedXML/Excel/Drawings/Style/XLDrawingFont.cs +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingFont.cs @@ -1,124 +1,124 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLDrawingFont : IXLDrawingFont - { - private readonly IXLDrawingStyle _style; - - public XLDrawingFont(IXLDrawingStyle style) - { - _style = style; - FontName = "Tahoma"; - FontSize = 9; - Underline = XLFontUnderlineValues.None; - FontColor = XLColor.FromIndex(64); - } - - public Boolean Bold { get; set; } - public Boolean Italic { get; set; } - public XLFontUnderlineValues Underline { get; set; } - public Boolean Strikethrough { get; set; } - public XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } - public Boolean Shadow { get; set; } - public Double FontSize { get; set; } - public XLColor FontColor { get; set; } - public String FontName { get; set; } - public XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } - - - public IXLDrawingStyle SetBold() - { - Bold = true; - return _style; - } - - public IXLDrawingStyle SetBold(Boolean value) - { - Bold = value; - return _style; - } - - public IXLDrawingStyle SetItalic() - { - Italic = true; - return _style; - } - - public IXLDrawingStyle SetItalic(Boolean value) - { - Italic = value; - return _style; - } - - public IXLDrawingStyle SetUnderline() - { - Underline = XLFontUnderlineValues.Single; - return _style; - } - - public IXLDrawingStyle SetUnderline(XLFontUnderlineValues value) - { - Underline = value; - return _style; - } - - public IXLDrawingStyle SetStrikethrough() - { - Strikethrough = true; - return _style; - } - - public IXLDrawingStyle SetStrikethrough(Boolean value) - { - Strikethrough = value; - return _style; - } - - public IXLDrawingStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) - { - VerticalAlignment = value; - return _style; - } - - public IXLDrawingStyle SetShadow() - { - Shadow = true; - return _style; - } - - public IXLDrawingStyle SetShadow(Boolean value) - { - Shadow = value; - return _style; - } - - public IXLDrawingStyle SetFontSize(Double value) - { - FontSize = value; - return _style; - } - - public IXLDrawingStyle SetFontColor(XLColor value) - { - FontColor = value; - return _style; - } - - public IXLDrawingStyle SetFontName(String value) - { - FontName = value; - return _style; - } - - public IXLDrawingStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value) - { - FontFamilyNumbering = value; - return _style; - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingFont : IXLDrawingFont + { + private readonly IXLDrawingStyle _style; + + public XLDrawingFont(IXLDrawingStyle style) + { + _style = style; + FontName = "Tahoma"; + FontSize = 9; + Underline = XLFontUnderlineValues.None; + FontColor = XLColor.FromIndex(64); + } + + public Boolean Bold { get; set; } + public Boolean Italic { get; set; } + public XLFontUnderlineValues Underline { get; set; } + public Boolean Strikethrough { get; set; } + public XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } + public Boolean Shadow { get; set; } + public Double FontSize { get; set; } + public XLColor FontColor { get; set; } + public String FontName { get; set; } + public XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } + + + public IXLDrawingStyle SetBold() + { + Bold = true; + return _style; + } + + public IXLDrawingStyle SetBold(Boolean value) + { + Bold = value; + return _style; + } + + public IXLDrawingStyle SetItalic() + { + Italic = true; + return _style; + } + + public IXLDrawingStyle SetItalic(Boolean value) + { + Italic = value; + return _style; + } + + public IXLDrawingStyle SetUnderline() + { + Underline = XLFontUnderlineValues.Single; + return _style; + } + + public IXLDrawingStyle SetUnderline(XLFontUnderlineValues value) + { + Underline = value; + return _style; + } + + public IXLDrawingStyle SetStrikethrough() + { + Strikethrough = true; + return _style; + } + + public IXLDrawingStyle SetStrikethrough(Boolean value) + { + Strikethrough = value; + return _style; + } + + public IXLDrawingStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) + { + VerticalAlignment = value; + return _style; + } + + public IXLDrawingStyle SetShadow() + { + Shadow = true; + return _style; + } + + public IXLDrawingStyle SetShadow(Boolean value) + { + Shadow = value; + return _style; + } + + public IXLDrawingStyle SetFontSize(Double value) + { + FontSize = value; + return _style; + } + + public IXLDrawingStyle SetFontColor(XLColor value) + { + FontColor = value; + return _style; + } + + public IXLDrawingStyle SetFontName(String value) + { + FontName = value; + return _style; + } + + public IXLDrawingStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value) + { + FontFamilyNumbering = value; + return _style; + } + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingMargins.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingMargins.cs index 3694114..650f7a1 100644 --- a/ClosedXML/Excel/Drawings/Style/XLDrawingMargins.cs +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingMargins.cs @@ -1,38 +1,38 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLDrawingMargins: IXLDrawingMargins - { - private readonly IXLDrawingStyle _style; - public XLDrawingMargins(IXLDrawingStyle style) - { - _style = style; - } - public Boolean Automatic { get; set; } public IXLDrawingStyle SetAutomatic() { Automatic = true; return _style; } public IXLDrawingStyle SetAutomatic(Boolean value) { Automatic = value; return _style; } - Double _left; - public Double Left { get { return _left; } set { _left = value; Automatic = false; } } - public IXLDrawingStyle SetLeft(Double value) { Left = value; return _style; } - Double _right; - public Double Right { get { return _right; } set { _right = value; Automatic = false; } } public IXLDrawingStyle SetRight(Double value) { Right = value; return _style; } - Double _top; - public Double Top { get { return _top; } set { _top = value; Automatic = false; } } public IXLDrawingStyle SetTop(Double value) { Top = value; return _style; } - Double _bottom; - public Double Bottom { get { return _bottom; } set { _bottom = value; Automatic = false; } } public IXLDrawingStyle SetBottom(Double value) { Bottom = value; return _style; } - public Double All - { - set - { - _left = value; - _right = value; - _top = value; - _bottom = value; - Automatic = false; - } - } - public IXLDrawingStyle SetAll(Double value) { All = value; return _style; } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingMargins: IXLDrawingMargins + { + private readonly IXLDrawingStyle _style; + public XLDrawingMargins(IXLDrawingStyle style) + { + _style = style; + } + public Boolean Automatic { get; set; } public IXLDrawingStyle SetAutomatic() { Automatic = true; return _style; } public IXLDrawingStyle SetAutomatic(Boolean value) { Automatic = value; return _style; } + Double _left; + public Double Left { get { return _left; } set { _left = value; Automatic = false; } } + public IXLDrawingStyle SetLeft(Double value) { Left = value; return _style; } + Double _right; + public Double Right { get { return _right; } set { _right = value; Automatic = false; } } public IXLDrawingStyle SetRight(Double value) { Right = value; return _style; } + Double _top; + public Double Top { get { return _top; } set { _top = value; Automatic = false; } } public IXLDrawingStyle SetTop(Double value) { Top = value; return _style; } + Double _bottom; + public Double Bottom { get { return _bottom; } set { _bottom = value; Automatic = false; } } public IXLDrawingStyle SetBottom(Double value) { Bottom = value; return _style; } + public Double All + { + set + { + _left = value; + _right = value; + _top = value; + _bottom = value; + Automatic = false; + } + } + public IXLDrawingStyle SetAll(Double value) { All = value; return _style; } + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingProperties.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingProperties.cs index 6f0ce19..a702762 100644 --- a/ClosedXML/Excel/Drawings/Style/XLDrawingProperties.cs +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingProperties.cs @@ -1,19 +1,19 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLDrawingProperties : IXLDrawingProperties - { - private readonly IXLDrawingStyle _style; - - public XLDrawingProperties(IXLDrawingStyle style) - { - _style = style; - } - public XLDrawingAnchor Positioning { get; set; } public IXLDrawingStyle SetPositioning(XLDrawingAnchor value) { Positioning = value; return _style; } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingProperties : IXLDrawingProperties + { + private readonly IXLDrawingStyle _style; + + public XLDrawingProperties(IXLDrawingStyle style) + { + _style = style; + } + public XLDrawingAnchor Positioning { get; set; } public IXLDrawingStyle SetPositioning(XLDrawingAnchor value) { Positioning = value; return _style; } + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingProtection.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingProtection.cs index d95633c..8d0c570 100644 --- a/ClosedXML/Excel/Drawings/Style/XLDrawingProtection.cs +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingProtection.cs @@ -1,20 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLDrawingProtection : IXLDrawingProtection - { - private readonly IXLDrawingStyle _style; - - public XLDrawingProtection(IXLDrawingStyle style) - { - _style = style; - } - public Boolean Locked { get; set; } public IXLDrawingStyle SetLocked() { Locked = true; return _style; } public IXLDrawingStyle SetLocked(Boolean value) { Locked = value; return _style; } - public Boolean LockText { get; set; } public IXLDrawingStyle SetLockText() { LockText = true; return _style; } public IXLDrawingStyle SetLockText(Boolean value) { LockText = value; return _style; } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingProtection : IXLDrawingProtection + { + private readonly IXLDrawingStyle _style; + + public XLDrawingProtection(IXLDrawingStyle style) + { + _style = style; + } + public Boolean Locked { get; set; } public IXLDrawingStyle SetLocked() { Locked = true; return _style; } public IXLDrawingStyle SetLocked(Boolean value) { Locked = value; return _style; } + public Boolean LockText { get; set; } public IXLDrawingStyle SetLockText() { LockText = true; return _style; } public IXLDrawingStyle SetLockText(Boolean value) { LockText = value; return _style; } + + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingSize.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingSize.cs index 11f30f9..84f4f1b 100644 --- a/ClosedXML/Excel/Drawings/Style/XLDrawingSize.cs +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingSize.cs @@ -1,22 +1,22 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLDrawingSize : IXLDrawingSize - { - private readonly IXLDrawingStyle _style; - - public XLDrawingSize(IXLDrawingStyle style) - { - _style = style; - } - - public Boolean AutomaticSize { get { return _style.Alignment.AutomaticSize; } set { _style.Alignment.AutomaticSize = value; } } - public IXLDrawingStyle SetAutomaticSize() { AutomaticSize = true; return _style; } public IXLDrawingStyle SetAutomaticSize(Boolean value) { AutomaticSize = value; return _style; } - public Double Height { get; set; } public IXLDrawingStyle SetHeight(Double value) { Height = value; return _style; } - public Double Width { get; set; } public IXLDrawingStyle SetWidth(Double value) { Width = value; return _style; } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingSize : IXLDrawingSize + { + private readonly IXLDrawingStyle _style; + + public XLDrawingSize(IXLDrawingStyle style) + { + _style = style; + } + + public Boolean AutomaticSize { get { return _style.Alignment.AutomaticSize; } set { _style.Alignment.AutomaticSize = value; } } + public IXLDrawingStyle SetAutomaticSize() { AutomaticSize = true; return _style; } public IXLDrawingStyle SetAutomaticSize(Boolean value) { AutomaticSize = value; return _style; } + public Double Height { get; set; } public IXLDrawingStyle SetHeight(Double value) { Height = value; return _style; } + public Double Width { get; set; } public IXLDrawingStyle SetWidth(Double value) { Width = value; return _style; } + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingStyle.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingStyle.cs index 056f639..a99c7e4 100644 --- a/ClosedXML/Excel/Drawings/Style/XLDrawingStyle.cs +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingStyle.cs @@ -1,30 +1,30 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLDrawingStyle: IXLDrawingStyle - { - public XLDrawingStyle() - { - //Font = new XLDrawingFont(this); - Alignment = new XLDrawingAlignment(this); - ColorsAndLines = new XLDrawingColorsAndLines(this); - Size = new XLDrawingSize(this); - Protection = new XLDrawingProtection(this); - Properties = new XLDrawingProperties(this); - Margins = new XLDrawingMargins(this); - Web = new XLDrawingWeb(this); - } - //public IXLDrawingFont Font { get; private set; } - public IXLDrawingAlignment Alignment { get; private set; } - public IXLDrawingColorsAndLines ColorsAndLines { get; private set; } - public IXLDrawingSize Size { get; private set; } - public IXLDrawingProtection Protection { get; private set; } - public IXLDrawingProperties Properties { get; private set; } - public IXLDrawingMargins Margins { get; private set; } - public IXLDrawingWeb Web { get; private set; } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingStyle: IXLDrawingStyle + { + public XLDrawingStyle() + { + //Font = new XLDrawingFont(this); + Alignment = new XLDrawingAlignment(this); + ColorsAndLines = new XLDrawingColorsAndLines(this); + Size = new XLDrawingSize(this); + Protection = new XLDrawingProtection(this); + Properties = new XLDrawingProperties(this); + Margins = new XLDrawingMargins(this); + Web = new XLDrawingWeb(this); + } + //public IXLDrawingFont Font { get; private set; } + public IXLDrawingAlignment Alignment { get; private set; } + public IXLDrawingColorsAndLines ColorsAndLines { get; private set; } + public IXLDrawingSize Size { get; private set; } + public IXLDrawingProtection Protection { get; private set; } + public IXLDrawingProperties Properties { get; private set; } + public IXLDrawingMargins Margins { get; private set; } + public IXLDrawingWeb Web { get; private set; } + } +} diff --git a/ClosedXML/Excel/Drawings/Style/XLDrawingWeb.cs b/ClosedXML/Excel/Drawings/Style/XLDrawingWeb.cs index c3fe40d..f47cb3b 100644 --- a/ClosedXML/Excel/Drawings/Style/XLDrawingWeb.cs +++ b/ClosedXML/Excel/Drawings/Style/XLDrawingWeb.cs @@ -1,19 +1,19 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLDrawingWeb : IXLDrawingWeb - { - private readonly IXLDrawingStyle _style; - - public XLDrawingWeb(IXLDrawingStyle style) - { - _style = style; - } - public String AlternateText { get; set; } public IXLDrawingStyle SetAlternateText(String value) { AlternateText = value; return _style; } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingWeb : IXLDrawingWeb + { + private readonly IXLDrawingStyle _style; + + public XLDrawingWeb(IXLDrawingStyle style) + { + _style = style; + } + public String AlternateText { get; set; } public IXLDrawingStyle SetAlternateText(String value) { AlternateText = value; return _style; } + + } +} diff --git a/ClosedXML/Excel/Drawings/XLDrawing.cs b/ClosedXML/Excel/Drawings/XLDrawing.cs index 9f55075..c3e3a83 100644 --- a/ClosedXML/Excel/Drawings/XLDrawing.cs +++ b/ClosedXML/Excel/Drawings/XLDrawing.cs @@ -1,114 +1,114 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLDrawing: IXLDrawing - { - internal T Container; - public XLDrawing() - { - Style = new XLDrawingStyle(); - Position = new XLDrawingPosition(); - } - - public Int32 ShapeId { get; internal set; } - - public Boolean Visible { get; set; } - public T SetVisible() - { - Visible = true; - return Container; - } - public T SetVisible(Boolean hidden) - { - Visible = hidden; - return Container; - } - - public String Name { get; set; } - public T SetName(String name) - { - Name = name; - return Container; - } - - public String Description { get; set; } - public T SetDescription(String description) - { - Description = description; - return Container; - } - - public IXLDrawingPosition Position { get; private set; } - - public Int32 ZOrder { get; set; } - public T SetZOrder(Int32 zOrder) - { - ZOrder = zOrder; - return Container; - } - - public Boolean HorizontalFlip { get; set; } - public T SetHorizontalFlip() - { - HorizontalFlip = true; - return Container; - } - public T SetHorizontalFlip(Boolean horizontalFlip) - { - HorizontalFlip = horizontalFlip; - return Container; - } - - public Boolean VerticalFlip { get; set; } - public T SetVerticalFlip() - { - VerticalFlip = true; - return Container; - } - public T SetVerticalFlip(Boolean verticalFlip) - { - VerticalFlip = verticalFlip; - return Container; - } - - public Int32 Rotation { get; set; } - public T SetRotation(Int32 rotation) - { - Rotation = rotation; - return Container; - } - - public Int32 OffsetX { get; set; } - public T SetOffsetX(Int32 offsetX) - { - OffsetX = offsetX; - return Container; - } - - public Int32 OffsetY { get; set; } - public T SetOffsetY(Int32 offsetY) - { - OffsetY = offsetY; - return Container; - } - - public Int32 ExtentLength { get; set; } - public T SetExtentLength(Int32 extentLength) - { - ExtentLength = extentLength; - return Container; - } - - public Int32 ExtentWidth { get; set; } - public T SetExtentWidth(Int32 extentWidth) - { - ExtentWidth = extentWidth; - return Container; - } - - public IXLDrawingStyle Style { get; private set; } - - - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLDrawing: IXLDrawing + { + internal T Container; + public XLDrawing() + { + Style = new XLDrawingStyle(); + Position = new XLDrawingPosition(); + } + + public Int32 ShapeId { get; internal set; } + + public Boolean Visible { get; set; } + public T SetVisible() + { + Visible = true; + return Container; + } + public T SetVisible(Boolean hidden) + { + Visible = hidden; + return Container; + } + + public String Name { get; set; } + public T SetName(String name) + { + Name = name; + return Container; + } + + public String Description { get; set; } + public T SetDescription(String description) + { + Description = description; + return Container; + } + + public IXLDrawingPosition Position { get; private set; } + + public Int32 ZOrder { get; set; } + public T SetZOrder(Int32 zOrder) + { + ZOrder = zOrder; + return Container; + } + + public Boolean HorizontalFlip { get; set; } + public T SetHorizontalFlip() + { + HorizontalFlip = true; + return Container; + } + public T SetHorizontalFlip(Boolean horizontalFlip) + { + HorizontalFlip = horizontalFlip; + return Container; + } + + public Boolean VerticalFlip { get; set; } + public T SetVerticalFlip() + { + VerticalFlip = true; + return Container; + } + public T SetVerticalFlip(Boolean verticalFlip) + { + VerticalFlip = verticalFlip; + return Container; + } + + public Int32 Rotation { get; set; } + public T SetRotation(Int32 rotation) + { + Rotation = rotation; + return Container; + } + + public Int32 OffsetX { get; set; } + public T SetOffsetX(Int32 offsetX) + { + OffsetX = offsetX; + return Container; + } + + public Int32 OffsetY { get; set; } + public T SetOffsetY(Int32 offsetY) + { + OffsetY = offsetY; + return Container; + } + + public Int32 ExtentLength { get; set; } + public T SetExtentLength(Int32 extentLength) + { + ExtentLength = extentLength; + return Container; + } + + public Int32 ExtentWidth { get; set; } + public T SetExtentWidth(Int32 extentWidth) + { + ExtentWidth = extentWidth; + return Container; + } + + public IXLDrawingStyle Style { get; private set; } + + + } +} diff --git a/ClosedXML/Excel/Drawings/XLDrawingPosition.cs b/ClosedXML/Excel/Drawings/XLDrawingPosition.cs index ccb73ae..b7309f2 100644 --- a/ClosedXML/Excel/Drawings/XLDrawingPosition.cs +++ b/ClosedXML/Excel/Drawings/XLDrawingPosition.cs @@ -1,20 +1,20 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLDrawingPosition: IXLDrawingPosition - { - public Int32 Column { get; set; } - public IXLDrawingPosition SetColumn(Int32 column) { Column = column; return this; } - public Double ColumnOffset { get; set; } - public IXLDrawingPosition SetColumnOffset(Double columnOffset) { ColumnOffset = columnOffset; return this; } - - public Int32 Row { get; set; } - public IXLDrawingPosition SetRow(Int32 row) { Row = row; return this; } - public Double RowOffset { get; set; } - public IXLDrawingPosition SetRowOffset(Double rowOffset) { RowOffset = rowOffset; return this; } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLDrawingPosition: IXLDrawingPosition + { + public Int32 Column { get; set; } + public IXLDrawingPosition SetColumn(Int32 column) { Column = column; return this; } + public Double ColumnOffset { get; set; } + public IXLDrawingPosition SetColumnOffset(Double columnOffset) { ColumnOffset = columnOffset; return this; } + + public Int32 Row { get; set; } + public IXLDrawingPosition SetRow(Int32 row) { Row = row; return this; } + public Double RowOffset { get; set; } + public IXLDrawingPosition SetRowOffset(Double rowOffset) { RowOffset = rowOffset; return this; } + } +} diff --git a/ClosedXML/Excel/Drawings/XLMarker.cs b/ClosedXML/Excel/Drawings/XLMarker.cs index 1ed01be..f48bf5c 100644 --- a/ClosedXML/Excel/Drawings/XLMarker.cs +++ b/ClosedXML/Excel/Drawings/XLMarker.cs @@ -1,79 +1,23 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Diagnostics; +using System.Drawing; namespace ClosedXML.Excel.Drawings { - public class XLMarker : IXLMarker + [DebuggerDisplay("{Address} {Offset}")] + internal class XLMarker : IXLMarker { - private Int32 colId; - private Int32 rowId; - private Double colOffset; - private Double rowOffset; + internal XLMarker(IXLAddress address) + : this(address, new Point(0, 0)) + { } - public Int32 ColumnId + internal XLMarker(IXLAddress address, Point offset) { - set - { - if (value < 1 || value > XLHelper.MaxColumnNumber) - throw new ArgumentOutOfRangeException(String.Format("Column number must be between 1 and {0}", - XLHelper.MaxColumnNumber)); - this.colId = value; - } - get - { - return this.colId; - } + this.Address = address; + this.Offset = offset; } - public Int32 RowId - { - set - { - if (value < 1 || value > XLHelper.MaxRowNumber) - throw new ArgumentOutOfRangeException(String.Format("Row number must be between 1 and {0}", - XLHelper.MaxRowNumber)); - this.rowId = value; - } - get - { - return this.rowId; - } - } + public IXLAddress Address { get; set; } - public Double ColumnOffset - { - set - { - this.colOffset = value; - } - get - { - return this.colOffset; - } - } - - public Double RowOffset - { - set - { - this.rowOffset = value; - } - get - { - return this.rowOffset; - } - } - - public Int32 GetZeroBasedColumn() - { - return colId - 1; - } - - public Int32 GetZeroBasedRow() - { - return rowId - 1; - } + public Point Offset { get; set; } } } diff --git a/ClosedXML/Excel/Drawings/XLPicture.cs b/ClosedXML/Excel/Drawings/XLPicture.cs index 0d54b51..86d45ae 100644 --- a/ClosedXML/Excel/Drawings/XLPicture.cs +++ b/ClosedXML/Excel/Drawings/XLPicture.cs @@ -1,244 +1,357 @@ -using System; +using System; using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; using System.IO; using System.Linq; -using System.Text; -using DocumentFormat.OpenXml.Packaging; +using System.Reflection; namespace ClosedXML.Excel.Drawings { - public class XLPicture : IXLPicture + [DebuggerDisplay("{Name}")] + internal class XLPicture : IXLPicture { - private MemoryStream imgStream; - private List Markers; - private String name; - private bool isAbsolute; - private ImagePartType type = ImagePartType.Jpeg; + private const String InvalidNameChars = @":\/?*[]"; + private static IDictionary FormatMap; + private readonly IXLWorksheet _worksheet; + private Int32 height; + private String name = string.Empty; + private Int32 width; - private long iMaxWidth = 500; - private long iMaxHeight = 500; - - private long iWidth; - private long iHeight; - - private long iOffsetX; - private long iOffsetY; - - private float iVerticalResolution; - private float iHorizontalResolution; - - private bool isResized = false; - - private void Resize() + static XLPicture() { - if (iWidth > iMaxHeight || iHeight > iMaxWidth) - { - var scaleX = (double)iWidth / (double)iMaxWidth; - var scaleY = (double)iHeight / (double)iMaxHeight; - var scale = Math.Max(scaleX, scaleY); - iWidth = (int)((double)iWidth / scale); - iHeight = (int)((double)iHeight / scale); - } - isResized = true; + var properties = typeof(ImageFormat).GetProperties(BindingFlags.Static | BindingFlags.Public); + FormatMap = Enum.GetValues(typeof(XLPictureFormat)) + .Cast() + .Where(pf => properties.Any(pi => pi.Name.Equals(pf.ToString(), StringComparison.OrdinalIgnoreCase))) + .ToDictionary( + pf => pf, + pf => properties.Single(pi => pi.Name.Equals(pf.ToString(), StringComparison.OrdinalIgnoreCase)).GetValue(null, null) as ImageFormat + ); } - public long MaxWidth + internal XLPicture(IXLWorksheet worksheet, Stream stream) + : this(worksheet) + { + if (stream == null) throw new ArgumentNullException(nameof(stream)); + + this.ImageStream = new MemoryStream(); + { + stream.Position = 0; + stream.CopyTo(ImageStream); + ImageStream.Seek(0, SeekOrigin.Begin); + + using (var bitmap = new Bitmap(ImageStream)) + { + if (FormatMap.Values.Select(f => f.Guid).Contains(bitmap.RawFormat.Guid)) + this.Format = FormatMap.Single(f => f.Value.Guid.Equals(bitmap.RawFormat.Guid)).Key; + + DeduceDimensionsFromBitmap(bitmap); + } + ImageStream.Seek(0, SeekOrigin.Begin); + } + } + + internal XLPicture(IXLWorksheet worksheet, Stream stream, XLPictureFormat format) + : this(worksheet) + { + if (stream == null) throw new ArgumentNullException(nameof(stream)); + this.Format = format; + + this.ImageStream = new MemoryStream(); + { + stream.Position = 0; + stream.CopyTo(ImageStream); + ImageStream.Seek(0, SeekOrigin.Begin); + + using (var bitmap = new Bitmap(ImageStream)) + { + if (FormatMap.ContainsKey(this.Format)) + { + if (FormatMap[this.Format].Guid != bitmap.RawFormat.Guid) + throw new ArgumentException("The picture format in the stream and the parameter don't match"); + } + + DeduceDimensionsFromBitmap(bitmap); + } + ImageStream.Seek(0, SeekOrigin.Begin); + } + } + + internal XLPicture(IXLWorksheet worksheet, Bitmap bitmap) + : this(worksheet) + { + if (bitmap == null) throw new ArgumentNullException(nameof(bitmap)); + this.ImageStream = new MemoryStream(); + bitmap.Save(ImageStream, bitmap.RawFormat); + ImageStream.Seek(0, SeekOrigin.Begin); + DeduceDimensionsFromBitmap(bitmap); + + var formats = FormatMap.Where(f => f.Value.Guid.Equals(bitmap.RawFormat.Guid)); + if (!formats.Any() || formats.Count() > 1) + throw new ArgumentException("Unsupported or unknown image format in bitmap"); + + this.Format = formats.Single().Key; + } + + private XLPicture(IXLWorksheet worksheet) + { + if (worksheet == null) throw new ArgumentNullException(nameof(worksheet)); + this._worksheet = worksheet; + this.Placement = XLPicturePlacement.MoveAndSize; + this.Markers = new Dictionary() + { + [XLMarkerPosition.TopLeft] = null, + [XLMarkerPosition.BottomRight] = null + }; + } + + public IXLAddress BottomRightCellAddress { get { - return ConvertToEmu(iMaxWidth, iHorizontalResolution); + return Markers[XLMarkerPosition.BottomRight].Address; } + + private set + { + if (!value.Worksheet.Equals(this._worksheet)) + throw new ArgumentOutOfRangeException(nameof(value.Worksheet)); + this.Markers[XLMarkerPosition.BottomRight] = new XLMarker(value); + } + } + + public XLPictureFormat Format { get; private set; } + + public Int32 Height + { + get { return height; } set { - iMaxWidth = value; - isResized = false; + if (this.Placement == XLPicturePlacement.MoveAndSize) + throw new ArgumentException("To set the height, the placement should be FreeFloating or Move"); + height = value; } } + public MemoryStream ImageStream { get; private set; } - public long MaxHeight + public Int32 Left { - get - { - return ConvertToEmu(iMaxHeight, iVerticalResolution); - } + get { return Markers[XLMarkerPosition.TopLeft]?.Offset.X ?? 0; } set { - iMaxHeight = value; - isResized = false; - } - } + if (this.Placement != XLPicturePlacement.FreeFloating) + throw new ArgumentException("To set the left-hand offset, the placement should be FreeFloating"); - public long Width - { - get - { - if (!isResized) - { - Resize(); - } - return ConvertToEmu(iWidth, iHorizontalResolution); + Markers[XLMarkerPosition.TopLeft] = new XLMarker(_worksheet.Cell(1, 1).Address, new Point(value, this.Top)); } - set { } - } - - public long Height - { - get - { - if (!isResized) - { - Resize(); - } - return ConvertToEmu(iHeight, iVerticalResolution); - } - set { } - } - - public long RawHeight - { - get { return (long)iHeight; } - } - public long RawWidth - { - get { return (long)iWidth; } - } - - public long OffsetX - { - get { return ConvertToEmu(iOffsetX, iHorizontalResolution); } - set { iOffsetX = value; } - } - public long OffsetY - { - get { return ConvertToEmu(iOffsetY, iVerticalResolution); } - set { iOffsetY = value; } - } - - public long RawOffsetX - { - get - { - return iOffsetX; - } - set - { - iOffsetX = value; - } - } - - public long RawOffsetY - { - get - { - return iOffsetY; - } - set - { - iOffsetY = value; - } - } - - private long ConvertToEmu(long pixels, float resolution) - { - return (long)(914400 * pixels / resolution); - } - - public Stream ImageStream - { - get - { - return imgStream; - } - set - { - if (imgStream == null) - { - imgStream = new MemoryStream(); - } - else - { - imgStream.Dispose(); - imgStream = new MemoryStream(); - } - value.CopyTo(imgStream); - imgStream.Seek(0, SeekOrigin.Begin); - - using (var bitmap = new System.Drawing.Bitmap(imgStream)) - { - iWidth = (long)bitmap.Width; - iHeight = (long)bitmap.Height; - iHorizontalResolution = bitmap.HorizontalResolution; - iVerticalResolution = bitmap.VerticalResolution; - } - imgStream.Seek(0, SeekOrigin.Begin); - } - } - - public List GetMarkers() - { - return Markers != null ? Markers : new List(); - } - public void AddMarker(IXLMarker marker) - { - if (Markers == null) - { - Markers = new List(); - } - Markers.Add(marker); } public String Name { - get - { - return name; - } + get { return name; } set { + if (name == value) return; + + if (value.IndexOfAny(InvalidNameChars.ToCharArray()) != -1) + throw new ArgumentException($"Picture names cannot contain any of the following characters: {InvalidNameChars}"); + + if (XLHelper.IsNullOrWhiteSpace(value)) + throw new ArgumentException("Picture names cannot be empty"); + + if (value.Length > 31) + throw new ArgumentException("Picture names cannot be more than 31 characters"); + + if ((_worksheet.Pictures.FirstOrDefault(p => p.Name.Equals(value, StringComparison.OrdinalIgnoreCase)) ?? this) != this) + throw new ArgumentException($"The picture name '{value}' already exists."); + name = value; } } - public bool IsAbsolute + public Int32 OriginalHeight { get; private set; } + + public Int32 OriginalWidth { get; private set; } + + public XLPicturePlacement Placement { get; set; } + + public Int32 Top + { + get { return Markers[XLMarkerPosition.TopLeft]?.Offset.Y ?? 0; } + set + { + if (this.Placement != XLPicturePlacement.FreeFloating) + throw new ArgumentException("To set the top offset, the placement should be FreeFloating"); + + Markers[XLMarkerPosition.TopLeft] = new XLMarker(_worksheet.Cell(1, 1).Address, new Point(this.Left, value)); + } + } + + public IXLAddress TopLeftCellAddress { get { - return isAbsolute; + return Markers[XLMarkerPosition.TopLeft].Address; } + + private set + { + if (!value.Worksheet.Equals(this._worksheet)) + throw new ArgumentOutOfRangeException(nameof(value.Worksheet)); + + this.Markers[XLMarkerPosition.TopLeft] = new XLMarker(value); + } + } + + public Int32 Width + { + get { return width; } set { - isAbsolute = value; + if (this.Placement == XLPicturePlacement.MoveAndSize) + throw new ArgumentException("To set the width, the placement should be FreeFloating or Move"); + width = value; } } - public String Type + public IXLWorksheet Worksheet { - get + get { return _worksheet; } + } + + internal IDictionary Markers { get; private set; } + + internal String RelId { get; set; } + + public void Delete() + { + Worksheet.Pictures.Delete(this.Name); + } + + public void Dispose() + { + this.ImageStream.Dispose(); + } + + public Point GetOffset(XLMarkerPosition position) + { + return Markers[position].Offset; + } + + public IXLPicture MoveTo(Int32 left, Int32 top) + { + this.Placement = XLPicturePlacement.FreeFloating; + this.Left = left; + this.Top = top; + return this; + } + + public IXLPicture MoveTo(IXLAddress cell) + { + return MoveTo(cell, 0, 0); + } + + public IXLPicture MoveTo(IXLAddress cell, Int32 xOffset, Int32 yOffset) + { + return MoveTo(cell, new Point(xOffset, yOffset)); + } + + public IXLPicture MoveTo(IXLAddress cell, Point offset) + { + if (cell == null) throw new ArgumentNullException(nameof(cell)); + this.Placement = XLPicturePlacement.Move; + this.TopLeftCellAddress = cell; + this.Markers[XLMarkerPosition.TopLeft].Offset = offset; + return this; + } + + public IXLPicture MoveTo(IXLAddress fromCell, IXLAddress toCell) + { + return MoveTo(fromCell, 0, 0, toCell, 0, 0); + } + + public IXLPicture MoveTo(IXLAddress fromCell, Int32 fromCellXOffset, Int32 fromCellYOffset, IXLAddress toCell, Int32 toCellXOffset, Int32 toCellYOffset) + { + return MoveTo(fromCell, new Point(fromCellXOffset, fromCellYOffset), toCell, new Point(toCellXOffset, toCellYOffset)); + } + + public IXLPicture MoveTo(IXLAddress fromCell, Point fromOffset, IXLAddress toCell, Point toOffset) + { + if (fromCell == null) throw new ArgumentNullException(nameof(fromCell)); + if (toCell == null) throw new ArgumentNullException(nameof(toCell)); + this.Placement = XLPicturePlacement.MoveAndSize; + + this.TopLeftCellAddress = fromCell; + this.Markers[XLMarkerPosition.TopLeft].Offset = fromOffset; + + this.BottomRightCellAddress = toCell; + this.Markers[XLMarkerPosition.BottomRight].Offset = toOffset; + + return this; + } + + public IXLPicture Scale(Double factor, Boolean relativeToOriginal = false) + { + return this.ScaleHeight(factor, relativeToOriginal).ScaleWidth(factor, relativeToOriginal); + } + + public IXLPicture ScaleHeight(Double factor, Boolean relativeToOriginal = false) + { + this.Height = Convert.ToInt32((relativeToOriginal ? this.OriginalHeight : this.Height) * factor); + return this; + } + + public IXLPicture ScaleWidth(Double factor, Boolean relativeToOriginal = false) + { + this.Width = Convert.ToInt32((relativeToOriginal ? this.OriginalWidth : this.Width) * factor); + return this; + } + + public IXLPicture WithPlacement(XLPicturePlacement value) + { + this.Placement = value; + return this; + } + + public IXLPicture WithSize(Int32 width, Int32 height) + { + this.Width = width; + this.Height = height; + return this; + } + + private static ImageFormat FromMimeType(string mimeType) + { + var guid = ImageCodecInfo.GetImageDecoders().FirstOrDefault(c => c.MimeType.Equals(mimeType, StringComparison.OrdinalIgnoreCase))?.FormatID; + if (!guid.HasValue) return null; + var property = typeof(System.Drawing.Imaging.ImageFormat).GetProperties(BindingFlags.Public | BindingFlags.Static) + .FirstOrDefault(pi => (pi.GetValue(null, null) as ImageFormat).Guid.Equals(guid.Value)); + + if (property == null) return null; + return (property.GetValue(null, null) as ImageFormat); + } + + private static string GetMimeType(Image i) + { + var imgguid = i.RawFormat.Guid; + foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageDecoders()) { - return GetExtension(type); + if (codec.FormatID == imgguid) + return codec.MimeType; } - set - { - try - { - type = (ImagePartType)Enum.Parse(typeof(ImagePartType), value, true); - } - catch - { - type = ImagePartType.Jpeg; - } - } + return "image/unknown"; } - private String GetExtension(ImagePartType type) + private void DeduceDimensionsFromBitmap(Bitmap bitmap) { - return type.ToString().ToLower(); - } + this.OriginalWidth = bitmap.Width; + this.OriginalHeight = bitmap.Height; - public ImagePartType GetImagePartType() - { - return type; + this.width = bitmap.Width; + this.height = bitmap.Height; } } } diff --git a/ClosedXML/Excel/Drawings/XLPictures.cs b/ClosedXML/Excel/Drawings/XLPictures.cs new file mode 100644 index 0000000..3381309 --- /dev/null +++ b/ClosedXML/Excel/Drawings/XLPictures.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; + +namespace ClosedXML.Excel.Drawings +{ + internal class XLPictures : IXLPictures, IEnumerable + { + private readonly List _pictures = new List(); + private readonly XLWorksheet _worksheet; + + public XLPictures(XLWorksheet worksheet) + { + _worksheet = worksheet; + } + + public int Count + { + [DebuggerStepThrough] + get { return _pictures.Count; } + } + + public IXLPicture Add(Stream stream) + { + var picture = new XLPicture(_worksheet, stream); + _pictures.Add(picture); + picture.Name = GetNextPictureName(); + return picture; + } + + public IXLPicture Add(Stream stream, string name) + { + var picture = Add(stream); + picture.Name = name; + return picture; + } + + public Drawings.IXLPicture Add(Stream stream, XLPictureFormat format) + { + var picture = new XLPicture(_worksheet, stream, format); + _pictures.Add(picture); + picture.Name = GetNextPictureName(); + return picture; + } + + public IXLPicture Add(Stream stream, XLPictureFormat format, string name) + { + var picture = Add(stream, format); + picture.Name = name; + return picture; + } + + public IXLPicture Add(Bitmap bitmap) + { + var picture = new XLPicture(_worksheet, bitmap); + _pictures.Add(picture); + picture.Name = GetNextPictureName(); + return picture; + } + + public IXLPicture Add(Bitmap bitmap, string name) + { + var picture = Add(bitmap); + picture.Name = name; + return picture; + } + + public IXLPicture Add(string imageFile) + { + using (var bitmap = Image.FromFile(imageFile) as Bitmap) + { + var picture = new XLPicture(_worksheet, bitmap); + _pictures.Add(picture); + picture.Name = GetNextPictureName(); + return picture; + } + } + + public IXLPicture Add(string imageFile, string name) + { + var picture = Add(imageFile); + picture.Name = name; + return picture; + } + + public void Delete(IXLPicture picture) + { + Delete(picture.Name); + } + + public void Delete(string pictureName) + { + _pictures.RemoveAll(picture => picture.Name.Equals(pictureName, StringComparison.OrdinalIgnoreCase)); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _pictures.Cast().GetEnumerator(); + } + + public IEnumerator GetEnumerator() + { + return ((IEnumerable)_pictures).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLPicture Picture(string pictureName) + { + IXLPicture p; + + if (TryGetPicture(pictureName, out p)) + return p; + + throw new ArgumentException($"There isn't a picture named '{pictureName}'."); + } + + public bool TryGetPicture(string pictureName, out IXLPicture picture) + { + var matches = _pictures.Where(p => p.Name.Equals(pictureName, StringComparison.OrdinalIgnoreCase)); + if (matches.Any()) + { + picture = matches.Single(); + return true; + } + picture = null; + return false; + } + + private String GetNextPictureName() + { + var pictureNumber = this.Count; + while (_pictures.Any(p => p.Name == $"Picture {pictureNumber}")) + { + pictureNumber++; + } + return $"Picture {pictureNumber}"; + } + } +} diff --git a/ClosedXML/Excel/EnumConverter.cs b/ClosedXML/Excel/EnumConverter.cs index f35d89b..5b8ea92 100644 --- a/ClosedXML/Excel/EnumConverter.cs +++ b/ClosedXML/Excel/EnumConverter.cs @@ -1,1262 +1,1720 @@ -using System; -using DocumentFormat.OpenXml.Spreadsheet; -using DocumentFormat.OpenXml.Vml; - -namespace ClosedXML.Excel -{ - internal static class EnumConverter - { - #region To OpenXml - public static UnderlineValues ToOpenXml(this XLFontUnderlineValues value) - { - switch (value) - { - case XLFontUnderlineValues.Double: - return UnderlineValues.Double; - case XLFontUnderlineValues.DoubleAccounting: - return UnderlineValues.DoubleAccounting; - case XLFontUnderlineValues.None: - return UnderlineValues.None; - case XLFontUnderlineValues.Single: - return UnderlineValues.Single; - case XLFontUnderlineValues.SingleAccounting: - return UnderlineValues.SingleAccounting; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static OrientationValues ToOpenXml(this XLPageOrientation value) - { - switch (value) - { - case XLPageOrientation.Default: - return OrientationValues.Default; - case XLPageOrientation.Landscape: - return OrientationValues.Landscape; - case XLPageOrientation.Portrait: - return OrientationValues.Portrait; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static VerticalAlignmentRunValues ToOpenXml(this XLFontVerticalTextAlignmentValues value) - { - switch (value) - { - case XLFontVerticalTextAlignmentValues.Baseline: - return VerticalAlignmentRunValues.Baseline; - case XLFontVerticalTextAlignmentValues.Subscript: - return VerticalAlignmentRunValues.Subscript; - case XLFontVerticalTextAlignmentValues.Superscript: - return VerticalAlignmentRunValues.Superscript; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static PatternValues ToOpenXml(this XLFillPatternValues value) - { - switch (value) - { - case XLFillPatternValues.DarkDown: - return PatternValues.DarkDown; - case XLFillPatternValues.DarkGray: - return PatternValues.DarkGray; - case XLFillPatternValues.DarkGrid: - return PatternValues.DarkGrid; - case XLFillPatternValues.DarkHorizontal: - return PatternValues.DarkHorizontal; - case XLFillPatternValues.DarkTrellis: - return PatternValues.DarkTrellis; - case XLFillPatternValues.DarkUp: - return PatternValues.DarkUp; - case XLFillPatternValues.DarkVertical: - return PatternValues.DarkVertical; - case XLFillPatternValues.Gray0625: - return PatternValues.Gray0625; - case XLFillPatternValues.Gray125: - return PatternValues.Gray125; - case XLFillPatternValues.LightDown: - return PatternValues.LightDown; - case XLFillPatternValues.LightGray: - return PatternValues.LightGray; - case XLFillPatternValues.LightGrid: - return PatternValues.LightGrid; - case XLFillPatternValues.LightHorizontal: - return PatternValues.LightHorizontal; - case XLFillPatternValues.LightTrellis: - return PatternValues.LightTrellis; - case XLFillPatternValues.LightUp: - return PatternValues.LightUp; - case XLFillPatternValues.LightVertical: - return PatternValues.LightVertical; - case XLFillPatternValues.MediumGray: - return PatternValues.MediumGray; - case XLFillPatternValues.None: - return PatternValues.None; - case XLFillPatternValues.Solid: - return PatternValues.Solid; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static BorderStyleValues ToOpenXml(this XLBorderStyleValues value) - { - switch (value) - { - case XLBorderStyleValues.DashDot: - return BorderStyleValues.DashDot; - case XLBorderStyleValues.DashDotDot: - return BorderStyleValues.DashDotDot; - case XLBorderStyleValues.Dashed: - return BorderStyleValues.Dashed; - case XLBorderStyleValues.Dotted: - return BorderStyleValues.Dotted; - case XLBorderStyleValues.Double: - return BorderStyleValues.Double; - case XLBorderStyleValues.Hair: - return BorderStyleValues.Hair; - case XLBorderStyleValues.Medium: - return BorderStyleValues.Medium; - case XLBorderStyleValues.MediumDashDot: - return BorderStyleValues.MediumDashDot; - case XLBorderStyleValues.MediumDashDotDot: - return BorderStyleValues.MediumDashDotDot; - case XLBorderStyleValues.MediumDashed: - return BorderStyleValues.MediumDashed; - case XLBorderStyleValues.None: - return BorderStyleValues.None; - case XLBorderStyleValues.SlantDashDot: - return BorderStyleValues.SlantDashDot; - case XLBorderStyleValues.Thick: - return BorderStyleValues.Thick; - case XLBorderStyleValues.Thin: - return BorderStyleValues.Thin; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static HorizontalAlignmentValues ToOpenXml(this XLAlignmentHorizontalValues value) - { - switch (value) - { - case XLAlignmentHorizontalValues.Center: - return HorizontalAlignmentValues.Center; - case XLAlignmentHorizontalValues.CenterContinuous: - return HorizontalAlignmentValues.CenterContinuous; - case XLAlignmentHorizontalValues.Distributed: - return HorizontalAlignmentValues.Distributed; - case XLAlignmentHorizontalValues.Fill: - return HorizontalAlignmentValues.Fill; - case XLAlignmentHorizontalValues.General: - return HorizontalAlignmentValues.General; - case XLAlignmentHorizontalValues.Justify: - return HorizontalAlignmentValues.Justify; - case XLAlignmentHorizontalValues.Left: - return HorizontalAlignmentValues.Left; - case XLAlignmentHorizontalValues.Right: - return HorizontalAlignmentValues.Right; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static VerticalAlignmentValues ToOpenXml(this XLAlignmentVerticalValues value) - { - switch (value) - { - case XLAlignmentVerticalValues.Bottom: - return VerticalAlignmentValues.Bottom; - case XLAlignmentVerticalValues.Center: - return VerticalAlignmentValues.Center; - case XLAlignmentVerticalValues.Distributed: - return VerticalAlignmentValues.Distributed; - case XLAlignmentVerticalValues.Justify: - return VerticalAlignmentValues.Justify; - case XLAlignmentVerticalValues.Top: - return VerticalAlignmentValues.Top; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static PageOrderValues ToOpenXml(this XLPageOrderValues value) - { - switch (value) - { - case XLPageOrderValues.DownThenOver: - return PageOrderValues.DownThenOver; - case XLPageOrderValues.OverThenDown: - return PageOrderValues.OverThenDown; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static CellCommentsValues ToOpenXml(this XLShowCommentsValues value) - { - switch (value) - { - case XLShowCommentsValues.AsDisplayed: - return CellCommentsValues.AsDisplayed; - case XLShowCommentsValues.AtEnd: - return CellCommentsValues.AtEnd; - case XLShowCommentsValues.None: - return CellCommentsValues.None; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static PrintErrorValues ToOpenXml(this XLPrintErrorValues value) - { - switch (value) - { - case XLPrintErrorValues.Blank: - return PrintErrorValues.Blank; - case XLPrintErrorValues.Dash: - return PrintErrorValues.Dash; - case XLPrintErrorValues.Displayed: - return PrintErrorValues.Displayed; - case XLPrintErrorValues.NA: - return PrintErrorValues.NA; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static CalculateModeValues ToOpenXml(this XLCalculateMode value) - { - switch (value) - { - case XLCalculateMode.Auto: - return CalculateModeValues.Auto; - case XLCalculateMode.AutoNoTable: - return CalculateModeValues.AutoNoTable; - case XLCalculateMode.Manual: - return CalculateModeValues.Manual; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static ReferenceModeValues ToOpenXml(this XLReferenceStyle value) - { - switch (value) - { - case XLReferenceStyle.R1C1: - return ReferenceModeValues.R1C1; - case XLReferenceStyle.A1: - return ReferenceModeValues.A1; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static uint ToOpenXml(this XLAlignmentReadingOrderValues value) - { - switch (value) - { - case XLAlignmentReadingOrderValues.ContextDependent: - return 0; - case XLAlignmentReadingOrderValues.LeftToRight: - return 1; - case XLAlignmentReadingOrderValues.RightToLeft: - return 2; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static TotalsRowFunctionValues ToOpenXml(this XLTotalsRowFunction value) - { - switch (value) - { - case XLTotalsRowFunction.None: - return TotalsRowFunctionValues.None; - case XLTotalsRowFunction.Sum: - return TotalsRowFunctionValues.Sum; - case XLTotalsRowFunction.Minimum: - return TotalsRowFunctionValues.Minimum; - case XLTotalsRowFunction.Maximum: - return TotalsRowFunctionValues.Maximum; - case XLTotalsRowFunction.Average: - return TotalsRowFunctionValues.Average; - case XLTotalsRowFunction.Count: - return TotalsRowFunctionValues.Count; - case XLTotalsRowFunction.CountNumbers: - return TotalsRowFunctionValues.CountNumbers; - case XLTotalsRowFunction.StandardDeviation: - return TotalsRowFunctionValues.StandardDeviation; - case XLTotalsRowFunction.Variance: - return TotalsRowFunctionValues.Variance; - case XLTotalsRowFunction.Custom: - return TotalsRowFunctionValues.Custom; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static DataValidationValues ToOpenXml(this XLAllowedValues value) - { - switch (value) - { - case XLAllowedValues.AnyValue: - return DataValidationValues.None; - case XLAllowedValues.Custom: - return DataValidationValues.Custom; - case XLAllowedValues.Date: - return DataValidationValues.Date; - case XLAllowedValues.Decimal: - return DataValidationValues.Decimal; - case XLAllowedValues.List: - return DataValidationValues.List; - case XLAllowedValues.TextLength: - return DataValidationValues.TextLength; - case XLAllowedValues.Time: - return DataValidationValues.Time; - case XLAllowedValues.WholeNumber: - return DataValidationValues.Whole; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static DataValidationErrorStyleValues ToOpenXml(this XLErrorStyle value) - { - switch (value) - { - case XLErrorStyle.Information: - return DataValidationErrorStyleValues.Information; - case XLErrorStyle.Warning: - return DataValidationErrorStyleValues.Warning; - case XLErrorStyle.Stop: - return DataValidationErrorStyleValues.Stop; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static DataValidationOperatorValues ToOpenXml(this XLOperator value) - { - switch (value) - { - case XLOperator.Between: - return DataValidationOperatorValues.Between; - case XLOperator.EqualOrGreaterThan: - return DataValidationOperatorValues.GreaterThanOrEqual; - case XLOperator.EqualOrLessThan: - return DataValidationOperatorValues.LessThanOrEqual; - case XLOperator.EqualTo: - return DataValidationOperatorValues.Equal; - case XLOperator.GreaterThan: - return DataValidationOperatorValues.GreaterThan; - case XLOperator.LessThan: - return DataValidationOperatorValues.LessThan; - case XLOperator.NotBetween: - return DataValidationOperatorValues.NotBetween; - case XLOperator.NotEqualTo: - return DataValidationOperatorValues.NotEqual; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static SheetStateValues ToOpenXml(this XLWorksheetVisibility value) - { - switch (value) - { - case XLWorksheetVisibility.Visible: - return SheetStateValues.Visible; - case XLWorksheetVisibility.Hidden: - return SheetStateValues.Hidden; - case XLWorksheetVisibility.VeryHidden: - return SheetStateValues.VeryHidden; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static PhoneticAlignmentValues ToOpenXml(this XLPhoneticAlignment value) - { - switch (value) - { - case XLPhoneticAlignment.Center : - return PhoneticAlignmentValues.Center; - case XLPhoneticAlignment.Distributed: - return PhoneticAlignmentValues.Distributed; - case XLPhoneticAlignment.Left: - return PhoneticAlignmentValues.Left; - case XLPhoneticAlignment.NoControl: - return PhoneticAlignmentValues.NoControl; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static PhoneticValues ToOpenXml(this XLPhoneticType value) - { - switch (value) - { - case XLPhoneticType.FullWidthKatakana: - return PhoneticValues.FullWidthKatakana; - case XLPhoneticType.HalfWidthKatakana: - return PhoneticValues.HalfWidthKatakana; - case XLPhoneticType.Hiragana: - return PhoneticValues.Hiragana; - case XLPhoneticType.NoConversion: - return PhoneticValues.NoConversion; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static DataConsolidateFunctionValues ToOpenXml(this XLPivotSummary value) - { - switch (value) - { - case XLPivotSummary.Sum: return DataConsolidateFunctionValues.Sum; - case XLPivotSummary.Count: return DataConsolidateFunctionValues.Count; - case XLPivotSummary.Average: return DataConsolidateFunctionValues.Average; - case XLPivotSummary.Minimum: return DataConsolidateFunctionValues.Minimum; - case XLPivotSummary.Maximum: return DataConsolidateFunctionValues.Maximum; - case XLPivotSummary.Product: return DataConsolidateFunctionValues.Product; - case XLPivotSummary.CountNumbers: return DataConsolidateFunctionValues.CountNumbers; - case XLPivotSummary.StandardDeviation: return DataConsolidateFunctionValues.StandardDeviation; - case XLPivotSummary.PopulationStandardDeviation: return DataConsolidateFunctionValues.StandardDeviationP; - case XLPivotSummary.Variance: return DataConsolidateFunctionValues.Variance; - case XLPivotSummary.PopulationVariance: return DataConsolidateFunctionValues.VarianceP; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static ShowDataAsValues ToOpenXml(this XLPivotCalculation value) - { - switch (value) - { - case XLPivotCalculation.Normal: return ShowDataAsValues.Normal; - case XLPivotCalculation.DifferenceFrom: return ShowDataAsValues.Difference; - case XLPivotCalculation.PercentageOf: return ShowDataAsValues.Percent; - case XLPivotCalculation.PercentageDifferenceFrom: return ShowDataAsValues.PercentageDifference; - case XLPivotCalculation.RunningTotal: return ShowDataAsValues.RunTotal; - case XLPivotCalculation.PercentageOfRow: return ShowDataAsValues.PercentOfRaw; // There's a typo in the OpenXML SDK =) - case XLPivotCalculation.PercentageOfColumn: return ShowDataAsValues.PercentOfColumn; - case XLPivotCalculation.PercentageOfTotal: return ShowDataAsValues.PercentOfTotal; - case XLPivotCalculation.Index: return ShowDataAsValues.Index; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static FilterOperatorValues ToOpenXml(this XLFilterOperator value) - { - switch(value) - { - case XLFilterOperator.Equal: return FilterOperatorValues.Equal; - case XLFilterOperator.NotEqual: return FilterOperatorValues.NotEqual; - case XLFilterOperator.GreaterThan: return FilterOperatorValues.GreaterThan; - case XLFilterOperator.EqualOrGreaterThan: return FilterOperatorValues.GreaterThanOrEqual; - case XLFilterOperator.LessThan: return FilterOperatorValues.LessThan; - case XLFilterOperator.EqualOrLessThan: return FilterOperatorValues.LessThanOrEqual; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static DynamicFilterValues ToOpenXml(this XLFilterDynamicType value) - { - switch (value) - { - case XLFilterDynamicType.AboveAverage: return DynamicFilterValues.AboveAverage; - case XLFilterDynamicType.BelowAverage: return DynamicFilterValues.BelowAverage; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static SheetViewValues ToOpenXml(this XLSheetViewOptions value) - { - switch (value) - { - case XLSheetViewOptions.Normal: return SheetViewValues.Normal; - case XLSheetViewOptions.PageBreakPreview: return SheetViewValues.PageBreakPreview; - case XLSheetViewOptions.PageLayout: return SheetViewValues.PageLayout; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static StrokeLineStyleValues ToOpenXml(this XLLineStyle value) - { - switch (value) - { - case XLLineStyle.Single : return StrokeLineStyleValues.Single ; - case XLLineStyle.ThickBetweenThin: return StrokeLineStyleValues.ThickBetweenThin; - case XLLineStyle.ThickThin: return StrokeLineStyleValues.ThickThin; - case XLLineStyle.ThinThick: return StrokeLineStyleValues.ThinThick; - case XLLineStyle.ThinThin: return StrokeLineStyleValues.ThinThin; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static ConditionalFormatValues ToOpenXml(this XLConditionalFormatType value) - { - switch (value) - { - case XLConditionalFormatType.Expression: return ConditionalFormatValues.Expression; - case XLConditionalFormatType.CellIs: return ConditionalFormatValues.CellIs; - case XLConditionalFormatType.ColorScale: return ConditionalFormatValues.ColorScale; - case XLConditionalFormatType.DataBar: return ConditionalFormatValues.DataBar; - case XLConditionalFormatType.IconSet: return ConditionalFormatValues.IconSet; - case XLConditionalFormatType.Top10: return ConditionalFormatValues.Top10; - case XLConditionalFormatType.IsUnique: return ConditionalFormatValues.UniqueValues; - case XLConditionalFormatType.IsDuplicate: return ConditionalFormatValues.DuplicateValues; - case XLConditionalFormatType.ContainsText: return ConditionalFormatValues.ContainsText; - case XLConditionalFormatType.NotContainsText: return ConditionalFormatValues.NotContainsText; - case XLConditionalFormatType.StartsWith: return ConditionalFormatValues.BeginsWith; - case XLConditionalFormatType.EndsWith: return ConditionalFormatValues.EndsWith; - case XLConditionalFormatType.IsBlank: return ConditionalFormatValues.ContainsBlanks; - case XLConditionalFormatType.NotBlank: return ConditionalFormatValues.NotContainsBlanks; - case XLConditionalFormatType.IsError: return ConditionalFormatValues.ContainsErrors; - case XLConditionalFormatType.NotError: return ConditionalFormatValues.NotContainsErrors; - case XLConditionalFormatType.TimePeriod: return ConditionalFormatValues.TimePeriod; - case XLConditionalFormatType.AboveAverage: return ConditionalFormatValues.AboveAverage; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static ConditionalFormatValueObjectValues ToOpenXml(this XLCFContentType value) - { - switch (value) - { - case XLCFContentType.Number: return ConditionalFormatValueObjectValues.Number; - case XLCFContentType.Percent: return ConditionalFormatValueObjectValues.Percent; - case XLCFContentType.Maximum: return ConditionalFormatValueObjectValues.Max; - case XLCFContentType.Minimum: return ConditionalFormatValueObjectValues.Min; - case XLCFContentType.Formula: return ConditionalFormatValueObjectValues.Formula; - case XLCFContentType.Percentile: return ConditionalFormatValueObjectValues.Percentile; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static ConditionalFormattingOperatorValues ToOpenXml(this XLCFOperator value) - { - switch (value) - { - case XLCFOperator.LessThan: return ConditionalFormattingOperatorValues.LessThan; - case XLCFOperator.EqualOrLessThan: return ConditionalFormattingOperatorValues.LessThanOrEqual; - case XLCFOperator.Equal: return ConditionalFormattingOperatorValues.Equal; - case XLCFOperator.NotEqual: return ConditionalFormattingOperatorValues.NotEqual; - case XLCFOperator.EqualOrGreaterThan: return ConditionalFormattingOperatorValues.GreaterThanOrEqual; - case XLCFOperator.GreaterThan: return ConditionalFormattingOperatorValues.GreaterThan; - case XLCFOperator.Between: return ConditionalFormattingOperatorValues.Between; - case XLCFOperator.NotBetween: return ConditionalFormattingOperatorValues.NotBetween; - case XLCFOperator.Contains : return ConditionalFormattingOperatorValues.ContainsText; - case XLCFOperator.NotContains: return ConditionalFormattingOperatorValues.NotContains; - case XLCFOperator.StartsWith: return ConditionalFormattingOperatorValues.BeginsWith; - case XLCFOperator.EndsWith: return ConditionalFormattingOperatorValues.EndsWith; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static IconSetValues ToOpenXml(this XLIconSetStyle value) - { - switch (value) - { - case XLIconSetStyle.ThreeArrows: return IconSetValues.ThreeArrows; - case XLIconSetStyle.ThreeArrowsGray: return IconSetValues.ThreeArrowsGray; - case XLIconSetStyle.ThreeFlags: return IconSetValues.ThreeFlags; - case XLIconSetStyle.ThreeTrafficLights1: return IconSetValues.ThreeTrafficLights1; - case XLIconSetStyle.ThreeTrafficLights2: return IconSetValues.ThreeTrafficLights2; - case XLIconSetStyle.ThreeSigns: return IconSetValues.ThreeSigns; - case XLIconSetStyle.ThreeSymbols: return IconSetValues.ThreeSymbols; - case XLIconSetStyle.ThreeSymbols2: return IconSetValues.ThreeSymbols2; - case XLIconSetStyle.FourArrows: return IconSetValues.FourArrows; - case XLIconSetStyle.FourArrowsGray: return IconSetValues.FourArrowsGray; - case XLIconSetStyle.FourRedToBlack: return IconSetValues.FourRedToBlack; - case XLIconSetStyle.FourRating: return IconSetValues.FourRating; - case XLIconSetStyle.FourTrafficLights: return IconSetValues.FourTrafficLights; - case XLIconSetStyle.FiveArrows: return IconSetValues.FiveArrows; - case XLIconSetStyle.FiveArrowsGray: return IconSetValues.FiveArrowsGray; - case XLIconSetStyle.FiveRating: return IconSetValues.FiveRating; - case XLIconSetStyle.FiveQuarters: return IconSetValues.FiveQuarters; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - #endregion - #region To ClosedXml - public static XLFontUnderlineValues ToClosedXml(this UnderlineValues value) - { - switch (value) - { - case UnderlineValues.Double: - return XLFontUnderlineValues.Double; - case UnderlineValues.DoubleAccounting: - return XLFontUnderlineValues.DoubleAccounting; - case UnderlineValues.None: - return XLFontUnderlineValues.None; - case UnderlineValues.Single: - return XLFontUnderlineValues.Single; - case UnderlineValues.SingleAccounting: - return XLFontUnderlineValues.SingleAccounting; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLPageOrientation ToClosedXml(this OrientationValues value) - { - switch (value) - { - case OrientationValues.Default: - return XLPageOrientation.Default; - case OrientationValues.Landscape: - return XLPageOrientation.Landscape; - case OrientationValues.Portrait: - return XLPageOrientation.Portrait; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLFontVerticalTextAlignmentValues ToClosedXml(this VerticalAlignmentRunValues value) - { - switch (value) - { - case VerticalAlignmentRunValues.Baseline: - return XLFontVerticalTextAlignmentValues.Baseline; - case VerticalAlignmentRunValues.Subscript: - return XLFontVerticalTextAlignmentValues.Subscript; - case VerticalAlignmentRunValues.Superscript: - return XLFontVerticalTextAlignmentValues.Superscript; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLFillPatternValues ToClosedXml(this PatternValues value) - { - switch (value) - { - case PatternValues.DarkDown: - return XLFillPatternValues.DarkDown; - case PatternValues.DarkGray: - return XLFillPatternValues.DarkGray; - case PatternValues.DarkGrid: - return XLFillPatternValues.DarkGrid; - case PatternValues.DarkHorizontal: - return XLFillPatternValues.DarkHorizontal; - case PatternValues.DarkTrellis: - return XLFillPatternValues.DarkTrellis; - case PatternValues.DarkUp: - return XLFillPatternValues.DarkUp; - case PatternValues.DarkVertical: - return XLFillPatternValues.DarkVertical; - case PatternValues.Gray0625: - return XLFillPatternValues.Gray0625; - case PatternValues.Gray125: - return XLFillPatternValues.Gray125; - case PatternValues.LightDown: - return XLFillPatternValues.LightDown; - case PatternValues.LightGray: - return XLFillPatternValues.LightGray; - case PatternValues.LightGrid: - return XLFillPatternValues.LightGrid; - case PatternValues.LightHorizontal: - return XLFillPatternValues.LightHorizontal; - case PatternValues.LightTrellis: - return XLFillPatternValues.LightTrellis; - case PatternValues.LightUp: - return XLFillPatternValues.LightUp; - case PatternValues.LightVertical: - return XLFillPatternValues.LightVertical; - case PatternValues.MediumGray: - return XLFillPatternValues.MediumGray; - case PatternValues.None: - return XLFillPatternValues.None; - case PatternValues.Solid: - return XLFillPatternValues.Solid; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLBorderStyleValues ToClosedXml(this BorderStyleValues value) - { - switch (value) - { - case BorderStyleValues.DashDot: - return XLBorderStyleValues.DashDot; - case BorderStyleValues.DashDotDot: - return XLBorderStyleValues.DashDotDot; - case BorderStyleValues.Dashed: - return XLBorderStyleValues.Dashed; - case BorderStyleValues.Dotted: - return XLBorderStyleValues.Dotted; - case BorderStyleValues.Double: - return XLBorderStyleValues.Double; - case BorderStyleValues.Hair: - return XLBorderStyleValues.Hair; - case BorderStyleValues.Medium: - return XLBorderStyleValues.Medium; - case BorderStyleValues.MediumDashDot: - return XLBorderStyleValues.MediumDashDot; - case BorderStyleValues.MediumDashDotDot: - return XLBorderStyleValues.MediumDashDotDot; - case BorderStyleValues.MediumDashed: - return XLBorderStyleValues.MediumDashed; - case BorderStyleValues.None: - return XLBorderStyleValues.None; - case BorderStyleValues.SlantDashDot: - return XLBorderStyleValues.SlantDashDot; - case BorderStyleValues.Thick: - return XLBorderStyleValues.Thick; - case BorderStyleValues.Thin: - return XLBorderStyleValues.Thin; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLAlignmentHorizontalValues ToClosedXml(this HorizontalAlignmentValues value) - { - switch (value) - { - case HorizontalAlignmentValues.Center: - return XLAlignmentHorizontalValues.Center; - case HorizontalAlignmentValues.CenterContinuous: - return XLAlignmentHorizontalValues.CenterContinuous; - case HorizontalAlignmentValues.Distributed: - return XLAlignmentHorizontalValues.Distributed; - case HorizontalAlignmentValues.Fill: - return XLAlignmentHorizontalValues.Fill; - case HorizontalAlignmentValues.General: - return XLAlignmentHorizontalValues.General; - case HorizontalAlignmentValues.Justify: - return XLAlignmentHorizontalValues.Justify; - case HorizontalAlignmentValues.Left: - return XLAlignmentHorizontalValues.Left; - case HorizontalAlignmentValues.Right: - return XLAlignmentHorizontalValues.Right; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLAlignmentVerticalValues ToClosedXml(this VerticalAlignmentValues value) - { - switch (value) - { - case VerticalAlignmentValues.Bottom: - return XLAlignmentVerticalValues.Bottom; - case VerticalAlignmentValues.Center: - return XLAlignmentVerticalValues.Center; - case VerticalAlignmentValues.Distributed: - return XLAlignmentVerticalValues.Distributed; - case VerticalAlignmentValues.Justify: - return XLAlignmentVerticalValues.Justify; - case VerticalAlignmentValues.Top: - return XLAlignmentVerticalValues.Top; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLPageOrderValues ToClosedXml(this PageOrderValues value) - { - switch (value) - { - case PageOrderValues.DownThenOver: - return XLPageOrderValues.DownThenOver; - case PageOrderValues.OverThenDown: - return XLPageOrderValues.OverThenDown; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLShowCommentsValues ToClosedXml(this CellCommentsValues value) - { - switch (value) - { - case CellCommentsValues.AsDisplayed: - return XLShowCommentsValues.AsDisplayed; - case CellCommentsValues.AtEnd: - return XLShowCommentsValues.AtEnd; - case CellCommentsValues.None: - return XLShowCommentsValues.None; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLPrintErrorValues ToClosedXml(this PrintErrorValues value) - { - switch (value) - { - case PrintErrorValues.Blank: - return XLPrintErrorValues.Blank; - case PrintErrorValues.Dash: - return XLPrintErrorValues.Dash; - case PrintErrorValues.Displayed: - return XLPrintErrorValues.Displayed; - case PrintErrorValues.NA: - return XLPrintErrorValues.NA; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLCalculateMode ToClosedXml(this CalculateModeValues value) - { - switch (value) - { - case CalculateModeValues.Auto: - return XLCalculateMode.Auto; - case CalculateModeValues.AutoNoTable: - return XLCalculateMode.AutoNoTable; - case CalculateModeValues.Manual: - return XLCalculateMode.Manual; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLReferenceStyle ToClosedXml(this ReferenceModeValues value) - { - switch (value) - { - case ReferenceModeValues.R1C1: - return XLReferenceStyle.R1C1; - case ReferenceModeValues.A1: - return XLReferenceStyle.A1; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLAlignmentReadingOrderValues ToClosedXml(this uint value) - { - switch (value) - { - case 0: - return XLAlignmentReadingOrderValues.ContextDependent; - case 1: - return XLAlignmentReadingOrderValues.LeftToRight; - case 2: - return XLAlignmentReadingOrderValues.RightToLeft; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLTotalsRowFunction ToClosedXml(this TotalsRowFunctionValues value) - { - switch (value) - { - case TotalsRowFunctionValues.None: - return XLTotalsRowFunction.None; - case TotalsRowFunctionValues.Sum: - return XLTotalsRowFunction.Sum; - case TotalsRowFunctionValues.Minimum: - return XLTotalsRowFunction.Minimum; - case TotalsRowFunctionValues.Maximum: - return XLTotalsRowFunction.Maximum; - case TotalsRowFunctionValues.Average: - return XLTotalsRowFunction.Average; - case TotalsRowFunctionValues.Count: - return XLTotalsRowFunction.Count; - case TotalsRowFunctionValues.CountNumbers: - return XLTotalsRowFunction.CountNumbers; - case TotalsRowFunctionValues.StandardDeviation: - return XLTotalsRowFunction.StandardDeviation; - case TotalsRowFunctionValues.Variance: - return XLTotalsRowFunction.Variance; - case TotalsRowFunctionValues.Custom: - return XLTotalsRowFunction.Custom; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLAllowedValues ToClosedXml(this DataValidationValues value) - { - switch (value) - { - case DataValidationValues.None: - return XLAllowedValues.AnyValue; - case DataValidationValues.Custom: - return XLAllowedValues.Custom; - case DataValidationValues.Date: - return XLAllowedValues.Date; - case DataValidationValues.Decimal: - return XLAllowedValues.Decimal; - case DataValidationValues.List: - return XLAllowedValues.List; - case DataValidationValues.TextLength: - return XLAllowedValues.TextLength; - case DataValidationValues.Time: - return XLAllowedValues.Time; - case DataValidationValues.Whole: - return XLAllowedValues.WholeNumber; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLErrorStyle ToClosedXml(this DataValidationErrorStyleValues value) - { - switch (value) - { - case DataValidationErrorStyleValues.Information: - return XLErrorStyle.Information; - case DataValidationErrorStyleValues.Warning: - return XLErrorStyle.Warning; - case DataValidationErrorStyleValues.Stop: - return XLErrorStyle.Stop; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLOperator ToClosedXml(this DataValidationOperatorValues value) - { - switch (value) - { - case DataValidationOperatorValues.Between: - return XLOperator.Between; - case DataValidationOperatorValues.GreaterThanOrEqual: - return XLOperator.EqualOrGreaterThan; - case DataValidationOperatorValues.LessThanOrEqual: - return XLOperator.EqualOrLessThan; - case DataValidationOperatorValues.Equal: - return XLOperator.EqualTo; - case DataValidationOperatorValues.GreaterThan: - return XLOperator.GreaterThan; - case DataValidationOperatorValues.LessThan: - return XLOperator.LessThan; - case DataValidationOperatorValues.NotBetween: - return XLOperator.NotBetween; - case DataValidationOperatorValues.NotEqual: - return XLOperator.NotEqualTo; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLWorksheetVisibility ToClosedXml(this SheetStateValues value) - { - switch (value) - { - case SheetStateValues.Visible: - return XLWorksheetVisibility.Visible; - case SheetStateValues.Hidden: - return XLWorksheetVisibility.Hidden; - case SheetStateValues.VeryHidden: - return XLWorksheetVisibility.VeryHidden; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLPhoneticAlignment ToClosedXml(this PhoneticAlignmentValues value) - { - switch (value) - { - case PhoneticAlignmentValues.Center: - return XLPhoneticAlignment.Center; - case PhoneticAlignmentValues.Distributed: - return XLPhoneticAlignment.Distributed; - case PhoneticAlignmentValues.Left: - return XLPhoneticAlignment.Left; - case PhoneticAlignmentValues.NoControl: - return XLPhoneticAlignment.NoControl; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLPhoneticType ToClosedXml(this PhoneticValues value) - { - switch (value) - { - case PhoneticValues.FullWidthKatakana: return XLPhoneticType.FullWidthKatakana; - case PhoneticValues.HalfWidthKatakana: - return XLPhoneticType.HalfWidthKatakana; - case PhoneticValues.Hiragana: - return XLPhoneticType.Hiragana; - case PhoneticValues.NoConversion: - return XLPhoneticType.NoConversion; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLPivotSummary ToClosedXml(this DataConsolidateFunctionValues value) - { - switch (value) - { - case DataConsolidateFunctionValues.Sum: return XLPivotSummary.Sum; - case DataConsolidateFunctionValues.Count: return XLPivotSummary.Count; - case DataConsolidateFunctionValues.Average: return XLPivotSummary.Average; - case DataConsolidateFunctionValues.Minimum: return XLPivotSummary.Minimum; - case DataConsolidateFunctionValues.Maximum: return XLPivotSummary.Maximum; - case DataConsolidateFunctionValues.Product: return XLPivotSummary.Product; - case DataConsolidateFunctionValues.CountNumbers: return XLPivotSummary.CountNumbers; - case DataConsolidateFunctionValues.StandardDeviation: return XLPivotSummary.StandardDeviation; - case DataConsolidateFunctionValues.StandardDeviationP: return XLPivotSummary.PopulationStandardDeviation; - case DataConsolidateFunctionValues.Variance: return XLPivotSummary.Variance; - case DataConsolidateFunctionValues.VarianceP: return XLPivotSummary.PopulationVariance; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLPivotCalculation ToClosedXml(this ShowDataAsValues value) - { - switch (value) - { - case ShowDataAsValues.Normal: return XLPivotCalculation.Normal; - case ShowDataAsValues.Difference: return XLPivotCalculation.DifferenceFrom; - case ShowDataAsValues.Percent: return XLPivotCalculation.PercentageOf; - case ShowDataAsValues.PercentageDifference: return XLPivotCalculation.PercentageDifferenceFrom; - case ShowDataAsValues.RunTotal: return XLPivotCalculation.RunningTotal; - case ShowDataAsValues.PercentOfRaw: return XLPivotCalculation.PercentageOfRow; // There's a typo in the OpenXML SDK =) - case ShowDataAsValues.PercentOfColumn: return XLPivotCalculation.PercentageOfColumn; - case ShowDataAsValues.PercentOfTotal: return XLPivotCalculation.PercentageOfTotal; - case ShowDataAsValues.Index: return XLPivotCalculation.Index; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLFilterOperator ToClosedXml(this FilterOperatorValues value) - { - switch (value) - { - case FilterOperatorValues.Equal: return XLFilterOperator.Equal; - case FilterOperatorValues.NotEqual: return XLFilterOperator.NotEqual; - case FilterOperatorValues.GreaterThan: return XLFilterOperator.GreaterThan; - case FilterOperatorValues.LessThan: return XLFilterOperator.LessThan; - case FilterOperatorValues.GreaterThanOrEqual: return XLFilterOperator.EqualOrGreaterThan; - case FilterOperatorValues.LessThanOrEqual: return XLFilterOperator.EqualOrLessThan; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLFilterDynamicType ToClosedXml(this DynamicFilterValues value) - { - switch (value) - { - case DynamicFilterValues.AboveAverage: return XLFilterDynamicType.AboveAverage; - case DynamicFilterValues.BelowAverage: return XLFilterDynamicType.BelowAverage; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLSheetViewOptions ToClosedXml(this SheetViewValues value) - { - switch (value) - { - case SheetViewValues.Normal: return XLSheetViewOptions.Normal; - case SheetViewValues.PageBreakPreview: return XLSheetViewOptions.PageBreakPreview; - case SheetViewValues.PageLayout: return XLSheetViewOptions.PageLayout; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLLineStyle ToClosedXml(this StrokeLineStyleValues value) - { - switch (value) - { - case StrokeLineStyleValues.Single: return XLLineStyle.Single; - case StrokeLineStyleValues.ThickBetweenThin: return XLLineStyle.ThickBetweenThin; - case StrokeLineStyleValues.ThickThin: return XLLineStyle.ThickThin; - case StrokeLineStyleValues.ThinThick: return XLLineStyle.ThinThick; - case StrokeLineStyleValues.ThinThin: return XLLineStyle.ThinThin; - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLConditionalFormatType ToClosedXml(this ConditionalFormatValues value) - { - switch (value) - { - case ConditionalFormatValues.Expression: return XLConditionalFormatType.Expression; - case ConditionalFormatValues.CellIs: return XLConditionalFormatType.CellIs; - case ConditionalFormatValues.ColorScale: return XLConditionalFormatType.ColorScale; - case ConditionalFormatValues.DataBar: return XLConditionalFormatType.DataBar; - case ConditionalFormatValues.IconSet: return XLConditionalFormatType.IconSet; - case ConditionalFormatValues.Top10: return XLConditionalFormatType.Top10; - case ConditionalFormatValues.UniqueValues: return XLConditionalFormatType.IsUnique; - case ConditionalFormatValues.DuplicateValues: return XLConditionalFormatType.IsDuplicate; - case ConditionalFormatValues.ContainsText: return XLConditionalFormatType.ContainsText; - case ConditionalFormatValues.NotContainsText: return XLConditionalFormatType.NotContainsText; - case ConditionalFormatValues.BeginsWith: return XLConditionalFormatType.StartsWith; - case ConditionalFormatValues.EndsWith: return XLConditionalFormatType.EndsWith; - case ConditionalFormatValues.ContainsBlanks: return XLConditionalFormatType.IsBlank; - case ConditionalFormatValues.NotContainsBlanks: return XLConditionalFormatType.NotBlank; - case ConditionalFormatValues.ContainsErrors: return XLConditionalFormatType.IsError; - case ConditionalFormatValues.NotContainsErrors: return XLConditionalFormatType.NotError; - case ConditionalFormatValues.TimePeriod: return XLConditionalFormatType.TimePeriod; - case ConditionalFormatValues.AboveAverage: return XLConditionalFormatType.AboveAverage; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLCFContentType ToClosedXml(this ConditionalFormatValueObjectValues value) - { - switch (value) - { - case ConditionalFormatValueObjectValues.Number: return XLCFContentType.Number; - case ConditionalFormatValueObjectValues.Percent: return XLCFContentType.Percent; - case ConditionalFormatValueObjectValues.Max: return XLCFContentType.Maximum; - case ConditionalFormatValueObjectValues.Min: return XLCFContentType.Minimum; - case ConditionalFormatValueObjectValues.Formula: return XLCFContentType.Formula; - case ConditionalFormatValueObjectValues.Percentile: return XLCFContentType.Percentile; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - public static XLCFOperator ToClosedXml(this ConditionalFormattingOperatorValues value) - { - switch (value) - { - case ConditionalFormattingOperatorValues.LessThan: return XLCFOperator.LessThan; - case ConditionalFormattingOperatorValues.LessThanOrEqual: return XLCFOperator.EqualOrLessThan; - case ConditionalFormattingOperatorValues.Equal: return XLCFOperator.Equal; - case ConditionalFormattingOperatorValues.NotEqual: return XLCFOperator.NotEqual; - case ConditionalFormattingOperatorValues.GreaterThanOrEqual: return XLCFOperator.EqualOrGreaterThan; - case ConditionalFormattingOperatorValues.GreaterThan: return XLCFOperator.GreaterThan; - case ConditionalFormattingOperatorValues.Between: return XLCFOperator.Between; - case ConditionalFormattingOperatorValues.NotBetween: return XLCFOperator.NotBetween; - case ConditionalFormattingOperatorValues.ContainsText: return XLCFOperator.Contains; - case ConditionalFormattingOperatorValues.NotContains: return XLCFOperator.NotContains; - case ConditionalFormattingOperatorValues.BeginsWith: return XLCFOperator.StartsWith; - case ConditionalFormattingOperatorValues.EndsWith: return XLCFOperator.EndsWith; - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - - public static XLIconSetStyle ToClosedXml(this IconSetValues value) - { - switch (value) - { - case IconSetValues.ThreeArrows: return XLIconSetStyle.ThreeArrows; - case IconSetValues.ThreeArrowsGray: return XLIconSetStyle.ThreeArrowsGray; - case IconSetValues.ThreeFlags: return XLIconSetStyle.ThreeFlags; - case IconSetValues.ThreeTrafficLights1: return XLIconSetStyle.ThreeTrafficLights1; - case IconSetValues.ThreeTrafficLights2: return XLIconSetStyle.ThreeTrafficLights2; - case IconSetValues.ThreeSigns: return XLIconSetStyle.ThreeSigns; - case IconSetValues.ThreeSymbols: return XLIconSetStyle.ThreeSymbols; - case IconSetValues.ThreeSymbols2: return XLIconSetStyle.ThreeSymbols2; - case IconSetValues.FourArrows: return XLIconSetStyle.FourArrows; - case IconSetValues.FourArrowsGray: return XLIconSetStyle.FourArrowsGray; - case IconSetValues.FourRedToBlack: return XLIconSetStyle.FourRedToBlack; - case IconSetValues.FourRating: return XLIconSetStyle.FourRating; - case IconSetValues.FourTrafficLights: return XLIconSetStyle.FourTrafficLights; - case IconSetValues.FiveArrows: return XLIconSetStyle.FiveArrows; - case IconSetValues.FiveArrowsGray: return XLIconSetStyle.FiveArrowsGray; - case IconSetValues.FiveRating: return XLIconSetStyle.FiveRating; - case IconSetValues.FiveQuarters: return XLIconSetStyle.FiveQuarters; - - - #region default - default: - throw new ApplicationException("Not implemented value!"); - #endregion - } - } - #endregion - } -} +using ClosedXML.Excel.Drawings; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using System; +using Vml = DocumentFormat.OpenXml.Vml; +using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal static class EnumConverter + { + #region To OpenXml + + public static UnderlineValues ToOpenXml(this XLFontUnderlineValues value) + { + switch (value) + { + case XLFontUnderlineValues.Double: + return UnderlineValues.Double; + + case XLFontUnderlineValues.DoubleAccounting: + return UnderlineValues.DoubleAccounting; + + case XLFontUnderlineValues.None: + return UnderlineValues.None; + + case XLFontUnderlineValues.Single: + return UnderlineValues.Single; + + case XLFontUnderlineValues.SingleAccounting: + return UnderlineValues.SingleAccounting; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static OrientationValues ToOpenXml(this XLPageOrientation value) + { + switch (value) + { + case XLPageOrientation.Default: + return OrientationValues.Default; + + case XLPageOrientation.Landscape: + return OrientationValues.Landscape; + + case XLPageOrientation.Portrait: + return OrientationValues.Portrait; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static VerticalAlignmentRunValues ToOpenXml(this XLFontVerticalTextAlignmentValues value) + { + switch (value) + { + case XLFontVerticalTextAlignmentValues.Baseline: + return VerticalAlignmentRunValues.Baseline; + + case XLFontVerticalTextAlignmentValues.Subscript: + return VerticalAlignmentRunValues.Subscript; + + case XLFontVerticalTextAlignmentValues.Superscript: + return VerticalAlignmentRunValues.Superscript; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static PatternValues ToOpenXml(this XLFillPatternValues value) + { + switch (value) + { + case XLFillPatternValues.DarkDown: + return PatternValues.DarkDown; + + case XLFillPatternValues.DarkGray: + return PatternValues.DarkGray; + + case XLFillPatternValues.DarkGrid: + return PatternValues.DarkGrid; + + case XLFillPatternValues.DarkHorizontal: + return PatternValues.DarkHorizontal; + + case XLFillPatternValues.DarkTrellis: + return PatternValues.DarkTrellis; + + case XLFillPatternValues.DarkUp: + return PatternValues.DarkUp; + + case XLFillPatternValues.DarkVertical: + return PatternValues.DarkVertical; + + case XLFillPatternValues.Gray0625: + return PatternValues.Gray0625; + + case XLFillPatternValues.Gray125: + return PatternValues.Gray125; + + case XLFillPatternValues.LightDown: + return PatternValues.LightDown; + + case XLFillPatternValues.LightGray: + return PatternValues.LightGray; + + case XLFillPatternValues.LightGrid: + return PatternValues.LightGrid; + + case XLFillPatternValues.LightHorizontal: + return PatternValues.LightHorizontal; + + case XLFillPatternValues.LightTrellis: + return PatternValues.LightTrellis; + + case XLFillPatternValues.LightUp: + return PatternValues.LightUp; + + case XLFillPatternValues.LightVertical: + return PatternValues.LightVertical; + + case XLFillPatternValues.MediumGray: + return PatternValues.MediumGray; + + case XLFillPatternValues.None: + return PatternValues.None; + + case XLFillPatternValues.Solid: + return PatternValues.Solid; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static BorderStyleValues ToOpenXml(this XLBorderStyleValues value) + { + switch (value) + { + case XLBorderStyleValues.DashDot: + return BorderStyleValues.DashDot; + + case XLBorderStyleValues.DashDotDot: + return BorderStyleValues.DashDotDot; + + case XLBorderStyleValues.Dashed: + return BorderStyleValues.Dashed; + + case XLBorderStyleValues.Dotted: + return BorderStyleValues.Dotted; + + case XLBorderStyleValues.Double: + return BorderStyleValues.Double; + + case XLBorderStyleValues.Hair: + return BorderStyleValues.Hair; + + case XLBorderStyleValues.Medium: + return BorderStyleValues.Medium; + + case XLBorderStyleValues.MediumDashDot: + return BorderStyleValues.MediumDashDot; + + case XLBorderStyleValues.MediumDashDotDot: + return BorderStyleValues.MediumDashDotDot; + + case XLBorderStyleValues.MediumDashed: + return BorderStyleValues.MediumDashed; + + case XLBorderStyleValues.None: + return BorderStyleValues.None; + + case XLBorderStyleValues.SlantDashDot: + return BorderStyleValues.SlantDashDot; + + case XLBorderStyleValues.Thick: + return BorderStyleValues.Thick; + + case XLBorderStyleValues.Thin: + return BorderStyleValues.Thin; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static HorizontalAlignmentValues ToOpenXml(this XLAlignmentHorizontalValues value) + { + switch (value) + { + case XLAlignmentHorizontalValues.Center: + return HorizontalAlignmentValues.Center; + + case XLAlignmentHorizontalValues.CenterContinuous: + return HorizontalAlignmentValues.CenterContinuous; + + case XLAlignmentHorizontalValues.Distributed: + return HorizontalAlignmentValues.Distributed; + + case XLAlignmentHorizontalValues.Fill: + return HorizontalAlignmentValues.Fill; + + case XLAlignmentHorizontalValues.General: + return HorizontalAlignmentValues.General; + + case XLAlignmentHorizontalValues.Justify: + return HorizontalAlignmentValues.Justify; + + case XLAlignmentHorizontalValues.Left: + return HorizontalAlignmentValues.Left; + + case XLAlignmentHorizontalValues.Right: + return HorizontalAlignmentValues.Right; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static VerticalAlignmentValues ToOpenXml(this XLAlignmentVerticalValues value) + { + switch (value) + { + case XLAlignmentVerticalValues.Bottom: + return VerticalAlignmentValues.Bottom; + + case XLAlignmentVerticalValues.Center: + return VerticalAlignmentValues.Center; + + case XLAlignmentVerticalValues.Distributed: + return VerticalAlignmentValues.Distributed; + + case XLAlignmentVerticalValues.Justify: + return VerticalAlignmentValues.Justify; + + case XLAlignmentVerticalValues.Top: + return VerticalAlignmentValues.Top; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static PageOrderValues ToOpenXml(this XLPageOrderValues value) + { + switch (value) + { + case XLPageOrderValues.DownThenOver: + return PageOrderValues.DownThenOver; + + case XLPageOrderValues.OverThenDown: + return PageOrderValues.OverThenDown; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static CellCommentsValues ToOpenXml(this XLShowCommentsValues value) + { + switch (value) + { + case XLShowCommentsValues.AsDisplayed: + return CellCommentsValues.AsDisplayed; + + case XLShowCommentsValues.AtEnd: + return CellCommentsValues.AtEnd; + + case XLShowCommentsValues.None: + return CellCommentsValues.None; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static PrintErrorValues ToOpenXml(this XLPrintErrorValues value) + { + switch (value) + { + case XLPrintErrorValues.Blank: + return PrintErrorValues.Blank; + + case XLPrintErrorValues.Dash: + return PrintErrorValues.Dash; + + case XLPrintErrorValues.Displayed: + return PrintErrorValues.Displayed; + + case XLPrintErrorValues.NA: + return PrintErrorValues.NA; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static CalculateModeValues ToOpenXml(this XLCalculateMode value) + { + switch (value) + { + case XLCalculateMode.Auto: + return CalculateModeValues.Auto; + + case XLCalculateMode.AutoNoTable: + return CalculateModeValues.AutoNoTable; + + case XLCalculateMode.Manual: + return CalculateModeValues.Manual; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static ReferenceModeValues ToOpenXml(this XLReferenceStyle value) + { + switch (value) + { + case XLReferenceStyle.R1C1: + return ReferenceModeValues.R1C1; + + case XLReferenceStyle.A1: + return ReferenceModeValues.A1; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static uint ToOpenXml(this XLAlignmentReadingOrderValues value) + { + switch (value) + { + case XLAlignmentReadingOrderValues.ContextDependent: + return 0; + + case XLAlignmentReadingOrderValues.LeftToRight: + return 1; + + case XLAlignmentReadingOrderValues.RightToLeft: + return 2; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static TotalsRowFunctionValues ToOpenXml(this XLTotalsRowFunction value) + { + switch (value) + { + case XLTotalsRowFunction.None: + return TotalsRowFunctionValues.None; + + case XLTotalsRowFunction.Sum: + return TotalsRowFunctionValues.Sum; + + case XLTotalsRowFunction.Minimum: + return TotalsRowFunctionValues.Minimum; + + case XLTotalsRowFunction.Maximum: + return TotalsRowFunctionValues.Maximum; + + case XLTotalsRowFunction.Average: + return TotalsRowFunctionValues.Average; + + case XLTotalsRowFunction.Count: + return TotalsRowFunctionValues.Count; + + case XLTotalsRowFunction.CountNumbers: + return TotalsRowFunctionValues.CountNumbers; + + case XLTotalsRowFunction.StandardDeviation: + return TotalsRowFunctionValues.StandardDeviation; + + case XLTotalsRowFunction.Variance: + return TotalsRowFunctionValues.Variance; + + case XLTotalsRowFunction.Custom: + return TotalsRowFunctionValues.Custom; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static DataValidationValues ToOpenXml(this XLAllowedValues value) + { + switch (value) + { + case XLAllowedValues.AnyValue: + return DataValidationValues.None; + + case XLAllowedValues.Custom: + return DataValidationValues.Custom; + + case XLAllowedValues.Date: + return DataValidationValues.Date; + + case XLAllowedValues.Decimal: + return DataValidationValues.Decimal; + + case XLAllowedValues.List: + return DataValidationValues.List; + + case XLAllowedValues.TextLength: + return DataValidationValues.TextLength; + + case XLAllowedValues.Time: + return DataValidationValues.Time; + + case XLAllowedValues.WholeNumber: + return DataValidationValues.Whole; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static DataValidationErrorStyleValues ToOpenXml(this XLErrorStyle value) + { + switch (value) + { + case XLErrorStyle.Information: + return DataValidationErrorStyleValues.Information; + + case XLErrorStyle.Warning: + return DataValidationErrorStyleValues.Warning; + + case XLErrorStyle.Stop: + return DataValidationErrorStyleValues.Stop; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static DataValidationOperatorValues ToOpenXml(this XLOperator value) + { + switch (value) + { + case XLOperator.Between: + return DataValidationOperatorValues.Between; + + case XLOperator.EqualOrGreaterThan: + return DataValidationOperatorValues.GreaterThanOrEqual; + + case XLOperator.EqualOrLessThan: + return DataValidationOperatorValues.LessThanOrEqual; + + case XLOperator.EqualTo: + return DataValidationOperatorValues.Equal; + + case XLOperator.GreaterThan: + return DataValidationOperatorValues.GreaterThan; + + case XLOperator.LessThan: + return DataValidationOperatorValues.LessThan; + + case XLOperator.NotBetween: + return DataValidationOperatorValues.NotBetween; + + case XLOperator.NotEqualTo: + return DataValidationOperatorValues.NotEqual; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static SheetStateValues ToOpenXml(this XLWorksheetVisibility value) + { + switch (value) + { + case XLWorksheetVisibility.Visible: + return SheetStateValues.Visible; + + case XLWorksheetVisibility.Hidden: + return SheetStateValues.Hidden; + + case XLWorksheetVisibility.VeryHidden: + return SheetStateValues.VeryHidden; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static PhoneticAlignmentValues ToOpenXml(this XLPhoneticAlignment value) + { + switch (value) + { + case XLPhoneticAlignment.Center: + return PhoneticAlignmentValues.Center; + + case XLPhoneticAlignment.Distributed: + return PhoneticAlignmentValues.Distributed; + + case XLPhoneticAlignment.Left: + return PhoneticAlignmentValues.Left; + + case XLPhoneticAlignment.NoControl: + return PhoneticAlignmentValues.NoControl; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static PhoneticValues ToOpenXml(this XLPhoneticType value) + { + switch (value) + { + case XLPhoneticType.FullWidthKatakana: + return PhoneticValues.FullWidthKatakana; + + case XLPhoneticType.HalfWidthKatakana: + return PhoneticValues.HalfWidthKatakana; + + case XLPhoneticType.Hiragana: + return PhoneticValues.Hiragana; + + case XLPhoneticType.NoConversion: + return PhoneticValues.NoConversion; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static DataConsolidateFunctionValues ToOpenXml(this XLPivotSummary value) + { + switch (value) + { + case XLPivotSummary.Sum: return DataConsolidateFunctionValues.Sum; + case XLPivotSummary.Count: return DataConsolidateFunctionValues.Count; + case XLPivotSummary.Average: return DataConsolidateFunctionValues.Average; + case XLPivotSummary.Minimum: return DataConsolidateFunctionValues.Minimum; + case XLPivotSummary.Maximum: return DataConsolidateFunctionValues.Maximum; + case XLPivotSummary.Product: return DataConsolidateFunctionValues.Product; + case XLPivotSummary.CountNumbers: return DataConsolidateFunctionValues.CountNumbers; + case XLPivotSummary.StandardDeviation: return DataConsolidateFunctionValues.StandardDeviation; + case XLPivotSummary.PopulationStandardDeviation: return DataConsolidateFunctionValues.StandardDeviationP; + case XLPivotSummary.Variance: return DataConsolidateFunctionValues.Variance; + case XLPivotSummary.PopulationVariance: return DataConsolidateFunctionValues.VarianceP; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static ShowDataAsValues ToOpenXml(this XLPivotCalculation value) + { + switch (value) + { + case XLPivotCalculation.Normal: return ShowDataAsValues.Normal; + case XLPivotCalculation.DifferenceFrom: return ShowDataAsValues.Difference; + case XLPivotCalculation.PercentageOf: return ShowDataAsValues.Percent; + case XLPivotCalculation.PercentageDifferenceFrom: return ShowDataAsValues.PercentageDifference; + case XLPivotCalculation.RunningTotal: return ShowDataAsValues.RunTotal; + case XLPivotCalculation.PercentageOfRow: return ShowDataAsValues.PercentOfRaw; // There's a typo in the OpenXML SDK =) + case XLPivotCalculation.PercentageOfColumn: return ShowDataAsValues.PercentOfColumn; + case XLPivotCalculation.PercentageOfTotal: return ShowDataAsValues.PercentOfTotal; + case XLPivotCalculation.Index: return ShowDataAsValues.Index; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static FilterOperatorValues ToOpenXml(this XLFilterOperator value) + { + switch (value) + { + case XLFilterOperator.Equal: return FilterOperatorValues.Equal; + case XLFilterOperator.NotEqual: return FilterOperatorValues.NotEqual; + case XLFilterOperator.GreaterThan: return FilterOperatorValues.GreaterThan; + case XLFilterOperator.EqualOrGreaterThan: return FilterOperatorValues.GreaterThanOrEqual; + case XLFilterOperator.LessThan: return FilterOperatorValues.LessThan; + case XLFilterOperator.EqualOrLessThan: return FilterOperatorValues.LessThanOrEqual; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static DynamicFilterValues ToOpenXml(this XLFilterDynamicType value) + { + switch (value) + { + case XLFilterDynamicType.AboveAverage: return DynamicFilterValues.AboveAverage; + case XLFilterDynamicType.BelowAverage: return DynamicFilterValues.BelowAverage; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static SheetViewValues ToOpenXml(this XLSheetViewOptions value) + { + switch (value) + { + case XLSheetViewOptions.Normal: return SheetViewValues.Normal; + case XLSheetViewOptions.PageBreakPreview: return SheetViewValues.PageBreakPreview; + case XLSheetViewOptions.PageLayout: return SheetViewValues.PageLayout; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static Vml.StrokeLineStyleValues ToOpenXml(this XLLineStyle value) + { + switch (value) + { + case XLLineStyle.Single: return Vml.StrokeLineStyleValues.Single; + case XLLineStyle.ThickBetweenThin: return Vml.StrokeLineStyleValues.ThickBetweenThin; + case XLLineStyle.ThickThin: return Vml.StrokeLineStyleValues.ThickThin; + case XLLineStyle.ThinThick: return Vml.StrokeLineStyleValues.ThinThick; + case XLLineStyle.ThinThin: return Vml.StrokeLineStyleValues.ThinThin; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static ConditionalFormatValues ToOpenXml(this XLConditionalFormatType value) + { + switch (value) + { + case XLConditionalFormatType.Expression: return ConditionalFormatValues.Expression; + case XLConditionalFormatType.CellIs: return ConditionalFormatValues.CellIs; + case XLConditionalFormatType.ColorScale: return ConditionalFormatValues.ColorScale; + case XLConditionalFormatType.DataBar: return ConditionalFormatValues.DataBar; + case XLConditionalFormatType.IconSet: return ConditionalFormatValues.IconSet; + case XLConditionalFormatType.Top10: return ConditionalFormatValues.Top10; + case XLConditionalFormatType.IsUnique: return ConditionalFormatValues.UniqueValues; + case XLConditionalFormatType.IsDuplicate: return ConditionalFormatValues.DuplicateValues; + case XLConditionalFormatType.ContainsText: return ConditionalFormatValues.ContainsText; + case XLConditionalFormatType.NotContainsText: return ConditionalFormatValues.NotContainsText; + case XLConditionalFormatType.StartsWith: return ConditionalFormatValues.BeginsWith; + case XLConditionalFormatType.EndsWith: return ConditionalFormatValues.EndsWith; + case XLConditionalFormatType.IsBlank: return ConditionalFormatValues.ContainsBlanks; + case XLConditionalFormatType.NotBlank: return ConditionalFormatValues.NotContainsBlanks; + case XLConditionalFormatType.IsError: return ConditionalFormatValues.ContainsErrors; + case XLConditionalFormatType.NotError: return ConditionalFormatValues.NotContainsErrors; + case XLConditionalFormatType.TimePeriod: return ConditionalFormatValues.TimePeriod; + case XLConditionalFormatType.AboveAverage: return ConditionalFormatValues.AboveAverage; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static ConditionalFormatValueObjectValues ToOpenXml(this XLCFContentType value) + { + switch (value) + { + case XLCFContentType.Number: return ConditionalFormatValueObjectValues.Number; + case XLCFContentType.Percent: return ConditionalFormatValueObjectValues.Percent; + case XLCFContentType.Maximum: return ConditionalFormatValueObjectValues.Max; + case XLCFContentType.Minimum: return ConditionalFormatValueObjectValues.Min; + case XLCFContentType.Formula: return ConditionalFormatValueObjectValues.Formula; + case XLCFContentType.Percentile: return ConditionalFormatValueObjectValues.Percentile; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static ConditionalFormattingOperatorValues ToOpenXml(this XLCFOperator value) + { + switch (value) + { + case XLCFOperator.LessThan: return ConditionalFormattingOperatorValues.LessThan; + case XLCFOperator.EqualOrLessThan: return ConditionalFormattingOperatorValues.LessThanOrEqual; + case XLCFOperator.Equal: return ConditionalFormattingOperatorValues.Equal; + case XLCFOperator.NotEqual: return ConditionalFormattingOperatorValues.NotEqual; + case XLCFOperator.EqualOrGreaterThan: return ConditionalFormattingOperatorValues.GreaterThanOrEqual; + case XLCFOperator.GreaterThan: return ConditionalFormattingOperatorValues.GreaterThan; + case XLCFOperator.Between: return ConditionalFormattingOperatorValues.Between; + case XLCFOperator.NotBetween: return ConditionalFormattingOperatorValues.NotBetween; + case XLCFOperator.Contains: return ConditionalFormattingOperatorValues.ContainsText; + case XLCFOperator.NotContains: return ConditionalFormattingOperatorValues.NotContains; + case XLCFOperator.StartsWith: return ConditionalFormattingOperatorValues.BeginsWith; + case XLCFOperator.EndsWith: return ConditionalFormattingOperatorValues.EndsWith; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static IconSetValues ToOpenXml(this XLIconSetStyle value) + { + switch (value) + { + case XLIconSetStyle.ThreeArrows: return IconSetValues.ThreeArrows; + case XLIconSetStyle.ThreeArrowsGray: return IconSetValues.ThreeArrowsGray; + case XLIconSetStyle.ThreeFlags: return IconSetValues.ThreeFlags; + case XLIconSetStyle.ThreeTrafficLights1: return IconSetValues.ThreeTrafficLights1; + case XLIconSetStyle.ThreeTrafficLights2: return IconSetValues.ThreeTrafficLights2; + case XLIconSetStyle.ThreeSigns: return IconSetValues.ThreeSigns; + case XLIconSetStyle.ThreeSymbols: return IconSetValues.ThreeSymbols; + case XLIconSetStyle.ThreeSymbols2: return IconSetValues.ThreeSymbols2; + case XLIconSetStyle.FourArrows: return IconSetValues.FourArrows; + case XLIconSetStyle.FourArrowsGray: return IconSetValues.FourArrowsGray; + case XLIconSetStyle.FourRedToBlack: return IconSetValues.FourRedToBlack; + case XLIconSetStyle.FourRating: return IconSetValues.FourRating; + case XLIconSetStyle.FourTrafficLights: return IconSetValues.FourTrafficLights; + case XLIconSetStyle.FiveArrows: return IconSetValues.FiveArrows; + case XLIconSetStyle.FiveArrowsGray: return IconSetValues.FiveArrowsGray; + case XLIconSetStyle.FiveRating: return IconSetValues.FiveRating; + case XLIconSetStyle.FiveQuarters: return IconSetValues.FiveQuarters; + + #region default + + default: + throw new ArgumentOutOfRangeException("Not implemented value!"); + + #endregion default + } + } + + public static ImagePartType ToOpenXml(this XLPictureFormat value) + { + return Enum.Parse(typeof(ImagePartType), value.ToString()).CastTo(); + } + + public static Xdr.EditAsValues ToOpenXml(this XLPicturePlacement value) + { + switch (value) + { + case XLPicturePlacement.FreeFloating: + return Xdr.EditAsValues.Absolute; + case XLPicturePlacement.Move: + return Xdr.EditAsValues.OneCell; + case XLPicturePlacement.MoveAndSize: + return Xdr.EditAsValues.TwoCell; + default: + throw new ArgumentOutOfRangeException("Not implemented value!"); + } + } + + #endregion To OpenXml + + #region To ClosedXml + + public static XLFontUnderlineValues ToClosedXml(this UnderlineValues value) + { + switch (value) + { + case UnderlineValues.Double: + return XLFontUnderlineValues.Double; + + case UnderlineValues.DoubleAccounting: + return XLFontUnderlineValues.DoubleAccounting; + + case UnderlineValues.None: + return XLFontUnderlineValues.None; + + case UnderlineValues.Single: + return XLFontUnderlineValues.Single; + + case UnderlineValues.SingleAccounting: + return XLFontUnderlineValues.SingleAccounting; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLPageOrientation ToClosedXml(this OrientationValues value) + { + switch (value) + { + case OrientationValues.Default: + return XLPageOrientation.Default; + + case OrientationValues.Landscape: + return XLPageOrientation.Landscape; + + case OrientationValues.Portrait: + return XLPageOrientation.Portrait; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLFontVerticalTextAlignmentValues ToClosedXml(this VerticalAlignmentRunValues value) + { + switch (value) + { + case VerticalAlignmentRunValues.Baseline: + return XLFontVerticalTextAlignmentValues.Baseline; + + case VerticalAlignmentRunValues.Subscript: + return XLFontVerticalTextAlignmentValues.Subscript; + + case VerticalAlignmentRunValues.Superscript: + return XLFontVerticalTextAlignmentValues.Superscript; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLFillPatternValues ToClosedXml(this PatternValues value) + { + switch (value) + { + case PatternValues.DarkDown: + return XLFillPatternValues.DarkDown; + + case PatternValues.DarkGray: + return XLFillPatternValues.DarkGray; + + case PatternValues.DarkGrid: + return XLFillPatternValues.DarkGrid; + + case PatternValues.DarkHorizontal: + return XLFillPatternValues.DarkHorizontal; + + case PatternValues.DarkTrellis: + return XLFillPatternValues.DarkTrellis; + + case PatternValues.DarkUp: + return XLFillPatternValues.DarkUp; + + case PatternValues.DarkVertical: + return XLFillPatternValues.DarkVertical; + + case PatternValues.Gray0625: + return XLFillPatternValues.Gray0625; + + case PatternValues.Gray125: + return XLFillPatternValues.Gray125; + + case PatternValues.LightDown: + return XLFillPatternValues.LightDown; + + case PatternValues.LightGray: + return XLFillPatternValues.LightGray; + + case PatternValues.LightGrid: + return XLFillPatternValues.LightGrid; + + case PatternValues.LightHorizontal: + return XLFillPatternValues.LightHorizontal; + + case PatternValues.LightTrellis: + return XLFillPatternValues.LightTrellis; + + case PatternValues.LightUp: + return XLFillPatternValues.LightUp; + + case PatternValues.LightVertical: + return XLFillPatternValues.LightVertical; + + case PatternValues.MediumGray: + return XLFillPatternValues.MediumGray; + + case PatternValues.None: + return XLFillPatternValues.None; + + case PatternValues.Solid: + return XLFillPatternValues.Solid; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLBorderStyleValues ToClosedXml(this BorderStyleValues value) + { + switch (value) + { + case BorderStyleValues.DashDot: + return XLBorderStyleValues.DashDot; + + case BorderStyleValues.DashDotDot: + return XLBorderStyleValues.DashDotDot; + + case BorderStyleValues.Dashed: + return XLBorderStyleValues.Dashed; + + case BorderStyleValues.Dotted: + return XLBorderStyleValues.Dotted; + + case BorderStyleValues.Double: + return XLBorderStyleValues.Double; + + case BorderStyleValues.Hair: + return XLBorderStyleValues.Hair; + + case BorderStyleValues.Medium: + return XLBorderStyleValues.Medium; + + case BorderStyleValues.MediumDashDot: + return XLBorderStyleValues.MediumDashDot; + + case BorderStyleValues.MediumDashDotDot: + return XLBorderStyleValues.MediumDashDotDot; + + case BorderStyleValues.MediumDashed: + return XLBorderStyleValues.MediumDashed; + + case BorderStyleValues.None: + return XLBorderStyleValues.None; + + case BorderStyleValues.SlantDashDot: + return XLBorderStyleValues.SlantDashDot; + + case BorderStyleValues.Thick: + return XLBorderStyleValues.Thick; + + case BorderStyleValues.Thin: + return XLBorderStyleValues.Thin; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLAlignmentHorizontalValues ToClosedXml(this HorizontalAlignmentValues value) + { + switch (value) + { + case HorizontalAlignmentValues.Center: + return XLAlignmentHorizontalValues.Center; + + case HorizontalAlignmentValues.CenterContinuous: + return XLAlignmentHorizontalValues.CenterContinuous; + + case HorizontalAlignmentValues.Distributed: + return XLAlignmentHorizontalValues.Distributed; + + case HorizontalAlignmentValues.Fill: + return XLAlignmentHorizontalValues.Fill; + + case HorizontalAlignmentValues.General: + return XLAlignmentHorizontalValues.General; + + case HorizontalAlignmentValues.Justify: + return XLAlignmentHorizontalValues.Justify; + + case HorizontalAlignmentValues.Left: + return XLAlignmentHorizontalValues.Left; + + case HorizontalAlignmentValues.Right: + return XLAlignmentHorizontalValues.Right; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLAlignmentVerticalValues ToClosedXml(this VerticalAlignmentValues value) + { + switch (value) + { + case VerticalAlignmentValues.Bottom: + return XLAlignmentVerticalValues.Bottom; + + case VerticalAlignmentValues.Center: + return XLAlignmentVerticalValues.Center; + + case VerticalAlignmentValues.Distributed: + return XLAlignmentVerticalValues.Distributed; + + case VerticalAlignmentValues.Justify: + return XLAlignmentVerticalValues.Justify; + + case VerticalAlignmentValues.Top: + return XLAlignmentVerticalValues.Top; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLPageOrderValues ToClosedXml(this PageOrderValues value) + { + switch (value) + { + case PageOrderValues.DownThenOver: + return XLPageOrderValues.DownThenOver; + + case PageOrderValues.OverThenDown: + return XLPageOrderValues.OverThenDown; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLShowCommentsValues ToClosedXml(this CellCommentsValues value) + { + switch (value) + { + case CellCommentsValues.AsDisplayed: + return XLShowCommentsValues.AsDisplayed; + + case CellCommentsValues.AtEnd: + return XLShowCommentsValues.AtEnd; + + case CellCommentsValues.None: + return XLShowCommentsValues.None; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLPrintErrorValues ToClosedXml(this PrintErrorValues value) + { + switch (value) + { + case PrintErrorValues.Blank: + return XLPrintErrorValues.Blank; + + case PrintErrorValues.Dash: + return XLPrintErrorValues.Dash; + + case PrintErrorValues.Displayed: + return XLPrintErrorValues.Displayed; + + case PrintErrorValues.NA: + return XLPrintErrorValues.NA; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLCalculateMode ToClosedXml(this CalculateModeValues value) + { + switch (value) + { + case CalculateModeValues.Auto: + return XLCalculateMode.Auto; + + case CalculateModeValues.AutoNoTable: + return XLCalculateMode.AutoNoTable; + + case CalculateModeValues.Manual: + return XLCalculateMode.Manual; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLReferenceStyle ToClosedXml(this ReferenceModeValues value) + { + switch (value) + { + case ReferenceModeValues.R1C1: + return XLReferenceStyle.R1C1; + + case ReferenceModeValues.A1: + return XLReferenceStyle.A1; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLAlignmentReadingOrderValues ToClosedXml(this uint value) + { + switch (value) + { + case 0: + return XLAlignmentReadingOrderValues.ContextDependent; + + case 1: + return XLAlignmentReadingOrderValues.LeftToRight; + + case 2: + return XLAlignmentReadingOrderValues.RightToLeft; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLTotalsRowFunction ToClosedXml(this TotalsRowFunctionValues value) + { + switch (value) + { + case TotalsRowFunctionValues.None: + return XLTotalsRowFunction.None; + + case TotalsRowFunctionValues.Sum: + return XLTotalsRowFunction.Sum; + + case TotalsRowFunctionValues.Minimum: + return XLTotalsRowFunction.Minimum; + + case TotalsRowFunctionValues.Maximum: + return XLTotalsRowFunction.Maximum; + + case TotalsRowFunctionValues.Average: + return XLTotalsRowFunction.Average; + + case TotalsRowFunctionValues.Count: + return XLTotalsRowFunction.Count; + + case TotalsRowFunctionValues.CountNumbers: + return XLTotalsRowFunction.CountNumbers; + + case TotalsRowFunctionValues.StandardDeviation: + return XLTotalsRowFunction.StandardDeviation; + + case TotalsRowFunctionValues.Variance: + return XLTotalsRowFunction.Variance; + + case TotalsRowFunctionValues.Custom: + return XLTotalsRowFunction.Custom; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLAllowedValues ToClosedXml(this DataValidationValues value) + { + switch (value) + { + case DataValidationValues.None: + return XLAllowedValues.AnyValue; + + case DataValidationValues.Custom: + return XLAllowedValues.Custom; + + case DataValidationValues.Date: + return XLAllowedValues.Date; + + case DataValidationValues.Decimal: + return XLAllowedValues.Decimal; + + case DataValidationValues.List: + return XLAllowedValues.List; + + case DataValidationValues.TextLength: + return XLAllowedValues.TextLength; + + case DataValidationValues.Time: + return XLAllowedValues.Time; + + case DataValidationValues.Whole: + return XLAllowedValues.WholeNumber; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLErrorStyle ToClosedXml(this DataValidationErrorStyleValues value) + { + switch (value) + { + case DataValidationErrorStyleValues.Information: + return XLErrorStyle.Information; + + case DataValidationErrorStyleValues.Warning: + return XLErrorStyle.Warning; + + case DataValidationErrorStyleValues.Stop: + return XLErrorStyle.Stop; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLOperator ToClosedXml(this DataValidationOperatorValues value) + { + switch (value) + { + case DataValidationOperatorValues.Between: + return XLOperator.Between; + + case DataValidationOperatorValues.GreaterThanOrEqual: + return XLOperator.EqualOrGreaterThan; + + case DataValidationOperatorValues.LessThanOrEqual: + return XLOperator.EqualOrLessThan; + + case DataValidationOperatorValues.Equal: + return XLOperator.EqualTo; + + case DataValidationOperatorValues.GreaterThan: + return XLOperator.GreaterThan; + + case DataValidationOperatorValues.LessThan: + return XLOperator.LessThan; + + case DataValidationOperatorValues.NotBetween: + return XLOperator.NotBetween; + + case DataValidationOperatorValues.NotEqual: + return XLOperator.NotEqualTo; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLWorksheetVisibility ToClosedXml(this SheetStateValues value) + { + switch (value) + { + case SheetStateValues.Visible: + return XLWorksheetVisibility.Visible; + + case SheetStateValues.Hidden: + return XLWorksheetVisibility.Hidden; + + case SheetStateValues.VeryHidden: + return XLWorksheetVisibility.VeryHidden; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLPhoneticAlignment ToClosedXml(this PhoneticAlignmentValues value) + { + switch (value) + { + case PhoneticAlignmentValues.Center: + return XLPhoneticAlignment.Center; + + case PhoneticAlignmentValues.Distributed: + return XLPhoneticAlignment.Distributed; + + case PhoneticAlignmentValues.Left: + return XLPhoneticAlignment.Left; + + case PhoneticAlignmentValues.NoControl: + return XLPhoneticAlignment.NoControl; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLPhoneticType ToClosedXml(this PhoneticValues value) + { + switch (value) + { + case PhoneticValues.FullWidthKatakana: return XLPhoneticType.FullWidthKatakana; + case PhoneticValues.HalfWidthKatakana: + return XLPhoneticType.HalfWidthKatakana; + + case PhoneticValues.Hiragana: + return XLPhoneticType.Hiragana; + + case PhoneticValues.NoConversion: + return XLPhoneticType.NoConversion; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLPivotSummary ToClosedXml(this DataConsolidateFunctionValues value) + { + switch (value) + { + case DataConsolidateFunctionValues.Sum: return XLPivotSummary.Sum; + case DataConsolidateFunctionValues.Count: return XLPivotSummary.Count; + case DataConsolidateFunctionValues.Average: return XLPivotSummary.Average; + case DataConsolidateFunctionValues.Minimum: return XLPivotSummary.Minimum; + case DataConsolidateFunctionValues.Maximum: return XLPivotSummary.Maximum; + case DataConsolidateFunctionValues.Product: return XLPivotSummary.Product; + case DataConsolidateFunctionValues.CountNumbers: return XLPivotSummary.CountNumbers; + case DataConsolidateFunctionValues.StandardDeviation: return XLPivotSummary.StandardDeviation; + case DataConsolidateFunctionValues.StandardDeviationP: return XLPivotSummary.PopulationStandardDeviation; + case DataConsolidateFunctionValues.Variance: return XLPivotSummary.Variance; + case DataConsolidateFunctionValues.VarianceP: return XLPivotSummary.PopulationVariance; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLPivotCalculation ToClosedXml(this ShowDataAsValues value) + { + switch (value) + { + case ShowDataAsValues.Normal: return XLPivotCalculation.Normal; + case ShowDataAsValues.Difference: return XLPivotCalculation.DifferenceFrom; + case ShowDataAsValues.Percent: return XLPivotCalculation.PercentageOf; + case ShowDataAsValues.PercentageDifference: return XLPivotCalculation.PercentageDifferenceFrom; + case ShowDataAsValues.RunTotal: return XLPivotCalculation.RunningTotal; + case ShowDataAsValues.PercentOfRaw: return XLPivotCalculation.PercentageOfRow; // There's a typo in the OpenXML SDK =) + case ShowDataAsValues.PercentOfColumn: return XLPivotCalculation.PercentageOfColumn; + case ShowDataAsValues.PercentOfTotal: return XLPivotCalculation.PercentageOfTotal; + case ShowDataAsValues.Index: return XLPivotCalculation.Index; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLFilterOperator ToClosedXml(this FilterOperatorValues value) + { + switch (value) + { + case FilterOperatorValues.Equal: return XLFilterOperator.Equal; + case FilterOperatorValues.NotEqual: return XLFilterOperator.NotEqual; + case FilterOperatorValues.GreaterThan: return XLFilterOperator.GreaterThan; + case FilterOperatorValues.LessThan: return XLFilterOperator.LessThan; + case FilterOperatorValues.GreaterThanOrEqual: return XLFilterOperator.EqualOrGreaterThan; + case FilterOperatorValues.LessThanOrEqual: return XLFilterOperator.EqualOrLessThan; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLFilterDynamicType ToClosedXml(this DynamicFilterValues value) + { + switch (value) + { + case DynamicFilterValues.AboveAverage: return XLFilterDynamicType.AboveAverage; + case DynamicFilterValues.BelowAverage: return XLFilterDynamicType.BelowAverage; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLSheetViewOptions ToClosedXml(this SheetViewValues value) + { + switch (value) + { + case SheetViewValues.Normal: return XLSheetViewOptions.Normal; + case SheetViewValues.PageBreakPreview: return XLSheetViewOptions.PageBreakPreview; + case SheetViewValues.PageLayout: return XLSheetViewOptions.PageLayout; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLLineStyle ToClosedXml(this Vml.StrokeLineStyleValues value) + { + switch (value) + { + case Vml.StrokeLineStyleValues.Single: return XLLineStyle.Single; + case Vml.StrokeLineStyleValues.ThickBetweenThin: return XLLineStyle.ThickBetweenThin; + case Vml.StrokeLineStyleValues.ThickThin: return XLLineStyle.ThickThin; + case Vml.StrokeLineStyleValues.ThinThick: return XLLineStyle.ThinThick; + case Vml.StrokeLineStyleValues.ThinThin: return XLLineStyle.ThinThin; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLConditionalFormatType ToClosedXml(this ConditionalFormatValues value) + { + switch (value) + { + case ConditionalFormatValues.Expression: return XLConditionalFormatType.Expression; + case ConditionalFormatValues.CellIs: return XLConditionalFormatType.CellIs; + case ConditionalFormatValues.ColorScale: return XLConditionalFormatType.ColorScale; + case ConditionalFormatValues.DataBar: return XLConditionalFormatType.DataBar; + case ConditionalFormatValues.IconSet: return XLConditionalFormatType.IconSet; + case ConditionalFormatValues.Top10: return XLConditionalFormatType.Top10; + case ConditionalFormatValues.UniqueValues: return XLConditionalFormatType.IsUnique; + case ConditionalFormatValues.DuplicateValues: return XLConditionalFormatType.IsDuplicate; + case ConditionalFormatValues.ContainsText: return XLConditionalFormatType.ContainsText; + case ConditionalFormatValues.NotContainsText: return XLConditionalFormatType.NotContainsText; + case ConditionalFormatValues.BeginsWith: return XLConditionalFormatType.StartsWith; + case ConditionalFormatValues.EndsWith: return XLConditionalFormatType.EndsWith; + case ConditionalFormatValues.ContainsBlanks: return XLConditionalFormatType.IsBlank; + case ConditionalFormatValues.NotContainsBlanks: return XLConditionalFormatType.NotBlank; + case ConditionalFormatValues.ContainsErrors: return XLConditionalFormatType.IsError; + case ConditionalFormatValues.NotContainsErrors: return XLConditionalFormatType.NotError; + case ConditionalFormatValues.TimePeriod: return XLConditionalFormatType.TimePeriod; + case ConditionalFormatValues.AboveAverage: return XLConditionalFormatType.AboveAverage; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLCFContentType ToClosedXml(this ConditionalFormatValueObjectValues value) + { + switch (value) + { + case ConditionalFormatValueObjectValues.Number: return XLCFContentType.Number; + case ConditionalFormatValueObjectValues.Percent: return XLCFContentType.Percent; + case ConditionalFormatValueObjectValues.Max: return XLCFContentType.Maximum; + case ConditionalFormatValueObjectValues.Min: return XLCFContentType.Minimum; + case ConditionalFormatValueObjectValues.Formula: return XLCFContentType.Formula; + case ConditionalFormatValueObjectValues.Percentile: return XLCFContentType.Percentile; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLCFOperator ToClosedXml(this ConditionalFormattingOperatorValues value) + { + switch (value) + { + case ConditionalFormattingOperatorValues.LessThan: return XLCFOperator.LessThan; + case ConditionalFormattingOperatorValues.LessThanOrEqual: return XLCFOperator.EqualOrLessThan; + case ConditionalFormattingOperatorValues.Equal: return XLCFOperator.Equal; + case ConditionalFormattingOperatorValues.NotEqual: return XLCFOperator.NotEqual; + case ConditionalFormattingOperatorValues.GreaterThanOrEqual: return XLCFOperator.EqualOrGreaterThan; + case ConditionalFormattingOperatorValues.GreaterThan: return XLCFOperator.GreaterThan; + case ConditionalFormattingOperatorValues.Between: return XLCFOperator.Between; + case ConditionalFormattingOperatorValues.NotBetween: return XLCFOperator.NotBetween; + case ConditionalFormattingOperatorValues.ContainsText: return XLCFOperator.Contains; + case ConditionalFormattingOperatorValues.NotContains: return XLCFOperator.NotContains; + case ConditionalFormattingOperatorValues.BeginsWith: return XLCFOperator.StartsWith; + case ConditionalFormattingOperatorValues.EndsWith: return XLCFOperator.EndsWith; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLIconSetStyle ToClosedXml(this IconSetValues value) + { + switch (value) + { + case IconSetValues.ThreeArrows: return XLIconSetStyle.ThreeArrows; + case IconSetValues.ThreeArrowsGray: return XLIconSetStyle.ThreeArrowsGray; + case IconSetValues.ThreeFlags: return XLIconSetStyle.ThreeFlags; + case IconSetValues.ThreeTrafficLights1: return XLIconSetStyle.ThreeTrafficLights1; + case IconSetValues.ThreeTrafficLights2: return XLIconSetStyle.ThreeTrafficLights2; + case IconSetValues.ThreeSigns: return XLIconSetStyle.ThreeSigns; + case IconSetValues.ThreeSymbols: return XLIconSetStyle.ThreeSymbols; + case IconSetValues.ThreeSymbols2: return XLIconSetStyle.ThreeSymbols2; + case IconSetValues.FourArrows: return XLIconSetStyle.FourArrows; + case IconSetValues.FourArrowsGray: return XLIconSetStyle.FourArrowsGray; + case IconSetValues.FourRedToBlack: return XLIconSetStyle.FourRedToBlack; + case IconSetValues.FourRating: return XLIconSetStyle.FourRating; + case IconSetValues.FourTrafficLights: return XLIconSetStyle.FourTrafficLights; + case IconSetValues.FiveArrows: return XLIconSetStyle.FiveArrows; + case IconSetValues.FiveArrowsGray: return XLIconSetStyle.FiveArrowsGray; + case IconSetValues.FiveRating: return XLIconSetStyle.FiveRating; + case IconSetValues.FiveQuarters: return XLIconSetStyle.FiveQuarters; + + #region default + + default: + throw new ApplicationException("Not implemented value!"); + + #endregion default + } + } + + public static XLPictureFormat ToClosedXml(this ImagePartType value) + { + return Enum.Parse(typeof(XLPictureFormat), value.ToString()).CastTo(); + } + + public static XLPicturePlacement ToClosedXml(this Xdr.EditAsValues value) + { + switch (value) + { + case Xdr.EditAsValues.Absolute: + return XLPicturePlacement.FreeFloating; + case Xdr.EditAsValues.OneCell: + return XLPicturePlacement.Move; + case Xdr.EditAsValues.TwoCell: + return XLPicturePlacement.MoveAndSize; + default: + throw new ArgumentOutOfRangeException(); + } + } + + #endregion To ClosedXml + } +} diff --git a/ClosedXML/Excel/Hyperlinks/IXLHyperlinks.cs b/ClosedXML/Excel/Hyperlinks/IXLHyperlinks.cs index 2fd3b44..a569e49 100644 --- a/ClosedXML/Excel/Hyperlinks/IXLHyperlinks.cs +++ b/ClosedXML/Excel/Hyperlinks/IXLHyperlinks.cs @@ -1,12 +1,12 @@ -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLHyperlinks: IEnumerable - { - void Add(XLHyperlink hyperlink); - void Delete(XLHyperlink hyperlink); - void Delete(IXLAddress address); - - } -} +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLHyperlinks: IEnumerable + { + void Add(XLHyperlink hyperlink); + void Delete(XLHyperlink hyperlink); + void Delete(IXLAddress address); + + } +} diff --git a/ClosedXML/Excel/Hyperlinks/XLHyperlink_Internal.cs b/ClosedXML/Excel/Hyperlinks/XLHyperlink_Internal.cs index db4f36b..2e5bebe 100644 --- a/ClosedXML/Excel/Hyperlinks/XLHyperlink_Internal.cs +++ b/ClosedXML/Excel/Hyperlinks/XLHyperlink_Internal.cs @@ -1,67 +1,67 @@ -using System; - -namespace ClosedXML.Excel -{ - public partial class XLHyperlink - { - internal XLHyperlink() - { - - } - - internal XLHyperlink(XLHyperlink hyperlink) - { - _externalAddress = hyperlink._externalAddress; - _internalAddress = hyperlink._internalAddress; - Tooltip = hyperlink.Tooltip; - IsExternal = hyperlink.IsExternal; - } - - internal void SetValues(String address, String tooltip) - { - Tooltip = tooltip; - if (address[0] == '.') - { - _externalAddress = new Uri(address, UriKind.Relative); - IsExternal = true; - } - else - { - Uri uri; - if(Uri.TryCreate(address, UriKind.Absolute, out uri)) - { - _externalAddress = uri; - IsExternal = true; - } - else - { - _internalAddress = address; - IsExternal = false; - } - } - } - - internal void SetValues(Uri uri, String tooltip) - { - Tooltip = tooltip; - _externalAddress = uri; - IsExternal = true; - } - - internal void SetValues(IXLCell cell, String tooltip) - { - Tooltip = tooltip; - _internalAddress = cell.Address.ToString(); - IsExternal = false; - } - - internal void SetValues(IXLRangeBase range, String tooltip) - { - Tooltip = tooltip; - _internalAddress = range.RangeAddress.ToString(); - IsExternal = false; - } - - internal XLWorksheet Worksheet { get; set; } - } -} +using System; + +namespace ClosedXML.Excel +{ + public partial class XLHyperlink + { + internal XLHyperlink() + { + + } + + internal XLHyperlink(XLHyperlink hyperlink) + { + _externalAddress = hyperlink._externalAddress; + _internalAddress = hyperlink._internalAddress; + Tooltip = hyperlink.Tooltip; + IsExternal = hyperlink.IsExternal; + } + + internal void SetValues(String address, String tooltip) + { + Tooltip = tooltip; + if (address[0] == '.') + { + _externalAddress = new Uri(address, UriKind.Relative); + IsExternal = true; + } + else + { + Uri uri; + if(Uri.TryCreate(address, UriKind.Absolute, out uri)) + { + _externalAddress = uri; + IsExternal = true; + } + else + { + _internalAddress = address; + IsExternal = false; + } + } + } + + internal void SetValues(Uri uri, String tooltip) + { + Tooltip = tooltip; + _externalAddress = uri; + IsExternal = true; + } + + internal void SetValues(IXLCell cell, String tooltip) + { + Tooltip = tooltip; + _internalAddress = cell.Address.ToString(); + IsExternal = false; + } + + internal void SetValues(IXLRangeBase range, String tooltip) + { + Tooltip = tooltip; + _internalAddress = range.RangeAddress.ToString(); + IsExternal = false; + } + + internal XLWorksheet Worksheet { get; set; } + } +} diff --git a/ClosedXML/Excel/Hyperlinks/XLHyperlink_public.cs b/ClosedXML/Excel/Hyperlinks/XLHyperlink_public.cs index 3f0dab5..12bd3da 100644 --- a/ClosedXML/Excel/Hyperlinks/XLHyperlink_public.cs +++ b/ClosedXML/Excel/Hyperlinks/XLHyperlink_public.cs @@ -1,102 +1,102 @@ -using System; -using System.Linq; - -namespace ClosedXML.Excel -{ - public partial class XLHyperlink - { - private Uri _externalAddress; - private String _internalAddress; - - public XLHyperlink(String address) - { - SetValues(address, String.Empty); - } - - public XLHyperlink(String address, String tooltip) - { - SetValues(address, tooltip); - } - - public XLHyperlink(IXLCell cell) - { - SetValues(cell, String.Empty); - } - - public XLHyperlink(IXLCell cell, String tooltip) - { - SetValues(cell, tooltip); - } - - public XLHyperlink(IXLRangeBase range) - { - SetValues(range, String.Empty); - } - - public XLHyperlink(IXLRangeBase range, String tooltip) - { - SetValues(range, tooltip); - } - - public XLHyperlink(Uri uri) - { - SetValues(uri, String.Empty); - } - - public XLHyperlink(Uri uri, String tooltip) - { - SetValues(uri, tooltip); - } - - public Boolean IsExternal { get; set; } - - public Uri ExternalAddress - { - get - { - return IsExternal ? _externalAddress : null; - } - set - { - _externalAddress = value; - IsExternal = true; - } - } - - public IXLCell Cell { get; internal set; } - - public String InternalAddress - { - get - { - if (IsExternal) - return null; - if (_internalAddress.Contains('!')) - { - return _internalAddress[0] != '\'' - ? String.Format("'{0}'!{1}", _internalAddress.Substring(0, _internalAddress.IndexOf('!')), - _internalAddress.Substring(_internalAddress.IndexOf('!') + 1)) - : _internalAddress; - } - return String.Format("'{0}'!{1}", Worksheet.Name, _internalAddress); - } - set - { - _internalAddress = value; - IsExternal = false; - } - } - - public String Tooltip { get; set; } - - public void Delete() - { - if (Cell == null) return; - Worksheet.Hyperlinks.Delete(Cell.Address); - if (Cell.Style.Font.FontColor.Equals(XLColor.FromTheme(XLThemeColor.Hyperlink))) - Cell.Style.Font.FontColor = Worksheet.Style.Font.FontColor; - - Cell.Style.Font.Underline = Worksheet.Style.Font.Underline; - } - } +using System; +using System.Linq; + +namespace ClosedXML.Excel +{ + public partial class XLHyperlink + { + private Uri _externalAddress; + private String _internalAddress; + + public XLHyperlink(String address) + { + SetValues(address, String.Empty); + } + + public XLHyperlink(String address, String tooltip) + { + SetValues(address, tooltip); + } + + public XLHyperlink(IXLCell cell) + { + SetValues(cell, String.Empty); + } + + public XLHyperlink(IXLCell cell, String tooltip) + { + SetValues(cell, tooltip); + } + + public XLHyperlink(IXLRangeBase range) + { + SetValues(range, String.Empty); + } + + public XLHyperlink(IXLRangeBase range, String tooltip) + { + SetValues(range, tooltip); + } + + public XLHyperlink(Uri uri) + { + SetValues(uri, String.Empty); + } + + public XLHyperlink(Uri uri, String tooltip) + { + SetValues(uri, tooltip); + } + + public Boolean IsExternal { get; set; } + + public Uri ExternalAddress + { + get + { + return IsExternal ? _externalAddress : null; + } + set + { + _externalAddress = value; + IsExternal = true; + } + } + + public IXLCell Cell { get; internal set; } + + public String InternalAddress + { + get + { + if (IsExternal) + return null; + if (_internalAddress.Contains('!')) + { + return _internalAddress[0] != '\'' + ? String.Format("'{0}'!{1}", _internalAddress.Substring(0, _internalAddress.IndexOf('!')), + _internalAddress.Substring(_internalAddress.IndexOf('!') + 1)) + : _internalAddress; + } + return String.Format("'{0}'!{1}", Worksheet.Name, _internalAddress); + } + set + { + _internalAddress = value; + IsExternal = false; + } + } + + public String Tooltip { get; set; } + + public void Delete() + { + if (Cell == null) return; + Worksheet.Hyperlinks.Delete(Cell.Address); + if (Cell.Style.Font.FontColor.Equals(XLColor.FromTheme(XLThemeColor.Hyperlink))) + Cell.Style.Font.FontColor = Worksheet.Style.Font.FontColor; + + Cell.Style.Font.Underline = Worksheet.Style.Font.Underline; + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Hyperlinks/XLHyperlinks.cs b/ClosedXML/Excel/Hyperlinks/XLHyperlinks.cs index 8d980da..6ba4cfc 100644 --- a/ClosedXML/Excel/Hyperlinks/XLHyperlinks.cs +++ b/ClosedXML/Excel/Hyperlinks/XLHyperlinks.cs @@ -1,34 +1,34 @@ -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - internal class XLHyperlinks: IXLHyperlinks - { - private Dictionary hyperlinks = new Dictionary(); - public IEnumerator GetEnumerator() - { - return hyperlinks.Values.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void Add(XLHyperlink hyperlink) - { - hyperlinks.Add(hyperlink.Cell.Address, hyperlink); - } - - public void Delete(XLHyperlink hyperlink) - { - hyperlinks.Remove(hyperlink.Cell.Address); - } - - public void Delete(IXLAddress address) - { - hyperlinks.Remove(address); - } - - } -} +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLHyperlinks: IXLHyperlinks + { + private Dictionary hyperlinks = new Dictionary(); + public IEnumerator GetEnumerator() + { + return hyperlinks.Values.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(XLHyperlink hyperlink) + { + hyperlinks.Add(hyperlink.Cell.Address, hyperlink); + } + + public void Delete(XLHyperlink hyperlink) + { + hyperlinks.Remove(hyperlink.Cell.Address); + } + + public void Delete(IXLAddress address) + { + hyperlinks.Remove(address); + } + + } +} diff --git a/ClosedXML/Excel/IXLOutline.cs b/ClosedXML/Excel/IXLOutline.cs index aae00ee..33b4711 100644 --- a/ClosedXML/Excel/IXLOutline.cs +++ b/ClosedXML/Excel/IXLOutline.cs @@ -1,11 +1,11 @@ - -namespace ClosedXML.Excel -{ - public enum XLOutlineSummaryVLocation { Top, Bottom }; - public enum XLOutlineSummaryHLocation { Left, Right }; - public interface IXLOutline - { - XLOutlineSummaryVLocation SummaryVLocation { get; set; } - XLOutlineSummaryHLocation SummaryHLocation { get; set; } - } -} + +namespace ClosedXML.Excel +{ + public enum XLOutlineSummaryVLocation { Top, Bottom }; + public enum XLOutlineSummaryHLocation { Left, Right }; + public interface IXLOutline + { + XLOutlineSummaryVLocation SummaryVLocation { get; set; } + XLOutlineSummaryHLocation SummaryHLocation { get; set; } + } +} diff --git a/ClosedXML/Excel/IXLSheetProtection.cs b/ClosedXML/Excel/IXLSheetProtection.cs index 149ae06..11ddf33 100644 --- a/ClosedXML/Excel/IXLSheetProtection.cs +++ b/ClosedXML/Excel/IXLSheetProtection.cs @@ -1,46 +1,46 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLSheetProtection - { - Boolean Protected { get; set; } - - Boolean AutoFilter { get; set; } - Boolean DeleteColumns { get; set; } - Boolean DeleteRows { get; set; } - Boolean FormatCells { get; set; } - Boolean FormatColumns { get; set; } - Boolean FormatRows { get; set; } - Boolean InsertColumns { get; set; } - Boolean InsertHyperlinks { get; set; } - Boolean InsertRows { get; set; } - Boolean Objects { get; set; } - Boolean PivotTables { get; set; } - Boolean Scenarios { get; set; } - Boolean SelectLockedCells { get; set; } - Boolean SelectUnlockedCells { get; set; } - Boolean Sort { get; set; } - - IXLSheetProtection SetAutoFilter(); IXLSheetProtection SetAutoFilter(Boolean value); - IXLSheetProtection SetDeleteColumns(); IXLSheetProtection SetDeleteColumns(Boolean value); - IXLSheetProtection SetDeleteRows(); IXLSheetProtection SetDeleteRows(Boolean value); - IXLSheetProtection SetFormatCells(); IXLSheetProtection SetFormatCells(Boolean value); - IXLSheetProtection SetFormatColumns(); IXLSheetProtection SetFormatColumns(Boolean value); - IXLSheetProtection SetFormatRows(); IXLSheetProtection SetFormatRows(Boolean value); - IXLSheetProtection SetInsertColumns(); IXLSheetProtection SetInsertColumns(Boolean value); - IXLSheetProtection SetInsertHyperlinks(); IXLSheetProtection SetInsertHyperlinks(Boolean value); - IXLSheetProtection SetInsertRows(); IXLSheetProtection SetInsertRows(Boolean value); - IXLSheetProtection SetObjects(); IXLSheetProtection SetObjects(Boolean value); - IXLSheetProtection SetPivotTables(); IXLSheetProtection SetPivotTables(Boolean value); - IXLSheetProtection SetScenarios(); IXLSheetProtection SetScenarios(Boolean value); - IXLSheetProtection SetSelectLockedCells(); IXLSheetProtection SetSelectLockedCells(Boolean value); - IXLSheetProtection SetSelectUnlockedCells(); IXLSheetProtection SetSelectUnlockedCells(Boolean value); - IXLSheetProtection SetSort(); IXLSheetProtection SetSort(Boolean value); - - IXLSheetProtection Protect(); - IXLSheetProtection Protect(String password); - IXLSheetProtection Unprotect(); - IXLSheetProtection Unprotect(String password); - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLSheetProtection + { + Boolean Protected { get; set; } + + Boolean AutoFilter { get; set; } + Boolean DeleteColumns { get; set; } + Boolean DeleteRows { get; set; } + Boolean FormatCells { get; set; } + Boolean FormatColumns { get; set; } + Boolean FormatRows { get; set; } + Boolean InsertColumns { get; set; } + Boolean InsertHyperlinks { get; set; } + Boolean InsertRows { get; set; } + Boolean Objects { get; set; } + Boolean PivotTables { get; set; } + Boolean Scenarios { get; set; } + Boolean SelectLockedCells { get; set; } + Boolean SelectUnlockedCells { get; set; } + Boolean Sort { get; set; } + + IXLSheetProtection SetAutoFilter(); IXLSheetProtection SetAutoFilter(Boolean value); + IXLSheetProtection SetDeleteColumns(); IXLSheetProtection SetDeleteColumns(Boolean value); + IXLSheetProtection SetDeleteRows(); IXLSheetProtection SetDeleteRows(Boolean value); + IXLSheetProtection SetFormatCells(); IXLSheetProtection SetFormatCells(Boolean value); + IXLSheetProtection SetFormatColumns(); IXLSheetProtection SetFormatColumns(Boolean value); + IXLSheetProtection SetFormatRows(); IXLSheetProtection SetFormatRows(Boolean value); + IXLSheetProtection SetInsertColumns(); IXLSheetProtection SetInsertColumns(Boolean value); + IXLSheetProtection SetInsertHyperlinks(); IXLSheetProtection SetInsertHyperlinks(Boolean value); + IXLSheetProtection SetInsertRows(); IXLSheetProtection SetInsertRows(Boolean value); + IXLSheetProtection SetObjects(); IXLSheetProtection SetObjects(Boolean value); + IXLSheetProtection SetPivotTables(); IXLSheetProtection SetPivotTables(Boolean value); + IXLSheetProtection SetScenarios(); IXLSheetProtection SetScenarios(Boolean value); + IXLSheetProtection SetSelectLockedCells(); IXLSheetProtection SetSelectLockedCells(Boolean value); + IXLSheetProtection SetSelectUnlockedCells(); IXLSheetProtection SetSelectUnlockedCells(Boolean value); + IXLSheetProtection SetSort(); IXLSheetProtection SetSort(Boolean value); + + IXLSheetProtection Protect(); + IXLSheetProtection Protect(String password); + IXLSheetProtection Unprotect(); + IXLSheetProtection Unprotect(String password); + } +} diff --git a/ClosedXML/Excel/IXLSheetView.cs b/ClosedXML/Excel/IXLSheetView.cs index 8628fa2..0aa27fe 100644 --- a/ClosedXML/Excel/IXLSheetView.cs +++ b/ClosedXML/Excel/IXLSheetView.cs @@ -1,67 +1,67 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLSheetViewOptions { Normal, PageBreakPreview, PageLayout } - - public interface IXLSheetView - { - /// - /// Gets or sets the column after which the horizontal split should take place. - /// - Int32 SplitColumn { get; set; } - - /// - /// Gets or sets the row after which the vertical split should take place. - /// - Int32 SplitRow { get; set; } - - XLSheetViewOptions View { get; set; } - - /// - /// Window zoom magnification for current view representing percent values. Horizontal and vertical scale together. - /// - /// Representing percent values ranging from 10 to 400. - Int32 ZoomScale { get; set; } - - /// - /// Zoom magnification to use when in normal view. Horizontal and vertical scale together - /// - /// Representing percent values ranging from 10 to 400. - Int32 ZoomScaleNormal { get; set; } - - /// - /// Zoom magnification to use when in page layout view. Horizontal and vertical scale together. - /// - /// Representing percent values ranging from 10 to 400. - Int32 ZoomScalePageLayoutView { get; set; } - - /// - /// Zoom magnification to use when in page break preview. Horizontal and vertical scale together. - /// - /// Representing percent values ranging from 10 to 400. - Int32 ZoomScaleSheetLayoutView { get; set; } - - /// - /// Freezes the specified rows and columns. - /// - /// The rows to freeze. - /// The columns to freeze. - void Freeze(Int32 rows, Int32 columns); - - /// - /// Freezes the left X columns. - /// - /// The columns to freeze. - void FreezeColumns(Int32 columns); - - //Boolean FreezePanes { get; set; } - /// - /// Freezes the top X rows. - /// - /// The rows to freeze. - void FreezeRows(Int32 rows); - - IXLSheetView SetView(XLSheetViewOptions value); - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLSheetViewOptions { Normal, PageBreakPreview, PageLayout } + + public interface IXLSheetView + { + /// + /// Gets or sets the column after which the horizontal split should take place. + /// + Int32 SplitColumn { get; set; } + + /// + /// Gets or sets the row after which the vertical split should take place. + /// + Int32 SplitRow { get; set; } + + XLSheetViewOptions View { get; set; } + + /// + /// Window zoom magnification for current view representing percent values. Horizontal and vertical scale together. + /// + /// Representing percent values ranging from 10 to 400. + Int32 ZoomScale { get; set; } + + /// + /// Zoom magnification to use when in normal view. Horizontal and vertical scale together + /// + /// Representing percent values ranging from 10 to 400. + Int32 ZoomScaleNormal { get; set; } + + /// + /// Zoom magnification to use when in page layout view. Horizontal and vertical scale together. + /// + /// Representing percent values ranging from 10 to 400. + Int32 ZoomScalePageLayoutView { get; set; } + + /// + /// Zoom magnification to use when in page break preview. Horizontal and vertical scale together. + /// + /// Representing percent values ranging from 10 to 400. + Int32 ZoomScaleSheetLayoutView { get; set; } + + /// + /// Freezes the specified rows and columns. + /// + /// The rows to freeze. + /// The columns to freeze. + void Freeze(Int32 rows, Int32 columns); + + /// + /// Freezes the left X columns. + /// + /// The columns to freeze. + void FreezeColumns(Int32 columns); + + //Boolean FreezePanes { get; set; } + /// + /// Freezes the top X rows. + /// + /// The rows to freeze. + void FreezeRows(Int32 rows); + + IXLSheetView SetView(XLSheetViewOptions value); + } +} diff --git a/ClosedXML/Excel/IXLTheme.cs b/ClosedXML/Excel/IXLTheme.cs index b4e1ccb..17e4e57 100644 --- a/ClosedXML/Excel/IXLTheme.cs +++ b/ClosedXML/Excel/IXLTheme.cs @@ -1,23 +1,23 @@ -using ClosedXML.Excel; -using System.Drawing; - -namespace ClosedXML.Excel -{ - public interface IXLTheme - { - XLColor Background1 { get; set; } - XLColor Text1 { get; set; } - XLColor Background2 { get; set; } - XLColor Text2 { get; set; } - XLColor Accent1 { get; set; } - XLColor Accent2 { get; set; } - XLColor Accent3 { get; set; } - XLColor Accent4 { get; set; } - XLColor Accent5 { get; set; } - XLColor Accent6 { get; set; } - XLColor Hyperlink { get; set; } - XLColor FollowedHyperlink { get; set; } - - XLColor ResolveThemeColor(XLThemeColor themeColor); - } -} +using ClosedXML.Excel; +using System.Drawing; + +namespace ClosedXML.Excel +{ + public interface IXLTheme + { + XLColor Background1 { get; set; } + XLColor Text1 { get; set; } + XLColor Background2 { get; set; } + XLColor Text2 { get; set; } + XLColor Accent1 { get; set; } + XLColor Accent2 { get; set; } + XLColor Accent3 { get; set; } + XLColor Accent4 { get; set; } + XLColor Accent5 { get; set; } + XLColor Accent6 { get; set; } + XLColor Hyperlink { get; set; } + XLColor FollowedHyperlink { get; set; } + + XLColor ResolveThemeColor(XLThemeColor themeColor); + } +} diff --git a/ClosedXML/Excel/IXLWorksheet.cs b/ClosedXML/Excel/IXLWorksheet.cs index cf5b21b..b5aecd7 100644 --- a/ClosedXML/Excel/IXLWorksheet.cs +++ b/ClosedXML/Excel/IXLWorksheet.cs @@ -1,381 +1,455 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public enum XLWorksheetVisibility { Visible, Hidden, VeryHidden } - public interface IXLWorksheet : IXLRangeBase - { - /// - /// Gets the workbook that contains this worksheet - /// - XLWorkbook Workbook { get; } - - /// - /// Gets or sets the default column width for this worksheet. - /// - Double ColumnWidth { get; set; } - /// - /// Gets or sets the default row height for this worksheet. - /// - Double RowHeight { get; set; } - - /// - /// Gets or sets the name (caption) of this worksheet. - /// - String Name { get; set; } - - /// - /// Gets or sets the position of the sheet. - /// When setting the Position all other sheets' positions are shifted accordingly. - /// - Int32 Position { get; set; } - - /// - /// Gets an object to manipulate the sheet's print options. - /// - IXLPageSetup PageSetup { get; } - /// - /// Gets an object to manipulate the Outline levels. - /// - IXLOutline Outline { get; } - - /// - /// Gets the first row of the worksheet. - /// - IXLRow FirstRow(); - /// - /// Gets the first row of the worksheet that contains a cell with a value. - /// Formatted empty cells do not count. - /// - IXLRow FirstRowUsed(); - /// - /// Gets the first row of the worksheet that contains a cell with a value. - /// - /// If set to true formatted empty cells will count as used. - IXLRow FirstRowUsed(Boolean includeFormats); - /// - /// Gets the last row of the worksheet. - /// - IXLRow LastRow(); - /// - /// Gets the last row of the worksheet that contains a cell with a value. - /// - IXLRow LastRowUsed(); - /// - /// Gets the last row of the worksheet that contains a cell with a value. - /// - /// If set to true formatted empty cells will count as used. - IXLRow LastRowUsed(Boolean includeFormats); - /// - /// Gets the first column of the worksheet. - /// - IXLColumn FirstColumn(); - /// - /// Gets the first column of the worksheet that contains a cell with a value. - /// - IXLColumn FirstColumnUsed(); - /// - /// Gets the first column of the worksheet that contains a cell with a value. - /// - /// If set to true formatted empty cells will count as used. - IXLColumn FirstColumnUsed(Boolean includeFormats); - /// - /// Gets the last column of the worksheet. - /// - IXLColumn LastColumn(); - /// - /// Gets the last column of the worksheet that contains a cell with a value. - /// - IXLColumn LastColumnUsed(); - /// - /// Gets the last column of the worksheet that contains a cell with a value. - /// - /// If set to true formatted empty cells will count as used. - IXLColumn LastColumnUsed(Boolean includeFormats); - /// - /// Gets a collection of all columns in this worksheet. - /// - IXLColumns Columns(); - /// - /// Gets a collection of the specified columns in this worksheet, separated by commas. - /// e.g. Columns("G:H"), Columns("10:11,13:14"), Columns("P:Q,S:T"), Columns("V") - /// - /// The columns to return. - IXLColumns Columns(String columns); - /// - /// Gets a collection of the specified columns in this worksheet. - /// - /// The first column to return. - /// The last column to return. - IXLColumns Columns(String firstColumn, String lastColumn); - /// - /// Gets a collection of the specified columns in this worksheet. - /// - /// The first column to return. - /// The last column to return. - IXLColumns Columns(Int32 firstColumn, Int32 lastColumn); - /// - /// Gets a collection of all rows in this worksheet. - /// - IXLRows Rows(); - /// - /// Gets a collection of the specified rows in this worksheet, separated by commas. - /// e.g. Rows("4:5"), Rows("7:8,10:11"), Rows("13") - /// - /// The rows to return. - IXLRows Rows(String rows); - /// - /// Gets a collection of the specified rows in this worksheet. - /// - /// The first row to return. - /// The last row to return. - /// - IXLRows Rows(Int32 firstRow, Int32 lastRow); - /// - /// Gets the specified row of the worksheet. - /// - /// The worksheet's row. - IXLRow Row(Int32 row); - /// - /// Gets the specified column of the worksheet. - /// - /// The worksheet's column. - IXLColumn Column(Int32 column); - /// - /// Gets the specified column of the worksheet. - /// - /// The worksheet's column. - IXLColumn Column(String column); - /// - /// Gets the cell at the specified row and column. - /// - /// The cell's row. - /// The cell's column. - IXLCell Cell(int row, int column); - /// Gets the cell at the specified address. - /// The cell address in the worksheet. - IXLCell Cell(string cellAddressInRange); - /// - /// Gets the cell at the specified row and column. - /// - /// The cell's row. - /// The cell's column. - IXLCell Cell(int row, string column); - /// Gets the cell at the specified address. - /// The cell address in the worksheet. - IXLCell Cell(IXLAddress cellAddressInRange); - - /// - /// Returns the specified range. - /// - /// The range boundaries. - IXLRange Range(IXLRangeAddress rangeAddress); - - /// Returns the specified range. - /// e.g. Range("A1"), Range("A1:C2") - /// The range boundaries. - IXLRange Range(string rangeAddress); - - /// Returns the specified range. - /// The first cell in the range. - /// The last cell in the range. - IXLRange Range(IXLCell firstCell, IXLCell lastCell); - - /// Returns the specified range. - /// The first cell address in the worksheet. - /// The last cell address in the worksheet. - IXLRange Range(string firstCellAddress, string lastCellAddress); - - /// Returns the specified range. - /// The first cell address in the worksheet. - /// The last cell address in the worksheet. - IXLRange Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress); - - /// Returns a collection of ranges, separated by commas. - /// e.g. Ranges("A1"), Ranges("A1:C2"), Ranges("A1:B2,D1:D4") - /// The ranges to return. - IXLRanges Ranges(string ranges); - - /// Returns the specified range. - /// The first cell's row of the range to return. - /// The first cell's column of the range to return. - /// The last cell's row of the range to return. - /// The last cell's column of the range to return. - /// . - IXLRange Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn); - - /// Gets the number of rows in this worksheet. - int RowCount(); - - /// Gets the number of columns in this worksheet. - int ColumnCount(); - - /// - /// Collapses all outlined rows. - /// - IXLWorksheet CollapseRows(); - /// - /// Collapses all outlined columns. - /// - IXLWorksheet CollapseColumns(); - /// - /// Expands all outlined rows. - /// - IXLWorksheet ExpandRows(); - /// - /// Expands all outlined columns. - /// - IXLWorksheet ExpandColumns(); - - /// - /// Collapses the outlined rows of the specified level. - /// - /// The outline level. - IXLWorksheet CollapseRows(Int32 outlineLevel); - /// - /// Collapses the outlined columns of the specified level. - /// - /// The outline level. - IXLWorksheet CollapseColumns(Int32 outlineLevel); - /// - /// Expands the outlined rows of the specified level. - /// - /// The outline level. - IXLWorksheet ExpandRows(Int32 outlineLevel); - /// - /// Expands the outlined columns of the specified level. - /// - /// The outline level. - IXLWorksheet ExpandColumns(Int32 outlineLevel); - - /// - /// Deletes this worksheet. - /// - void Delete(); - - - /// - /// Gets an object to manage this worksheet's named ranges. - /// - IXLNamedRanges NamedRanges { get; } - /// - /// Gets the specified named range. - /// - /// Name of the range. - IXLNamedRange NamedRange(String rangeName); - - /// - /// Gets an object to manage how the worksheet is going to displayed by Excel. - /// - IXLSheetView SheetView { get; } - - /// - /// Gets the Excel table of the given index - /// - /// Index of the table to return - IXLTable Table(Int32 index); - /// - /// Gets the Excel table of the given name - /// - /// Name of the table to return - IXLTable Table(String name); - /// - /// Gets an object to manage this worksheet's Excel tables - /// - IXLTables Tables { get; } - - /// - /// Copies the - /// - /// - /// - IXLWorksheet CopyTo(String newSheetName); - IXLWorksheet CopyTo(String newSheetName, Int32 position); - IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName); - IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName, Int32 position); - - IXLRange RangeUsed(); - IXLRange RangeUsed(bool includeFormats); - - IXLDataValidations DataValidations { get; } - - XLWorksheetVisibility Visibility { get; set; } - IXLWorksheet Hide(); - IXLWorksheet Unhide(); - - IXLSheetProtection Protection { get; } - IXLSheetProtection Protect(); - IXLSheetProtection Protect(String password); - IXLSheetProtection Unprotect(); - IXLSheetProtection Unprotect(String password); - - IXLSortElements SortRows { get; } - IXLSortElements SortColumns { get; } - - IXLRange Sort(); - - IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - - //IXLCharts Charts { get; } - - Boolean ShowFormulas { get; set; } - Boolean ShowGridLines { get; set; } - Boolean ShowOutlineSymbols { get; set; } - Boolean ShowRowColHeaders { get; set; } - Boolean ShowRuler { get; set; } - Boolean ShowWhiteSpace { get; set; } - Boolean ShowZeros { get; set; } - - IXLWorksheet SetShowFormulas(); IXLWorksheet SetShowFormulas(Boolean value); - IXLWorksheet SetShowGridLines(); IXLWorksheet SetShowGridLines(Boolean value); - IXLWorksheet SetShowOutlineSymbols(); IXLWorksheet SetShowOutlineSymbols(Boolean value); - IXLWorksheet SetShowRowColHeaders(); IXLWorksheet SetShowRowColHeaders(Boolean value); - IXLWorksheet SetShowRuler(); IXLWorksheet SetShowRuler(Boolean value); - IXLWorksheet SetShowWhiteSpace(); IXLWorksheet SetShowWhiteSpace(Boolean value); - IXLWorksheet SetShowZeros(); IXLWorksheet SetShowZeros(Boolean value); - - - XLColor TabColor { get; set; } - IXLWorksheet SetTabColor(XLColor color); - - Boolean TabSelected { get; set; } - Boolean TabActive { get; set; } - - IXLWorksheet SetTabSelected(); IXLWorksheet SetTabSelected(Boolean value); - IXLWorksheet SetTabActive(); IXLWorksheet SetTabActive(Boolean value); - - IXLPivotTable PivotTable(String name); - IXLPivotTables PivotTables { get; } - - Boolean RightToLeft { get; set; } - IXLWorksheet SetRightToLeft(); IXLWorksheet SetRightToLeft(Boolean value); - - IXLBaseAutoFilter AutoFilter { get; } - - IXLRows RowsUsed(Boolean includeFormats = false, Func predicate = null); - IXLRows RowsUsed(Func predicate); - IXLColumns ColumnsUsed(Boolean includeFormats = false, Func predicate = null); - IXLColumns ColumnsUsed(Func predicate); - - IXLRanges MergedRanges { get; } - IXLConditionalFormats ConditionalFormats { get; } - - IXLRanges SelectedRanges { get; } - IXLCell ActiveCell { get; set; } - - Object Evaluate(String expression); - - String Author { get; set; } - - List Pictures(); - - /// - /// Adds image to worksheet - /// - /// XLPicture object to be added. - void AddPicture(Drawings.XLPicture pic); - } -} +using ClosedXML.Excel.Drawings; +using System; +using System.Drawing; +using System.IO; + +namespace ClosedXML.Excel +{ + public enum XLWorksheetVisibility { Visible, Hidden, VeryHidden } + + public interface IXLWorksheet : IXLRangeBase + { + /// + /// Gets the workbook that contains this worksheet + /// + XLWorkbook Workbook { get; } + + /// + /// Gets or sets the default column width for this worksheet. + /// + Double ColumnWidth { get; set; } + + /// + /// Gets or sets the default row height for this worksheet. + /// + Double RowHeight { get; set; } + + /// + /// Gets or sets the name (caption) of this worksheet. + /// + String Name { get; set; } + + /// + /// Gets or sets the position of the sheet. + /// When setting the Position all other sheets' positions are shifted accordingly. + /// + Int32 Position { get; set; } + + /// + /// Gets an object to manipulate the sheet's print options. + /// + IXLPageSetup PageSetup { get; } + + /// + /// Gets an object to manipulate the Outline levels. + /// + IXLOutline Outline { get; } + + /// + /// Gets the first row of the worksheet. + /// + IXLRow FirstRow(); + + /// + /// Gets the first row of the worksheet that contains a cell with a value. + /// Formatted empty cells do not count. + /// + IXLRow FirstRowUsed(); + + /// + /// Gets the first row of the worksheet that contains a cell with a value. + /// + /// If set to true formatted empty cells will count as used. + IXLRow FirstRowUsed(Boolean includeFormats); + + /// + /// Gets the last row of the worksheet. + /// + IXLRow LastRow(); + + /// + /// Gets the last row of the worksheet that contains a cell with a value. + /// + IXLRow LastRowUsed(); + + /// + /// Gets the last row of the worksheet that contains a cell with a value. + /// + /// If set to true formatted empty cells will count as used. + IXLRow LastRowUsed(Boolean includeFormats); + + /// + /// Gets the first column of the worksheet. + /// + IXLColumn FirstColumn(); + + /// + /// Gets the first column of the worksheet that contains a cell with a value. + /// + IXLColumn FirstColumnUsed(); + + /// + /// Gets the first column of the worksheet that contains a cell with a value. + /// + /// If set to true formatted empty cells will count as used. + IXLColumn FirstColumnUsed(Boolean includeFormats); + + /// + /// Gets the last column of the worksheet. + /// + IXLColumn LastColumn(); + + /// + /// Gets the last column of the worksheet that contains a cell with a value. + /// + IXLColumn LastColumnUsed(); + + /// + /// Gets the last column of the worksheet that contains a cell with a value. + /// + /// If set to true formatted empty cells will count as used. + IXLColumn LastColumnUsed(Boolean includeFormats); + + /// + /// Gets a collection of all columns in this worksheet. + /// + IXLColumns Columns(); + + /// + /// Gets a collection of the specified columns in this worksheet, separated by commas. + /// e.g. Columns("G:H"), Columns("10:11,13:14"), Columns("P:Q,S:T"), Columns("V") + /// + /// The columns to return. + IXLColumns Columns(String columns); + + /// + /// Gets a collection of the specified columns in this worksheet. + /// + /// The first column to return. + /// The last column to return. + IXLColumns Columns(String firstColumn, String lastColumn); + + /// + /// Gets a collection of the specified columns in this worksheet. + /// + /// The first column to return. + /// The last column to return. + IXLColumns Columns(Int32 firstColumn, Int32 lastColumn); + + /// + /// Gets a collection of all rows in this worksheet. + /// + IXLRows Rows(); + + /// + /// Gets a collection of the specified rows in this worksheet, separated by commas. + /// e.g. Rows("4:5"), Rows("7:8,10:11"), Rows("13") + /// + /// The rows to return. + IXLRows Rows(String rows); + + /// + /// Gets a collection of the specified rows in this worksheet. + /// + /// The first row to return. + /// The last row to return. + /// + IXLRows Rows(Int32 firstRow, Int32 lastRow); + + /// + /// Gets the specified row of the worksheet. + /// + /// The worksheet's row. + IXLRow Row(Int32 row); + + /// + /// Gets the specified column of the worksheet. + /// + /// The worksheet's column. + IXLColumn Column(Int32 column); + + /// + /// Gets the specified column of the worksheet. + /// + /// The worksheet's column. + IXLColumn Column(String column); + + /// + /// Gets the cell at the specified row and column. + /// + /// The cell's row. + /// The cell's column. + IXLCell Cell(int row, int column); + + /// Gets the cell at the specified address. + /// The cell address in the worksheet. + IXLCell Cell(string cellAddressInRange); + + /// + /// Gets the cell at the specified row and column. + /// + /// The cell's row. + /// The cell's column. + IXLCell Cell(int row, string column); + + /// Gets the cell at the specified address. + /// The cell address in the worksheet. + IXLCell Cell(IXLAddress cellAddressInRange); + + /// + /// Returns the specified range. + /// + /// The range boundaries. + IXLRange Range(IXLRangeAddress rangeAddress); + + /// Returns the specified range. + /// e.g. Range("A1"), Range("A1:C2") + /// The range boundaries. + IXLRange Range(string rangeAddress); + + /// Returns the specified range. + /// The first cell in the range. + /// The last cell in the range. + IXLRange Range(IXLCell firstCell, IXLCell lastCell); + + /// Returns the specified range. + /// The first cell address in the worksheet. + /// The last cell address in the worksheet. + IXLRange Range(string firstCellAddress, string lastCellAddress); + + /// Returns the specified range. + /// The first cell address in the worksheet. + /// The last cell address in the worksheet. + IXLRange Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress); + + /// Returns a collection of ranges, separated by commas. + /// e.g. Ranges("A1"), Ranges("A1:C2"), Ranges("A1:B2,D1:D4") + /// The ranges to return. + IXLRanges Ranges(string ranges); + + /// Returns the specified range. + /// The first cell's row of the range to return. + /// The first cell's column of the range to return. + /// The last cell's row of the range to return. + /// The last cell's column of the range to return. + /// . + IXLRange Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn); + + /// Gets the number of rows in this worksheet. + int RowCount(); + + /// Gets the number of columns in this worksheet. + int ColumnCount(); + + /// + /// Collapses all outlined rows. + /// + IXLWorksheet CollapseRows(); + + /// + /// Collapses all outlined columns. + /// + IXLWorksheet CollapseColumns(); + + /// + /// Expands all outlined rows. + /// + IXLWorksheet ExpandRows(); + + /// + /// Expands all outlined columns. + /// + IXLWorksheet ExpandColumns(); + + /// + /// Collapses the outlined rows of the specified level. + /// + /// The outline level. + IXLWorksheet CollapseRows(Int32 outlineLevel); + + /// + /// Collapses the outlined columns of the specified level. + /// + /// The outline level. + IXLWorksheet CollapseColumns(Int32 outlineLevel); + + /// + /// Expands the outlined rows of the specified level. + /// + /// The outline level. + IXLWorksheet ExpandRows(Int32 outlineLevel); + + /// + /// Expands the outlined columns of the specified level. + /// + /// The outline level. + IXLWorksheet ExpandColumns(Int32 outlineLevel); + + /// + /// Deletes this worksheet. + /// + void Delete(); + + /// + /// Gets an object to manage this worksheet's named ranges. + /// + IXLNamedRanges NamedRanges { get; } + + /// + /// Gets the specified named range. + /// + /// Name of the range. + IXLNamedRange NamedRange(String rangeName); + + /// + /// Gets an object to manage how the worksheet is going to displayed by Excel. + /// + IXLSheetView SheetView { get; } + + /// + /// Gets the Excel table of the given index + /// + /// Index of the table to return + IXLTable Table(Int32 index); + + /// + /// Gets the Excel table of the given name + /// + /// Name of the table to return + IXLTable Table(String name); + + /// + /// Gets an object to manage this worksheet's Excel tables + /// + IXLTables Tables { get; } + + /// + /// Copies the + /// + /// + /// + IXLWorksheet CopyTo(String newSheetName); + + IXLWorksheet CopyTo(String newSheetName, Int32 position); + + IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName); + + IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName, Int32 position); + + IXLRange RangeUsed(); + + IXLRange RangeUsed(bool includeFormats); + + IXLDataValidations DataValidations { get; } + + XLWorksheetVisibility Visibility { get; set; } + + IXLWorksheet Hide(); + + IXLWorksheet Unhide(); + + IXLSheetProtection Protection { get; } + + IXLSheetProtection Protect(); + + IXLSheetProtection Protect(String password); + + IXLSheetProtection Unprotect(); + + IXLSheetProtection Unprotect(String password); + + IXLSortElements SortRows { get; } + IXLSortElements SortColumns { get; } + + IXLRange Sort(); + + IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + //IXLCharts Charts { get; } + + Boolean ShowFormulas { get; set; } + Boolean ShowGridLines { get; set; } + Boolean ShowOutlineSymbols { get; set; } + Boolean ShowRowColHeaders { get; set; } + Boolean ShowRuler { get; set; } + Boolean ShowWhiteSpace { get; set; } + Boolean ShowZeros { get; set; } + + IXLWorksheet SetShowFormulas(); IXLWorksheet SetShowFormulas(Boolean value); + + IXLWorksheet SetShowGridLines(); IXLWorksheet SetShowGridLines(Boolean value); + + IXLWorksheet SetShowOutlineSymbols(); IXLWorksheet SetShowOutlineSymbols(Boolean value); + + IXLWorksheet SetShowRowColHeaders(); IXLWorksheet SetShowRowColHeaders(Boolean value); + + IXLWorksheet SetShowRuler(); IXLWorksheet SetShowRuler(Boolean value); + + IXLWorksheet SetShowWhiteSpace(); IXLWorksheet SetShowWhiteSpace(Boolean value); + + IXLWorksheet SetShowZeros(); IXLWorksheet SetShowZeros(Boolean value); + + XLColor TabColor { get; set; } + + IXLWorksheet SetTabColor(XLColor color); + + Boolean TabSelected { get; set; } + Boolean TabActive { get; set; } + + IXLWorksheet SetTabSelected(); IXLWorksheet SetTabSelected(Boolean value); + + IXLWorksheet SetTabActive(); IXLWorksheet SetTabActive(Boolean value); + + IXLPivotTable PivotTable(String name); + + IXLPivotTables PivotTables { get; } + + Boolean RightToLeft { get; set; } + + IXLWorksheet SetRightToLeft(); IXLWorksheet SetRightToLeft(Boolean value); + + IXLBaseAutoFilter AutoFilter { get; } + + IXLRows RowsUsed(Boolean includeFormats = false, Func predicate = null); + + IXLRows RowsUsed(Func predicate); + + IXLColumns ColumnsUsed(Boolean includeFormats = false, Func predicate = null); + + IXLColumns ColumnsUsed(Func predicate); + + IXLRanges MergedRanges { get; } + IXLConditionalFormats ConditionalFormats { get; } + + IXLRanges SelectedRanges { get; } + IXLCell ActiveCell { get; set; } + + Object Evaluate(String expression); + + String Author { get; set; } + + IXLPictures Pictures { get; } + + IXLPicture Picture(String pictureName); + + IXLPicture AddPicture(Stream stream); + + IXLPicture AddPicture(Stream stream, String name); + + IXLPicture AddPicture(Stream stream, XLPictureFormat format); + + IXLPicture AddPicture(Stream stream, XLPictureFormat format, String name); + + IXLPicture AddPicture(Bitmap bitmap); + + IXLPicture AddPicture(Bitmap bitmap, String name); + + IXLPicture AddPicture(String imageFile); + + IXLPicture AddPicture(String imageFile, String name); + } +} diff --git a/ClosedXML/Excel/IXLWorksheets.cs b/ClosedXML/Excel/IXLWorksheets.cs index ea10629..f811507 100644 --- a/ClosedXML/Excel/IXLWorksheets.cs +++ b/ClosedXML/Excel/IXLWorksheets.cs @@ -1,24 +1,24 @@ -using System; -using System.Collections.Generic; -using System.Data; - -namespace ClosedXML.Excel -{ - public interface IXLWorksheets: IEnumerable - { - int Count { get; } - bool TryGetWorksheet(string sheetName,out IXLWorksheet worksheet); - - IXLWorksheet Worksheet(String sheetName); - IXLWorksheet Worksheet(Int32 position); - IXLWorksheet Add(String sheetName); - IXLWorksheet Add(String sheetName, Int32 position); - IXLWorksheet Add(DataTable dataTable); - IXLWorksheet Add(DataTable dataTable, String sheetName); - void Add(DataSet dataSet); - void Delete(String sheetName); - void Delete(Int32 position); - - - } -} +using System; +using System.Collections.Generic; +using System.Data; + +namespace ClosedXML.Excel +{ + public interface IXLWorksheets: IEnumerable + { + int Count { get; } + bool TryGetWorksheet(string sheetName,out IXLWorksheet worksheet); + + IXLWorksheet Worksheet(String sheetName); + IXLWorksheet Worksheet(Int32 position); + IXLWorksheet Add(String sheetName); + IXLWorksheet Add(String sheetName, Int32 position); + IXLWorksheet Add(DataTable dataTable); + IXLWorksheet Add(DataTable dataTable, String sheetName); + void Add(DataSet dataSet); + void Delete(String sheetName); + void Delete(Int32 position); + + + } +} diff --git a/ClosedXML/Excel/Misc/XLCallbackAction.cs b/ClosedXML/Excel/Misc/XLCallbackAction.cs index 9238200..db031fc 100644 --- a/ClosedXML/Excel/Misc/XLCallbackAction.cs +++ b/ClosedXML/Excel/Misc/XLCallbackAction.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/ClosedXML/Excel/Misc/XLDictionary.cs b/ClosedXML/Excel/Misc/XLDictionary.cs index a79707c..b386e89 100644 --- a/ClosedXML/Excel/Misc/XLDictionary.cs +++ b/ClosedXML/Excel/Misc/XLDictionary.cs @@ -1,32 +1,32 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public class XLDictionary: Dictionary - { - public XLDictionary() - { - - } - public XLDictionary(XLDictionary other) - { - other.Values.ForEach(Add); - } - - public void Initialize(T value) - { - if (Count > 0) - Clear(); - - Add(value); - } - - public void Add(T value) - { - Add(Count + 1, value); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public class XLDictionary: Dictionary + { + public XLDictionary() + { + + } + public XLDictionary(XLDictionary other) + { + other.Values.ForEach(Add); + } + + public void Initialize(T value) + { + if (Count > 0) + Clear(); + + Add(value); + } + + public void Add(T value) + { + Add(Count + 1, value); + } + } +} diff --git a/ClosedXML/Excel/Misc/XLFormula.cs b/ClosedXML/Excel/Misc/XLFormula.cs index 2ff7a44..34cea84 100644 --- a/ClosedXML/Excel/Misc/XLFormula.cs +++ b/ClosedXML/Excel/Misc/XLFormula.cs @@ -1,58 +1,58 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public class XLFormula - { - public XLFormula() - {} - - public XLFormula(XLFormula defaultFormula) - { - _value = defaultFormula._value; - IsFormula = defaultFormula.IsFormula; - } - - public XLFormula(String value) - { - Value = value; - } - - public XLFormula(double value) - { - Value = value.ToInvariantString(); - } - - public XLFormula(int value) - { - Value = value.ToInvariantString(); - } - - internal String _value; - public String Value - { - get { return _value; } - set - { - if (value == null) - { - _value = String.Empty; - } - else - { - _value = value.Trim(); - IsFormula = !XLHelper.IsNullOrWhiteSpace(_value) && _value.TrimStart()[0] == '=' ; - if (IsFormula) - _value = _value.Substring(1); - } - - - } - } - - public Boolean IsFormula { get; internal set; } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public class XLFormula + { + public XLFormula() + {} + + public XLFormula(XLFormula defaultFormula) + { + _value = defaultFormula._value; + IsFormula = defaultFormula.IsFormula; + } + + public XLFormula(String value) + { + Value = value; + } + + public XLFormula(double value) + { + Value = value.ToInvariantString(); + } + + public XLFormula(int value) + { + Value = value.ToInvariantString(); + } + + internal String _value; + public String Value + { + get { return _value; } + set + { + if (value == null) + { + _value = String.Empty; + } + else + { + _value = value.Trim(); + IsFormula = !XLHelper.IsNullOrWhiteSpace(_value) && _value.TrimStart()[0] == '=' ; + if (IsFormula) + _value = _value.Substring(1); + } + + + } + } + + public Boolean IsFormula { get; internal set; } + } +} diff --git a/ClosedXML/Excel/Misc/XLIdManager.cs b/ClosedXML/Excel/Misc/XLIdManager.cs index 1c8c7fd..7dde3e8 100644 --- a/ClosedXML/Excel/Misc/XLIdManager.cs +++ b/ClosedXML/Excel/Misc/XLIdManager.cs @@ -1,41 +1,41 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLIdManager - { - private HashSet _hash = new HashSet(); - - - public Int32 GetNext() - { - if (_hash.Count == 0) - { - _hash.Add(1); - return 1; - } - - Int32 id = 1; - while (true) - { - if (!_hash.Contains(id)) - { - _hash.Add(id); - return id; - } - id++; - } - } - public void Add(Int32 value) - { - _hash.Add(value); - } - public void Add(IEnumerable values) - { - values.ForEach(v => _hash.Add(v)); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLIdManager + { + private HashSet _hash = new HashSet(); + + + public Int32 GetNext() + { + if (_hash.Count == 0) + { + _hash.Add(1); + return 1; + } + + Int32 id = 1; + while (true) + { + if (!_hash.Contains(id)) + { + _hash.Add(id); + return id; + } + id++; + } + } + public void Add(Int32 value) + { + _hash.Add(value); + } + public void Add(IEnumerable values) + { + values.ForEach(v => _hash.Add(v)); + } + } +} diff --git a/ClosedXML/Excel/Misc/XLReentrantEnumerableSet.cs b/ClosedXML/Excel/Misc/XLReentrantEnumerableSet.cs index c902733..62337a0 100644 --- a/ClosedXML/Excel/Misc/XLReentrantEnumerableSet.cs +++ b/ClosedXML/Excel/Misc/XLReentrantEnumerableSet.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/ClosedXML/Excel/NamedRanges/IXLNamedRange.cs b/ClosedXML/Excel/NamedRanges/IXLNamedRange.cs index c1d3831..3f57c20 100644 --- a/ClosedXML/Excel/NamedRanges/IXLNamedRange.cs +++ b/ClosedXML/Excel/NamedRanges/IXLNamedRange.cs @@ -1,99 +1,99 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLNamedRange - { - /// - /// Gets or sets the name of the range. - /// - /// - /// The name of the range. - /// - String Name { get; set; } - - /// - /// Gets the ranges associated with this named range. - /// Note: A named range can point to multiple ranges. - /// - IXLRanges Ranges { get; } - - /// - /// Gets or sets the comment for this named range. - /// - /// - /// The comment for this named range. - /// - String Comment { get; set; } - - /// - /// Gets or sets the visibility of this named range. - /// - /// - /// true if visible; otherwise, false. - /// - Boolean Visible { get; set; } - - /// - /// Adds the specified range to this named range. - /// Note: A named range can point to multiple ranges. - /// - /// Workbook containing the range - /// The range address to add. - IXLRanges Add(XLWorkbook workbook, String rangeAddress); - - /// - /// Adds the specified range to this named range. - /// Note: A named range can point to multiple ranges. - /// - /// The range to add. - IXLRanges Add(IXLRange range); - - /// - /// Adds the specified ranges to this named range. - /// Note: A named range can point to multiple ranges. - /// - /// The ranges to add. - IXLRanges Add(IXLRanges ranges); - - - /// - /// Deletes this named range (not the cells). - /// - void Delete(); - - /// - /// Clears the list of ranges associated with this named range. - /// (it does not clear the cells) - /// - void Clear(); - - /// - /// Removes the specified range from this named range. - /// Note: A named range can point to multiple ranges. - /// - /// The range address to remove. - void Remove(String rangeAddress); - - /// - /// Removes the specified range from this named range. - /// Note: A named range can point to multiple ranges. - /// - /// The range to remove. - void Remove(IXLRange range); - - /// - /// Removes the specified ranges from this named range. - /// Note: A named range can point to multiple ranges. - /// - /// The ranges to remove. - void Remove(IXLRanges ranges); - - - IXLNamedRange SetRefersTo(String range); - IXLNamedRange SetRefersTo(IXLRangeBase range); - IXLNamedRange SetRefersTo(IXLRanges ranges); - - String RefersTo { get; set; } - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLNamedRange + { + /// + /// Gets or sets the name of the range. + /// + /// + /// The name of the range. + /// + String Name { get; set; } + + /// + /// Gets the ranges associated with this named range. + /// Note: A named range can point to multiple ranges. + /// + IXLRanges Ranges { get; } + + /// + /// Gets or sets the comment for this named range. + /// + /// + /// The comment for this named range. + /// + String Comment { get; set; } + + /// + /// Gets or sets the visibility of this named range. + /// + /// + /// true if visible; otherwise, false. + /// + Boolean Visible { get; set; } + + /// + /// Adds the specified range to this named range. + /// Note: A named range can point to multiple ranges. + /// + /// Workbook containing the range + /// The range address to add. + IXLRanges Add(XLWorkbook workbook, String rangeAddress); + + /// + /// Adds the specified range to this named range. + /// Note: A named range can point to multiple ranges. + /// + /// The range to add. + IXLRanges Add(IXLRange range); + + /// + /// Adds the specified ranges to this named range. + /// Note: A named range can point to multiple ranges. + /// + /// The ranges to add. + IXLRanges Add(IXLRanges ranges); + + + /// + /// Deletes this named range (not the cells). + /// + void Delete(); + + /// + /// Clears the list of ranges associated with this named range. + /// (it does not clear the cells) + /// + void Clear(); + + /// + /// Removes the specified range from this named range. + /// Note: A named range can point to multiple ranges. + /// + /// The range address to remove. + void Remove(String rangeAddress); + + /// + /// Removes the specified range from this named range. + /// Note: A named range can point to multiple ranges. + /// + /// The range to remove. + void Remove(IXLRange range); + + /// + /// Removes the specified ranges from this named range. + /// Note: A named range can point to multiple ranges. + /// + /// The ranges to remove. + void Remove(IXLRanges ranges); + + + IXLNamedRange SetRefersTo(String range); + IXLNamedRange SetRefersTo(IXLRangeBase range); + IXLNamedRange SetRefersTo(IXLRanges ranges); + + String RefersTo { get; set; } + } +} diff --git a/ClosedXML/Excel/NamedRanges/IXLNamedRanges.cs b/ClosedXML/Excel/NamedRanges/IXLNamedRanges.cs index bec7353..3084e81 100644 --- a/ClosedXML/Excel/NamedRanges/IXLNamedRanges.cs +++ b/ClosedXML/Excel/NamedRanges/IXLNamedRanges.cs @@ -1,84 +1,84 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLNamedRanges: IEnumerable - { - /// - /// Gets the specified named range. - /// - /// Name of the range. - IXLNamedRange NamedRange(String rangeName); - - /// - /// Adds a new named range. - /// - /// Name of the range to add. - /// The range address to add. - /// - IXLNamedRange Add(String rangeName, String rangeAddress); - - /// - /// Adds a new named range. - /// - /// Name of the range to add. - /// The range to add. - /// - IXLNamedRange Add(String rangeName, IXLRange range); - - /// - /// Adds a new named range. - /// - /// Name of the range to add. - /// The ranges to add. - /// - IXLNamedRange Add(String rangeName, IXLRanges ranges); - - /// - /// Adds a new named range. - /// - /// Name of the ranges to add. - /// The range address to add. - /// The comment for the new named range. - IXLNamedRange Add(String rangeName, String rangeAddress, String comment); - - /// - /// Adds a new named range. - /// - /// Name of the ranges to add. - /// The range to add. - /// The comment for the new named range. - IXLNamedRange Add(String rangeName, IXLRange range, String comment); - - /// - /// Adds a new named range. - /// - /// Name of the ranges to add. - /// The ranges to add. - /// The comment for the new named range. - IXLNamedRange Add(String rangeName, IXLRanges ranges, String comment); - - /// - /// Deletes the specified named range (not the cells). - /// - /// Name of the range to delete. - void Delete(String rangeName); - - /// - /// Deletes the specified named range's index (not the cells). - /// - /// Index of the named range to delete. - void Delete(Int32 rangeIndex); - - - /// - /// Deletes all named ranges (not the cells). - /// - void DeleteAll(); - - Boolean TryGetValue(String name, out IXLNamedRange range); - - Boolean Contains(String name); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLNamedRanges: IEnumerable + { + /// + /// Gets the specified named range. + /// + /// Name of the range. + IXLNamedRange NamedRange(String rangeName); + + /// + /// Adds a new named range. + /// + /// Name of the range to add. + /// The range address to add. + /// + IXLNamedRange Add(String rangeName, String rangeAddress); + + /// + /// Adds a new named range. + /// + /// Name of the range to add. + /// The range to add. + /// + IXLNamedRange Add(String rangeName, IXLRange range); + + /// + /// Adds a new named range. + /// + /// Name of the range to add. + /// The ranges to add. + /// + IXLNamedRange Add(String rangeName, IXLRanges ranges); + + /// + /// Adds a new named range. + /// + /// Name of the ranges to add. + /// The range address to add. + /// The comment for the new named range. + IXLNamedRange Add(String rangeName, String rangeAddress, String comment); + + /// + /// Adds a new named range. + /// + /// Name of the ranges to add. + /// The range to add. + /// The comment for the new named range. + IXLNamedRange Add(String rangeName, IXLRange range, String comment); + + /// + /// Adds a new named range. + /// + /// Name of the ranges to add. + /// The ranges to add. + /// The comment for the new named range. + IXLNamedRange Add(String rangeName, IXLRanges ranges, String comment); + + /// + /// Deletes the specified named range (not the cells). + /// + /// Name of the range to delete. + void Delete(String rangeName); + + /// + /// Deletes the specified named range's index (not the cells). + /// + /// Index of the named range to delete. + void Delete(Int32 rangeIndex); + + + /// + /// Deletes all named ranges (not the cells). + /// + void DeleteAll(); + + Boolean TryGetValue(String name, out IXLNamedRange range); + + Boolean Contains(String name); + } +} diff --git a/ClosedXML/Excel/NamedRanges/XLNamedRange.cs b/ClosedXML/Excel/NamedRanges/XLNamedRange.cs index 1cef341..ce7e2a5 100644 --- a/ClosedXML/Excel/NamedRanges/XLNamedRange.cs +++ b/ClosedXML/Excel/NamedRanges/XLNamedRange.cs @@ -1,141 +1,141 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - using System.Text.RegularExpressions; - - internal class XLNamedRange: IXLNamedRange - { - - private List _rangeList = new List(); - private readonly XLNamedRanges _namedRanges; - public XLNamedRange(XLNamedRanges namedRanges , String rangeName, String range, String comment = null) - { - Visible = true; - Name = rangeName; - _rangeList.Add(range); - Comment = comment; - _namedRanges = namedRanges; - } - - public XLNamedRange(XLNamedRanges namedRanges, String rangeName, IXLRanges ranges, String comment = null) - { - Visible = true; - Name = rangeName; - ranges.ForEach(r => _rangeList.Add(r.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true))); - Comment = comment; - _namedRanges = namedRanges; - } - - public String Name { get; set; } - public IXLRanges Ranges - { - get - { - var ranges = new XLRanges(); - foreach (var rangeToAdd in - from rangeAddress in _rangeList.SelectMany(c=>c.Split(',')).Where(s=>s[0] != '"') - let match = XLHelper.NamedRangeReferenceRegex.Match(rangeAddress) - select - match.Groups["Sheet"].Success - ? _namedRanges.Workbook.WorksheetsInternal.Worksheet(match.Groups["Sheet"].Value).Range(match.Groups["Range"].Value) as IXLRangeBase - : _namedRanges.Workbook.Worksheets.SelectMany(sheet => sheet.Tables).Single(table => table.Name == match.Groups["Table"].Value).DataRange.Column(match.Groups["Column"].Value) ) - { - ranges.Add(rangeToAdd); - } - return ranges; - } - } - - public String Comment { get; set; } - - public Boolean Visible { get; set; } - - public IXLRanges Add(XLWorkbook workbook, String rangeAddress) - { - var ranges = new XLRanges(); - var byExclamation = rangeAddress.Split('!'); - var wsName = byExclamation[0].Replace("'", ""); - var rng = byExclamation[1]; - var rangeToAdd = workbook.WorksheetsInternal.Worksheet(wsName).Range(rng); - - ranges.Add(rangeToAdd); - return Add(ranges); - } - public IXLRanges Add(IXLRange range) - { - var ranges = new XLRanges {range}; - return Add(ranges); - } - public IXLRanges Add(IXLRanges ranges) - { - ranges.ForEach(r => _rangeList.Add(r.ToString())); - return ranges; - } - - public void Delete() - { - _namedRanges.Delete(Name); - } - public void Clear() - { - _rangeList.Clear(); - } - public void Remove(String rangeAddress) - { - _rangeList.Remove(rangeAddress); - } - public void Remove(IXLRange range) - { - _rangeList.Remove(range.ToString()); - } - public void Remove(IXLRanges ranges) - { - ranges.ForEach(r => _rangeList.Remove(r.ToString())); - } - - - public override string ToString() - { - String retVal = _rangeList.Aggregate(String.Empty, (agg, r) => agg + (r + ",")); - if (retVal.Length > 0) retVal = retVal.Substring(0, retVal.Length - 1); - return retVal; - } - - public String RefersTo - { - get { return ToString(); } - set - { - _rangeList.Clear(); - _rangeList.Add(value); - } - } - - internal List RangeList - { - get { return _rangeList; } - set { _rangeList = value; } - } - - public IXLNamedRange SetRefersTo(String range) - { - RefersTo = range; - return this; - } - public IXLNamedRange SetRefersTo(IXLRangeBase range) - { - _rangeList.Clear(); - _rangeList.Add(range.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true)); - return this; - } - public IXLNamedRange SetRefersTo(IXLRanges ranges) - { - _rangeList.Clear(); - ranges.ForEach(r => _rangeList.Add(r.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true))); - return this; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Text.RegularExpressions; + + internal class XLNamedRange: IXLNamedRange + { + + private List _rangeList = new List(); + private readonly XLNamedRanges _namedRanges; + public XLNamedRange(XLNamedRanges namedRanges , String rangeName, String range, String comment = null) + { + Visible = true; + Name = rangeName; + _rangeList.Add(range); + Comment = comment; + _namedRanges = namedRanges; + } + + public XLNamedRange(XLNamedRanges namedRanges, String rangeName, IXLRanges ranges, String comment = null) + { + Visible = true; + Name = rangeName; + ranges.ForEach(r => _rangeList.Add(r.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true))); + Comment = comment; + _namedRanges = namedRanges; + } + + public String Name { get; set; } + public IXLRanges Ranges + { + get + { + var ranges = new XLRanges(); + foreach (var rangeToAdd in + from rangeAddress in _rangeList.SelectMany(c=>c.Split(',')).Where(s=>s[0] != '"') + let match = XLHelper.NamedRangeReferenceRegex.Match(rangeAddress) + select + match.Groups["Sheet"].Success + ? _namedRanges.Workbook.WorksheetsInternal.Worksheet(match.Groups["Sheet"].Value).Range(match.Groups["Range"].Value) as IXLRangeBase + : _namedRanges.Workbook.Worksheets.SelectMany(sheet => sheet.Tables).Single(table => table.Name == match.Groups["Table"].Value).DataRange.Column(match.Groups["Column"].Value) ) + { + ranges.Add(rangeToAdd); + } + return ranges; + } + } + + public String Comment { get; set; } + + public Boolean Visible { get; set; } + + public IXLRanges Add(XLWorkbook workbook, String rangeAddress) + { + var ranges = new XLRanges(); + var byExclamation = rangeAddress.Split('!'); + var wsName = byExclamation[0].Replace("'", ""); + var rng = byExclamation[1]; + var rangeToAdd = workbook.WorksheetsInternal.Worksheet(wsName).Range(rng); + + ranges.Add(rangeToAdd); + return Add(ranges); + } + public IXLRanges Add(IXLRange range) + { + var ranges = new XLRanges {range}; + return Add(ranges); + } + public IXLRanges Add(IXLRanges ranges) + { + ranges.ForEach(r => _rangeList.Add(r.ToString())); + return ranges; + } + + public void Delete() + { + _namedRanges.Delete(Name); + } + public void Clear() + { + _rangeList.Clear(); + } + public void Remove(String rangeAddress) + { + _rangeList.Remove(rangeAddress); + } + public void Remove(IXLRange range) + { + _rangeList.Remove(range.ToString()); + } + public void Remove(IXLRanges ranges) + { + ranges.ForEach(r => _rangeList.Remove(r.ToString())); + } + + + public override string ToString() + { + String retVal = _rangeList.Aggregate(String.Empty, (agg, r) => agg + (r + ",")); + if (retVal.Length > 0) retVal = retVal.Substring(0, retVal.Length - 1); + return retVal; + } + + public String RefersTo + { + get { return ToString(); } + set + { + _rangeList.Clear(); + _rangeList.Add(value); + } + } + + internal List RangeList + { + get { return _rangeList; } + set { _rangeList = value; } + } + + public IXLNamedRange SetRefersTo(String range) + { + RefersTo = range; + return this; + } + public IXLNamedRange SetRefersTo(IXLRangeBase range) + { + _rangeList.Clear(); + _rangeList.Add(range.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true)); + return this; + } + public IXLNamedRange SetRefersTo(IXLRanges ranges) + { + _rangeList.Clear(); + ranges.ForEach(r => _rangeList.Add(r.RangeAddress.ToStringFixed(XLReferenceStyle.A1, true))); + return this; + } + } +} diff --git a/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs b/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs index 2b0b015..504cb03 100644 --- a/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs +++ b/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs @@ -1,106 +1,106 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLNamedRanges: IXLNamedRanges - { - readonly Dictionary _namedRanges = new Dictionary(); - internal XLWorkbook Workbook { get; set; } - - public XLNamedRanges(XLWorkbook workbook) - { - Workbook = workbook; - } - - #region IXLNamedRanges Members - - public IXLNamedRange NamedRange(String rangeName) - { - IXLNamedRange range; - if (_namedRanges.TryGetValue(rangeName, out range)) - return range; - - return null; - } - - public IXLNamedRange Add(String rangeName, String rangeAddress) - { - return Add(rangeName, rangeAddress, null); - } - public IXLNamedRange Add(String rangeName, IXLRange range) - { - return Add(rangeName, range, null); - } - public IXLNamedRange Add(String rangeName, IXLRanges ranges) - { - return Add(rangeName, ranges, null); - } - public IXLNamedRange Add(String rangeName, String rangeAddress, String comment ) - { - var namedRange = new XLNamedRange(this, rangeName, rangeAddress, comment); - _namedRanges.Add(rangeName, namedRange); - return namedRange; - } - public IXLNamedRange Add(String rangeName, IXLRange range, String comment) - { - var ranges = new XLRanges {range}; - return Add(rangeName, ranges, comment); - } - public IXLNamedRange Add(String rangeName, IXLRanges ranges, String comment) - { - var namedRange = new XLNamedRange(this, rangeName, ranges, comment); - _namedRanges.Add(rangeName, namedRange); - return namedRange; - } - - public void Delete(String rangeName) - { - _namedRanges.Remove(rangeName); - } - public void Delete(Int32 rangeIndex) - { - _namedRanges.Remove(_namedRanges.ElementAt(rangeIndex).Key); - } - public void DeleteAll() - { - _namedRanges.Clear(); - } - - #endregion - - #region IEnumerable Members - - public IEnumerator GetEnumerator() - { - return _namedRanges.Values.GetEnumerator(); - } - - #endregion - - #region IEnumerable Members - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - #endregion - - public Boolean TryGetValue(String name, out IXLNamedRange range) - { - if (_namedRanges.TryGetValue(name, out range)) return true; - - range = Workbook.NamedRange(name); - return range != null; - } - - public Boolean Contains(String name) - { - if (_namedRanges.ContainsKey(name)) return true; - return Workbook.NamedRange(name) != null; - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLNamedRanges: IXLNamedRanges + { + readonly Dictionary _namedRanges = new Dictionary(); + internal XLWorkbook Workbook { get; set; } + + public XLNamedRanges(XLWorkbook workbook) + { + Workbook = workbook; + } + + #region IXLNamedRanges Members + + public IXLNamedRange NamedRange(String rangeName) + { + IXLNamedRange range; + if (_namedRanges.TryGetValue(rangeName, out range)) + return range; + + return null; + } + + public IXLNamedRange Add(String rangeName, String rangeAddress) + { + return Add(rangeName, rangeAddress, null); + } + public IXLNamedRange Add(String rangeName, IXLRange range) + { + return Add(rangeName, range, null); + } + public IXLNamedRange Add(String rangeName, IXLRanges ranges) + { + return Add(rangeName, ranges, null); + } + public IXLNamedRange Add(String rangeName, String rangeAddress, String comment ) + { + var namedRange = new XLNamedRange(this, rangeName, rangeAddress, comment); + _namedRanges.Add(rangeName, namedRange); + return namedRange; + } + public IXLNamedRange Add(String rangeName, IXLRange range, String comment) + { + var ranges = new XLRanges {range}; + return Add(rangeName, ranges, comment); + } + public IXLNamedRange Add(String rangeName, IXLRanges ranges, String comment) + { + var namedRange = new XLNamedRange(this, rangeName, ranges, comment); + _namedRanges.Add(rangeName, namedRange); + return namedRange; + } + + public void Delete(String rangeName) + { + _namedRanges.Remove(rangeName); + } + public void Delete(Int32 rangeIndex) + { + _namedRanges.Remove(_namedRanges.ElementAt(rangeIndex).Key); + } + public void DeleteAll() + { + _namedRanges.Clear(); + } + + #endregion + + #region IEnumerable Members + + public IEnumerator GetEnumerator() + { + return _namedRanges.Values.GetEnumerator(); + } + + #endregion + + #region IEnumerable Members + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + #endregion + + public Boolean TryGetValue(String name, out IXLNamedRange range) + { + if (_namedRanges.TryGetValue(name, out range)) return true; + + range = Workbook.NamedRange(name); + return range != null; + } + + public Boolean Contains(String name) + { + if (_namedRanges.ContainsKey(name)) return true; + return Workbook.NamedRange(name) != null; + } + + } +} diff --git a/ClosedXML/Excel/PageSetup/IXLHFItem.cs b/ClosedXML/Excel/PageSetup/IXLHFItem.cs index 2710292..5f7fc0e 100644 --- a/ClosedXML/Excel/PageSetup/IXLHFItem.cs +++ b/ClosedXML/Excel/PageSetup/IXLHFItem.cs @@ -1,48 +1,48 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLHFPredefinedText - { - PageNumber, NumberOfPages, Date, Time, FullPath, Path, File, SheetName - } - public enum XLHFOccurrence - { - AllPages, OddPages, EvenPages, FirstPage - } - - public interface IXLHFItem: IXLWithRichString - { - /// - /// Gets the text of the specified header/footer occurrence. - /// - /// The occurrence. - String GetText(XLHFOccurrence occurrence); - - /// - /// Adds the given predefined text to this header/footer item. - /// - /// The predefined text to add to this header/footer item. - IXLRichString AddText(XLHFPredefinedText predefinedText); - - /// - /// Adds the given text to this header/footer item. - /// - /// The text to add to this header/footer item. - /// The occurrence for the text. - IXLRichString AddText(String text, XLHFOccurrence occurrence); - - /// - /// Adds the given predefined text to this header/footer item. - /// - /// The predefined text to add to this header/footer item. - /// The occurrence for the predefined text. - IXLRichString AddText(XLHFPredefinedText predefinedText, XLHFOccurrence occurrence); - - /// Clears the text/formats of this header/footer item. - /// The occurrence to clear. - void Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages); - - IXLRichString AddImage(String imagePath, XLHFOccurrence occurrence = XLHFOccurrence.AllPages); - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLHFPredefinedText + { + PageNumber, NumberOfPages, Date, Time, FullPath, Path, File, SheetName + } + public enum XLHFOccurrence + { + AllPages, OddPages, EvenPages, FirstPage + } + + public interface IXLHFItem: IXLWithRichString + { + /// + /// Gets the text of the specified header/footer occurrence. + /// + /// The occurrence. + String GetText(XLHFOccurrence occurrence); + + /// + /// Adds the given predefined text to this header/footer item. + /// + /// The predefined text to add to this header/footer item. + IXLRichString AddText(XLHFPredefinedText predefinedText); + + /// + /// Adds the given text to this header/footer item. + /// + /// The text to add to this header/footer item. + /// The occurrence for the text. + IXLRichString AddText(String text, XLHFOccurrence occurrence); + + /// + /// Adds the given predefined text to this header/footer item. + /// + /// The predefined text to add to this header/footer item. + /// The occurrence for the predefined text. + IXLRichString AddText(XLHFPredefinedText predefinedText, XLHFOccurrence occurrence); + + /// Clears the text/formats of this header/footer item. + /// The occurrence to clear. + void Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages); + + IXLRichString AddImage(String imagePath, XLHFOccurrence occurrence = XLHFOccurrence.AllPages); + } +} diff --git a/ClosedXML/Excel/PageSetup/IXLHeaderFooter.cs b/ClosedXML/Excel/PageSetup/IXLHeaderFooter.cs index c8c2f7c..2358754 100644 --- a/ClosedXML/Excel/PageSetup/IXLHeaderFooter.cs +++ b/ClosedXML/Excel/PageSetup/IXLHeaderFooter.cs @@ -1,31 +1,31 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLHFMode { OddPagesOnly, OddAndEvenPages, Odd } - public interface IXLHeaderFooter - { - /// - /// Gets the left header/footer item. - /// - IXLHFItem Left { get; } - - /// - /// Gets the middle header/footer item. - /// - IXLHFItem Center { get; } - - /// - /// Gets the right header/footer item. - /// - IXLHFItem Right { get; } - - /// - /// Gets the text of the specified header/footer occurrence. - /// - /// The occurrence. - String GetText(XLHFOccurrence occurrence); - - IXLHeaderFooter Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages); - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLHFMode { OddPagesOnly, OddAndEvenPages, Odd } + public interface IXLHeaderFooter + { + /// + /// Gets the left header/footer item. + /// + IXLHFItem Left { get; } + + /// + /// Gets the middle header/footer item. + /// + IXLHFItem Center { get; } + + /// + /// Gets the right header/footer item. + /// + IXLHFItem Right { get; } + + /// + /// Gets the text of the specified header/footer occurrence. + /// + /// The occurrence. + String GetText(XLHFOccurrence occurrence); + + IXLHeaderFooter Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages); + } +} diff --git a/ClosedXML/Excel/PageSetup/IXLMargins.cs b/ClosedXML/Excel/PageSetup/IXLMargins.cs index 2a1e40b..148fcfb 100644 --- a/ClosedXML/Excel/PageSetup/IXLMargins.cs +++ b/ClosedXML/Excel/PageSetup/IXLMargins.cs @@ -1,39 +1,39 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLMargins - { - /// Gets or sets the Left margin. - /// The Left margin. - Double Left { get; set; } - - /// Gets or sets the Right margin. - /// The Right margin. - Double Right { get; set; } - - /// Gets or sets the Top margin. - /// The Top margin. - Double Top { get; set; } - - /// Gets or sets the Bottom margin. - /// The Bottom margin. - Double Bottom { get; set; } - - /// Gets or sets the Header margin. - /// The Header margin. - Double Header { get; set; } - - /// Gets or sets the Footer margin. - /// The Footer margin. - Double Footer { get; set; } - - IXLMargins SetLeft(Double value); - IXLMargins SetRight(Double value); - IXLMargins SetTop(Double value); - IXLMargins SetBottom(Double value); - IXLMargins SetHeader(Double value); - IXLMargins SetFooter(Double value); - - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLMargins + { + /// Gets or sets the Left margin. + /// The Left margin. + Double Left { get; set; } + + /// Gets or sets the Right margin. + /// The Right margin. + Double Right { get; set; } + + /// Gets or sets the Top margin. + /// The Top margin. + Double Top { get; set; } + + /// Gets or sets the Bottom margin. + /// The Bottom margin. + Double Bottom { get; set; } + + /// Gets or sets the Header margin. + /// The Header margin. + Double Header { get; set; } + + /// Gets or sets the Footer margin. + /// The Footer margin. + Double Footer { get; set; } + + IXLMargins SetLeft(Double value); + IXLMargins SetRight(Double value); + IXLMargins SetTop(Double value); + IXLMargins SetBottom(Double value); + IXLMargins SetHeader(Double value); + IXLMargins SetFooter(Double value); + + } +} diff --git a/ClosedXML/Excel/PageSetup/IXLPageSetup.cs b/ClosedXML/Excel/PageSetup/IXLPageSetup.cs index 5376f9a..e2c6be4 100644 --- a/ClosedXML/Excel/PageSetup/IXLPageSetup.cs +++ b/ClosedXML/Excel/PageSetup/IXLPageSetup.cs @@ -1,311 +1,311 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public enum XLPageOrientation { Default, Portrait, Landscape } - public enum XLPaperSize - { - LetterPaper = 1, - LetterSmallPaper = 2, - TabloidPaper = 3, - LedgerPaper = 4, - LegalPaper = 5, - StatementPaper = 6, - ExecutivePaper = 7, - A3Paper = 8, - A4Paper = 9, - A4SmallPaper = 10, - A5Paper = 11, - B4Paper = 12, - B5Paper = 13, - FolioPaper = 14, - QuartoPaper = 15, - StandardPaper = 16, - StandardPaper1 = 17, - NotePaper = 18, - No9Envelope = 19, - No10Envelope = 20, - No11Envelope = 21, - No12Envelope = 22, - No14Envelope = 23, - CPaper = 24, - DPaper = 25, - EPaper = 26, - DlEnvelope = 27, - C5Envelope = 28, - C3Envelope = 29, - C4Envelope = 30, - C6Envelope = 31, - C65Envelope = 32, - B4Envelope = 33, - B5Envelope = 34, - B6Envelope = 35, - ItalyEnvelope = 36, - MonarchEnvelope = 37, - No634Envelope = 38, - UsStandardFanfold = 39, - GermanStandardFanfold = 40, - GermanLegalFanfold = 41, - IsoB4 = 42, - JapaneseDoublePostcard = 43, - StandardPaper2 = 44, - StandardPaper3 = 45, - StandardPaper4 = 46, - InviteEnvelope = 47, - LetterExtraPaper = 50, - LegalExtraPaper = 51, - TabloidExtraPaper = 52, - A4ExtraPaper = 53, - LetterTransversePaper = 54, - A4TransversePaper = 55, - LetterExtraTransversePaper = 56, - SuperaSuperaA4Paper = 57, - SuperbSuperbA3Paper = 58, - LetterPlusPaper = 59, - A4PlusPaper = 60, - A5TransversePaper = 61, - JisB5TransversePaper = 62, - A3ExtraPaper = 63, - A5ExtraPaper = 64, - IsoB5ExtraPaper = 65, - A2Paper = 66, - A3TransversePaper = 67, - A3ExtraTransversePaper = 68 - } - public enum XLPageOrderValues { DownThenOver, OverThenDown } - public enum XLShowCommentsValues { None, AtEnd, AsDisplayed } - public enum XLPrintErrorValues { Blank, Dash, Displayed, NA } - - public interface IXLPageSetup - { - /// - /// Gets an object to manage the print areas of the worksheet. - /// - IXLPrintAreas PrintAreas { get; } - /// - /// Gets the first row that will repeat on the top of the printed pages. - /// Use SetRowsToRepeatAtTop() to set the rows that will be repeated on the top of the printed pages. - /// - Int32 FirstRowToRepeatAtTop { get; } - /// - /// Gets the last row that will repeat on the top of the printed pages. - /// Use SetRowsToRepeatAtTop() to set the rows that will be repeated on the top of the printed pages. - /// - Int32 LastRowToRepeatAtTop { get; } - /// - /// Sets the rows to repeat on the top of the printed pages. - /// - /// The range of rows to repeat on the top of the printed pages. - void SetRowsToRepeatAtTop(String range); - /// - /// Sets the rows to repeat on the top of the printed pages. - /// - /// The first row to repeat at top. - /// The last row to repeat at top. - void SetRowsToRepeatAtTop(Int32 firstRowToRepeatAtTop, Int32 lastRowToRepeatAtTop); - - /// Gets the first column to repeat on the left of the printed pages. - /// The first column to repeat on the left of the printed pages. - Int32 FirstColumnToRepeatAtLeft { get; } - /// Gets the last column to repeat on the left of the printed pages. - /// The last column to repeat on the left of the printed pages. - Int32 LastColumnToRepeatAtLeft { get; } - /// - /// Sets the rows to repeat on the left of the printed pages. - /// - /// The first column to repeat at left. - /// The last column to repeat at left. - void SetColumnsToRepeatAtLeft(Int32 firstColumnToRepeatAtLeft, Int32 lastColumnToRepeatAtLeft); - /// - /// Sets the rows to repeat on the left of the printed pages. - /// - /// The range of rows to repeat on the left of the printed pages. - void SetColumnsToRepeatAtLeft(String range); - - /// Gets or sets the page orientation for printing. - /// The page orientation. - XLPageOrientation PageOrientation { get; set; } - /// - /// Gets or sets the number of pages wide (horizontal) the worksheet will be printed on. - /// If you don't specify the PagesTall, Excel will adjust that value - /// based on the contents of the worksheet and the PagesWide number. - /// Setting this value will override the Scale value. - /// - Int32 PagesWide { get; set; } - /// - /// Gets or sets the number of pages tall (vertical) the worksheet will be printed on. - /// If you don't specify the PagesWide, Excel will adjust that value - /// based on the contents of the worksheet and the PagesTall number. - /// Setting this value will override the Scale value. - /// - Int32 PagesTall { get; set; } - /// - /// Gets or sets the scale at which the worksheet will be printed. - /// The worksheet will be printed on as many pages as necessary to print at the given scale. - /// Setting this value will override the PagesWide and PagesTall values. - /// - Int32 Scale { get; set; } - /// - /// Gets or sets the horizontal dpi for printing the worksheet. - /// - Int32 HorizontalDpi { get; set; } - /// - /// Gets or sets the vertical dpi for printing the worksheet. - /// - Int32 VerticalDpi { get; set; } - /// - /// Gets or sets the page number that will begin the printout. - /// For example, the first page of your printout could be numbered page 5. - /// - Int64 FirstPageNumber { get; set; } - /// - /// Gets or sets a value indicating whether the worksheet will be centered on the page horizontally. - /// - /// - /// true if the worksheet will be centered on the page horizontally; otherwise, false. - /// - Boolean CenterHorizontally { get; set; } - /// - /// Gets or sets a value indicating whether the worksheet will be centered on the page vertically. - /// - /// - /// true if the worksheet will be centered on the page vartically; otherwise, false. - /// - Boolean CenterVertically { get; set; } - /// - /// Sets the scale at which the worksheet will be printed. This is equivalent to setting the Scale property. - /// The worksheet will be printed on as many pages as necessary to print at the given scale. - /// Setting this value will override the PagesWide and PagesTall values. - /// - /// The scale at which the worksheet will be printed. - void AdjustTo(Int32 percentageOfNormalSize); - /// - /// Gets or sets the number of pages the worksheet will be printed on. - /// This is equivalent to setting both PagesWide and PagesTall properties. - /// Setting this value will override the Scale value. - /// - /// The pages wide. - /// The pages tall. - void FitToPages(Int32 pagesWide, Int32 pagesTall); - /// - /// Gets or sets the size of the paper to print the worksheet. - /// - XLPaperSize PaperSize { get; set; } - /// - /// Gets an object to work with the page margins. - /// - IXLMargins Margins { get; } - - /// - /// Gets an object to work with the page headers. - /// - IXLHeaderFooter Header { get; } - /// - /// Gets an object to work with the page footers. - /// - IXLHeaderFooter Footer { get; } - /// - /// Gets or sets a value indicating whether Excel will automatically adjust the font size to the scale of the worksheet. - /// - /// - /// true if Excel will automatically adjust the font size to the scale of the worksheet; otherwise, false. - /// - Boolean ScaleHFWithDocument { get; set; } - /// - /// Gets or sets a value indicating whether the header and footer margins are aligned with the left and right margins of the worksheet. - /// - /// - /// true if the header and footer margins are aligned with the left and right margins of the worksheet; otherwise, false. - /// - Boolean AlignHFWithMargins { get; set; } - - /// - /// Gets or sets a value indicating whether the gridlines will be printed. - /// - /// - /// true if the gridlines will be printed; otherwise, false. - /// - Boolean ShowGridlines { get; set; } - /// - /// Gets or sets a value indicating whether to show row numbers and column letters/numbers. - /// - /// - /// true to show row numbers and column letters/numbers; otherwise, false. - /// - Boolean ShowRowAndColumnHeadings { get; set; } - /// - /// Gets or sets a value indicating whether the worksheet will be printed in black and white. - /// - /// - /// true if the worksheet will be printed in black and white; otherwise, false. - /// - Boolean BlackAndWhite { get; set; } - /// - /// Gets or sets a value indicating whether the worksheet will be printed in draft quality. - /// - /// - /// true if the worksheet will be printed in draft quality; otherwise, false. - /// - Boolean DraftQuality { get; set; } - /// - /// Gets or sets the page order for printing. - /// - XLPageOrderValues PageOrder { get; set; } - /// - /// Gets or sets how the comments will be printed. - /// - XLShowCommentsValues ShowComments { get; set; } - - /// - /// Gets a list with the row breaks (for printing). - /// - List RowBreaks { get; } - /// - /// Gets a list with the column breaks (for printing). - /// - List ColumnBreaks { get; } - /// - /// Adds a horizontal page break after the given row. - /// - /// The row to insert the break. - void AddHorizontalPageBreak(Int32 row); - - /// - /// Adds a vertical page break after the given column. - /// - /// The column to insert the break. - void AddVerticalPageBreak(Int32 column); - - /// - /// Gets or sets how error values will be printed. - /// - XLPrintErrorValues PrintErrorValue { get; set; } - - IXLPageSetup SetPageOrientation(XLPageOrientation value); - IXLPageSetup SetPagesWide(Int32 value); - IXLPageSetup SetPagesTall(Int32 value); - IXLPageSetup SetScale(Int32 value); - IXLPageSetup SetHorizontalDpi(Int32 value); - IXLPageSetup SetVerticalDpi(Int32 value); - IXLPageSetup SetFirstPageNumber(Int64 value); - IXLPageSetup SetCenterHorizontally(); IXLPageSetup SetCenterHorizontally(Boolean value); - IXLPageSetup SetCenterVertically(); IXLPageSetup SetCenterVertically(Boolean value); - IXLPageSetup SetPaperSize(XLPaperSize value); - IXLPageSetup SetScaleHFWithDocument(); IXLPageSetup SetScaleHFWithDocument(Boolean value); - IXLPageSetup SetAlignHFWithMargins(); IXLPageSetup SetAlignHFWithMargins(Boolean value); - IXLPageSetup SetShowGridlines(); IXLPageSetup SetShowGridlines(Boolean value); - IXLPageSetup SetShowRowAndColumnHeadings(); IXLPageSetup SetShowRowAndColumnHeadings(Boolean value); - IXLPageSetup SetBlackAndWhite(); IXLPageSetup SetBlackAndWhite(Boolean value); - IXLPageSetup SetDraftQuality(); IXLPageSetup SetDraftQuality(Boolean value); - IXLPageSetup SetPageOrder(XLPageOrderValues value); - IXLPageSetup SetShowComments(XLShowCommentsValues value); - IXLPageSetup SetPrintErrorValue(XLPrintErrorValues value); - - - Boolean DifferentFirstPageOnHF { get; set; } - IXLPageSetup SetDifferentFirstPageOnHF(); IXLPageSetup SetDifferentFirstPageOnHF(Boolean value); - Boolean DifferentOddEvenPagesOnHF { get; set; } - IXLPageSetup SetDifferentOddEvenPagesOnHF(); IXLPageSetup SetDifferentOddEvenPagesOnHF(Boolean value); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public enum XLPageOrientation { Default, Portrait, Landscape } + public enum XLPaperSize + { + LetterPaper = 1, + LetterSmallPaper = 2, + TabloidPaper = 3, + LedgerPaper = 4, + LegalPaper = 5, + StatementPaper = 6, + ExecutivePaper = 7, + A3Paper = 8, + A4Paper = 9, + A4SmallPaper = 10, + A5Paper = 11, + B4Paper = 12, + B5Paper = 13, + FolioPaper = 14, + QuartoPaper = 15, + StandardPaper = 16, + StandardPaper1 = 17, + NotePaper = 18, + No9Envelope = 19, + No10Envelope = 20, + No11Envelope = 21, + No12Envelope = 22, + No14Envelope = 23, + CPaper = 24, + DPaper = 25, + EPaper = 26, + DlEnvelope = 27, + C5Envelope = 28, + C3Envelope = 29, + C4Envelope = 30, + C6Envelope = 31, + C65Envelope = 32, + B4Envelope = 33, + B5Envelope = 34, + B6Envelope = 35, + ItalyEnvelope = 36, + MonarchEnvelope = 37, + No634Envelope = 38, + UsStandardFanfold = 39, + GermanStandardFanfold = 40, + GermanLegalFanfold = 41, + IsoB4 = 42, + JapaneseDoublePostcard = 43, + StandardPaper2 = 44, + StandardPaper3 = 45, + StandardPaper4 = 46, + InviteEnvelope = 47, + LetterExtraPaper = 50, + LegalExtraPaper = 51, + TabloidExtraPaper = 52, + A4ExtraPaper = 53, + LetterTransversePaper = 54, + A4TransversePaper = 55, + LetterExtraTransversePaper = 56, + SuperaSuperaA4Paper = 57, + SuperbSuperbA3Paper = 58, + LetterPlusPaper = 59, + A4PlusPaper = 60, + A5TransversePaper = 61, + JisB5TransversePaper = 62, + A3ExtraPaper = 63, + A5ExtraPaper = 64, + IsoB5ExtraPaper = 65, + A2Paper = 66, + A3TransversePaper = 67, + A3ExtraTransversePaper = 68 + } + public enum XLPageOrderValues { DownThenOver, OverThenDown } + public enum XLShowCommentsValues { None, AtEnd, AsDisplayed } + public enum XLPrintErrorValues { Blank, Dash, Displayed, NA } + + public interface IXLPageSetup + { + /// + /// Gets an object to manage the print areas of the worksheet. + /// + IXLPrintAreas PrintAreas { get; } + /// + /// Gets the first row that will repeat on the top of the printed pages. + /// Use SetRowsToRepeatAtTop() to set the rows that will be repeated on the top of the printed pages. + /// + Int32 FirstRowToRepeatAtTop { get; } + /// + /// Gets the last row that will repeat on the top of the printed pages. + /// Use SetRowsToRepeatAtTop() to set the rows that will be repeated on the top of the printed pages. + /// + Int32 LastRowToRepeatAtTop { get; } + /// + /// Sets the rows to repeat on the top of the printed pages. + /// + /// The range of rows to repeat on the top of the printed pages. + void SetRowsToRepeatAtTop(String range); + /// + /// Sets the rows to repeat on the top of the printed pages. + /// + /// The first row to repeat at top. + /// The last row to repeat at top. + void SetRowsToRepeatAtTop(Int32 firstRowToRepeatAtTop, Int32 lastRowToRepeatAtTop); + + /// Gets the first column to repeat on the left of the printed pages. + /// The first column to repeat on the left of the printed pages. + Int32 FirstColumnToRepeatAtLeft { get; } + /// Gets the last column to repeat on the left of the printed pages. + /// The last column to repeat on the left of the printed pages. + Int32 LastColumnToRepeatAtLeft { get; } + /// + /// Sets the rows to repeat on the left of the printed pages. + /// + /// The first column to repeat at left. + /// The last column to repeat at left. + void SetColumnsToRepeatAtLeft(Int32 firstColumnToRepeatAtLeft, Int32 lastColumnToRepeatAtLeft); + /// + /// Sets the rows to repeat on the left of the printed pages. + /// + /// The range of rows to repeat on the left of the printed pages. + void SetColumnsToRepeatAtLeft(String range); + + /// Gets or sets the page orientation for printing. + /// The page orientation. + XLPageOrientation PageOrientation { get; set; } + /// + /// Gets or sets the number of pages wide (horizontal) the worksheet will be printed on. + /// If you don't specify the PagesTall, Excel will adjust that value + /// based on the contents of the worksheet and the PagesWide number. + /// Setting this value will override the Scale value. + /// + Int32 PagesWide { get; set; } + /// + /// Gets or sets the number of pages tall (vertical) the worksheet will be printed on. + /// If you don't specify the PagesWide, Excel will adjust that value + /// based on the contents of the worksheet and the PagesTall number. + /// Setting this value will override the Scale value. + /// + Int32 PagesTall { get; set; } + /// + /// Gets or sets the scale at which the worksheet will be printed. + /// The worksheet will be printed on as many pages as necessary to print at the given scale. + /// Setting this value will override the PagesWide and PagesTall values. + /// + Int32 Scale { get; set; } + /// + /// Gets or sets the horizontal dpi for printing the worksheet. + /// + Int32 HorizontalDpi { get; set; } + /// + /// Gets or sets the vertical dpi for printing the worksheet. + /// + Int32 VerticalDpi { get; set; } + /// + /// Gets or sets the page number that will begin the printout. + /// For example, the first page of your printout could be numbered page 5. + /// + Int64 FirstPageNumber { get; set; } + /// + /// Gets or sets a value indicating whether the worksheet will be centered on the page horizontally. + /// + /// + /// true if the worksheet will be centered on the page horizontally; otherwise, false. + /// + Boolean CenterHorizontally { get; set; } + /// + /// Gets or sets a value indicating whether the worksheet will be centered on the page vertically. + /// + /// + /// true if the worksheet will be centered on the page vartically; otherwise, false. + /// + Boolean CenterVertically { get; set; } + /// + /// Sets the scale at which the worksheet will be printed. This is equivalent to setting the Scale property. + /// The worksheet will be printed on as many pages as necessary to print at the given scale. + /// Setting this value will override the PagesWide and PagesTall values. + /// + /// The scale at which the worksheet will be printed. + void AdjustTo(Int32 percentageOfNormalSize); + /// + /// Gets or sets the number of pages the worksheet will be printed on. + /// This is equivalent to setting both PagesWide and PagesTall properties. + /// Setting this value will override the Scale value. + /// + /// The pages wide. + /// The pages tall. + void FitToPages(Int32 pagesWide, Int32 pagesTall); + /// + /// Gets or sets the size of the paper to print the worksheet. + /// + XLPaperSize PaperSize { get; set; } + /// + /// Gets an object to work with the page margins. + /// + IXLMargins Margins { get; } + + /// + /// Gets an object to work with the page headers. + /// + IXLHeaderFooter Header { get; } + /// + /// Gets an object to work with the page footers. + /// + IXLHeaderFooter Footer { get; } + /// + /// Gets or sets a value indicating whether Excel will automatically adjust the font size to the scale of the worksheet. + /// + /// + /// true if Excel will automatically adjust the font size to the scale of the worksheet; otherwise, false. + /// + Boolean ScaleHFWithDocument { get; set; } + /// + /// Gets or sets a value indicating whether the header and footer margins are aligned with the left and right margins of the worksheet. + /// + /// + /// true if the header and footer margins are aligned with the left and right margins of the worksheet; otherwise, false. + /// + Boolean AlignHFWithMargins { get; set; } + + /// + /// Gets or sets a value indicating whether the gridlines will be printed. + /// + /// + /// true if the gridlines will be printed; otherwise, false. + /// + Boolean ShowGridlines { get; set; } + /// + /// Gets or sets a value indicating whether to show row numbers and column letters/numbers. + /// + /// + /// true to show row numbers and column letters/numbers; otherwise, false. + /// + Boolean ShowRowAndColumnHeadings { get; set; } + /// + /// Gets or sets a value indicating whether the worksheet will be printed in black and white. + /// + /// + /// true if the worksheet will be printed in black and white; otherwise, false. + /// + Boolean BlackAndWhite { get; set; } + /// + /// Gets or sets a value indicating whether the worksheet will be printed in draft quality. + /// + /// + /// true if the worksheet will be printed in draft quality; otherwise, false. + /// + Boolean DraftQuality { get; set; } + /// + /// Gets or sets the page order for printing. + /// + XLPageOrderValues PageOrder { get; set; } + /// + /// Gets or sets how the comments will be printed. + /// + XLShowCommentsValues ShowComments { get; set; } + + /// + /// Gets a list with the row breaks (for printing). + /// + List RowBreaks { get; } + /// + /// Gets a list with the column breaks (for printing). + /// + List ColumnBreaks { get; } + /// + /// Adds a horizontal page break after the given row. + /// + /// The row to insert the break. + void AddHorizontalPageBreak(Int32 row); + + /// + /// Adds a vertical page break after the given column. + /// + /// The column to insert the break. + void AddVerticalPageBreak(Int32 column); + + /// + /// Gets or sets how error values will be printed. + /// + XLPrintErrorValues PrintErrorValue { get; set; } + + IXLPageSetup SetPageOrientation(XLPageOrientation value); + IXLPageSetup SetPagesWide(Int32 value); + IXLPageSetup SetPagesTall(Int32 value); + IXLPageSetup SetScale(Int32 value); + IXLPageSetup SetHorizontalDpi(Int32 value); + IXLPageSetup SetVerticalDpi(Int32 value); + IXLPageSetup SetFirstPageNumber(Int64 value); + IXLPageSetup SetCenterHorizontally(); IXLPageSetup SetCenterHorizontally(Boolean value); + IXLPageSetup SetCenterVertically(); IXLPageSetup SetCenterVertically(Boolean value); + IXLPageSetup SetPaperSize(XLPaperSize value); + IXLPageSetup SetScaleHFWithDocument(); IXLPageSetup SetScaleHFWithDocument(Boolean value); + IXLPageSetup SetAlignHFWithMargins(); IXLPageSetup SetAlignHFWithMargins(Boolean value); + IXLPageSetup SetShowGridlines(); IXLPageSetup SetShowGridlines(Boolean value); + IXLPageSetup SetShowRowAndColumnHeadings(); IXLPageSetup SetShowRowAndColumnHeadings(Boolean value); + IXLPageSetup SetBlackAndWhite(); IXLPageSetup SetBlackAndWhite(Boolean value); + IXLPageSetup SetDraftQuality(); IXLPageSetup SetDraftQuality(Boolean value); + IXLPageSetup SetPageOrder(XLPageOrderValues value); + IXLPageSetup SetShowComments(XLShowCommentsValues value); + IXLPageSetup SetPrintErrorValue(XLPrintErrorValues value); + + + Boolean DifferentFirstPageOnHF { get; set; } + IXLPageSetup SetDifferentFirstPageOnHF(); IXLPageSetup SetDifferentFirstPageOnHF(Boolean value); + Boolean DifferentOddEvenPagesOnHF { get; set; } + IXLPageSetup SetDifferentOddEvenPagesOnHF(); IXLPageSetup SetDifferentOddEvenPagesOnHF(Boolean value); + } +} diff --git a/ClosedXML/Excel/PageSetup/IXLPrintAreas.cs b/ClosedXML/Excel/PageSetup/IXLPrintAreas.cs index 48b5816..8f04642 100644 --- a/ClosedXML/Excel/PageSetup/IXLPrintAreas.cs +++ b/ClosedXML/Excel/PageSetup/IXLPrintAreas.cs @@ -1,32 +1,32 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLPrintAreas: IEnumerable - { - /// Removes the print areas from the worksheet. - void Clear(); - - /// Adds a range to the print areas. - /// The first cell row. - /// The first cell column. - /// The last cell row. - /// The last cell column. - void Add(Int32 firstCellRow, Int32 firstCellColumn, Int32 lastCellRow, Int32 lastCellColumn); - - /// Adds a range to the print areas. - /// The range address to add. - void Add(String rangeAddress); - - /// Adds a range to the print areas. - /// The first cell address. - /// The last cell address. - void Add(String firstCellAddress, String lastCellAddress); - - /// Adds a range to the print areas. - /// The first cell address. - /// The last cell address. - void Add(IXLAddress firstCellAddress, IXLAddress lastCellAddress); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLPrintAreas: IEnumerable + { + /// Removes the print areas from the worksheet. + void Clear(); + + /// Adds a range to the print areas. + /// The first cell row. + /// The first cell column. + /// The last cell row. + /// The last cell column. + void Add(Int32 firstCellRow, Int32 firstCellColumn, Int32 lastCellRow, Int32 lastCellColumn); + + /// Adds a range to the print areas. + /// The range address to add. + void Add(String rangeAddress); + + /// Adds a range to the print areas. + /// The first cell address. + /// The last cell address. + void Add(String firstCellAddress, String lastCellAddress); + + /// Adds a range to the print areas. + /// The first cell address. + /// The last cell address. + void Add(IXLAddress firstCellAddress, IXLAddress lastCellAddress); + } +} diff --git a/ClosedXML/Excel/PageSetup/XLHFItem.cs b/ClosedXML/Excel/PageSetup/XLHFItem.cs index 4fd398e..e344ea3 100644 --- a/ClosedXML/Excel/PageSetup/XLHFItem.cs +++ b/ClosedXML/Excel/PageSetup/XLHFItem.cs @@ -1,118 +1,118 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLHFItem : IXLHFItem - { - internal readonly XLHeaderFooter HeaderFooter; - public XLHFItem(XLHeaderFooter headerFooter) - { - HeaderFooter = headerFooter; - } - public XLHFItem(XLHFItem defaultHFItem, XLHeaderFooter headerFooter) - :this(headerFooter) - { - defaultHFItem.texts.ForEach(kp => texts.Add(kp.Key, kp.Value)); - } - private readonly Dictionary> texts = new Dictionary>(); - public String GetText(XLHFOccurrence occurrence) - { - var sb = new StringBuilder(); - if(texts.ContainsKey(occurrence)) - { - foreach (var hfText in texts[occurrence]) - sb.Append(hfText.GetHFText(sb.ToString())); - } - - return sb.ToString(); - } - - public IXLRichString AddText(String text) - { - return AddText(text, XLHFOccurrence.AllPages); - } - public IXLRichString AddText(XLHFPredefinedText predefinedText) - { - return AddText(predefinedText, XLHFOccurrence.AllPages); - } - - public IXLRichString AddText(String text, XLHFOccurrence occurrence) - { - XLRichString richText = new XLRichString(text, this.HeaderFooter.Worksheet.Style.Font, this); - - var hfText = new XLHFText(richText, this); - if (occurrence == XLHFOccurrence.AllPages) - { - AddTextToOccurrence(hfText, XLHFOccurrence.EvenPages); - AddTextToOccurrence(hfText, XLHFOccurrence.FirstPage); - AddTextToOccurrence(hfText, XLHFOccurrence.OddPages); - } - else - { - AddTextToOccurrence(hfText, occurrence); - } - - return richText; - } - - public IXLRichString AddNewLine() - { - return AddText(Environment.NewLine); - } - - public IXLRichString AddImage(String imagePath, XLHFOccurrence occurrence = XLHFOccurrence.AllPages) - { - throw new NotImplementedException(); - } - - private void AddTextToOccurrence(XLHFText hfText, XLHFOccurrence occurrence) - { - if (texts.ContainsKey(occurrence)) - texts[occurrence].Add(hfText); - else - texts.Add(occurrence, new List { hfText }); - - this.HeaderFooter.Changed = true; - } - - public IXLRichString AddText(XLHFPredefinedText predefinedText, XLHFOccurrence occurrence) - { - String hfText; - switch (predefinedText) - { - case XLHFPredefinedText.PageNumber: hfText = "&P"; break; - case XLHFPredefinedText.NumberOfPages : hfText = "&N"; break; - case XLHFPredefinedText.Date : hfText = "&D"; break; - case XLHFPredefinedText.Time : hfText = "&T"; break; - case XLHFPredefinedText.Path : hfText = "&Z"; break; - case XLHFPredefinedText.File : hfText = "&F"; break; - case XLHFPredefinedText.SheetName : hfText = "&A"; break; - case XLHFPredefinedText.FullPath: hfText = "&Z&F"; break; - default: throw new NotImplementedException(); - } - return AddText(hfText, occurrence); - } - - public void Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages) - { - if (occurrence == XLHFOccurrence.AllPages) - { - ClearOccurrence(XLHFOccurrence.EvenPages); - ClearOccurrence(XLHFOccurrence.FirstPage); - ClearOccurrence(XLHFOccurrence.OddPages); - } - else - { - ClearOccurrence(occurrence); - } - } - - private void ClearOccurrence(XLHFOccurrence occurrence) - { - if (texts.ContainsKey(occurrence)) - texts.Remove(occurrence); - } - } -} +using System; +using System.Collections.Generic; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLHFItem : IXLHFItem + { + internal readonly XLHeaderFooter HeaderFooter; + public XLHFItem(XLHeaderFooter headerFooter) + { + HeaderFooter = headerFooter; + } + public XLHFItem(XLHFItem defaultHFItem, XLHeaderFooter headerFooter) + :this(headerFooter) + { + defaultHFItem.texts.ForEach(kp => texts.Add(kp.Key, kp.Value)); + } + private readonly Dictionary> texts = new Dictionary>(); + public String GetText(XLHFOccurrence occurrence) + { + var sb = new StringBuilder(); + if(texts.ContainsKey(occurrence)) + { + foreach (var hfText in texts[occurrence]) + sb.Append(hfText.GetHFText(sb.ToString())); + } + + return sb.ToString(); + } + + public IXLRichString AddText(String text) + { + return AddText(text, XLHFOccurrence.AllPages); + } + public IXLRichString AddText(XLHFPredefinedText predefinedText) + { + return AddText(predefinedText, XLHFOccurrence.AllPages); + } + + public IXLRichString AddText(String text, XLHFOccurrence occurrence) + { + XLRichString richText = new XLRichString(text, this.HeaderFooter.Worksheet.Style.Font, this); + + var hfText = new XLHFText(richText, this); + if (occurrence == XLHFOccurrence.AllPages) + { + AddTextToOccurrence(hfText, XLHFOccurrence.EvenPages); + AddTextToOccurrence(hfText, XLHFOccurrence.FirstPage); + AddTextToOccurrence(hfText, XLHFOccurrence.OddPages); + } + else + { + AddTextToOccurrence(hfText, occurrence); + } + + return richText; + } + + public IXLRichString AddNewLine() + { + return AddText(Environment.NewLine); + } + + public IXLRichString AddImage(String imagePath, XLHFOccurrence occurrence = XLHFOccurrence.AllPages) + { + throw new NotImplementedException(); + } + + private void AddTextToOccurrence(XLHFText hfText, XLHFOccurrence occurrence) + { + if (texts.ContainsKey(occurrence)) + texts[occurrence].Add(hfText); + else + texts.Add(occurrence, new List { hfText }); + + this.HeaderFooter.Changed = true; + } + + public IXLRichString AddText(XLHFPredefinedText predefinedText, XLHFOccurrence occurrence) + { + String hfText; + switch (predefinedText) + { + case XLHFPredefinedText.PageNumber: hfText = "&P"; break; + case XLHFPredefinedText.NumberOfPages : hfText = "&N"; break; + case XLHFPredefinedText.Date : hfText = "&D"; break; + case XLHFPredefinedText.Time : hfText = "&T"; break; + case XLHFPredefinedText.Path : hfText = "&Z"; break; + case XLHFPredefinedText.File : hfText = "&F"; break; + case XLHFPredefinedText.SheetName : hfText = "&A"; break; + case XLHFPredefinedText.FullPath: hfText = "&Z&F"; break; + default: throw new NotImplementedException(); + } + return AddText(hfText, occurrence); + } + + public void Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages) + { + if (occurrence == XLHFOccurrence.AllPages) + { + ClearOccurrence(XLHFOccurrence.EvenPages); + ClearOccurrence(XLHFOccurrence.FirstPage); + ClearOccurrence(XLHFOccurrence.OddPages); + } + else + { + ClearOccurrence(occurrence); + } + } + + private void ClearOccurrence(XLHFOccurrence occurrence) + { + if (texts.ContainsKey(occurrence)) + texts.Remove(occurrence); + } + } +} diff --git a/ClosedXML/Excel/PageSetup/XLHFText.cs b/ClosedXML/Excel/PageSetup/XLHFText.cs index ea9d5a8..f9530a3 100644 --- a/ClosedXML/Excel/PageSetup/XLHFText.cs +++ b/ClosedXML/Excel/PageSetup/XLHFText.cs @@ -1,103 +1,103 @@ -using System; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLHFText - { - private readonly XLHFItem _hfItem; - public XLHFText(XLRichString richText, XLHFItem hfItem) - { - RichText = richText; - _hfItem = hfItem; - } - public XLRichString RichText { get; private set; } - - public String GetHFText(String prevText) - { - var wsFont = _hfItem.HeaderFooter.Worksheet.Style.Font; - - var isRichText = RichText.FontName != null && RichText.FontName != wsFont.FontName - || RichText.Bold != wsFont.Bold - || RichText.Italic != wsFont.Italic - || RichText.Strikethrough != wsFont.Strikethrough - || RichText.FontSize > 0 && Math.Abs(RichText.FontSize - wsFont.FontSize) > XLHelper.Epsilon - || RichText.VerticalAlignment != wsFont.VerticalAlignment - || RichText.Underline != wsFont.Underline - || !RichText.FontColor.Equals(wsFont.FontColor); - - if (!isRichText) - return RichText.Text; - - StringBuilder sb = new StringBuilder(); - - if (RichText.FontName != null && RichText.FontName != wsFont.FontName) - sb.Append("&\"" + RichText.FontName); - else - sb.Append("&\"-"); - - if (RichText.Bold && RichText.Italic) - sb.Append(",Bold Italic\""); - else if (RichText.Bold) - sb.Append(",Bold\""); - else if (RichText.Italic) - sb.Append(",Italic\""); - else - sb.Append(",Regular\""); - - if (RichText.FontSize > 0 && Math.Abs(RichText.FontSize - wsFont.FontSize) > XLHelper.Epsilon) - sb.Append("&" + RichText.FontSize); - - if (RichText.Strikethrough && !wsFont.Strikethrough) - sb.Append("&S"); - - if (RichText.VerticalAlignment != wsFont.VerticalAlignment) - { - if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Subscript) - sb.Append("&Y"); - else if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Superscript) - sb.Append("&X"); - } - - if (RichText.Underline != wsFont.Underline) - { - if (RichText.Underline == XLFontUnderlineValues.Single) - sb.Append("&U"); - else if (RichText.Underline == XLFontUnderlineValues.Double) - sb.Append("&E"); - } - - var lastColorPosition = prevText.LastIndexOf("&K"); - - if ( - (lastColorPosition >= 0 && !RichText.FontColor.Equals(XLColor.FromHtml("#" + prevText.Substring(lastColorPosition + 2, 6)))) - || (lastColorPosition == -1 && !RichText.FontColor.Equals(wsFont.FontColor)) - ) - sb.Append("&K" + RichText.FontColor.Color.ToHex().Substring(2)); - - sb.Append(RichText.Text); - - if (RichText.Underline != wsFont.Underline) - { - if (RichText.Underline == XLFontUnderlineValues.Single) - sb.Append("&U"); - else if (RichText.Underline == XLFontUnderlineValues.Double) - sb.Append("&E"); - } - - if (RichText.VerticalAlignment != wsFont.VerticalAlignment) - { - if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Subscript) - sb.Append("&Y"); - else if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Superscript) - sb.Append("&X"); - } - - if (RichText.Strikethrough && !wsFont.Strikethrough) - sb.Append("&S"); - - return sb.ToString(); - } - - } -} +using System; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLHFText + { + private readonly XLHFItem _hfItem; + public XLHFText(XLRichString richText, XLHFItem hfItem) + { + RichText = richText; + _hfItem = hfItem; + } + public XLRichString RichText { get; private set; } + + public String GetHFText(String prevText) + { + var wsFont = _hfItem.HeaderFooter.Worksheet.Style.Font; + + var isRichText = RichText.FontName != null && RichText.FontName != wsFont.FontName + || RichText.Bold != wsFont.Bold + || RichText.Italic != wsFont.Italic + || RichText.Strikethrough != wsFont.Strikethrough + || RichText.FontSize > 0 && Math.Abs(RichText.FontSize - wsFont.FontSize) > XLHelper.Epsilon + || RichText.VerticalAlignment != wsFont.VerticalAlignment + || RichText.Underline != wsFont.Underline + || !RichText.FontColor.Equals(wsFont.FontColor); + + if (!isRichText) + return RichText.Text; + + StringBuilder sb = new StringBuilder(); + + if (RichText.FontName != null && RichText.FontName != wsFont.FontName) + sb.Append("&\"" + RichText.FontName); + else + sb.Append("&\"-"); + + if (RichText.Bold && RichText.Italic) + sb.Append(",Bold Italic\""); + else if (RichText.Bold) + sb.Append(",Bold\""); + else if (RichText.Italic) + sb.Append(",Italic\""); + else + sb.Append(",Regular\""); + + if (RichText.FontSize > 0 && Math.Abs(RichText.FontSize - wsFont.FontSize) > XLHelper.Epsilon) + sb.Append("&" + RichText.FontSize); + + if (RichText.Strikethrough && !wsFont.Strikethrough) + sb.Append("&S"); + + if (RichText.VerticalAlignment != wsFont.VerticalAlignment) + { + if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Subscript) + sb.Append("&Y"); + else if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Superscript) + sb.Append("&X"); + } + + if (RichText.Underline != wsFont.Underline) + { + if (RichText.Underline == XLFontUnderlineValues.Single) + sb.Append("&U"); + else if (RichText.Underline == XLFontUnderlineValues.Double) + sb.Append("&E"); + } + + var lastColorPosition = prevText.LastIndexOf("&K"); + + if ( + (lastColorPosition >= 0 && !RichText.FontColor.Equals(XLColor.FromHtml("#" + prevText.Substring(lastColorPosition + 2, 6)))) + || (lastColorPosition == -1 && !RichText.FontColor.Equals(wsFont.FontColor)) + ) + sb.Append("&K" + RichText.FontColor.Color.ToHex().Substring(2)); + + sb.Append(RichText.Text); + + if (RichText.Underline != wsFont.Underline) + { + if (RichText.Underline == XLFontUnderlineValues.Single) + sb.Append("&U"); + else if (RichText.Underline == XLFontUnderlineValues.Double) + sb.Append("&E"); + } + + if (RichText.VerticalAlignment != wsFont.VerticalAlignment) + { + if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Subscript) + sb.Append("&Y"); + else if (RichText.VerticalAlignment == XLFontVerticalTextAlignmentValues.Superscript) + sb.Append("&X"); + } + + if (RichText.Strikethrough && !wsFont.Strikethrough) + sb.Append("&S"); + + return sb.ToString(); + } + + } +} diff --git a/ClosedXML/Excel/PageSetup/XLHeaderFooter.cs b/ClosedXML/Excel/PageSetup/XLHeaderFooter.cs index 18fe407..77f37ff 100644 --- a/ClosedXML/Excel/PageSetup/XLHeaderFooter.cs +++ b/ClosedXML/Excel/PageSetup/XLHeaderFooter.cs @@ -1,144 +1,144 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - using System.Linq; - - internal class XLHeaderFooter: IXLHeaderFooter - { - - public XLHeaderFooter(XLWorksheet worksheet) - { - this.Worksheet = worksheet; - Left = new XLHFItem(this); - Right = new XLHFItem(this); - Center = new XLHFItem(this); - SetAsInitial(); - } - - public XLHeaderFooter(XLHeaderFooter defaultHF, XLWorksheet worksheet) - { - this.Worksheet = worksheet; - defaultHF.innerTexts.ForEach(kp => innerTexts.Add(kp.Key, kp.Value)); - Left = new XLHFItem(defaultHF.Left as XLHFItem, this); - Center = new XLHFItem(defaultHF.Center as XLHFItem, this); - Right = new XLHFItem(defaultHF.Right as XLHFItem, this); - SetAsInitial(); - } - - internal readonly IXLWorksheet Worksheet; - - public IXLHFItem Left { get; private set; } - public IXLHFItem Center { get; private set; } - public IXLHFItem Right { get; private set; } - - public String GetText(XLHFOccurrence occurrence) - { - //if (innerTexts.ContainsKey(occurrence)) return innerTexts[occurrence]; - - var retVal = String.Empty; - var leftText = Left.GetText(occurrence); - var centerText = Center.GetText(occurrence); - var rightText = Right.GetText(occurrence); - retVal += leftText.Length > 0 ? "&L" + leftText : String.Empty; - retVal += centerText.Length > 0 ? "&C" + centerText : String.Empty; - retVal += rightText.Length > 0 ? "&R" + rightText : String.Empty; - if (retVal.Length > 255) - throw new ArgumentOutOfRangeException("Headers and Footers cannot be longer than 255 characters (including style markups)"); - return retVal; - } - - private Dictionary innerTexts = new Dictionary(); - internal String SetInnerText(XLHFOccurrence occurrence, String text) - { - var parsedElements = ParseFormattedHeaderFooterText(text); - - if (parsedElements.Any(e => e.Position == 'L')) - this.Left.AddText(string.Join("\r\n", parsedElements.Where(e => e.Position == 'L').Select(e => e.Text).ToArray()), occurrence); - - if (parsedElements.Any(e => e.Position == 'C')) - this.Center.AddText(string.Join("\r\n", parsedElements.Where(e => e.Position == 'C').Select(e => e.Text).ToArray()), occurrence); - - if (parsedElements.Any(e => e.Position == 'R')) - this.Right.AddText(string.Join("\r\n", parsedElements.Where(e => e.Position == 'R').Select(e => e.Text).ToArray()), occurrence); - - - if (innerTexts.ContainsKey(occurrence)) - innerTexts[occurrence] = text; - else - innerTexts.Add(occurrence, text); - - return innerTexts[occurrence]; - } - - private struct ParsedHeaderFooterElement - { - public char Position; - public string Text; - } - - private static IEnumerable ParseFormattedHeaderFooterText(string text) - { - var parsedElements = new List(); - var currentPosition = 'L'; // default is LEFT - var hfElement = ""; - - for (int i = 0; i < text.Length; i++) - { - if (i < text.Length - 1 && text[i] == '&' && (new char[] { 'L', 'C', 'R' }.Contains(text[i + 1]))) - { - if ("" != hfElement) parsedElements.Add(new ParsedHeaderFooterElement() - { - Position = currentPosition, - Text = hfElement - }); - - currentPosition = text[i + 1]; - i += 2; - hfElement = ""; - } - - hfElement += text[i]; - } - - if ("" != hfElement) - parsedElements.Add(new ParsedHeaderFooterElement() - { - Position = currentPosition, - Text = hfElement - }); - return parsedElements; - } - - private Dictionary _initialTexts; - - private Boolean _changed; - internal Boolean Changed - { - get - { - return _changed || _initialTexts.Any(it => GetText(it.Key) != it.Value); - } - set { _changed = value; } - } - - internal void SetAsInitial() - { - _initialTexts = new Dictionary(); - foreach (var o in Enum.GetValues(typeof(XLHFOccurrence)).Cast()) - { - _initialTexts.Add(o, GetText(o)); - } - } - - - public IXLHeaderFooter Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages) - { - Left.Clear(occurrence); - Right.Clear(occurrence); - Center.Clear(occurrence); - return this; - } - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + using System.Linq; + + internal class XLHeaderFooter: IXLHeaderFooter + { + + public XLHeaderFooter(XLWorksheet worksheet) + { + this.Worksheet = worksheet; + Left = new XLHFItem(this); + Right = new XLHFItem(this); + Center = new XLHFItem(this); + SetAsInitial(); + } + + public XLHeaderFooter(XLHeaderFooter defaultHF, XLWorksheet worksheet) + { + this.Worksheet = worksheet; + defaultHF.innerTexts.ForEach(kp => innerTexts.Add(kp.Key, kp.Value)); + Left = new XLHFItem(defaultHF.Left as XLHFItem, this); + Center = new XLHFItem(defaultHF.Center as XLHFItem, this); + Right = new XLHFItem(defaultHF.Right as XLHFItem, this); + SetAsInitial(); + } + + internal readonly IXLWorksheet Worksheet; + + public IXLHFItem Left { get; private set; } + public IXLHFItem Center { get; private set; } + public IXLHFItem Right { get; private set; } + + public String GetText(XLHFOccurrence occurrence) + { + //if (innerTexts.ContainsKey(occurrence)) return innerTexts[occurrence]; + + var retVal = String.Empty; + var leftText = Left.GetText(occurrence); + var centerText = Center.GetText(occurrence); + var rightText = Right.GetText(occurrence); + retVal += leftText.Length > 0 ? "&L" + leftText : String.Empty; + retVal += centerText.Length > 0 ? "&C" + centerText : String.Empty; + retVal += rightText.Length > 0 ? "&R" + rightText : String.Empty; + if (retVal.Length > 255) + throw new ArgumentOutOfRangeException("Headers and Footers cannot be longer than 255 characters (including style markups)"); + return retVal; + } + + private Dictionary innerTexts = new Dictionary(); + internal String SetInnerText(XLHFOccurrence occurrence, String text) + { + var parsedElements = ParseFormattedHeaderFooterText(text); + + if (parsedElements.Any(e => e.Position == 'L')) + this.Left.AddText(string.Join("\r\n", parsedElements.Where(e => e.Position == 'L').Select(e => e.Text).ToArray()), occurrence); + + if (parsedElements.Any(e => e.Position == 'C')) + this.Center.AddText(string.Join("\r\n", parsedElements.Where(e => e.Position == 'C').Select(e => e.Text).ToArray()), occurrence); + + if (parsedElements.Any(e => e.Position == 'R')) + this.Right.AddText(string.Join("\r\n", parsedElements.Where(e => e.Position == 'R').Select(e => e.Text).ToArray()), occurrence); + + + if (innerTexts.ContainsKey(occurrence)) + innerTexts[occurrence] = text; + else + innerTexts.Add(occurrence, text); + + return innerTexts[occurrence]; + } + + private struct ParsedHeaderFooterElement + { + public char Position; + public string Text; + } + + private static IEnumerable ParseFormattedHeaderFooterText(string text) + { + var parsedElements = new List(); + var currentPosition = 'L'; // default is LEFT + var hfElement = ""; + + for (int i = 0; i < text.Length; i++) + { + if (i < text.Length - 1 && text[i] == '&' && (new char[] { 'L', 'C', 'R' }.Contains(text[i + 1]))) + { + if ("" != hfElement) parsedElements.Add(new ParsedHeaderFooterElement() + { + Position = currentPosition, + Text = hfElement + }); + + currentPosition = text[i + 1]; + i += 2; + hfElement = ""; + } + + hfElement += text[i]; + } + + if ("" != hfElement) + parsedElements.Add(new ParsedHeaderFooterElement() + { + Position = currentPosition, + Text = hfElement + }); + return parsedElements; + } + + private Dictionary _initialTexts; + + private Boolean _changed; + internal Boolean Changed + { + get + { + return _changed || _initialTexts.Any(it => GetText(it.Key) != it.Value); + } + set { _changed = value; } + } + + internal void SetAsInitial() + { + _initialTexts = new Dictionary(); + foreach (var o in Enum.GetValues(typeof(XLHFOccurrence)).Cast()) + { + _initialTexts.Add(o, GetText(o)); + } + } + + + public IXLHeaderFooter Clear(XLHFOccurrence occurrence = XLHFOccurrence.AllPages) + { + Left.Clear(occurrence); + Right.Clear(occurrence); + Center.Clear(occurrence); + return this; + } + } +} diff --git a/ClosedXML/Excel/PageSetup/XLMargins.cs b/ClosedXML/Excel/PageSetup/XLMargins.cs index 896254a..9643542 100644 --- a/ClosedXML/Excel/PageSetup/XLMargins.cs +++ b/ClosedXML/Excel/PageSetup/XLMargins.cs @@ -1,22 +1,22 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLMargins: IXLMargins - { - public Double Left { get; set; } - public Double Right { get; set; } - public Double Top { get; set; } - public Double Bottom { get; set; } - public Double Header { get; set; } - public Double Footer { get; set; } - - public IXLMargins SetLeft(Double value) { Left = value; return this; } - public IXLMargins SetRight(Double value) { Right = value; return this; } - public IXLMargins SetTop(Double value) { Top = value; return this; } - public IXLMargins SetBottom(Double value) { Bottom = value; return this; } - public IXLMargins SetHeader(Double value) { Header = value; return this; } - public IXLMargins SetFooter(Double value) { Footer = value; return this; } - - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLMargins: IXLMargins + { + public Double Left { get; set; } + public Double Right { get; set; } + public Double Top { get; set; } + public Double Bottom { get; set; } + public Double Header { get; set; } + public Double Footer { get; set; } + + public IXLMargins SetLeft(Double value) { Left = value; return this; } + public IXLMargins SetRight(Double value) { Right = value; return this; } + public IXLMargins SetTop(Double value) { Top = value; return this; } + public IXLMargins SetBottom(Double value) { Bottom = value; return this; } + public IXLMargins SetHeader(Double value) { Header = value; return this; } + public IXLMargins SetFooter(Double value) { Footer = value; return this; } + + } +} diff --git a/ClosedXML/Excel/PageSetup/XLPageSetup.cs b/ClosedXML/Excel/PageSetup/XLPageSetup.cs index 8fdc197..7e03392 100644 --- a/ClosedXML/Excel/PageSetup/XLPageSetup.cs +++ b/ClosedXML/Excel/PageSetup/XLPageSetup.cs @@ -1,257 +1,257 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLPageSetup : IXLPageSetup - { - public XLPageSetup(XLPageSetup defaultPageOptions, XLWorksheet worksheet) - { - - if (defaultPageOptions != null) - { - PrintAreas = new XLPrintAreas(defaultPageOptions.PrintAreas as XLPrintAreas, worksheet); - CenterHorizontally = defaultPageOptions.CenterHorizontally; - CenterVertically = defaultPageOptions.CenterVertically; - FirstPageNumber = defaultPageOptions.FirstPageNumber; - HorizontalDpi = defaultPageOptions.HorizontalDpi; - PageOrientation = defaultPageOptions.PageOrientation; - VerticalDpi = defaultPageOptions.VerticalDpi; - - PaperSize = defaultPageOptions.PaperSize; - _pagesTall = defaultPageOptions.PagesTall; - _pagesWide = defaultPageOptions.PagesWide; - _scale = defaultPageOptions.Scale; - - - if (defaultPageOptions.Margins != null) - { - Margins = new XLMargins - { - Top = defaultPageOptions.Margins.Top, - Bottom = defaultPageOptions.Margins.Bottom, - Left = defaultPageOptions.Margins.Left, - Right = defaultPageOptions.Margins.Right, - Header = defaultPageOptions.Margins.Header, - Footer = defaultPageOptions.Margins.Footer - }; - } - AlignHFWithMargins = defaultPageOptions.AlignHFWithMargins; - ScaleHFWithDocument = defaultPageOptions.ScaleHFWithDocument; - ShowGridlines = defaultPageOptions.ShowGridlines; - ShowRowAndColumnHeadings = defaultPageOptions.ShowRowAndColumnHeadings; - BlackAndWhite = defaultPageOptions.BlackAndWhite; - DraftQuality = defaultPageOptions.DraftQuality; - PageOrder = defaultPageOptions.PageOrder; - - ColumnBreaks = defaultPageOptions.ColumnBreaks.ToList(); - RowBreaks = defaultPageOptions.RowBreaks.ToList(); - Header = new XLHeaderFooter(defaultPageOptions.Header as XLHeaderFooter, worksheet); - Footer = new XLHeaderFooter(defaultPageOptions.Footer as XLHeaderFooter, worksheet); - PrintErrorValue = defaultPageOptions.PrintErrorValue; - } - else - { - PrintAreas = new XLPrintAreas(worksheet); - Header = new XLHeaderFooter(worksheet); - Footer = new XLHeaderFooter(worksheet); - ColumnBreaks = new List(); - RowBreaks = new List(); - } - } - public IXLPrintAreas PrintAreas { get; private set; } - - - public Int32 FirstRowToRepeatAtTop { get; private set; } - public Int32 LastRowToRepeatAtTop { get; private set; } - public void SetRowsToRepeatAtTop(String range) - { - var arrRange = range.Replace("$", "").Split(':'); - SetRowsToRepeatAtTop(Int32.Parse(arrRange[0]), Int32.Parse(arrRange[1])); - } - public void SetRowsToRepeatAtTop(Int32 firstRowToRepeatAtTop, Int32 lastRowToRepeatAtTop) - { - if (firstRowToRepeatAtTop <= 0) throw new ArgumentOutOfRangeException("The first row has to be greater than zero."); - if (firstRowToRepeatAtTop > lastRowToRepeatAtTop) throw new ArgumentOutOfRangeException("The first row has to be less than the second row."); - - FirstRowToRepeatAtTop = firstRowToRepeatAtTop; - LastRowToRepeatAtTop = lastRowToRepeatAtTop; - } - public Int32 FirstColumnToRepeatAtLeft { get; private set; } - public Int32 LastColumnToRepeatAtLeft { get; private set; } - public void SetColumnsToRepeatAtLeft(String range) - { - var arrRange = range.Replace("$", "").Split(':'); - Int32 iTest; - if (Int32.TryParse(arrRange[0], out iTest)) - SetColumnsToRepeatAtLeft(Int32.Parse(arrRange[0]), Int32.Parse(arrRange[1])); - else - SetColumnsToRepeatAtLeft(arrRange[0], arrRange[1]); - } - public void SetColumnsToRepeatAtLeft(String firstColumnToRepeatAtLeft, String lastColumnToRepeatAtLeft) - { - SetColumnsToRepeatAtLeft(XLHelper.GetColumnNumberFromLetter(firstColumnToRepeatAtLeft), XLHelper.GetColumnNumberFromLetter(lastColumnToRepeatAtLeft)); - } - public void SetColumnsToRepeatAtLeft(Int32 firstColumnToRepeatAtLeft, Int32 lastColumnToRepeatAtLeft) - { - if (firstColumnToRepeatAtLeft <= 0) throw new ArgumentOutOfRangeException("The first column has to be greater than zero."); - if (firstColumnToRepeatAtLeft > lastColumnToRepeatAtLeft) throw new ArgumentOutOfRangeException("The first column has to be less than the second column."); - - FirstColumnToRepeatAtLeft = firstColumnToRepeatAtLeft; - LastColumnToRepeatAtLeft = lastColumnToRepeatAtLeft; - } - - public XLPageOrientation PageOrientation { get; set; } - public XLPaperSize PaperSize { get; set; } - public Int32 HorizontalDpi { get; set; } - public Int32 VerticalDpi { get; set; } - public Int64 FirstPageNumber { get; set; } - public Boolean CenterHorizontally { get; set; } - public Boolean CenterVertically { get; set; } - public XLPrintErrorValues PrintErrorValue { get; set; } - public IXLMargins Margins { get; set; } - - private Int32 _pagesWide; - public Int32 PagesWide - { - get - { - return _pagesWide; - } - set - { - _pagesWide = value; - if (_pagesWide >0) - _scale = 0; - } - } - - private Int32 _pagesTall; - public Int32 PagesTall - { - get - { - return _pagesTall; - } - set - { - _pagesTall = value; - if (_pagesTall >0) - _scale = 0; - } - } - - private Int32 _scale; - public Int32 Scale - { - get - { - return _scale; - } - set - { - _scale = value; - if (_scale <= 0) return; - _pagesTall = 0; - _pagesWide = 0; - } - } - - public void AdjustTo(Int32 percentageOfNormalSize) - { - Scale = percentageOfNormalSize; - _pagesWide = 0; - _pagesTall = 0; - } - public void FitToPages(Int32 pagesWide, Int32 pagesTall) - { - _pagesWide = pagesWide; - this._pagesTall = pagesTall; - _scale = 0; - } - - - public IXLHeaderFooter Header { get; private set; } - public IXLHeaderFooter Footer { get; private set; } - - public Boolean ScaleHFWithDocument { get; set; } - public Boolean AlignHFWithMargins { get; set; } - - public Boolean ShowGridlines { get; set; } - public Boolean ShowRowAndColumnHeadings { get; set; } - public Boolean BlackAndWhite { get; set; } - public Boolean DraftQuality { get; set; } - - public XLPageOrderValues PageOrder { get; set; } - public XLShowCommentsValues ShowComments { get; set; } - - public List RowBreaks { get; private set; } - public List ColumnBreaks { get; private set; } - public void AddHorizontalPageBreak(Int32 row) - { - if (!RowBreaks.Contains(row)) - RowBreaks.Add(row); - RowBreaks.Sort(); - } - public void AddVerticalPageBreak(Int32 column) - { - if (!ColumnBreaks.Contains(column)) - ColumnBreaks.Add(column); - ColumnBreaks.Sort(); - } - - //public void SetPageBreak(IXLRange range, XLPageBreakLocations breakLocation) - //{ - // switch (breakLocation) - // { - // case XLPageBreakLocations.AboveRange: RowBreaks.Add(range.Internals.Worksheet.Row(range.RowNumber)); break; - // case XLPageBreakLocations.BelowRange: RowBreaks.Add(range.Internals.Worksheet.Row(range.RowCount())); break; - // case XLPageBreakLocations.LeftOfRange: ColumnBreaks.Add(range.Internals.Worksheet.Column(range.ColumnNumber)); break; - // case XLPageBreakLocations.RightOfRange: ColumnBreaks.Add(range.Internals.Worksheet.Column(range.ColumnCount())); break; - // default: throw new NotImplementedException(); - // } - //} - - public IXLPageSetup SetPageOrientation(XLPageOrientation value) { PageOrientation = value; return this; } - public IXLPageSetup SetPagesWide(Int32 value) { PagesWide = value; return this; } - public IXLPageSetup SetPagesTall(Int32 value) { PagesTall = value; return this; } - public IXLPageSetup SetScale(Int32 value) { Scale = value; return this; } - public IXLPageSetup SetHorizontalDpi(Int32 value) { HorizontalDpi = value; return this; } - public IXLPageSetup SetVerticalDpi(Int32 value) { VerticalDpi = value; return this; } - public IXLPageSetup SetFirstPageNumber(Int64 value) { FirstPageNumber = value; return this; } - public IXLPageSetup SetCenterHorizontally() { CenterHorizontally = true; return this; } public IXLPageSetup SetCenterHorizontally(Boolean value) { CenterHorizontally = value; return this; } - public IXLPageSetup SetCenterVertically() { CenterVertically = true; return this; } public IXLPageSetup SetCenterVertically(Boolean value) { CenterVertically = value; return this; } - public IXLPageSetup SetPaperSize(XLPaperSize value) { PaperSize = value; return this; } - public IXLPageSetup SetScaleHFWithDocument() { ScaleHFWithDocument = true; return this; } public IXLPageSetup SetScaleHFWithDocument(Boolean value) { ScaleHFWithDocument = value; return this; } - public IXLPageSetup SetAlignHFWithMargins() { AlignHFWithMargins = true; return this; } public IXLPageSetup SetAlignHFWithMargins(Boolean value) { AlignHFWithMargins = value; return this; } - public IXLPageSetup SetShowGridlines() { ShowGridlines = true; return this; } public IXLPageSetup SetShowGridlines(Boolean value) { ShowGridlines = value; return this; } - public IXLPageSetup SetShowRowAndColumnHeadings() { ShowRowAndColumnHeadings = true; return this; } public IXLPageSetup SetShowRowAndColumnHeadings(Boolean value) { ShowRowAndColumnHeadings = value; return this; } - public IXLPageSetup SetBlackAndWhite() { BlackAndWhite = true; return this; } public IXLPageSetup SetBlackAndWhite(Boolean value) { BlackAndWhite = value; return this; } - public IXLPageSetup SetDraftQuality() { DraftQuality = true; return this; } public IXLPageSetup SetDraftQuality(Boolean value) { DraftQuality = value; return this; } - public IXLPageSetup SetPageOrder(XLPageOrderValues value) { PageOrder = value; return this; } - public IXLPageSetup SetShowComments(XLShowCommentsValues value) { ShowComments = value; return this; } - public IXLPageSetup SetPrintErrorValue(XLPrintErrorValues value) { PrintErrorValue = value; return this; } - - public Boolean DifferentFirstPageOnHF { get; set; } - public IXLPageSetup SetDifferentFirstPageOnHF() - { - return SetDifferentFirstPageOnHF(true); - } - public IXLPageSetup SetDifferentFirstPageOnHF(Boolean value) - { - DifferentFirstPageOnHF = value; - return this; - } - public Boolean DifferentOddEvenPagesOnHF { get; set; } - public IXLPageSetup SetDifferentOddEvenPagesOnHF() - { - return SetDifferentOddEvenPagesOnHF(true); - } - public IXLPageSetup SetDifferentOddEvenPagesOnHF(Boolean value) - { - DifferentOddEvenPagesOnHF = value; - return this; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLPageSetup : IXLPageSetup + { + public XLPageSetup(XLPageSetup defaultPageOptions, XLWorksheet worksheet) + { + + if (defaultPageOptions != null) + { + PrintAreas = new XLPrintAreas(defaultPageOptions.PrintAreas as XLPrintAreas, worksheet); + CenterHorizontally = defaultPageOptions.CenterHorizontally; + CenterVertically = defaultPageOptions.CenterVertically; + FirstPageNumber = defaultPageOptions.FirstPageNumber; + HorizontalDpi = defaultPageOptions.HorizontalDpi; + PageOrientation = defaultPageOptions.PageOrientation; + VerticalDpi = defaultPageOptions.VerticalDpi; + + PaperSize = defaultPageOptions.PaperSize; + _pagesTall = defaultPageOptions.PagesTall; + _pagesWide = defaultPageOptions.PagesWide; + _scale = defaultPageOptions.Scale; + + + if (defaultPageOptions.Margins != null) + { + Margins = new XLMargins + { + Top = defaultPageOptions.Margins.Top, + Bottom = defaultPageOptions.Margins.Bottom, + Left = defaultPageOptions.Margins.Left, + Right = defaultPageOptions.Margins.Right, + Header = defaultPageOptions.Margins.Header, + Footer = defaultPageOptions.Margins.Footer + }; + } + AlignHFWithMargins = defaultPageOptions.AlignHFWithMargins; + ScaleHFWithDocument = defaultPageOptions.ScaleHFWithDocument; + ShowGridlines = defaultPageOptions.ShowGridlines; + ShowRowAndColumnHeadings = defaultPageOptions.ShowRowAndColumnHeadings; + BlackAndWhite = defaultPageOptions.BlackAndWhite; + DraftQuality = defaultPageOptions.DraftQuality; + PageOrder = defaultPageOptions.PageOrder; + + ColumnBreaks = defaultPageOptions.ColumnBreaks.ToList(); + RowBreaks = defaultPageOptions.RowBreaks.ToList(); + Header = new XLHeaderFooter(defaultPageOptions.Header as XLHeaderFooter, worksheet); + Footer = new XLHeaderFooter(defaultPageOptions.Footer as XLHeaderFooter, worksheet); + PrintErrorValue = defaultPageOptions.PrintErrorValue; + } + else + { + PrintAreas = new XLPrintAreas(worksheet); + Header = new XLHeaderFooter(worksheet); + Footer = new XLHeaderFooter(worksheet); + ColumnBreaks = new List(); + RowBreaks = new List(); + } + } + public IXLPrintAreas PrintAreas { get; private set; } + + + public Int32 FirstRowToRepeatAtTop { get; private set; } + public Int32 LastRowToRepeatAtTop { get; private set; } + public void SetRowsToRepeatAtTop(String range) + { + var arrRange = range.Replace("$", "").Split(':'); + SetRowsToRepeatAtTop(Int32.Parse(arrRange[0]), Int32.Parse(arrRange[1])); + } + public void SetRowsToRepeatAtTop(Int32 firstRowToRepeatAtTop, Int32 lastRowToRepeatAtTop) + { + if (firstRowToRepeatAtTop <= 0) throw new ArgumentOutOfRangeException("The first row has to be greater than zero."); + if (firstRowToRepeatAtTop > lastRowToRepeatAtTop) throw new ArgumentOutOfRangeException("The first row has to be less than the second row."); + + FirstRowToRepeatAtTop = firstRowToRepeatAtTop; + LastRowToRepeatAtTop = lastRowToRepeatAtTop; + } + public Int32 FirstColumnToRepeatAtLeft { get; private set; } + public Int32 LastColumnToRepeatAtLeft { get; private set; } + public void SetColumnsToRepeatAtLeft(String range) + { + var arrRange = range.Replace("$", "").Split(':'); + Int32 iTest; + if (Int32.TryParse(arrRange[0], out iTest)) + SetColumnsToRepeatAtLeft(Int32.Parse(arrRange[0]), Int32.Parse(arrRange[1])); + else + SetColumnsToRepeatAtLeft(arrRange[0], arrRange[1]); + } + public void SetColumnsToRepeatAtLeft(String firstColumnToRepeatAtLeft, String lastColumnToRepeatAtLeft) + { + SetColumnsToRepeatAtLeft(XLHelper.GetColumnNumberFromLetter(firstColumnToRepeatAtLeft), XLHelper.GetColumnNumberFromLetter(lastColumnToRepeatAtLeft)); + } + public void SetColumnsToRepeatAtLeft(Int32 firstColumnToRepeatAtLeft, Int32 lastColumnToRepeatAtLeft) + { + if (firstColumnToRepeatAtLeft <= 0) throw new ArgumentOutOfRangeException("The first column has to be greater than zero."); + if (firstColumnToRepeatAtLeft > lastColumnToRepeatAtLeft) throw new ArgumentOutOfRangeException("The first column has to be less than the second column."); + + FirstColumnToRepeatAtLeft = firstColumnToRepeatAtLeft; + LastColumnToRepeatAtLeft = lastColumnToRepeatAtLeft; + } + + public XLPageOrientation PageOrientation { get; set; } + public XLPaperSize PaperSize { get; set; } + public Int32 HorizontalDpi { get; set; } + public Int32 VerticalDpi { get; set; } + public Int64 FirstPageNumber { get; set; } + public Boolean CenterHorizontally { get; set; } + public Boolean CenterVertically { get; set; } + public XLPrintErrorValues PrintErrorValue { get; set; } + public IXLMargins Margins { get; set; } + + private Int32 _pagesWide; + public Int32 PagesWide + { + get + { + return _pagesWide; + } + set + { + _pagesWide = value; + if (_pagesWide >0) + _scale = 0; + } + } + + private Int32 _pagesTall; + public Int32 PagesTall + { + get + { + return _pagesTall; + } + set + { + _pagesTall = value; + if (_pagesTall >0) + _scale = 0; + } + } + + private Int32 _scale; + public Int32 Scale + { + get + { + return _scale; + } + set + { + _scale = value; + if (_scale <= 0) return; + _pagesTall = 0; + _pagesWide = 0; + } + } + + public void AdjustTo(Int32 percentageOfNormalSize) + { + Scale = percentageOfNormalSize; + _pagesWide = 0; + _pagesTall = 0; + } + public void FitToPages(Int32 pagesWide, Int32 pagesTall) + { + _pagesWide = pagesWide; + this._pagesTall = pagesTall; + _scale = 0; + } + + + public IXLHeaderFooter Header { get; private set; } + public IXLHeaderFooter Footer { get; private set; } + + public Boolean ScaleHFWithDocument { get; set; } + public Boolean AlignHFWithMargins { get; set; } + + public Boolean ShowGridlines { get; set; } + public Boolean ShowRowAndColumnHeadings { get; set; } + public Boolean BlackAndWhite { get; set; } + public Boolean DraftQuality { get; set; } + + public XLPageOrderValues PageOrder { get; set; } + public XLShowCommentsValues ShowComments { get; set; } + + public List RowBreaks { get; private set; } + public List ColumnBreaks { get; private set; } + public void AddHorizontalPageBreak(Int32 row) + { + if (!RowBreaks.Contains(row)) + RowBreaks.Add(row); + RowBreaks.Sort(); + } + public void AddVerticalPageBreak(Int32 column) + { + if (!ColumnBreaks.Contains(column)) + ColumnBreaks.Add(column); + ColumnBreaks.Sort(); + } + + //public void SetPageBreak(IXLRange range, XLPageBreakLocations breakLocation) + //{ + // switch (breakLocation) + // { + // case XLPageBreakLocations.AboveRange: RowBreaks.Add(range.Internals.Worksheet.Row(range.RowNumber)); break; + // case XLPageBreakLocations.BelowRange: RowBreaks.Add(range.Internals.Worksheet.Row(range.RowCount())); break; + // case XLPageBreakLocations.LeftOfRange: ColumnBreaks.Add(range.Internals.Worksheet.Column(range.ColumnNumber)); break; + // case XLPageBreakLocations.RightOfRange: ColumnBreaks.Add(range.Internals.Worksheet.Column(range.ColumnCount())); break; + // default: throw new NotImplementedException(); + // } + //} + + public IXLPageSetup SetPageOrientation(XLPageOrientation value) { PageOrientation = value; return this; } + public IXLPageSetup SetPagesWide(Int32 value) { PagesWide = value; return this; } + public IXLPageSetup SetPagesTall(Int32 value) { PagesTall = value; return this; } + public IXLPageSetup SetScale(Int32 value) { Scale = value; return this; } + public IXLPageSetup SetHorizontalDpi(Int32 value) { HorizontalDpi = value; return this; } + public IXLPageSetup SetVerticalDpi(Int32 value) { VerticalDpi = value; return this; } + public IXLPageSetup SetFirstPageNumber(Int64 value) { FirstPageNumber = value; return this; } + public IXLPageSetup SetCenterHorizontally() { CenterHorizontally = true; return this; } public IXLPageSetup SetCenterHorizontally(Boolean value) { CenterHorizontally = value; return this; } + public IXLPageSetup SetCenterVertically() { CenterVertically = true; return this; } public IXLPageSetup SetCenterVertically(Boolean value) { CenterVertically = value; return this; } + public IXLPageSetup SetPaperSize(XLPaperSize value) { PaperSize = value; return this; } + public IXLPageSetup SetScaleHFWithDocument() { ScaleHFWithDocument = true; return this; } public IXLPageSetup SetScaleHFWithDocument(Boolean value) { ScaleHFWithDocument = value; return this; } + public IXLPageSetup SetAlignHFWithMargins() { AlignHFWithMargins = true; return this; } public IXLPageSetup SetAlignHFWithMargins(Boolean value) { AlignHFWithMargins = value; return this; } + public IXLPageSetup SetShowGridlines() { ShowGridlines = true; return this; } public IXLPageSetup SetShowGridlines(Boolean value) { ShowGridlines = value; return this; } + public IXLPageSetup SetShowRowAndColumnHeadings() { ShowRowAndColumnHeadings = true; return this; } public IXLPageSetup SetShowRowAndColumnHeadings(Boolean value) { ShowRowAndColumnHeadings = value; return this; } + public IXLPageSetup SetBlackAndWhite() { BlackAndWhite = true; return this; } public IXLPageSetup SetBlackAndWhite(Boolean value) { BlackAndWhite = value; return this; } + public IXLPageSetup SetDraftQuality() { DraftQuality = true; return this; } public IXLPageSetup SetDraftQuality(Boolean value) { DraftQuality = value; return this; } + public IXLPageSetup SetPageOrder(XLPageOrderValues value) { PageOrder = value; return this; } + public IXLPageSetup SetShowComments(XLShowCommentsValues value) { ShowComments = value; return this; } + public IXLPageSetup SetPrintErrorValue(XLPrintErrorValues value) { PrintErrorValue = value; return this; } + + public Boolean DifferentFirstPageOnHF { get; set; } + public IXLPageSetup SetDifferentFirstPageOnHF() + { + return SetDifferentFirstPageOnHF(true); + } + public IXLPageSetup SetDifferentFirstPageOnHF(Boolean value) + { + DifferentFirstPageOnHF = value; + return this; + } + public Boolean DifferentOddEvenPagesOnHF { get; set; } + public IXLPageSetup SetDifferentOddEvenPagesOnHF() + { + return SetDifferentOddEvenPagesOnHF(true); + } + public IXLPageSetup SetDifferentOddEvenPagesOnHF(Boolean value) + { + DifferentOddEvenPagesOnHF = value; + return this; + } + } +} diff --git a/ClosedXML/Excel/PageSetup/XLPrintAreas.cs b/ClosedXML/Excel/PageSetup/XLPrintAreas.cs index 797d2fc..6aea4b9 100644 --- a/ClosedXML/Excel/PageSetup/XLPrintAreas.cs +++ b/ClosedXML/Excel/PageSetup/XLPrintAreas.cs @@ -1,56 +1,56 @@ -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLPrintAreas : IXLPrintAreas - { - List ranges = new List(); - private XLWorksheet worksheet; - public XLPrintAreas(XLWorksheet worksheet) - { - this.worksheet = worksheet; - } - - public XLPrintAreas(XLPrintAreas defaultPrintAreas, XLWorksheet worksheet) - { - ranges = defaultPrintAreas.ranges.ToList(); - this.worksheet = worksheet; - } - - public void Clear() - { - ranges.Clear(); - } - - public void Add(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn) - { - ranges.Add(worksheet.Range(firstCellRow, firstCellColumn, lastCellRow, lastCellColumn)); - } - - public void Add(string rangeAddress) - { - ranges.Add(worksheet.Range(rangeAddress)); - } - - public void Add(string firstCellAddress, string lastCellAddress) - { - ranges.Add(worksheet.Range(firstCellAddress, lastCellAddress)); - } - - public void Add(IXLAddress firstCellAddress, IXLAddress lastCellAddress) - { - ranges.Add(worksheet.Range(firstCellAddress, lastCellAddress)); - } - - public IEnumerator GetEnumerator() - { - return ranges.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } -} +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLPrintAreas : IXLPrintAreas + { + List ranges = new List(); + private XLWorksheet worksheet; + public XLPrintAreas(XLWorksheet worksheet) + { + this.worksheet = worksheet; + } + + public XLPrintAreas(XLPrintAreas defaultPrintAreas, XLWorksheet worksheet) + { + ranges = defaultPrintAreas.ranges.ToList(); + this.worksheet = worksheet; + } + + public void Clear() + { + ranges.Clear(); + } + + public void Add(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn) + { + ranges.Add(worksheet.Range(firstCellRow, firstCellColumn, lastCellRow, lastCellColumn)); + } + + public void Add(string rangeAddress) + { + ranges.Add(worksheet.Range(rangeAddress)); + } + + public void Add(string firstCellAddress, string lastCellAddress) + { + ranges.Add(worksheet.Range(firstCellAddress, lastCellAddress)); + } + + public void Add(IXLAddress firstCellAddress, IXLAddress lastCellAddress) + { + ranges.Add(worksheet.Range(firstCellAddress, lastCellAddress)); + } + + public IEnumerator GetEnumerator() + { + return ranges.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/ClosedXML/Excel/PivotTables/IXLPivotField.cs b/ClosedXML/Excel/PivotTables/IXLPivotField.cs index 011e222..8ce227b 100644 --- a/ClosedXML/Excel/PivotTables/IXLPivotField.cs +++ b/ClosedXML/Excel/PivotTables/IXLPivotField.cs @@ -1,56 +1,56 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public enum XLSubtotalFunction - { - Automatic, - None, - Sum, - Count, - Average, - Minimum, - Maximum, - Product, - CountNumbers, - StandardDeviation, - PopulationStandardDeviation, - Variance, - PopulationVariance, - } - public enum XLPivotLayout { Outline, Tabular, Compact } - public interface IXLPivotField - { - String SourceName { get; } - String CustomName { get; set; } - - List Subtotals { get; } - Boolean IncludeNewItemsInFilter { get; set; } - - XLPivotLayout Layout { get; set; } - Boolean SubtotalsAtTop { get; set; } - Boolean RepeatItemLabels { get; set; } - Boolean InsertBlankLines { get; set; } - Boolean ShowBlankItems { get; set; } - Boolean InsertPageBreaks { get; set; } - Boolean Collapsed { get; set; } - - IXLPivotField SetCustomName(String value); - - IXLPivotField AddSubtotal(XLSubtotalFunction value); - IXLPivotField SetIncludeNewItemsInFilter(); IXLPivotField SetIncludeNewItemsInFilter(Boolean value); - - IXLPivotField SetLayout(XLPivotLayout value); - IXLPivotField SetSubtotalsAtTop(); IXLPivotField SetSubtotalsAtTop(Boolean value); - IXLPivotField SetRepeatItemLabels(); IXLPivotField SetRepeatItemLabels(Boolean value); - IXLPivotField SetInsertBlankLines(); IXLPivotField SetInsertBlankLines(Boolean value); - IXLPivotField SetShowBlankItems(); IXLPivotField SetShowBlankItems(Boolean value); - IXLPivotField SetInsertPageBreaks(); IXLPivotField SetInsertPageBreaks(Boolean value); - IXLPivotField SetCollapsed(); IXLPivotField SetCollapsed(Boolean value); - - List SharedStrings { get; set; } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLSubtotalFunction + { + Automatic, + None, + Sum, + Count, + Average, + Minimum, + Maximum, + Product, + CountNumbers, + StandardDeviation, + PopulationStandardDeviation, + Variance, + PopulationVariance, + } + public enum XLPivotLayout { Outline, Tabular, Compact } + public interface IXLPivotField + { + String SourceName { get; } + String CustomName { get; set; } + + List Subtotals { get; } + Boolean IncludeNewItemsInFilter { get; set; } + + XLPivotLayout Layout { get; set; } + Boolean SubtotalsAtTop { get; set; } + Boolean RepeatItemLabels { get; set; } + Boolean InsertBlankLines { get; set; } + Boolean ShowBlankItems { get; set; } + Boolean InsertPageBreaks { get; set; } + Boolean Collapsed { get; set; } + + IXLPivotField SetCustomName(String value); + + IXLPivotField AddSubtotal(XLSubtotalFunction value); + IXLPivotField SetIncludeNewItemsInFilter(); IXLPivotField SetIncludeNewItemsInFilter(Boolean value); + + IXLPivotField SetLayout(XLPivotLayout value); + IXLPivotField SetSubtotalsAtTop(); IXLPivotField SetSubtotalsAtTop(Boolean value); + IXLPivotField SetRepeatItemLabels(); IXLPivotField SetRepeatItemLabels(Boolean value); + IXLPivotField SetInsertBlankLines(); IXLPivotField SetInsertBlankLines(Boolean value); + IXLPivotField SetShowBlankItems(); IXLPivotField SetShowBlankItems(Boolean value); + IXLPivotField SetInsertPageBreaks(); IXLPivotField SetInsertPageBreaks(Boolean value); + IXLPivotField SetCollapsed(); IXLPivotField SetCollapsed(Boolean value); + + List SharedStrings { get; set; } + } +} diff --git a/ClosedXML/Excel/PivotTables/IXLPivotFields.cs b/ClosedXML/Excel/PivotTables/IXLPivotFields.cs index 7b01687..08c5312 100644 --- a/ClosedXML/Excel/PivotTables/IXLPivotFields.cs +++ b/ClosedXML/Excel/PivotTables/IXLPivotFields.cs @@ -1,17 +1,17 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLPivotFields: IEnumerable - { - IXLPivotField Add(String sourceName); - IXLPivotField Add(String sourceName, String customName); - void Clear(); - void Remove(String sourceName); - - int IndexOf(IXLPivotField pf); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLPivotFields: IEnumerable + { + IXLPivotField Add(String sourceName); + IXLPivotField Add(String sourceName, String customName); + void Clear(); + void Remove(String sourceName); + + int IndexOf(IXLPivotField pf); + } +} diff --git a/ClosedXML/Excel/PivotTables/IXLPivotTable.cs b/ClosedXML/Excel/PivotTables/IXLPivotTable.cs index 414f421..91bcafd 100644 --- a/ClosedXML/Excel/PivotTables/IXLPivotTable.cs +++ b/ClosedXML/Excel/PivotTables/IXLPivotTable.cs @@ -1,213 +1,213 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLPivotTableTheme - { - PivotStyleDark1, - PivotStyleDark10, - PivotStyleDark11, - PivotStyleDark12, - PivotStyleDark13, - PivotStyleDark14, - PivotStyleDark15, - PivotStyleDark16, - PivotStyleDark17, - PivotStyleDark18, - PivotStyleDark19, - PivotStyleDark2, - PivotStyleDark20, - PivotStyleDark21, - PivotStyleDark22, - PivotStyleDark23, - PivotStyleDark24, - PivotStyleDark25, - PivotStyleDark26, - PivotStyleDark27, - PivotStyleDark28, - PivotStyleDark3, - PivotStyleDark4, - PivotStyleDark5, - PivotStyleDark6, - PivotStyleDark7, - PivotStyleDark8, - PivotStyleDark9, - PivotStyleLight1, - PivotStyleLight10, - PivotStyleLight11, - PivotStyleLight12, - PivotStyleLight13, - PivotStyleLight14, - PivotStyleLight15, - PivotStyleLight16, - PivotStyleLight17, - PivotStyleLight18, - PivotStyleLight19, - PivotStyleLight2, - PivotStyleLight20, - PivotStyleLight21, - PivotStyleLight22, - PivotStyleLight23, - PivotStyleLight24, - PivotStyleLight25, - PivotStyleLight26, - PivotStyleLight27, - PivotStyleLight28, - PivotStyleLight3, - PivotStyleLight4, - PivotStyleLight5, - PivotStyleLight6, - PivotStyleLight7, - PivotStyleLight8, - PivotStyleLight9, - PivotStyleMedium1, - PivotStyleMedium10, - PivotStyleMedium11, - PivotStyleMedium12, - PivotStyleMedium13, - PivotStyleMedium14, - PivotStyleMedium15, - PivotStyleMedium16, - PivotStyleMedium17, - PivotStyleMedium18, - PivotStyleMedium19, - PivotStyleMedium2, - PivotStyleMedium20, - PivotStyleMedium21, - PivotStyleMedium22, - PivotStyleMedium23, - PivotStyleMedium24, - PivotStyleMedium25, - PivotStyleMedium26, - PivotStyleMedium27, - PivotStyleMedium28, - PivotStyleMedium3, - PivotStyleMedium4, - PivotStyleMedium5, - PivotStyleMedium6, - PivotStyleMedium7, - PivotStyleMedium8, - PivotStyleMedium9 - } - - public enum XLPivotSubtotals - { - DoNotShow, - AtTop, - AtBottom - } - - public enum XLFilterAreaOrder { DownThenOver, OverThenDown } - public enum XLItemsToRetain { Automatic, None, Max } - - public interface IXLPivotTable - { - XLPivotTableTheme Theme { get; set; } - - IXLPivotFields Fields { get; } - IXLPivotFields ReportFilters { get; } - IXLPivotFields ColumnLabels { get; } - IXLPivotFields RowLabels { get; } - IXLPivotValues Values { get; } - - String Name { get; set; } - String Title { get; set; } - String Description { get; set; } - - IXLCell TargetCell { get; set; } - IXLRange SourceRange { get; set; } - - Boolean MergeAndCenterWithLabels { get; set; } // MergeItem - Int32 RowLabelIndent { get; set; } // Indent - XLFilterAreaOrder FilterAreaOrder { get; set; } // PageOverThenDown - Int32 FilterFieldsPageWrap { get; set; } // PageWrap - String ErrorValueReplacement { get; set; } // ErrorCaption - String EmptyCellReplacement { get; set; } // MissingCaption - Boolean AutofitColumns { get; set; } //UseAutoFormatting - Boolean PreserveCellFormatting { get; set; } // PreserveFormatting - - Boolean ShowGrandTotalsRows { get; set; } // RowGrandTotals - Boolean ShowGrandTotalsColumns { get; set; } // ColumnGrandTotals - Boolean FilteredItemsInSubtotals { get; set; } // Subtotal filtered page items - Boolean AllowMultipleFilters { get; set; } // MultipleFieldFilters - Boolean UseCustomListsForSorting { get; set; } // CustomListSort - - Boolean ShowExpandCollapseButtons { get; set; } - Boolean ShowContextualTooltips { get; set; } - Boolean ShowPropertiesInTooltips { get; set; } - Boolean DisplayCaptionsAndDropdowns { get; set; } - Boolean ClassicPivotTableLayout { get; set; } - Boolean ShowValuesRow { get; set; } - Boolean ShowEmptyItemsOnRows { get; set; } - Boolean ShowEmptyItemsOnColumns { get; set; } - Boolean DisplayItemLabels { get; set; } - Boolean SortFieldsAtoZ { get; set; } - - Boolean PrintExpandCollapsedButtons { get; set; } - Boolean RepeatRowLabels { get; set; } - Boolean PrintTitles { get; set; } - - Boolean SaveSourceData { get; set; } - Boolean EnableShowDetails { get; set; } - Boolean RefreshDataOnOpen { get; set; } - XLItemsToRetain ItemsToRetainPerField { get; set; } - Boolean EnableCellEditing { get; set; } - - IXLPivotTable SetName(String value); - IXLPivotTable SetTitle(String value); - IXLPivotTable SetDescription(String value); - - IXLPivotTable SetMergeAndCenterWithLabels(); IXLPivotTable SetMergeAndCenterWithLabels(Boolean value); - IXLPivotTable SetRowLabelIndent(Int32 value); - IXLPivotTable SetFilterAreaOrder(XLFilterAreaOrder value); - IXLPivotTable SetFilterFieldsPageWrap(Int32 value); - IXLPivotTable SetErrorValueReplacement(String value); - IXLPivotTable SetEmptyCellReplacement(String value); - IXLPivotTable SetAutofitColumns(); IXLPivotTable SetAutofitColumns(Boolean value); - IXLPivotTable SetPreserveCellFormatting(); IXLPivotTable SetPreserveCellFormatting(Boolean value); - - IXLPivotTable SetShowGrandTotalsRows(); IXLPivotTable SetShowGrandTotalsRows(Boolean value); - IXLPivotTable SetShowGrandTotalsColumns(); IXLPivotTable SetShowGrandTotalsColumns(Boolean value); - IXLPivotTable SetFilteredItemsInSubtotals(); IXLPivotTable SetFilteredItemsInSubtotals(Boolean value); - IXLPivotTable SetAllowMultipleFilters(); IXLPivotTable SetAllowMultipleFilters(Boolean value); - IXLPivotTable SetUseCustomListsForSorting(); IXLPivotTable SetUseCustomListsForSorting(Boolean value); - - IXLPivotTable SetShowExpandCollapseButtons(); IXLPivotTable SetShowExpandCollapseButtons(Boolean value); - IXLPivotTable SetShowContextualTooltips(); IXLPivotTable SetShowContextualTooltips(Boolean value); - IXLPivotTable SetShowPropertiesInTooltips(); IXLPivotTable SetShowPropertiesInTooltips(Boolean value); - IXLPivotTable SetDisplayCaptionsAndDropdowns(); IXLPivotTable SetDisplayCaptionsAndDropdowns(Boolean value); - IXLPivotTable SetClassicPivotTableLayout(); IXLPivotTable SetClassicPivotTableLayout(Boolean value); - IXLPivotTable SetShowValuesRow(); IXLPivotTable SetShowValuesRow(Boolean value); - IXLPivotTable SetShowEmptyItemsOnRows(); IXLPivotTable SetShowEmptyItemsOnRows(Boolean value); - IXLPivotTable SetShowEmptyItemsOnColumns(); IXLPivotTable SetShowEmptyItemsOnColumns(Boolean value); - IXLPivotTable SetDisplayItemLabels(); IXLPivotTable SetDisplayItemLabels(Boolean value); - IXLPivotTable SetSortFieldsAtoZ(); IXLPivotTable SetSortFieldsAtoZ(Boolean value); - - IXLPivotTable SetPrintExpandCollapsedButtons(); IXLPivotTable SetPrintExpandCollapsedButtons(Boolean value); - IXLPivotTable SetRepeatRowLabels(); IXLPivotTable SetRepeatRowLabels(Boolean value); - IXLPivotTable SetPrintTitles(); IXLPivotTable SetPrintTitles(Boolean value); - - IXLPivotTable SetSaveSourceData(); IXLPivotTable SetSaveSourceData(Boolean value); - IXLPivotTable SetEnableShowDetails(); IXLPivotTable SetEnableShowDetails(Boolean value); - IXLPivotTable SetRefreshDataOnOpen(); IXLPivotTable SetRefreshDataOnOpen(Boolean value); - IXLPivotTable SetItemsToRetainPerField(XLItemsToRetain value); - IXLPivotTable SetEnableCellEditing(); IXLPivotTable SetEnableCellEditing(Boolean value); - - Boolean ShowRowHeaders { get; set; } - Boolean ShowColumnHeaders { get; set; } - Boolean ShowRowStripes { get; set; } - Boolean ShowColumnStripes { get; set; } - XLPivotSubtotals Subtotals { get; set; } - XLPivotLayout Layout { set; } - Boolean InsertBlankLines { set; } - - IXLPivotTable SetShowRowHeaders(); IXLPivotTable SetShowRowHeaders(Boolean value); - IXLPivotTable SetShowColumnHeaders(); IXLPivotTable SetShowColumnHeaders(Boolean value); - IXLPivotTable SetShowRowStripes(); IXLPivotTable SetShowRowStripes(Boolean value); - IXLPivotTable SetShowColumnStripes(); IXLPivotTable SetShowColumnStripes(Boolean value); - IXLPivotTable SetSubtotals(XLPivotSubtotals value); - IXLPivotTable SetLayout(XLPivotLayout value); - IXLPivotTable SetInsertBlankLines(); IXLPivotTable SetInsertBlankLines(Boolean value); - - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLPivotTableTheme + { + PivotStyleDark1, + PivotStyleDark10, + PivotStyleDark11, + PivotStyleDark12, + PivotStyleDark13, + PivotStyleDark14, + PivotStyleDark15, + PivotStyleDark16, + PivotStyleDark17, + PivotStyleDark18, + PivotStyleDark19, + PivotStyleDark2, + PivotStyleDark20, + PivotStyleDark21, + PivotStyleDark22, + PivotStyleDark23, + PivotStyleDark24, + PivotStyleDark25, + PivotStyleDark26, + PivotStyleDark27, + PivotStyleDark28, + PivotStyleDark3, + PivotStyleDark4, + PivotStyleDark5, + PivotStyleDark6, + PivotStyleDark7, + PivotStyleDark8, + PivotStyleDark9, + PivotStyleLight1, + PivotStyleLight10, + PivotStyleLight11, + PivotStyleLight12, + PivotStyleLight13, + PivotStyleLight14, + PivotStyleLight15, + PivotStyleLight16, + PivotStyleLight17, + PivotStyleLight18, + PivotStyleLight19, + PivotStyleLight2, + PivotStyleLight20, + PivotStyleLight21, + PivotStyleLight22, + PivotStyleLight23, + PivotStyleLight24, + PivotStyleLight25, + PivotStyleLight26, + PivotStyleLight27, + PivotStyleLight28, + PivotStyleLight3, + PivotStyleLight4, + PivotStyleLight5, + PivotStyleLight6, + PivotStyleLight7, + PivotStyleLight8, + PivotStyleLight9, + PivotStyleMedium1, + PivotStyleMedium10, + PivotStyleMedium11, + PivotStyleMedium12, + PivotStyleMedium13, + PivotStyleMedium14, + PivotStyleMedium15, + PivotStyleMedium16, + PivotStyleMedium17, + PivotStyleMedium18, + PivotStyleMedium19, + PivotStyleMedium2, + PivotStyleMedium20, + PivotStyleMedium21, + PivotStyleMedium22, + PivotStyleMedium23, + PivotStyleMedium24, + PivotStyleMedium25, + PivotStyleMedium26, + PivotStyleMedium27, + PivotStyleMedium28, + PivotStyleMedium3, + PivotStyleMedium4, + PivotStyleMedium5, + PivotStyleMedium6, + PivotStyleMedium7, + PivotStyleMedium8, + PivotStyleMedium9 + } + + public enum XLPivotSubtotals + { + DoNotShow, + AtTop, + AtBottom + } + + public enum XLFilterAreaOrder { DownThenOver, OverThenDown } + public enum XLItemsToRetain { Automatic, None, Max } + + public interface IXLPivotTable + { + XLPivotTableTheme Theme { get; set; } + + IXLPivotFields Fields { get; } + IXLPivotFields ReportFilters { get; } + IXLPivotFields ColumnLabels { get; } + IXLPivotFields RowLabels { get; } + IXLPivotValues Values { get; } + + String Name { get; set; } + String Title { get; set; } + String Description { get; set; } + + IXLCell TargetCell { get; set; } + IXLRange SourceRange { get; set; } + + Boolean MergeAndCenterWithLabels { get; set; } // MergeItem + Int32 RowLabelIndent { get; set; } // Indent + XLFilterAreaOrder FilterAreaOrder { get; set; } // PageOverThenDown + Int32 FilterFieldsPageWrap { get; set; } // PageWrap + String ErrorValueReplacement { get; set; } // ErrorCaption + String EmptyCellReplacement { get; set; } // MissingCaption + Boolean AutofitColumns { get; set; } //UseAutoFormatting + Boolean PreserveCellFormatting { get; set; } // PreserveFormatting + + Boolean ShowGrandTotalsRows { get; set; } // RowGrandTotals + Boolean ShowGrandTotalsColumns { get; set; } // ColumnGrandTotals + Boolean FilteredItemsInSubtotals { get; set; } // Subtotal filtered page items + Boolean AllowMultipleFilters { get; set; } // MultipleFieldFilters + Boolean UseCustomListsForSorting { get; set; } // CustomListSort + + Boolean ShowExpandCollapseButtons { get; set; } + Boolean ShowContextualTooltips { get; set; } + Boolean ShowPropertiesInTooltips { get; set; } + Boolean DisplayCaptionsAndDropdowns { get; set; } + Boolean ClassicPivotTableLayout { get; set; } + Boolean ShowValuesRow { get; set; } + Boolean ShowEmptyItemsOnRows { get; set; } + Boolean ShowEmptyItemsOnColumns { get; set; } + Boolean DisplayItemLabels { get; set; } + Boolean SortFieldsAtoZ { get; set; } + + Boolean PrintExpandCollapsedButtons { get; set; } + Boolean RepeatRowLabels { get; set; } + Boolean PrintTitles { get; set; } + + Boolean SaveSourceData { get; set; } + Boolean EnableShowDetails { get; set; } + Boolean RefreshDataOnOpen { get; set; } + XLItemsToRetain ItemsToRetainPerField { get; set; } + Boolean EnableCellEditing { get; set; } + + IXLPivotTable SetName(String value); + IXLPivotTable SetTitle(String value); + IXLPivotTable SetDescription(String value); + + IXLPivotTable SetMergeAndCenterWithLabels(); IXLPivotTable SetMergeAndCenterWithLabels(Boolean value); + IXLPivotTable SetRowLabelIndent(Int32 value); + IXLPivotTable SetFilterAreaOrder(XLFilterAreaOrder value); + IXLPivotTable SetFilterFieldsPageWrap(Int32 value); + IXLPivotTable SetErrorValueReplacement(String value); + IXLPivotTable SetEmptyCellReplacement(String value); + IXLPivotTable SetAutofitColumns(); IXLPivotTable SetAutofitColumns(Boolean value); + IXLPivotTable SetPreserveCellFormatting(); IXLPivotTable SetPreserveCellFormatting(Boolean value); + + IXLPivotTable SetShowGrandTotalsRows(); IXLPivotTable SetShowGrandTotalsRows(Boolean value); + IXLPivotTable SetShowGrandTotalsColumns(); IXLPivotTable SetShowGrandTotalsColumns(Boolean value); + IXLPivotTable SetFilteredItemsInSubtotals(); IXLPivotTable SetFilteredItemsInSubtotals(Boolean value); + IXLPivotTable SetAllowMultipleFilters(); IXLPivotTable SetAllowMultipleFilters(Boolean value); + IXLPivotTable SetUseCustomListsForSorting(); IXLPivotTable SetUseCustomListsForSorting(Boolean value); + + IXLPivotTable SetShowExpandCollapseButtons(); IXLPivotTable SetShowExpandCollapseButtons(Boolean value); + IXLPivotTable SetShowContextualTooltips(); IXLPivotTable SetShowContextualTooltips(Boolean value); + IXLPivotTable SetShowPropertiesInTooltips(); IXLPivotTable SetShowPropertiesInTooltips(Boolean value); + IXLPivotTable SetDisplayCaptionsAndDropdowns(); IXLPivotTable SetDisplayCaptionsAndDropdowns(Boolean value); + IXLPivotTable SetClassicPivotTableLayout(); IXLPivotTable SetClassicPivotTableLayout(Boolean value); + IXLPivotTable SetShowValuesRow(); IXLPivotTable SetShowValuesRow(Boolean value); + IXLPivotTable SetShowEmptyItemsOnRows(); IXLPivotTable SetShowEmptyItemsOnRows(Boolean value); + IXLPivotTable SetShowEmptyItemsOnColumns(); IXLPivotTable SetShowEmptyItemsOnColumns(Boolean value); + IXLPivotTable SetDisplayItemLabels(); IXLPivotTable SetDisplayItemLabels(Boolean value); + IXLPivotTable SetSortFieldsAtoZ(); IXLPivotTable SetSortFieldsAtoZ(Boolean value); + + IXLPivotTable SetPrintExpandCollapsedButtons(); IXLPivotTable SetPrintExpandCollapsedButtons(Boolean value); + IXLPivotTable SetRepeatRowLabels(); IXLPivotTable SetRepeatRowLabels(Boolean value); + IXLPivotTable SetPrintTitles(); IXLPivotTable SetPrintTitles(Boolean value); + + IXLPivotTable SetSaveSourceData(); IXLPivotTable SetSaveSourceData(Boolean value); + IXLPivotTable SetEnableShowDetails(); IXLPivotTable SetEnableShowDetails(Boolean value); + IXLPivotTable SetRefreshDataOnOpen(); IXLPivotTable SetRefreshDataOnOpen(Boolean value); + IXLPivotTable SetItemsToRetainPerField(XLItemsToRetain value); + IXLPivotTable SetEnableCellEditing(); IXLPivotTable SetEnableCellEditing(Boolean value); + + Boolean ShowRowHeaders { get; set; } + Boolean ShowColumnHeaders { get; set; } + Boolean ShowRowStripes { get; set; } + Boolean ShowColumnStripes { get; set; } + XLPivotSubtotals Subtotals { get; set; } + XLPivotLayout Layout { set; } + Boolean InsertBlankLines { set; } + + IXLPivotTable SetShowRowHeaders(); IXLPivotTable SetShowRowHeaders(Boolean value); + IXLPivotTable SetShowColumnHeaders(); IXLPivotTable SetShowColumnHeaders(Boolean value); + IXLPivotTable SetShowRowStripes(); IXLPivotTable SetShowRowStripes(Boolean value); + IXLPivotTable SetShowColumnStripes(); IXLPivotTable SetShowColumnStripes(Boolean value); + IXLPivotTable SetSubtotals(XLPivotSubtotals value); + IXLPivotTable SetLayout(XLPivotLayout value); + IXLPivotTable SetInsertBlankLines(); IXLPivotTable SetInsertBlankLines(Boolean value); + + } +} diff --git a/ClosedXML/Excel/PivotTables/IXLPivotTables.cs b/ClosedXML/Excel/PivotTables/IXLPivotTables.cs index 1f3bb63..bbce037 100644 --- a/ClosedXML/Excel/PivotTables/IXLPivotTables.cs +++ b/ClosedXML/Excel/PivotTables/IXLPivotTables.cs @@ -1,16 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLPivotTables: IEnumerable - { - IXLPivotTable PivotTable(String name); - void Add(String name, IXLPivotTable pivotTable); - IXLPivotTable AddNew(String name, IXLCell target, IXLRange source); - void Delete(String name); - void DeleteAll(); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLPivotTables: IEnumerable + { + IXLPivotTable PivotTable(String name); + void Add(String name, IXLPivotTable pivotTable); + IXLPivotTable AddNew(String name, IXLCell target, IXLRange source); + void Delete(String name); + void DeleteAll(); + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValue.cs b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValue.cs index 1784044..3723e82 100644 --- a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValue.cs +++ b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValue.cs @@ -1,71 +1,71 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public enum XLPivotSummary - { - Sum, - Count, - Average, - Minimum, - Maximum, - Product, - CountNumbers, - StandardDeviation, - PopulationStandardDeviation, - Variance, - PopulationVariance, - } - - public enum XLPivotCalculation - { - Normal, - DifferenceFrom, - PercentageOf, - PercentageDifferenceFrom, - RunningTotal, - PercentageOfRow, - PercentageOfColumn, - PercentageOfTotal, - Index - } - public enum XLPivotCalculationItem - { - Value, Previous, Next - } - - public interface IXLPivotValue - { - String SourceName { get; } - String CustomName { get; set; } - - IXLPivotValueFormat NumberFormat { get; } - - XLPivotSummary SummaryFormula { get; set; } - XLPivotCalculation Calculation { get; set; } - String BaseField { get; set; } - String BaseItem { get; set; } - XLPivotCalculationItem CalculationItem { get; set; } - - IXLPivotValue SetSummaryFormula(XLPivotSummary value); - IXLPivotValue SetCalculation(XLPivotCalculation value); - IXLPivotValue SetBaseField(String value); - IXLPivotValue SetBaseItem(String value); - IXLPivotValue SetCalculationItem(XLPivotCalculationItem value); - - - IXLPivotValue ShowAsNormal(); - IXLPivotValueCombination ShowAsDifferenceFrom(String fieldSourceName); - IXLPivotValueCombination ShowAsPercentageFrom(String fieldSourceName); - IXLPivotValueCombination ShowAsPercentageDifferenceFrom(String fieldSourceName); - IXLPivotValue ShowAsRunningTotalIn(String fieldSourceName); - IXLPivotValue ShowAsPercentageOfRow(); - IXLPivotValue ShowAsPercentageOfColumn(); - IXLPivotValue ShowAsPercentageOfTotal(); - IXLPivotValue ShowAsIndex(); - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public enum XLPivotSummary + { + Sum, + Count, + Average, + Minimum, + Maximum, + Product, + CountNumbers, + StandardDeviation, + PopulationStandardDeviation, + Variance, + PopulationVariance, + } + + public enum XLPivotCalculation + { + Normal, + DifferenceFrom, + PercentageOf, + PercentageDifferenceFrom, + RunningTotal, + PercentageOfRow, + PercentageOfColumn, + PercentageOfTotal, + Index + } + public enum XLPivotCalculationItem + { + Value, Previous, Next + } + + public interface IXLPivotValue + { + String SourceName { get; } + String CustomName { get; set; } + + IXLPivotValueFormat NumberFormat { get; } + + XLPivotSummary SummaryFormula { get; set; } + XLPivotCalculation Calculation { get; set; } + String BaseField { get; set; } + String BaseItem { get; set; } + XLPivotCalculationItem CalculationItem { get; set; } + + IXLPivotValue SetSummaryFormula(XLPivotSummary value); + IXLPivotValue SetCalculation(XLPivotCalculation value); + IXLPivotValue SetBaseField(String value); + IXLPivotValue SetBaseItem(String value); + IXLPivotValue SetCalculationItem(XLPivotCalculationItem value); + + + IXLPivotValue ShowAsNormal(); + IXLPivotValueCombination ShowAsDifferenceFrom(String fieldSourceName); + IXLPivotValueCombination ShowAsPercentageFrom(String fieldSourceName); + IXLPivotValueCombination ShowAsPercentageDifferenceFrom(String fieldSourceName); + IXLPivotValue ShowAsRunningTotalIn(String fieldSourceName); + IXLPivotValue ShowAsPercentageOfRow(); + IXLPivotValue ShowAsPercentageOfColumn(); + IXLPivotValue ShowAsPercentageOfTotal(); + IXLPivotValue ShowAsIndex(); + + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueCombination.cs b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueCombination.cs index 3e655b8..a6e3a72 100644 --- a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueCombination.cs +++ b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueCombination.cs @@ -1,14 +1,14 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLPivotValueCombination - { - IXLPivotValue And(String item); - IXLPivotValue AndPrevious(); - IXLPivotValue AndNext(); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLPivotValueCombination + { + IXLPivotValue And(String item); + IXLPivotValue AndPrevious(); + IXLPivotValue AndNext(); + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueFormat.cs b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueFormat.cs index 3c6391c..2923cb5 100644 --- a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueFormat.cs +++ b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValueFormat.cs @@ -1,11 +1,11 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLPivotValueFormat : IXLNumberFormatBase, IEquatable - { - IXLPivotValue SetNumberFormatId(Int32 value); - - IXLPivotValue SetFormat(String value); - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLPivotValueFormat : IXLNumberFormatBase, IEquatable + { + IXLPivotValue SetNumberFormatId(Int32 value); + + IXLPivotValue SetFormat(String value); + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValues.cs b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValues.cs index 0d971e6..87a7015 100644 --- a/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValues.cs +++ b/ClosedXML/Excel/PivotTables/PivotValues/IXLPivotValues.cs @@ -1,15 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLPivotValues: IEnumerable - { - IXLPivotValue Add(String sourceName); - IXLPivotValue Add(String sourceName, String customName); - void Clear(); - void Remove(String sourceName); - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLPivotValues: IEnumerable + { + IXLPivotValue Add(String sourceName); + IXLPivotValue Add(String sourceName, String customName); + void Clear(); + void Remove(String sourceName); + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValue.cs b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValue.cs index 50753cb..baed68c 100644 --- a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValue.cs +++ b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValue.cs @@ -1,74 +1,74 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLPivotValue: IXLPivotValue - { - public XLPivotValue(string sourceName) - { - SourceName = sourceName; - NumberFormat = new XLPivotValueFormat(this); - } - - public IXLPivotValueFormat NumberFormat { get; private set; } - public String SourceName { get; private set; } - public String CustomName { get; set; } public IXLPivotValue SetCustomName(String value) { CustomName = value; return this; } - - public XLPivotSummary SummaryFormula { get; set; } public IXLPivotValue SetSummaryFormula(XLPivotSummary value) { SummaryFormula = value; return this; } - public XLPivotCalculation Calculation { get; set; } public IXLPivotValue SetCalculation(XLPivotCalculation value) { Calculation = value; return this; } - public String BaseField { get; set; } public IXLPivotValue SetBaseField(String value) { BaseField = value; return this; } - public String BaseItem { get; set; } public IXLPivotValue SetBaseItem(String value) { BaseItem = value; return this; } - public XLPivotCalculationItem CalculationItem { get; set; } public IXLPivotValue SetCalculationItem(XLPivotCalculationItem value) { CalculationItem = value; return this; } - - - public IXLPivotValue ShowAsNormal() - { - return SetCalculation(XLPivotCalculation.Normal); - } - public IXLPivotValueCombination ShowAsDifferenceFrom(String fieldSourceName) - { - BaseField = fieldSourceName; - SetCalculation(XLPivotCalculation.DifferenceFrom); - return new XLPivotValueCombination(this); - } - public IXLPivotValueCombination ShowAsPercentageFrom(String fieldSourceName) - { - BaseField = fieldSourceName; - SetCalculation(XLPivotCalculation.PercentageOf); - return new XLPivotValueCombination(this); - } - public IXLPivotValueCombination ShowAsPercentageDifferenceFrom(String fieldSourceName) - { - BaseField = fieldSourceName; - SetCalculation(XLPivotCalculation.PercentageDifferenceFrom); - return new XLPivotValueCombination(this); - } - public IXLPivotValue ShowAsRunningTotalIn(String fieldSourceName) - { - BaseField = fieldSourceName; - return SetCalculation(XLPivotCalculation.RunningTotal); - } - public IXLPivotValue ShowAsPercentageOfRow() - { - return SetCalculation(XLPivotCalculation.PercentageOfRow); - } - - public IXLPivotValue ShowAsPercentageOfColumn() - { - return SetCalculation(XLPivotCalculation.PercentageOfColumn); - } - - public IXLPivotValue ShowAsPercentageOfTotal() - { - return SetCalculation(XLPivotCalculation.PercentageOfTotal); - } - - public IXLPivotValue ShowAsIndex() - { - return SetCalculation(XLPivotCalculation.Index); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLPivotValue: IXLPivotValue + { + public XLPivotValue(string sourceName) + { + SourceName = sourceName; + NumberFormat = new XLPivotValueFormat(this); + } + + public IXLPivotValueFormat NumberFormat { get; private set; } + public String SourceName { get; private set; } + public String CustomName { get; set; } public IXLPivotValue SetCustomName(String value) { CustomName = value; return this; } + + public XLPivotSummary SummaryFormula { get; set; } public IXLPivotValue SetSummaryFormula(XLPivotSummary value) { SummaryFormula = value; return this; } + public XLPivotCalculation Calculation { get; set; } public IXLPivotValue SetCalculation(XLPivotCalculation value) { Calculation = value; return this; } + public String BaseField { get; set; } public IXLPivotValue SetBaseField(String value) { BaseField = value; return this; } + public String BaseItem { get; set; } public IXLPivotValue SetBaseItem(String value) { BaseItem = value; return this; } + public XLPivotCalculationItem CalculationItem { get; set; } public IXLPivotValue SetCalculationItem(XLPivotCalculationItem value) { CalculationItem = value; return this; } + + + public IXLPivotValue ShowAsNormal() + { + return SetCalculation(XLPivotCalculation.Normal); + } + public IXLPivotValueCombination ShowAsDifferenceFrom(String fieldSourceName) + { + BaseField = fieldSourceName; + SetCalculation(XLPivotCalculation.DifferenceFrom); + return new XLPivotValueCombination(this); + } + public IXLPivotValueCombination ShowAsPercentageFrom(String fieldSourceName) + { + BaseField = fieldSourceName; + SetCalculation(XLPivotCalculation.PercentageOf); + return new XLPivotValueCombination(this); + } + public IXLPivotValueCombination ShowAsPercentageDifferenceFrom(String fieldSourceName) + { + BaseField = fieldSourceName; + SetCalculation(XLPivotCalculation.PercentageDifferenceFrom); + return new XLPivotValueCombination(this); + } + public IXLPivotValue ShowAsRunningTotalIn(String fieldSourceName) + { + BaseField = fieldSourceName; + return SetCalculation(XLPivotCalculation.RunningTotal); + } + public IXLPivotValue ShowAsPercentageOfRow() + { + return SetCalculation(XLPivotCalculation.PercentageOfRow); + } + + public IXLPivotValue ShowAsPercentageOfColumn() + { + return SetCalculation(XLPivotCalculation.PercentageOfColumn); + } + + public IXLPivotValue ShowAsPercentageOfTotal() + { + return SetCalculation(XLPivotCalculation.PercentageOfTotal); + } + + public IXLPivotValue ShowAsIndex() + { + return SetCalculation(XLPivotCalculation.Index); + } + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueCombination.cs b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueCombination.cs index 56f04bc..5d8c124 100644 --- a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueCombination.cs +++ b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueCombination.cs @@ -1,32 +1,32 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLPivotValueCombination: IXLPivotValueCombination - { - private readonly IXLPivotValue _pivotValue; - public XLPivotValueCombination(IXLPivotValue pivotValue) - { - _pivotValue = pivotValue; - } - public IXLPivotValue And(String item) - { - _pivotValue.BaseItem = item; - _pivotValue.CalculationItem = XLPivotCalculationItem.Value; - return _pivotValue; - } - public IXLPivotValue AndPrevious() - { - _pivotValue.CalculationItem = XLPivotCalculationItem.Previous; - return _pivotValue; - } - public IXLPivotValue AndNext() - { - _pivotValue.CalculationItem = XLPivotCalculationItem.Next; - return _pivotValue; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLPivotValueCombination: IXLPivotValueCombination + { + private readonly IXLPivotValue _pivotValue; + public XLPivotValueCombination(IXLPivotValue pivotValue) + { + _pivotValue = pivotValue; + } + public IXLPivotValue And(String item) + { + _pivotValue.BaseItem = item; + _pivotValue.CalculationItem = XLPivotCalculationItem.Value; + return _pivotValue; + } + public IXLPivotValue AndPrevious() + { + _pivotValue.CalculationItem = XLPivotCalculationItem.Previous; + return _pivotValue; + } + public IXLPivotValue AndNext() + { + _pivotValue.CalculationItem = XLPivotCalculationItem.Next; + return _pivotValue; + } + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueFormat.cs b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueFormat.cs index 7e5b918..8ab869b 100644 --- a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueFormat.cs +++ b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValueFormat.cs @@ -1,104 +1,104 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLPivotValueFormat: IXLPivotValueFormat - { - private readonly XLPivotValue _pivotValue; - public XLPivotValueFormat(XLPivotValue pivotValue) - { - _pivotValue = pivotValue; - _format = "General"; - _numberFormatId = 0; - } - - private Int32 _numberFormatId = -1; - public Int32 NumberFormatId - { - get { return _numberFormatId; } - set - { - _numberFormatId = value; - _format = string.Empty; - } - } - - private String _format = String.Empty; - public String Format - { - get { return _format; } - set - { - _format = value; - _numberFormatId = -1; - } - } - - public IXLPivotValue SetNumberFormatId(Int32 value) - { - NumberFormatId = value; - return _pivotValue; - } - public IXLPivotValue SetFormat(String value) - { - Format = value; - - switch (value) - { - case "General": - _numberFormatId = 0; - break; - case "0": - _numberFormatId = 1; - break; - case "0.00": - _numberFormatId = 2; - break; - case "#,##0": - _numberFormatId = 3; - break; - case "#,##0.00": - _numberFormatId = 4; - break; - case "0%": - _numberFormatId = 9; - break; - case "0.00%": - _numberFormatId = 10; - break; - case "0.00E+00": - _numberFormatId = 11; - break; - } - - - return _pivotValue; - } - - #region Overrides - public bool Equals(IXLNumberFormatBase other) - { - return - _numberFormatId == other.NumberFormatId - && _format == other.Format - ; - } - - public override bool Equals(object obj) - { - return Equals((IXLNumberFormatBase)obj); - } - - public override int GetHashCode() - { - return NumberFormatId - ^ Format.GetHashCode(); - } - - #endregion - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLPivotValueFormat: IXLPivotValueFormat + { + private readonly XLPivotValue _pivotValue; + public XLPivotValueFormat(XLPivotValue pivotValue) + { + _pivotValue = pivotValue; + _format = "General"; + _numberFormatId = 0; + } + + private Int32 _numberFormatId = -1; + public Int32 NumberFormatId + { + get { return _numberFormatId; } + set + { + _numberFormatId = value; + _format = string.Empty; + } + } + + private String _format = String.Empty; + public String Format + { + get { return _format; } + set + { + _format = value; + _numberFormatId = -1; + } + } + + public IXLPivotValue SetNumberFormatId(Int32 value) + { + NumberFormatId = value; + return _pivotValue; + } + public IXLPivotValue SetFormat(String value) + { + Format = value; + + switch (value) + { + case "General": + _numberFormatId = 0; + break; + case "0": + _numberFormatId = 1; + break; + case "0.00": + _numberFormatId = 2; + break; + case "#,##0": + _numberFormatId = 3; + break; + case "#,##0.00": + _numberFormatId = 4; + break; + case "0%": + _numberFormatId = 9; + break; + case "0.00%": + _numberFormatId = 10; + break; + case "0.00E+00": + _numberFormatId = 11; + break; + } + + + return _pivotValue; + } + + #region Overrides + public bool Equals(IXLNumberFormatBase other) + { + return + _numberFormatId == other.NumberFormatId + && _format == other.Format + ; + } + + public override bool Equals(object obj) + { + return Equals((IXLNumberFormatBase)obj); + } + + public override int GetHashCode() + { + return NumberFormatId + ^ Format.GetHashCode(); + } + + #endregion + + } +} diff --git a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValues.cs b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValues.cs index a7542ba..4e09f16 100644 --- a/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValues.cs +++ b/ClosedXML/Excel/PivotTables/PivotValues/XLPivotValues.cs @@ -1,53 +1,53 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLPivotValues: IXLPivotValues - { - private readonly Dictionary _pivotValues = new Dictionary(); - - private readonly IXLPivotTable _pivotTable; - - internal XLPivotValues(IXLPivotTable pivotTable) - { - this._pivotTable = pivotTable; - } - - public IEnumerator GetEnumerator() - { - return _pivotValues.Values.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IXLPivotValue Add(String sourceName) - { - return Add(sourceName, sourceName); - } - public IXLPivotValue Add(String sourceName, String customName) - { - var pivotValue = new XLPivotValue(sourceName) { CustomName = customName }; - _pivotValues.Add(customName, pivotValue); - - if (_pivotValues.Count > 1 && !this._pivotTable.ColumnLabels.Any(cl => cl.SourceName == XLConstants.PivotTableValuesSentinalLabel) && !this._pivotTable.RowLabels.Any(rl => rl.SourceName == XLConstants.PivotTableValuesSentinalLabel)) - _pivotTable.ColumnLabels.Add(XLConstants.PivotTableValuesSentinalLabel); - - return pivotValue; - } - - public void Clear() - { - _pivotValues.Clear(); - } - public void Remove(String sourceName) - { - _pivotValues.Remove(sourceName); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLPivotValues: IXLPivotValues + { + private readonly Dictionary _pivotValues = new Dictionary(); + + private readonly IXLPivotTable _pivotTable; + + internal XLPivotValues(IXLPivotTable pivotTable) + { + this._pivotTable = pivotTable; + } + + public IEnumerator GetEnumerator() + { + return _pivotValues.Values.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLPivotValue Add(String sourceName) + { + return Add(sourceName, sourceName); + } + public IXLPivotValue Add(String sourceName, String customName) + { + var pivotValue = new XLPivotValue(sourceName) { CustomName = customName }; + _pivotValues.Add(customName, pivotValue); + + if (_pivotValues.Count > 1 && !this._pivotTable.ColumnLabels.Any(cl => cl.SourceName == XLConstants.PivotTableValuesSentinalLabel) && !this._pivotTable.RowLabels.Any(rl => rl.SourceName == XLConstants.PivotTableValuesSentinalLabel)) + _pivotTable.ColumnLabels.Add(XLConstants.PivotTableValuesSentinalLabel); + + return pivotValue; + } + + public void Clear() + { + _pivotValues.Clear(); + } + public void Remove(String sourceName) + { + _pivotValues.Remove(sourceName); + } + } +} diff --git a/ClosedXML/Excel/PivotTables/XLPivotField.cs b/ClosedXML/Excel/PivotTables/XLPivotField.cs index 909db34..9bd7ccb 100644 --- a/ClosedXML/Excel/PivotTables/XLPivotField.cs +++ b/ClosedXML/Excel/PivotTables/XLPivotField.cs @@ -1,72 +1,72 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public class XLPivotField : IXLPivotField - { - public XLPivotField(string sourceName) - { - SourceName = sourceName; - SharedStrings = new List(); - Subtotals = new List(); - } - - public String SourceName { get; private set; } - public String CustomName { get; set; } - - public IXLPivotField SetCustomName(String value) { CustomName = value; return this; } - - public List Subtotals { get; private set; } - - public IXLPivotField AddSubtotal(XLSubtotalFunction value) { Subtotals.Add(value); return this; } - - public Boolean IncludeNewItemsInFilter { get; set; } - - public IXLPivotField SetIncludeNewItemsInFilter() { IncludeNewItemsInFilter = true; return this; } - - public IXLPivotField SetIncludeNewItemsInFilter(Boolean value) { IncludeNewItemsInFilter = value; return this; } - - public XLPivotLayout Layout { get; set; } - - public IXLPivotField SetLayout(XLPivotLayout value) { Layout = value; return this; } - - public Boolean SubtotalsAtTop { get; set; } - - public IXLPivotField SetSubtotalsAtTop() { SubtotalsAtTop = true; return this; } - - public IXLPivotField SetSubtotalsAtTop(Boolean value) { SubtotalsAtTop = value; return this; } - - public Boolean RepeatItemLabels { get; set; } - - public IXLPivotField SetRepeatItemLabels() { RepeatItemLabels = true; return this; } - - public IXLPivotField SetRepeatItemLabels(Boolean value) { RepeatItemLabels = value; return this; } - - public Boolean InsertBlankLines { get; set; } - - public IXLPivotField SetInsertBlankLines() { InsertBlankLines = true; return this; } - - public IXLPivotField SetInsertBlankLines(Boolean value) { InsertBlankLines = value; return this; } - - public Boolean ShowBlankItems { get; set; } - - public IXLPivotField SetShowBlankItems() { ShowBlankItems = true; return this; } - - public IXLPivotField SetShowBlankItems(Boolean value) { ShowBlankItems = value; return this; } - - public Boolean InsertPageBreaks { get; set; } - - public IXLPivotField SetInsertPageBreaks() { InsertPageBreaks = true; return this; } - - public IXLPivotField SetInsertPageBreaks(Boolean value) { InsertPageBreaks = value; return this; } - - public Boolean Collapsed { get; set; } - - public IXLPivotField SetCollapsed() { Collapsed = true; return this; } - - public IXLPivotField SetCollapsed(Boolean value) { Collapsed = value; return this; } - - public List SharedStrings { get; set; } - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public class XLPivotField : IXLPivotField + { + public XLPivotField(string sourceName) + { + SourceName = sourceName; + SharedStrings = new List(); + Subtotals = new List(); + } + + public String SourceName { get; private set; } + public String CustomName { get; set; } + + public IXLPivotField SetCustomName(String value) { CustomName = value; return this; } + + public List Subtotals { get; private set; } + + public IXLPivotField AddSubtotal(XLSubtotalFunction value) { Subtotals.Add(value); return this; } + + public Boolean IncludeNewItemsInFilter { get; set; } + + public IXLPivotField SetIncludeNewItemsInFilter() { IncludeNewItemsInFilter = true; return this; } + + public IXLPivotField SetIncludeNewItemsInFilter(Boolean value) { IncludeNewItemsInFilter = value; return this; } + + public XLPivotLayout Layout { get; set; } + + public IXLPivotField SetLayout(XLPivotLayout value) { Layout = value; return this; } + + public Boolean SubtotalsAtTop { get; set; } + + public IXLPivotField SetSubtotalsAtTop() { SubtotalsAtTop = true; return this; } + + public IXLPivotField SetSubtotalsAtTop(Boolean value) { SubtotalsAtTop = value; return this; } + + public Boolean RepeatItemLabels { get; set; } + + public IXLPivotField SetRepeatItemLabels() { RepeatItemLabels = true; return this; } + + public IXLPivotField SetRepeatItemLabels(Boolean value) { RepeatItemLabels = value; return this; } + + public Boolean InsertBlankLines { get; set; } + + public IXLPivotField SetInsertBlankLines() { InsertBlankLines = true; return this; } + + public IXLPivotField SetInsertBlankLines(Boolean value) { InsertBlankLines = value; return this; } + + public Boolean ShowBlankItems { get; set; } + + public IXLPivotField SetShowBlankItems() { ShowBlankItems = true; return this; } + + public IXLPivotField SetShowBlankItems(Boolean value) { ShowBlankItems = value; return this; } + + public Boolean InsertPageBreaks { get; set; } + + public IXLPivotField SetInsertPageBreaks() { InsertPageBreaks = true; return this; } + + public IXLPivotField SetInsertPageBreaks(Boolean value) { InsertPageBreaks = value; return this; } + + public Boolean Collapsed { get; set; } + + public IXLPivotField SetCollapsed() { Collapsed = true; return this; } + + public IXLPivotField SetCollapsed(Boolean value) { Collapsed = value; return this; } + + public List SharedStrings { get; set; } + } +} diff --git a/ClosedXML/Excel/PivotTables/XLPivotFields.cs b/ClosedXML/Excel/PivotTables/XLPivotFields.cs index 95e15d5..c1a52f2 100644 --- a/ClosedXML/Excel/PivotTables/XLPivotFields.cs +++ b/ClosedXML/Excel/PivotTables/XLPivotFields.cs @@ -1,49 +1,49 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public class XLPivotFields: IXLPivotFields - { - private readonly Dictionary _pivotFields = new Dictionary(); - public IEnumerator GetEnumerator() - { - return _pivotFields.Values.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IXLPivotField Add(String sourceName) - { - return Add(sourceName, sourceName); - } - public IXLPivotField Add(String sourceName, String customName) - { - var pivotField = new XLPivotField(sourceName) {CustomName = customName}; - _pivotFields.Add(sourceName, pivotField); - return pivotField; - } - - public void Clear() - { - _pivotFields.Clear(); - } - public void Remove(String sourceName) - { - _pivotFields.Remove(sourceName); - } - - public int IndexOf(IXLPivotField pf) - { - var selectedItem = _pivotFields.Select((item, index) => new {Item = item, Position = index}).FirstOrDefault(i => i.Item.Key == pf.SourceName); - if (selectedItem == null) - throw new IndexOutOfRangeException("Invalid field name."); - return selectedItem.Position; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public class XLPivotFields: IXLPivotFields + { + private readonly Dictionary _pivotFields = new Dictionary(); + public IEnumerator GetEnumerator() + { + return _pivotFields.Values.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLPivotField Add(String sourceName) + { + return Add(sourceName, sourceName); + } + public IXLPivotField Add(String sourceName, String customName) + { + var pivotField = new XLPivotField(sourceName) {CustomName = customName}; + _pivotFields.Add(sourceName, pivotField); + return pivotField; + } + + public void Clear() + { + _pivotFields.Clear(); + } + public void Remove(String sourceName) + { + _pivotFields.Remove(sourceName); + } + + public int IndexOf(IXLPivotField pf) + { + var selectedItem = _pivotFields.Select((item, index) => new {Item = item, Position = index}).FirstOrDefault(i => i.Item.Key == pf.SourceName); + if (selectedItem == null) + throw new IndexOutOfRangeException("Invalid field name."); + return selectedItem.Position; + } + } +} diff --git a/ClosedXML/Excel/PivotTables/XLPivotTable.cs b/ClosedXML/Excel/PivotTables/XLPivotTable.cs index c762261..acb4a84 100644 --- a/ClosedXML/Excel/PivotTables/XLPivotTable.cs +++ b/ClosedXML/Excel/PivotTables/XLPivotTable.cs @@ -1,117 +1,117 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLPivotTable: IXLPivotTable - { - - public XLPivotTable() - { - Fields = new XLPivotFields(); - ReportFilters = new XLPivotFields(); - ColumnLabels=new XLPivotFields(); - RowLabels = new XLPivotFields(); - Values = new XLPivotValues(this); - Theme = XLPivotTableTheme.PivotStyleLight16; - - SetExcelDefaults(); - } - - public IXLCell TargetCell { get; set; } - public IXLRange SourceRange { get; set; } - - public IXLPivotFields Fields { get; private set; } - public IXLPivotFields ReportFilters { get; private set; } - public IXLPivotFields ColumnLabels { get; private set; } - public IXLPivotFields RowLabels { get; private set; } - public IXLPivotValues Values { get; private set; } - - public XLPivotTableTheme Theme { get; set; } public IXLPivotTable SetTheme(XLPivotTableTheme value) { Theme = value; return this; } - public String Name { get; set; } public IXLPivotTable SetName(String value) { Name = value; return this; } - public String Title { get; set; } public IXLPivotTable SetTitle(String value) { Title = value; return this; } - public String Description { get; set; } public IXLPivotTable SetDescription(String value) { Description = value; return this; } - - public Boolean MergeAndCenterWithLabels { get; set; } public IXLPivotTable SetMergeAndCenterWithLabels() { MergeAndCenterWithLabels = true; return this; } public IXLPivotTable SetMergeAndCenterWithLabels(Boolean value) { MergeAndCenterWithLabels = value; return this; } - public Int32 RowLabelIndent { get; set; } public IXLPivotTable SetRowLabelIndent(Int32 value) { RowLabelIndent = value; return this; } - public XLFilterAreaOrder FilterAreaOrder { get; set; } public IXLPivotTable SetFilterAreaOrder(XLFilterAreaOrder value) { FilterAreaOrder = value; return this; } - public Int32 FilterFieldsPageWrap { get; set; } public IXLPivotTable SetFilterFieldsPageWrap(Int32 value) { FilterFieldsPageWrap = value; return this; } - public String ErrorValueReplacement { get; set; } public IXLPivotTable SetErrorValueReplacement(String value) { ErrorValueReplacement = value; return this; } - public String EmptyCellReplacement { get; set; } public IXLPivotTable SetEmptyCellReplacement(String value) { EmptyCellReplacement = value; return this; } - public Boolean AutofitColumns { get; set; } public IXLPivotTable SetAutofitColumns() { AutofitColumns = true; return this; } public IXLPivotTable SetAutofitColumns(Boolean value) { AutofitColumns = value; return this; } - public Boolean PreserveCellFormatting { get; set; } public IXLPivotTable SetPreserveCellFormatting() { PreserveCellFormatting = true; return this; } public IXLPivotTable SetPreserveCellFormatting(Boolean value) { PreserveCellFormatting = value; return this; } - - public Boolean ShowGrandTotalsRows { get; set; } public IXLPivotTable SetShowGrandTotalsRows() { ShowGrandTotalsRows = true; return this; } public IXLPivotTable SetShowGrandTotalsRows(Boolean value) { ShowGrandTotalsRows = value; return this; } - public Boolean ShowGrandTotalsColumns { get; set; } public IXLPivotTable SetShowGrandTotalsColumns() { ShowGrandTotalsColumns = true; return this; } public IXLPivotTable SetShowGrandTotalsColumns(Boolean value) { ShowGrandTotalsColumns = value; return this; } - public Boolean FilteredItemsInSubtotals { get; set; } public IXLPivotTable SetFilteredItemsInSubtotals() { FilteredItemsInSubtotals = true; return this; } public IXLPivotTable SetFilteredItemsInSubtotals(Boolean value) { FilteredItemsInSubtotals = value; return this; } - public Boolean AllowMultipleFilters { get; set; } public IXLPivotTable SetAllowMultipleFilters() { AllowMultipleFilters = true; return this; } public IXLPivotTable SetAllowMultipleFilters(Boolean value) { AllowMultipleFilters = value; return this; } - public Boolean UseCustomListsForSorting { get; set; } public IXLPivotTable SetUseCustomListsForSorting() { UseCustomListsForSorting = true; return this; } public IXLPivotTable SetUseCustomListsForSorting(Boolean value) { UseCustomListsForSorting = value; return this; } - - public Boolean ShowExpandCollapseButtons { get; set; } public IXLPivotTable SetShowExpandCollapseButtons() { ShowExpandCollapseButtons = true; return this; } public IXLPivotTable SetShowExpandCollapseButtons(Boolean value) { ShowExpandCollapseButtons = value; return this; } - public Boolean ShowContextualTooltips { get; set; } public IXLPivotTable SetShowContextualTooltips() { ShowContextualTooltips = true; return this; } public IXLPivotTable SetShowContextualTooltips(Boolean value) { ShowContextualTooltips = value; return this; } - public Boolean ShowPropertiesInTooltips { get; set; } public IXLPivotTable SetShowPropertiesInTooltips() { ShowPropertiesInTooltips = true; return this; } public IXLPivotTable SetShowPropertiesInTooltips(Boolean value) { ShowPropertiesInTooltips = value; return this; } - public Boolean DisplayCaptionsAndDropdowns { get; set; } public IXLPivotTable SetDisplayCaptionsAndDropdowns() { DisplayCaptionsAndDropdowns = true; return this; } public IXLPivotTable SetDisplayCaptionsAndDropdowns(Boolean value) { DisplayCaptionsAndDropdowns = value; return this; } - public Boolean ClassicPivotTableLayout { get; set; } public IXLPivotTable SetClassicPivotTableLayout() { ClassicPivotTableLayout = true; return this; } public IXLPivotTable SetClassicPivotTableLayout(Boolean value) { ClassicPivotTableLayout = value; return this; } - public Boolean ShowValuesRow { get; set; } public IXLPivotTable SetShowValuesRow() { ShowValuesRow = true; return this; } public IXLPivotTable SetShowValuesRow(Boolean value) { ShowValuesRow = value; return this; } - public Boolean ShowEmptyItemsOnRows { get; set; } public IXLPivotTable SetShowEmptyItemsOnRows() { ShowEmptyItemsOnRows = true; return this; } public IXLPivotTable SetShowEmptyItemsOnRows(Boolean value) { ShowEmptyItemsOnRows = value; return this; } - public Boolean ShowEmptyItemsOnColumns { get; set; } public IXLPivotTable SetShowEmptyItemsOnColumns() { ShowEmptyItemsOnColumns = true; return this; } public IXLPivotTable SetShowEmptyItemsOnColumns(Boolean value) { ShowEmptyItemsOnColumns = value; return this; } - public Boolean DisplayItemLabels { get; set; } public IXLPivotTable SetDisplayItemLabels() { DisplayItemLabels = true; return this; } public IXLPivotTable SetDisplayItemLabels(Boolean value) { DisplayItemLabels = value; return this; } - public Boolean SortFieldsAtoZ { get; set; } public IXLPivotTable SetSortFieldsAtoZ() { SortFieldsAtoZ = true; return this; } public IXLPivotTable SetSortFieldsAtoZ(Boolean value) { SortFieldsAtoZ = value; return this; } - - public Boolean PrintExpandCollapsedButtons { get; set; } public IXLPivotTable SetPrintExpandCollapsedButtons() { PrintExpandCollapsedButtons = true; return this; } public IXLPivotTable SetPrintExpandCollapsedButtons(Boolean value) { PrintExpandCollapsedButtons = value; return this; } - public Boolean RepeatRowLabels { get; set; } public IXLPivotTable SetRepeatRowLabels() { RepeatRowLabels = true; return this; } public IXLPivotTable SetRepeatRowLabels(Boolean value) { RepeatRowLabels = value; return this; } - public Boolean PrintTitles { get; set; } public IXLPivotTable SetPrintTitles() { PrintTitles = true; return this; } public IXLPivotTable SetPrintTitles(Boolean value) { PrintTitles = value; return this; } - - public Boolean SaveSourceData { get; set; } public IXLPivotTable SetSaveSourceData() { SaveSourceData = true; return this; } public IXLPivotTable SetSaveSourceData(Boolean value) { SaveSourceData = value; return this; } - public Boolean EnableShowDetails { get; set; } public IXLPivotTable SetEnableShowDetails() { EnableShowDetails = true; return this; } public IXLPivotTable SetEnableShowDetails(Boolean value) { EnableShowDetails = value; return this; } - public Boolean RefreshDataOnOpen { get; set; } public IXLPivotTable SetRefreshDataOnOpen() { RefreshDataOnOpen = true; return this; } public IXLPivotTable SetRefreshDataOnOpen(Boolean value) { RefreshDataOnOpen = value; return this; } - public XLItemsToRetain ItemsToRetainPerField { get; set; } public IXLPivotTable SetItemsToRetainPerField(XLItemsToRetain value) { ItemsToRetainPerField = value; return this; } - public Boolean EnableCellEditing { get; set; } public IXLPivotTable SetEnableCellEditing() { EnableCellEditing = true; return this; } public IXLPivotTable SetEnableCellEditing(Boolean value) { EnableCellEditing = value; return this; } - - - public Boolean ShowRowHeaders { get; set; } public IXLPivotTable SetShowRowHeaders() { ShowRowHeaders = true; return this; } public IXLPivotTable SetShowRowHeaders(Boolean value) { ShowRowHeaders = value; return this; } - public Boolean ShowColumnHeaders { get; set; } public IXLPivotTable SetShowColumnHeaders() { ShowColumnHeaders = true; return this; } public IXLPivotTable SetShowColumnHeaders(Boolean value) { ShowColumnHeaders = value; return this; } - public Boolean ShowRowStripes { get; set; } public IXLPivotTable SetShowRowStripes() { ShowRowStripes = true; return this; } public IXLPivotTable SetShowRowStripes(Boolean value) { ShowRowStripes = value; return this; } - public Boolean ShowColumnStripes { get; set; } public IXLPivotTable SetShowColumnStripes() { ShowColumnStripes = true; return this; } public IXLPivotTable SetShowColumnStripes(Boolean value) { ShowColumnStripes = value; return this; } - public XLPivotSubtotals Subtotals { get; set; } public IXLPivotTable SetSubtotals(XLPivotSubtotals value) { Subtotals = value; return this; } - - public XLPivotLayout Layout - { - set { Fields.ForEach(f=>f.SetLayout(value)); } - } - - public IXLPivotTable SetLayout(XLPivotLayout value) { Layout = value; return this; } - - public Boolean InsertBlankLines - { - set { Fields.ForEach(f=>f.SetInsertBlankLines(value)); } - } - - public IXLPivotTable SetInsertBlankLines() { InsertBlankLines = true; return this; } public IXLPivotTable SetInsertBlankLines(Boolean value) { InsertBlankLines = value; return this; } - - internal String RelId { get; set; } - internal String CacheDefinitionRelId { get; set; } - internal String WorkbookCacheRelId { get; set; } - - private void SetExcelDefaults() - { - EmptyCellReplacement = String.Empty; - AutofitColumns = true; - PreserveCellFormatting = true; - ShowGrandTotalsColumns = true; - ShowGrandTotalsRows = true; - UseCustomListsForSorting = true; - ShowExpandCollapseButtons = true; - ShowContextualTooltips = true; - DisplayCaptionsAndDropdowns = true; - RepeatRowLabels = true; - SaveSourceData = true; - EnableShowDetails = true; - ShowColumnHeaders = true; - ShowRowHeaders = true; - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLPivotTable: IXLPivotTable + { + + public XLPivotTable() + { + Fields = new XLPivotFields(); + ReportFilters = new XLPivotFields(); + ColumnLabels=new XLPivotFields(); + RowLabels = new XLPivotFields(); + Values = new XLPivotValues(this); + Theme = XLPivotTableTheme.PivotStyleLight16; + + SetExcelDefaults(); + } + + public IXLCell TargetCell { get; set; } + public IXLRange SourceRange { get; set; } + + public IXLPivotFields Fields { get; private set; } + public IXLPivotFields ReportFilters { get; private set; } + public IXLPivotFields ColumnLabels { get; private set; } + public IXLPivotFields RowLabels { get; private set; } + public IXLPivotValues Values { get; private set; } + + public XLPivotTableTheme Theme { get; set; } public IXLPivotTable SetTheme(XLPivotTableTheme value) { Theme = value; return this; } + public String Name { get; set; } public IXLPivotTable SetName(String value) { Name = value; return this; } + public String Title { get; set; } public IXLPivotTable SetTitle(String value) { Title = value; return this; } + public String Description { get; set; } public IXLPivotTable SetDescription(String value) { Description = value; return this; } + + public Boolean MergeAndCenterWithLabels { get; set; } public IXLPivotTable SetMergeAndCenterWithLabels() { MergeAndCenterWithLabels = true; return this; } public IXLPivotTable SetMergeAndCenterWithLabels(Boolean value) { MergeAndCenterWithLabels = value; return this; } + public Int32 RowLabelIndent { get; set; } public IXLPivotTable SetRowLabelIndent(Int32 value) { RowLabelIndent = value; return this; } + public XLFilterAreaOrder FilterAreaOrder { get; set; } public IXLPivotTable SetFilterAreaOrder(XLFilterAreaOrder value) { FilterAreaOrder = value; return this; } + public Int32 FilterFieldsPageWrap { get; set; } public IXLPivotTable SetFilterFieldsPageWrap(Int32 value) { FilterFieldsPageWrap = value; return this; } + public String ErrorValueReplacement { get; set; } public IXLPivotTable SetErrorValueReplacement(String value) { ErrorValueReplacement = value; return this; } + public String EmptyCellReplacement { get; set; } public IXLPivotTable SetEmptyCellReplacement(String value) { EmptyCellReplacement = value; return this; } + public Boolean AutofitColumns { get; set; } public IXLPivotTable SetAutofitColumns() { AutofitColumns = true; return this; } public IXLPivotTable SetAutofitColumns(Boolean value) { AutofitColumns = value; return this; } + public Boolean PreserveCellFormatting { get; set; } public IXLPivotTable SetPreserveCellFormatting() { PreserveCellFormatting = true; return this; } public IXLPivotTable SetPreserveCellFormatting(Boolean value) { PreserveCellFormatting = value; return this; } + + public Boolean ShowGrandTotalsRows { get; set; } public IXLPivotTable SetShowGrandTotalsRows() { ShowGrandTotalsRows = true; return this; } public IXLPivotTable SetShowGrandTotalsRows(Boolean value) { ShowGrandTotalsRows = value; return this; } + public Boolean ShowGrandTotalsColumns { get; set; } public IXLPivotTable SetShowGrandTotalsColumns() { ShowGrandTotalsColumns = true; return this; } public IXLPivotTable SetShowGrandTotalsColumns(Boolean value) { ShowGrandTotalsColumns = value; return this; } + public Boolean FilteredItemsInSubtotals { get; set; } public IXLPivotTable SetFilteredItemsInSubtotals() { FilteredItemsInSubtotals = true; return this; } public IXLPivotTable SetFilteredItemsInSubtotals(Boolean value) { FilteredItemsInSubtotals = value; return this; } + public Boolean AllowMultipleFilters { get; set; } public IXLPivotTable SetAllowMultipleFilters() { AllowMultipleFilters = true; return this; } public IXLPivotTable SetAllowMultipleFilters(Boolean value) { AllowMultipleFilters = value; return this; } + public Boolean UseCustomListsForSorting { get; set; } public IXLPivotTable SetUseCustomListsForSorting() { UseCustomListsForSorting = true; return this; } public IXLPivotTable SetUseCustomListsForSorting(Boolean value) { UseCustomListsForSorting = value; return this; } + + public Boolean ShowExpandCollapseButtons { get; set; } public IXLPivotTable SetShowExpandCollapseButtons() { ShowExpandCollapseButtons = true; return this; } public IXLPivotTable SetShowExpandCollapseButtons(Boolean value) { ShowExpandCollapseButtons = value; return this; } + public Boolean ShowContextualTooltips { get; set; } public IXLPivotTable SetShowContextualTooltips() { ShowContextualTooltips = true; return this; } public IXLPivotTable SetShowContextualTooltips(Boolean value) { ShowContextualTooltips = value; return this; } + public Boolean ShowPropertiesInTooltips { get; set; } public IXLPivotTable SetShowPropertiesInTooltips() { ShowPropertiesInTooltips = true; return this; } public IXLPivotTable SetShowPropertiesInTooltips(Boolean value) { ShowPropertiesInTooltips = value; return this; } + public Boolean DisplayCaptionsAndDropdowns { get; set; } public IXLPivotTable SetDisplayCaptionsAndDropdowns() { DisplayCaptionsAndDropdowns = true; return this; } public IXLPivotTable SetDisplayCaptionsAndDropdowns(Boolean value) { DisplayCaptionsAndDropdowns = value; return this; } + public Boolean ClassicPivotTableLayout { get; set; } public IXLPivotTable SetClassicPivotTableLayout() { ClassicPivotTableLayout = true; return this; } public IXLPivotTable SetClassicPivotTableLayout(Boolean value) { ClassicPivotTableLayout = value; return this; } + public Boolean ShowValuesRow { get; set; } public IXLPivotTable SetShowValuesRow() { ShowValuesRow = true; return this; } public IXLPivotTable SetShowValuesRow(Boolean value) { ShowValuesRow = value; return this; } + public Boolean ShowEmptyItemsOnRows { get; set; } public IXLPivotTable SetShowEmptyItemsOnRows() { ShowEmptyItemsOnRows = true; return this; } public IXLPivotTable SetShowEmptyItemsOnRows(Boolean value) { ShowEmptyItemsOnRows = value; return this; } + public Boolean ShowEmptyItemsOnColumns { get; set; } public IXLPivotTable SetShowEmptyItemsOnColumns() { ShowEmptyItemsOnColumns = true; return this; } public IXLPivotTable SetShowEmptyItemsOnColumns(Boolean value) { ShowEmptyItemsOnColumns = value; return this; } + public Boolean DisplayItemLabels { get; set; } public IXLPivotTable SetDisplayItemLabels() { DisplayItemLabels = true; return this; } public IXLPivotTable SetDisplayItemLabels(Boolean value) { DisplayItemLabels = value; return this; } + public Boolean SortFieldsAtoZ { get; set; } public IXLPivotTable SetSortFieldsAtoZ() { SortFieldsAtoZ = true; return this; } public IXLPivotTable SetSortFieldsAtoZ(Boolean value) { SortFieldsAtoZ = value; return this; } + + public Boolean PrintExpandCollapsedButtons { get; set; } public IXLPivotTable SetPrintExpandCollapsedButtons() { PrintExpandCollapsedButtons = true; return this; } public IXLPivotTable SetPrintExpandCollapsedButtons(Boolean value) { PrintExpandCollapsedButtons = value; return this; } + public Boolean RepeatRowLabels { get; set; } public IXLPivotTable SetRepeatRowLabels() { RepeatRowLabels = true; return this; } public IXLPivotTable SetRepeatRowLabels(Boolean value) { RepeatRowLabels = value; return this; } + public Boolean PrintTitles { get; set; } public IXLPivotTable SetPrintTitles() { PrintTitles = true; return this; } public IXLPivotTable SetPrintTitles(Boolean value) { PrintTitles = value; return this; } + + public Boolean SaveSourceData { get; set; } public IXLPivotTable SetSaveSourceData() { SaveSourceData = true; return this; } public IXLPivotTable SetSaveSourceData(Boolean value) { SaveSourceData = value; return this; } + public Boolean EnableShowDetails { get; set; } public IXLPivotTable SetEnableShowDetails() { EnableShowDetails = true; return this; } public IXLPivotTable SetEnableShowDetails(Boolean value) { EnableShowDetails = value; return this; } + public Boolean RefreshDataOnOpen { get; set; } public IXLPivotTable SetRefreshDataOnOpen() { RefreshDataOnOpen = true; return this; } public IXLPivotTable SetRefreshDataOnOpen(Boolean value) { RefreshDataOnOpen = value; return this; } + public XLItemsToRetain ItemsToRetainPerField { get; set; } public IXLPivotTable SetItemsToRetainPerField(XLItemsToRetain value) { ItemsToRetainPerField = value; return this; } + public Boolean EnableCellEditing { get; set; } public IXLPivotTable SetEnableCellEditing() { EnableCellEditing = true; return this; } public IXLPivotTable SetEnableCellEditing(Boolean value) { EnableCellEditing = value; return this; } + + + public Boolean ShowRowHeaders { get; set; } public IXLPivotTable SetShowRowHeaders() { ShowRowHeaders = true; return this; } public IXLPivotTable SetShowRowHeaders(Boolean value) { ShowRowHeaders = value; return this; } + public Boolean ShowColumnHeaders { get; set; } public IXLPivotTable SetShowColumnHeaders() { ShowColumnHeaders = true; return this; } public IXLPivotTable SetShowColumnHeaders(Boolean value) { ShowColumnHeaders = value; return this; } + public Boolean ShowRowStripes { get; set; } public IXLPivotTable SetShowRowStripes() { ShowRowStripes = true; return this; } public IXLPivotTable SetShowRowStripes(Boolean value) { ShowRowStripes = value; return this; } + public Boolean ShowColumnStripes { get; set; } public IXLPivotTable SetShowColumnStripes() { ShowColumnStripes = true; return this; } public IXLPivotTable SetShowColumnStripes(Boolean value) { ShowColumnStripes = value; return this; } + public XLPivotSubtotals Subtotals { get; set; } public IXLPivotTable SetSubtotals(XLPivotSubtotals value) { Subtotals = value; return this; } + + public XLPivotLayout Layout + { + set { Fields.ForEach(f=>f.SetLayout(value)); } + } + + public IXLPivotTable SetLayout(XLPivotLayout value) { Layout = value; return this; } + + public Boolean InsertBlankLines + { + set { Fields.ForEach(f=>f.SetInsertBlankLines(value)); } + } + + public IXLPivotTable SetInsertBlankLines() { InsertBlankLines = true; return this; } public IXLPivotTable SetInsertBlankLines(Boolean value) { InsertBlankLines = value; return this; } + + internal String RelId { get; set; } + internal String CacheDefinitionRelId { get; set; } + internal String WorkbookCacheRelId { get; set; } + + private void SetExcelDefaults() + { + EmptyCellReplacement = String.Empty; + AutofitColumns = true; + PreserveCellFormatting = true; + ShowGrandTotalsColumns = true; + ShowGrandTotalsRows = true; + UseCustomListsForSorting = true; + ShowExpandCollapseButtons = true; + ShowContextualTooltips = true; + DisplayCaptionsAndDropdowns = true; + RepeatRowLabels = true; + SaveSourceData = true; + EnableShowDetails = true; + ShowColumnHeaders = true; + ShowRowHeaders = true; + } + + } +} diff --git a/ClosedXML/Excel/PivotTables/XLPivotTables.cs b/ClosedXML/Excel/PivotTables/XLPivotTables.cs index fe945b3..e64d78e 100644 --- a/ClosedXML/Excel/PivotTables/XLPivotTables.cs +++ b/ClosedXML/Excel/PivotTables/XLPivotTables.cs @@ -1,51 +1,51 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLPivotTables: IXLPivotTables - { - private readonly Dictionary _pivotTables = new Dictionary(); - public IEnumerator GetEnumerator() - { - return _pivotTables.Values.Cast().GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public XLPivotTable PivotTable(String name) - { - return _pivotTables[name]; - } - IXLPivotTable IXLPivotTables.PivotTable(String name) - { - return PivotTable(name); - } - public void Delete(String name) - { - _pivotTables.Remove(name); - } - public void DeleteAll() - { - _pivotTables.Clear(); - } - - public void Add(String name, IXLPivotTable pivotTable) - { - _pivotTables.Add(name, (XLPivotTable)pivotTable); - } - - public IXLPivotTable AddNew(string name, IXLCell target, IXLRange source) - { - var pivotTable = new XLPivotTable { Name = name, TargetCell = target, SourceRange = source }; - _pivotTables.Add(name, pivotTable); - return pivotTable; - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLPivotTables: IXLPivotTables + { + private readonly Dictionary _pivotTables = new Dictionary(); + public IEnumerator GetEnumerator() + { + return _pivotTables.Values.Cast().GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public XLPivotTable PivotTable(String name) + { + return _pivotTables[name]; + } + IXLPivotTable IXLPivotTables.PivotTable(String name) + { + return PivotTable(name); + } + public void Delete(String name) + { + _pivotTables.Remove(name); + } + public void DeleteAll() + { + _pivotTables.Clear(); + } + + public void Add(String name, IXLPivotTable pivotTable) + { + _pivotTables.Add(name, (XLPivotTable)pivotTable); + } + + public IXLPivotTable AddNew(string name, IXLCell target, IXLRange source) + { + var pivotTable = new XLPivotTable { Name = name, TargetCell = target, SourceRange = source }; + _pivotTables.Add(name, pivotTable); + return pivotTable; + } + + } +} diff --git a/ClosedXML/Excel/Ranges/IXLBaseCollection.cs b/ClosedXML/Excel/Ranges/IXLBaseCollection.cs index 118db37..ea38cb1 100644 --- a/ClosedXML/Excel/Ranges/IXLBaseCollection.cs +++ b/ClosedXML/Excel/Ranges/IXLBaseCollection.cs @@ -1,77 +1,77 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLBaseCollection: IEnumerable - { - Int32 Count { get; } - - IXLStyle Style { get; set; } - - IXLDataValidation SetDataValidation(); - - /// - /// Creates a named range out of these ranges. - /// If the named range exists, it will add these ranges to that named range. - /// The default scope for the named range is Workbook. - /// - /// Name of the range. - TMultiple AddToNamed(String rangeName); - - /// - /// Creates a named range out of these ranges. - /// If the named range exists, it will add these ranges to that named range. - /// Name of the range. - /// The scope for the named range. - /// - TMultiple AddToNamed(String rangeName, XLScope scope); - - /// - /// Creates a named range out of these ranges. - /// If the named range exists, it will add these ranges to that named range. - /// Name of the range. - /// The scope for the named range. - /// The comments for the named range. - /// - TMultiple AddToNamed(String rangeName, XLScope scope, String comment); - - /// - /// Sets the cells' value. - /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. - /// If the object is a range ClosedXML will copy the range starting from each cell. - /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. - /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. - /// - /// - /// The object containing the value(s) to set. - /// - Object Value { set; } - - TMultiple SetValue(T value); - - /// - /// Returns the collection of cells. - /// - IXLCells Cells(); - - /// - /// Returns the collection of cells that have a value. - /// - IXLCells CellsUsed(); - - /// - /// Returns the collection of cells that have a value. - /// - /// if set to true will return all cells with a value or a style different than the default. - IXLCells CellsUsed(Boolean includeFormats); - - TMultiple SetDataType(XLCellValues dataType); - - /// - /// Clears the contents of these ranges. - /// - /// Specify what you want to clear. - TMultiple Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLBaseCollection: IEnumerable + { + Int32 Count { get; } + + IXLStyle Style { get; set; } + + IXLDataValidation SetDataValidation(); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// The default scope for the named range is Workbook. + /// + /// Name of the range. + TMultiple AddToNamed(String rangeName); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// Name of the range. + /// The scope for the named range. + /// + TMultiple AddToNamed(String rangeName, XLScope scope); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// Name of the range. + /// The scope for the named range. + /// The comments for the named range. + /// + TMultiple AddToNamed(String rangeName, XLScope scope, String comment); + + /// + /// Sets the cells' value. + /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. + /// If the object is a range ClosedXML will copy the range starting from each cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. + /// + /// + /// The object containing the value(s) to set. + /// + Object Value { set; } + + TMultiple SetValue(T value); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + IXLCells CellsUsed(Boolean includeFormats); + + TMultiple SetDataType(XLCellValues dataType); + + /// + /// Clears the contents of these ranges. + /// + /// Specify what you want to clear. + TMultiple Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRange.cs b/ClosedXML/Excel/Ranges/IXLRange.cs index 26761ba..fbbe958 100644 --- a/ClosedXML/Excel/Ranges/IXLRange.cs +++ b/ClosedXML/Excel/Ranges/IXLRange.cs @@ -1,254 +1,254 @@ -using System; - - -namespace ClosedXML.Excel -{ - public enum XLShiftDeletedCells { ShiftCellsUp, ShiftCellsLeft } - public enum XLTransposeOptions { MoveCells, ReplaceCells } - public enum XLSearchContents { Values, Formulas, ValuesAndFormulas } - public interface IXLRange: IXLRangeBase - { - /// - /// Gets the cell at the specified row and column. - /// The cell address is relative to the parent range. - /// - /// The cell's row. - /// The cell's column. - IXLCell Cell(int row, int column); - - /// Gets the cell at the specified address. - /// The cell address is relative to the parent range. - /// The cell address in the parent range. - IXLCell Cell(string cellAddressInRange); - - /// - /// Gets the cell at the specified row and column. - /// The cell address is relative to the parent range. - /// - /// The cell's row. - /// The cell's column. - IXLCell Cell(int row, string column); - /// Gets the cell at the specified address. - /// The cell address is relative to the parent range. - /// The cell address in the parent range. - IXLCell Cell(IXLAddress cellAddressInRange); - - /// - /// Gets the specified column of the range. - /// - /// The range column. - IXLRangeColumn Column(int column); - /// - /// Gets the specified column of the range. - /// - /// The range column. - IXLRangeColumn Column(string column); - /// - /// Gets the first column of the range. - /// - IXLRangeColumn FirstColumn(Func predicate = null); - /// - /// Gets the first column of the range that contains a cell with a value. - /// - IXLRangeColumn FirstColumnUsed(Boolean includeFormats, Func predicate = null); - IXLRangeColumn FirstColumnUsed(Func predicate = null); - /// - /// Gets the last column of the range. - /// - IXLRangeColumn LastColumn(Func predicate = null); - /// - /// Gets the last column of the range that contains a cell with a value. - /// - IXLRangeColumn LastColumnUsed(Boolean includeFormats, Func predicate = null); - IXLRangeColumn LastColumnUsed(Func predicate = null); - /// - /// Gets a collection of all columns in this range. - /// - IXLRangeColumns Columns(Func predicate = null); - /// - /// Gets a collection of the specified columns in this range. - /// - /// The first column to return. - /// The last column to return. - IXLRangeColumns Columns(int firstColumn, int lastColumn); - /// - /// Gets a collection of the specified columns in this range. - /// - /// The first column to return. - /// The last column to return. - IXLRangeColumns Columns(string firstColumn, string lastColumn); - /// - /// Gets a collection of the specified columns in this range, separated by commas. - /// e.g. Columns("G:H"), Columns("10:11,13:14"), Columns("P:Q,S:T"), Columns("V") - /// - /// The columns to return. - IXLRangeColumns Columns(string columns); - /// - /// Returns the first row that matches the given predicate - /// - IXLRangeColumn FindColumn(Func predicate); - /// - /// Returns the first row that matches the given predicate - /// - IXLRangeRow FindRow(Func predicate); - /// - /// Gets the first row of the range. - /// - IXLRangeRow FirstRow(Func predicate = null); - /// - /// Gets the first row of the range that contains a cell with a value. - /// - IXLRangeRow FirstRowUsed(Boolean includeFormats, Func predicate = null); - IXLRangeRow FirstRowUsed(Func predicate = null); - /// - /// Gets the last row of the range. - /// - IXLRangeRow LastRow(Func predicate = null); - /// - /// Gets the last row of the range that contains a cell with a value. - /// - IXLRangeRow LastRowUsed(Boolean includeFormats, Func predicate = null); - IXLRangeRow LastRowUsed(Func predicate = null); - /// - /// Gets the specified row of the range. - /// - /// The range row. - IXLRangeRow Row(int row); - - IXLRangeRows Rows(Func predicate = null); - - /// - /// Gets a collection of the specified rows in this range. - /// - /// The first row to return. - /// The last row to return. - /// - IXLRangeRows Rows(int firstRow, int lastRow); - /// - /// Gets a collection of the specified rows in this range, separated by commas. - /// e.g. Rows("4:5"), Rows("7:8,10:11"), Rows("13") - /// - /// The rows to return. - IXLRangeRows Rows(string rows); - - /// - /// Returns the specified range. - /// - /// The range boundaries. - IXLRange Range(IXLRangeAddress rangeAddress); - - /// Returns the specified range. - /// e.g. Range("A1"), Range("A1:C2") - /// The range boundaries. - IXLRange Range(string rangeAddress); - - /// Returns the specified range. - /// The first cell in the range. - /// The last cell in the range. - IXLRange Range(IXLCell firstCell, IXLCell lastCell); - - /// Returns the specified range. - /// The first cell address in the range. - /// The last cell address in the range. - IXLRange Range(string firstCellAddress, string lastCellAddress); - - /// Returns the specified range. - /// The first cell address in the range. - /// The last cell address in the range. - IXLRange Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress); - - /// Returns a collection of ranges, separated by commas. - /// e.g. Ranges("A1"), Ranges("A1:C2"), Ranges("A1:B2,D1:D4") - /// The ranges to return. - IXLRanges Ranges(string ranges); - - /// Returns the specified range. - /// The first cell's row of the range to return. - /// The first cell's column of the range to return. - /// The last cell's row of the range to return. - /// The last cell's column of the range to return. - /// . - IXLRange Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn); - - /// Gets the number of rows in this range. - int RowCount(); - - /// Gets the number of columns in this range. - int ColumnCount(); - - /// - /// Inserts X number of columns to the right of this range. - /// All cells to the right of this range will be shifted X number of columns. - /// - /// Number of columns to insert. - IXLRangeColumns InsertColumnsAfter(int numberOfColumns); - IXLRangeColumns InsertColumnsAfter(int numberOfColumns, Boolean expandRange); - /// - /// Inserts X number of columns to the left of this range. - /// This range and all cells to the right of this range will be shifted X number of columns. - /// - /// Number of columns to insert. - IXLRangeColumns InsertColumnsBefore(int numberOfColumns); - IXLRangeColumns InsertColumnsBefore(int numberOfColumns, Boolean expandRange); - /// - /// Inserts X number of rows on top of this range. - /// This range and all cells below this range will be shifted X number of rows. - /// - /// Number of rows to insert. - IXLRangeRows InsertRowsAbove(int numberOfRows); - IXLRangeRows InsertRowsAbove(int numberOfRows, Boolean expandRange); - /// - /// Inserts X number of rows below this range. - /// All cells below this range will be shifted X number of rows. - /// - /// Number of rows to insert. - IXLRangeRows InsertRowsBelow(int numberOfRows); - IXLRangeRows InsertRowsBelow(int numberOfRows, Boolean expandRange); - - /// - /// Deletes this range and shifts the surrounding cells accordingly. - /// - /// How to shift the surrounding cells. - void Delete(XLShiftDeletedCells shiftDeleteCells); - - /// - /// Transposes the contents and styles of all cells in this range. - /// - /// How to handle the surrounding cells when transposing the range. - void Transpose(XLTransposeOptions transposeOption); - - IXLTable AsTable(); - IXLTable AsTable(String name); - IXLTable CreateTable(); - IXLTable CreateTable(String name); - - IXLRange RangeUsed(); - - IXLRange CopyTo(IXLCell target); - IXLRange CopyTo(IXLRangeBase target); - - IXLSortElements SortRows { get; } - IXLSortElements SortColumns { get; } - - IXLRange Sort(); - - IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - - - IXLRange SetDataType(XLCellValues dataType); - - /// - /// Clears the contents of this range. - /// - /// Specify what you want to clear. - new IXLRange Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - IXLRangeRows RowsUsed(Boolean includeFormats, Func predicate = null); - IXLRangeRows RowsUsed(Func predicate = null); - IXLRangeColumns ColumnsUsed(Boolean includeFormats, Func predicate = null); - IXLRangeColumns ColumnsUsed(Func predicate = null); - } -} - +using System; + + +namespace ClosedXML.Excel +{ + public enum XLShiftDeletedCells { ShiftCellsUp, ShiftCellsLeft } + public enum XLTransposeOptions { MoveCells, ReplaceCells } + public enum XLSearchContents { Values, Formulas, ValuesAndFormulas } + public interface IXLRange: IXLRangeBase + { + /// + /// Gets the cell at the specified row and column. + /// The cell address is relative to the parent range. + /// + /// The cell's row. + /// The cell's column. + IXLCell Cell(int row, int column); + + /// Gets the cell at the specified address. + /// The cell address is relative to the parent range. + /// The cell address in the parent range. + IXLCell Cell(string cellAddressInRange); + + /// + /// Gets the cell at the specified row and column. + /// The cell address is relative to the parent range. + /// + /// The cell's row. + /// The cell's column. + IXLCell Cell(int row, string column); + /// Gets the cell at the specified address. + /// The cell address is relative to the parent range. + /// The cell address in the parent range. + IXLCell Cell(IXLAddress cellAddressInRange); + + /// + /// Gets the specified column of the range. + /// + /// The range column. + IXLRangeColumn Column(int column); + /// + /// Gets the specified column of the range. + /// + /// The range column. + IXLRangeColumn Column(string column); + /// + /// Gets the first column of the range. + /// + IXLRangeColumn FirstColumn(Func predicate = null); + /// + /// Gets the first column of the range that contains a cell with a value. + /// + IXLRangeColumn FirstColumnUsed(Boolean includeFormats, Func predicate = null); + IXLRangeColumn FirstColumnUsed(Func predicate = null); + /// + /// Gets the last column of the range. + /// + IXLRangeColumn LastColumn(Func predicate = null); + /// + /// Gets the last column of the range that contains a cell with a value. + /// + IXLRangeColumn LastColumnUsed(Boolean includeFormats, Func predicate = null); + IXLRangeColumn LastColumnUsed(Func predicate = null); + /// + /// Gets a collection of all columns in this range. + /// + IXLRangeColumns Columns(Func predicate = null); + /// + /// Gets a collection of the specified columns in this range. + /// + /// The first column to return. + /// The last column to return. + IXLRangeColumns Columns(int firstColumn, int lastColumn); + /// + /// Gets a collection of the specified columns in this range. + /// + /// The first column to return. + /// The last column to return. + IXLRangeColumns Columns(string firstColumn, string lastColumn); + /// + /// Gets a collection of the specified columns in this range, separated by commas. + /// e.g. Columns("G:H"), Columns("10:11,13:14"), Columns("P:Q,S:T"), Columns("V") + /// + /// The columns to return. + IXLRangeColumns Columns(string columns); + /// + /// Returns the first row that matches the given predicate + /// + IXLRangeColumn FindColumn(Func predicate); + /// + /// Returns the first row that matches the given predicate + /// + IXLRangeRow FindRow(Func predicate); + /// + /// Gets the first row of the range. + /// + IXLRangeRow FirstRow(Func predicate = null); + /// + /// Gets the first row of the range that contains a cell with a value. + /// + IXLRangeRow FirstRowUsed(Boolean includeFormats, Func predicate = null); + IXLRangeRow FirstRowUsed(Func predicate = null); + /// + /// Gets the last row of the range. + /// + IXLRangeRow LastRow(Func predicate = null); + /// + /// Gets the last row of the range that contains a cell with a value. + /// + IXLRangeRow LastRowUsed(Boolean includeFormats, Func predicate = null); + IXLRangeRow LastRowUsed(Func predicate = null); + /// + /// Gets the specified row of the range. + /// + /// The range row. + IXLRangeRow Row(int row); + + IXLRangeRows Rows(Func predicate = null); + + /// + /// Gets a collection of the specified rows in this range. + /// + /// The first row to return. + /// The last row to return. + /// + IXLRangeRows Rows(int firstRow, int lastRow); + /// + /// Gets a collection of the specified rows in this range, separated by commas. + /// e.g. Rows("4:5"), Rows("7:8,10:11"), Rows("13") + /// + /// The rows to return. + IXLRangeRows Rows(string rows); + + /// + /// Returns the specified range. + /// + /// The range boundaries. + IXLRange Range(IXLRangeAddress rangeAddress); + + /// Returns the specified range. + /// e.g. Range("A1"), Range("A1:C2") + /// The range boundaries. + IXLRange Range(string rangeAddress); + + /// Returns the specified range. + /// The first cell in the range. + /// The last cell in the range. + IXLRange Range(IXLCell firstCell, IXLCell lastCell); + + /// Returns the specified range. + /// The first cell address in the range. + /// The last cell address in the range. + IXLRange Range(string firstCellAddress, string lastCellAddress); + + /// Returns the specified range. + /// The first cell address in the range. + /// The last cell address in the range. + IXLRange Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress); + + /// Returns a collection of ranges, separated by commas. + /// e.g. Ranges("A1"), Ranges("A1:C2"), Ranges("A1:B2,D1:D4") + /// The ranges to return. + IXLRanges Ranges(string ranges); + + /// Returns the specified range. + /// The first cell's row of the range to return. + /// The first cell's column of the range to return. + /// The last cell's row of the range to return. + /// The last cell's column of the range to return. + /// . + IXLRange Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn); + + /// Gets the number of rows in this range. + int RowCount(); + + /// Gets the number of columns in this range. + int ColumnCount(); + + /// + /// Inserts X number of columns to the right of this range. + /// All cells to the right of this range will be shifted X number of columns. + /// + /// Number of columns to insert. + IXLRangeColumns InsertColumnsAfter(int numberOfColumns); + IXLRangeColumns InsertColumnsAfter(int numberOfColumns, Boolean expandRange); + /// + /// Inserts X number of columns to the left of this range. + /// This range and all cells to the right of this range will be shifted X number of columns. + /// + /// Number of columns to insert. + IXLRangeColumns InsertColumnsBefore(int numberOfColumns); + IXLRangeColumns InsertColumnsBefore(int numberOfColumns, Boolean expandRange); + /// + /// Inserts X number of rows on top of this range. + /// This range and all cells below this range will be shifted X number of rows. + /// + /// Number of rows to insert. + IXLRangeRows InsertRowsAbove(int numberOfRows); + IXLRangeRows InsertRowsAbove(int numberOfRows, Boolean expandRange); + /// + /// Inserts X number of rows below this range. + /// All cells below this range will be shifted X number of rows. + /// + /// Number of rows to insert. + IXLRangeRows InsertRowsBelow(int numberOfRows); + IXLRangeRows InsertRowsBelow(int numberOfRows, Boolean expandRange); + + /// + /// Deletes this range and shifts the surrounding cells accordingly. + /// + /// How to shift the surrounding cells. + void Delete(XLShiftDeletedCells shiftDeleteCells); + + /// + /// Transposes the contents and styles of all cells in this range. + /// + /// How to handle the surrounding cells when transposing the range. + void Transpose(XLTransposeOptions transposeOption); + + IXLTable AsTable(); + IXLTable AsTable(String name); + IXLTable CreateTable(); + IXLTable CreateTable(String name); + + IXLRange RangeUsed(); + + IXLRange CopyTo(IXLCell target); + IXLRange CopyTo(IXLRangeBase target); + + IXLSortElements SortRows { get; } + IXLSortElements SortColumns { get; } + + IXLRange Sort(); + + IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + + IXLRange SetDataType(XLCellValues dataType); + + /// + /// Clears the contents of this range. + /// + /// Specify what you want to clear. + new IXLRange Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + IXLRangeRows RowsUsed(Boolean includeFormats, Func predicate = null); + IXLRangeRows RowsUsed(Func predicate = null); + IXLRangeColumns ColumnsUsed(Boolean includeFormats, Func predicate = null); + IXLRangeColumns ColumnsUsed(Func predicate = null); + } +} + diff --git a/ClosedXML/Excel/Ranges/IXLRangeAddress.cs b/ClosedXML/Excel/Ranges/IXLRangeAddress.cs index 8354d3d..9da98e4 100644 --- a/ClosedXML/Excel/Ranges/IXLRangeAddress.cs +++ b/ClosedXML/Excel/Ranges/IXLRangeAddress.cs @@ -1,37 +1,37 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLRangeAddress - { - IXLWorksheet Worksheet { get; } - - /// - /// Gets or sets the first address in the range. - /// - /// - /// The first address. - /// - IXLAddress FirstAddress { get; set; } - /// - /// Gets or sets the last address in the range. - /// - /// - /// The last address. - /// - IXLAddress LastAddress { get; set; } - /// - /// Gets or sets a value indicating whether this range is invalid. - /// - /// - /// true if this instance is invalid; otherwise, false. - /// - Boolean IsInvalid { get; set; } - - String ToStringRelative(); - String ToStringRelative(Boolean includeSheet); - String ToStringFixed(); - String ToStringFixed(XLReferenceStyle referenceStyle); - String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet); - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLRangeAddress + { + IXLWorksheet Worksheet { get; } + + /// + /// Gets or sets the first address in the range. + /// + /// + /// The first address. + /// + IXLAddress FirstAddress { get; set; } + /// + /// Gets or sets the last address in the range. + /// + /// + /// The last address. + /// + IXLAddress LastAddress { get; set; } + /// + /// Gets or sets a value indicating whether this range is invalid. + /// + /// + /// true if this instance is invalid; otherwise, false. + /// + Boolean IsInvalid { get; set; } + + String ToStringRelative(); + String ToStringRelative(Boolean includeSheet); + String ToStringFixed(); + String ToStringFixed(XLReferenceStyle referenceStyle); + String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRangeBase.cs b/ClosedXML/Excel/Ranges/IXLRangeBase.cs index de5fa11..76902d0 100644 --- a/ClosedXML/Excel/Ranges/IXLRangeBase.cs +++ b/ClosedXML/Excel/Ranges/IXLRangeBase.cs @@ -1,258 +1,258 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLScope - { - Workbook, - Worksheet - } - - public interface IXLRangeBase: IDisposable - { - IXLWorksheet Worksheet { get; } - - /// - /// Gets an object with the boundaries of this range. - /// - IXLRangeAddress RangeAddress { get; } - - /// - /// Sets a value to every cell in this range. - /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. - /// If the object is a range ClosedXML will copy the range starting from each cell. - /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. - /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. - /// - /// - /// The object containing the value(s) to set. - /// - Object Value { set; } - - /// - /// Sets the type of the cells' data. - /// Changing the data type will cause ClosedXML to covert the current value to the new data type. - /// An exception will be thrown if the current value cannot be converted to the new data type. - /// - /// - /// The type of the cell's data. - /// - /// - XLCellValues DataType { set; } - - /// - /// Sets the cells' formula with A1 references. - /// - /// The formula with A1 references. - String FormulaA1 { set; } - - /// - /// Sets the cells' formula with R1C1 references. - /// - /// The formula with R1C1 references. - String FormulaR1C1 { set; } - - IXLStyle Style { get; set; } - - /// - /// Gets or sets a value indicating whether this cell's text should be shared or not. - /// - /// - /// If false the cell's text will not be shared and stored as an inline value. - /// - Boolean ShareString { set; } - - IXLHyperlinks Hyperlinks { get; } - - - /// - /// Returns the collection of cells. - /// - IXLCells Cells(); - - IXLCells Cells(Boolean usedCellsOnly); - - IXLCells Cells(Boolean usedCellsOnly, Boolean includeFormats); - - IXLCells Cells(String cells); - - IXLCells Cells(Func predicate); - - /// - /// Returns the collection of cells that have a value. Formats are ignored. - /// - IXLCells CellsUsed(); - - /// - /// Returns the collection of cells that have a value. - /// - /// if set to true will return all cells with a value or a style different than the default. - IXLCells CellsUsed(Boolean includeFormats); - - IXLCells CellsUsed(Func predicate); - - IXLCells CellsUsed(Boolean includeFormats, Func predicate); - - /// - /// Returns the first cell of this range. - /// - IXLCell FirstCell(); - - /// - /// Returns the first cell with a value of this range. Formats are ignored. - /// The cell's address is going to be ([First Row with a value], [First Column with a value]) - /// - IXLCell FirstCellUsed(); - - /// - /// Returns the first cell with a value of this range. - /// - /// The cell's address is going to be ([First Row with a value], [First Column with a value]) - /// if set to true will return all cells with a value or a style different than the default. - IXLCell FirstCellUsed(Boolean includeFormats); - - IXLCell FirstCellUsed(Func predicate); - - IXLCell FirstCellUsed(Boolean includeFormats, Func predicate); - - /// - /// Returns the last cell of this range. - /// - IXLCell LastCell(); - - /// - /// Returns the last cell with a value of this range. Formats are ignored. - /// The cell's address is going to be ([Last Row with a value], [Last Column with a value]) - /// - IXLCell LastCellUsed(); - - /// - /// Returns the last cell with a value of this range. - /// - /// The cell's address is going to be ([Last Row with a value], [Last Column with a value]) - /// if set to true will return all cells with a value or a style different than the default. - IXLCell LastCellUsed(Boolean includeFormats); - - IXLCell LastCellUsed(Func predicate); - - IXLCell LastCellUsed(Boolean includeFormats, Func predicate); - - /// - /// 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; otherwise, false. - /// - 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); - - Boolean Contains(IXLCell cell); - - /// - /// 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. - /// - IXLRange Unmerge(); - - /// - /// Merges this range. - /// The contents and style of the merged cells will be equal to the first cell. - /// - IXLRange Merge(); - - IXLRange Merge(Boolean checkIntersect); - - /// - /// Creates a named range out of this range. - /// If the named range exists, it will add this range to that named range. - /// The default scope for the named range is Workbook. - /// - /// Name of the range. - IXLRange AddToNamed(String rangeName); - - /// - /// Creates a named range out of this range. - /// If the named range exists, it will add this range to that named range. - /// Name of the range. - /// The scope for the named range. - /// - IXLRange AddToNamed(String rangeName, XLScope scope); - - /// - /// Creates a named range out of this range. - /// If the named range exists, it will add this range to that named range. - /// Name of the range. - /// The scope for the named range. - /// The comments for the named range. - /// - IXLRange AddToNamed(String rangeName, XLScope scope, String comment); - - /// - /// Clears the contents of this range. - /// - /// Specify what you want to clear. - IXLRangeBase Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - /// - /// Deletes the cell comments from this range. - /// - void DeleteComments(); - - IXLRangeBase SetValue(T value); - - /// - /// Converts this object to a range. - /// - IXLRange AsRange(); - - Boolean IsMerged(); - Boolean IsEmpty(); - Boolean IsEmpty(Boolean includeFormats); - - - IXLPivotTable CreatePivotTable(IXLCell targetCell); - IXLPivotTable CreatePivotTable(IXLCell targetCell, String name); - - - - //IXLChart CreateChart(Int32 firstRow, Int32 firstColumn, Int32 lastRow, Int32 lastColumn); - - IXLAutoFilter SetAutoFilter(); - - IXLDataValidation SetDataValidation(); - - IXLConditionalFormat AddConditionalFormat(); - - void Select(); - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLScope + { + Workbook, + Worksheet + } + + public interface IXLRangeBase: IDisposable + { + IXLWorksheet Worksheet { get; } + + /// + /// Gets an object with the boundaries of this range. + /// + IXLRangeAddress RangeAddress { get; } + + /// + /// Sets a value to every cell in this range. + /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. + /// If the object is a range ClosedXML will copy the range starting from each cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. + /// + /// + /// The object containing the value(s) to set. + /// + Object Value { set; } + + /// + /// Sets the type of the cells' data. + /// Changing the data type will cause ClosedXML to covert the current value to the new data type. + /// An exception will be thrown if the current value cannot be converted to the new data type. + /// + /// + /// The type of the cell's data. + /// + /// + XLCellValues DataType { set; } + + /// + /// Sets the cells' formula with A1 references. + /// + /// The formula with A1 references. + String FormulaA1 { set; } + + /// + /// Sets the cells' formula with R1C1 references. + /// + /// The formula with R1C1 references. + String FormulaR1C1 { set; } + + IXLStyle Style { get; set; } + + /// + /// Gets or sets a value indicating whether this cell's text should be shared or not. + /// + /// + /// If false the cell's text will not be shared and stored as an inline value. + /// + Boolean ShareString { set; } + + IXLHyperlinks Hyperlinks { get; } + + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + IXLCells Cells(Boolean usedCellsOnly); + + IXLCells Cells(Boolean usedCellsOnly, Boolean includeFormats); + + IXLCells Cells(String cells); + + IXLCells Cells(Func predicate); + + /// + /// Returns the collection of cells that have a value. Formats are ignored. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + IXLCells CellsUsed(Boolean includeFormats); + + IXLCells CellsUsed(Func predicate); + + IXLCells CellsUsed(Boolean includeFormats, Func predicate); + + /// + /// Returns the first cell of this range. + /// + IXLCell FirstCell(); + + /// + /// Returns the first cell with a value of this range. Formats are ignored. + /// The cell's address is going to be ([First Row with a value], [First Column with a value]) + /// + IXLCell FirstCellUsed(); + + /// + /// Returns the first cell with a value of this range. + /// + /// The cell's address is going to be ([First Row with a value], [First Column with a value]) + /// if set to true will return all cells with a value or a style different than the default. + IXLCell FirstCellUsed(Boolean includeFormats); + + IXLCell FirstCellUsed(Func predicate); + + IXLCell FirstCellUsed(Boolean includeFormats, Func predicate); + + /// + /// Returns the last cell of this range. + /// + IXLCell LastCell(); + + /// + /// Returns the last cell with a value of this range. Formats are ignored. + /// The cell's address is going to be ([Last Row with a value], [Last Column with a value]) + /// + IXLCell LastCellUsed(); + + /// + /// Returns the last cell with a value of this range. + /// + /// The cell's address is going to be ([Last Row with a value], [Last Column with a value]) + /// if set to true will return all cells with a value or a style different than the default. + IXLCell LastCellUsed(Boolean includeFormats); + + IXLCell LastCellUsed(Func predicate); + + IXLCell LastCellUsed(Boolean includeFormats, Func predicate); + + /// + /// 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; otherwise, false. + /// + 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); + + Boolean Contains(IXLCell cell); + + /// + /// 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. + /// + IXLRange Unmerge(); + + /// + /// Merges this range. + /// The contents and style of the merged cells will be equal to the first cell. + /// + IXLRange Merge(); + + IXLRange Merge(Boolean checkIntersect); + + /// + /// Creates a named range out of this range. + /// If the named range exists, it will add this range to that named range. + /// The default scope for the named range is Workbook. + /// + /// Name of the range. + IXLRange AddToNamed(String rangeName); + + /// + /// Creates a named range out of this range. + /// If the named range exists, it will add this range to that named range. + /// Name of the range. + /// The scope for the named range. + /// + IXLRange AddToNamed(String rangeName, XLScope scope); + + /// + /// Creates a named range out of this range. + /// If the named range exists, it will add this range to that named range. + /// Name of the range. + /// The scope for the named range. + /// The comments for the named range. + /// + IXLRange AddToNamed(String rangeName, XLScope scope, String comment); + + /// + /// Clears the contents of this range. + /// + /// Specify what you want to clear. + IXLRangeBase Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + /// + /// Deletes the cell comments from this range. + /// + void DeleteComments(); + + IXLRangeBase SetValue(T value); + + /// + /// Converts this object to a range. + /// + IXLRange AsRange(); + + Boolean IsMerged(); + Boolean IsEmpty(); + Boolean IsEmpty(Boolean includeFormats); + + + IXLPivotTable CreatePivotTable(IXLCell targetCell); + IXLPivotTable CreatePivotTable(IXLCell targetCell, String name); + + + + //IXLChart CreateChart(Int32 firstRow, Int32 firstColumn, Int32 lastRow, Int32 lastColumn); + + IXLAutoFilter SetAutoFilter(); + + IXLDataValidation SetDataValidation(); + + IXLConditionalFormat AddConditionalFormat(); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRangeColumn.cs b/ClosedXML/Excel/Ranges/IXLRangeColumn.cs index 5de5a7f..c70a5ff 100644 --- a/ClosedXML/Excel/Ranges/IXLRangeColumn.cs +++ b/ClosedXML/Excel/Ranges/IXLRangeColumn.cs @@ -1,110 +1,110 @@ -using System; - - -namespace ClosedXML.Excel -{ - public interface IXLRangeColumn : IXLRangeBase - { - /// - /// Gets the cell in the specified row. - /// - /// The cell's row. - IXLCell Cell(Int32 rowNumber); - - /// - /// Returns the specified group of cells, separated by commas. - /// e.g. Cells("1"), Cells("1:5"), Cells("1:2,4:5") - /// - /// The column cells to return. - new IXLCells Cells(String cellsInColumn); - /// - /// Returns the specified group of cells. - /// - /// The first row in the group of cells to return. - /// The last row in the group of cells to return. - IXLCells Cells(Int32 firstRow, Int32 lastRow); - - /// - /// Inserts X number of columns to the right of this range. - /// All cells to the right of this range will be shifted X number of columns. - /// - /// Number of columns to insert. - IXLRangeColumns InsertColumnsAfter(int numberOfColumns); - IXLRangeColumns InsertColumnsAfter(int numberOfColumns, Boolean expandRange); - /// - /// Inserts X number of columns to the left of this range. - /// This range and all cells to the right of this range will be shifted X number of columns. - /// - /// Number of columns to insert. - IXLRangeColumns InsertColumnsBefore(int numberOfColumns); - IXLRangeColumns InsertColumnsBefore(int numberOfColumns, Boolean expandRange); - /// - /// Inserts X number of cells on top of this column. - /// This column and all cells below it will be shifted X number of rows. - /// - /// Number of cells to insert. - IXLCells InsertCellsAbove(int numberOfRows); - IXLCells InsertCellsAbove(int numberOfRows, Boolean expandRange); - /// - /// Inserts X number of cells below this range. - /// All cells below this column will be shifted X number of rows. - /// - /// Number of cells to insert. - IXLCells InsertCellsBelow(int numberOfRows); - IXLCells InsertCellsBelow(int numberOfRows, Boolean expandRange); - - /// - /// Deletes this range and shifts the cells at the right. - /// - void Delete(); - /// - /// Deletes this range and shifts the surrounding cells accordingly. - /// - /// How to shift the surrounding cells. - void Delete(XLShiftDeletedCells shiftDeleteCells); - - /// - /// Gets this column's number in the range - /// - Int32 ColumnNumber(); - - /// - /// Gets this column's letter in the range - /// - String ColumnLetter(); - - Int32 CellCount(); - - IXLRangeColumn CopyTo(IXLCell target); - IXLRangeColumn CopyTo(IXLRangeBase target); - - IXLRangeColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - - IXLRangeColumn Column(Int32 start, Int32 end); - IXLRangeColumn Column(IXLCell start, IXLCell end); - IXLRangeColumns Columns(String columns); - - IXLRangeColumn SetDataType(XLCellValues dataType); - - IXLRangeColumn ColumnLeft(); - IXLRangeColumn ColumnLeft(Int32 step); - IXLRangeColumn ColumnRight(); - IXLRangeColumn ColumnRight(Int32 step); - - IXLColumn WorksheetColumn(); - - IXLTable AsTable(); - IXLTable AsTable(String name); - IXLTable CreateTable(); - IXLTable CreateTable(String name); - - /// - /// Clears the contents of this column. - /// - /// Specify what you want to clear. - new IXLRangeColumn Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - IXLRangeColumn ColumnUsed(Boolean includeFormats = false); - } -} - +using System; + + +namespace ClosedXML.Excel +{ + public interface IXLRangeColumn : IXLRangeBase + { + /// + /// Gets the cell in the specified row. + /// + /// The cell's row. + IXLCell Cell(Int32 rowNumber); + + /// + /// Returns the specified group of cells, separated by commas. + /// e.g. Cells("1"), Cells("1:5"), Cells("1:2,4:5") + /// + /// The column cells to return. + new IXLCells Cells(String cellsInColumn); + /// + /// Returns the specified group of cells. + /// + /// The first row in the group of cells to return. + /// The last row in the group of cells to return. + IXLCells Cells(Int32 firstRow, Int32 lastRow); + + /// + /// Inserts X number of columns to the right of this range. + /// All cells to the right of this range will be shifted X number of columns. + /// + /// Number of columns to insert. + IXLRangeColumns InsertColumnsAfter(int numberOfColumns); + IXLRangeColumns InsertColumnsAfter(int numberOfColumns, Boolean expandRange); + /// + /// Inserts X number of columns to the left of this range. + /// This range and all cells to the right of this range will be shifted X number of columns. + /// + /// Number of columns to insert. + IXLRangeColumns InsertColumnsBefore(int numberOfColumns); + IXLRangeColumns InsertColumnsBefore(int numberOfColumns, Boolean expandRange); + /// + /// Inserts X number of cells on top of this column. + /// This column and all cells below it will be shifted X number of rows. + /// + /// Number of cells to insert. + IXLCells InsertCellsAbove(int numberOfRows); + IXLCells InsertCellsAbove(int numberOfRows, Boolean expandRange); + /// + /// Inserts X number of cells below this range. + /// All cells below this column will be shifted X number of rows. + /// + /// Number of cells to insert. + IXLCells InsertCellsBelow(int numberOfRows); + IXLCells InsertCellsBelow(int numberOfRows, Boolean expandRange); + + /// + /// Deletes this range and shifts the cells at the right. + /// + void Delete(); + /// + /// Deletes this range and shifts the surrounding cells accordingly. + /// + /// How to shift the surrounding cells. + void Delete(XLShiftDeletedCells shiftDeleteCells); + + /// + /// Gets this column's number in the range + /// + Int32 ColumnNumber(); + + /// + /// Gets this column's letter in the range + /// + String ColumnLetter(); + + Int32 CellCount(); + + IXLRangeColumn CopyTo(IXLCell target); + IXLRangeColumn CopyTo(IXLRangeBase target); + + IXLRangeColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRangeColumn Column(Int32 start, Int32 end); + IXLRangeColumn Column(IXLCell start, IXLCell end); + IXLRangeColumns Columns(String columns); + + IXLRangeColumn SetDataType(XLCellValues dataType); + + IXLRangeColumn ColumnLeft(); + IXLRangeColumn ColumnLeft(Int32 step); + IXLRangeColumn ColumnRight(); + IXLRangeColumn ColumnRight(Int32 step); + + IXLColumn WorksheetColumn(); + + IXLTable AsTable(); + IXLTable AsTable(String name); + IXLTable CreateTable(); + IXLTable CreateTable(String name); + + /// + /// Clears the contents of this column. + /// + /// Specify what you want to clear. + new IXLRangeColumn Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + IXLRangeColumn ColumnUsed(Boolean includeFormats = false); + } +} + diff --git a/ClosedXML/Excel/Ranges/IXLRangeColumns.cs b/ClosedXML/Excel/Ranges/IXLRangeColumns.cs index 90faa05..80b22e9 100644 --- a/ClosedXML/Excel/Ranges/IXLRangeColumns.cs +++ b/ClosedXML/Excel/Ranges/IXLRangeColumns.cs @@ -1,48 +1,48 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLRangeColumns: IEnumerable, IDisposable - { - - /// - /// Adds a column range to this group. - /// - /// The column range to add. - void Add(IXLRangeColumn columRange); - - /// - /// Returns the collection of cells. - /// - IXLCells Cells(); - - /// - /// Returns the collection of cells that have a value. - /// - IXLCells CellsUsed(); - - /// - /// Returns the collection of cells that have a value. - /// - /// if set to true will return all cells with a value or a style different than the default. - IXLCells CellsUsed(Boolean includeFormats); - - /// - /// Deletes all columns and shifts the columns at the right of them accordingly. - /// - void Delete(); - - IXLStyle Style { get; set; } - - IXLRangeColumns SetDataType(XLCellValues dataType); - - /// - /// Clears the contents of these columns. - /// - /// Specify what you want to clear. - IXLRangeColumns Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - void Select(); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLRangeColumns: IEnumerable, IDisposable + { + + /// + /// Adds a column range to this group. + /// + /// The column range to add. + void Add(IXLRangeColumn columRange); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + IXLCells CellsUsed(Boolean includeFormats); + + /// + /// Deletes all columns and shifts the columns at the right of them accordingly. + /// + void Delete(); + + IXLStyle Style { get; set; } + + IXLRangeColumns SetDataType(XLCellValues dataType); + + /// + /// Clears the contents of these columns. + /// + /// Specify what you want to clear. + IXLRangeColumns Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRangeRow.cs b/ClosedXML/Excel/Ranges/IXLRangeRow.cs index 8e641a9..c13753c 100644 --- a/ClosedXML/Excel/Ranges/IXLRangeRow.cs +++ b/ClosedXML/Excel/Ranges/IXLRangeRow.cs @@ -1,113 +1,113 @@ -using System; - - -namespace ClosedXML.Excel -{ - public interface IXLRangeRow: IXLRangeBase - { - /// - /// Gets the cell in the specified column. - /// - /// The cell's column. - IXLCell Cell(Int32 columnNumber); - - /// - /// Gets the cell in the specified column. - /// - /// The cell's column. - IXLCell Cell(String columnLetter); - - /// - /// Returns the specified group of cells, separated by commas. - /// e.g. Cells("1"), Cells("1:5"), Cells("1:2,4:5") - /// - /// The row's cells to return. - new IXLCells Cells(String cellsInRow); - /// - /// Returns the specified group of cells. - /// - /// The first column in the group of cells to return. - /// The last column in the group of cells to return. - IXLCells Cells(Int32 firstColumn, Int32 lastColumn); - /// - /// Returns the specified group of cells. - /// - /// The first column in the group of cells to return. - /// The last column in the group of cells to return. - IXLCells Cells(String firstColumn, String lastColumn); - - /// - /// Inserts X number of cells to the right of this row. - /// All cells to the right of this row will be shifted X number of columns. - /// - /// Number of cells to insert. - IXLCells InsertCellsAfter(int numberOfColumns); - IXLCells InsertCellsAfter(int numberOfColumns, Boolean expandRange); - /// - /// Inserts X number of cells to the left of this row. - /// This row and all cells to the right of it will be shifted X number of columns. - /// - /// Number of cells to insert. - IXLCells InsertCellsBefore(int numberOfColumns); - IXLCells InsertCellsBefore(int numberOfColumns, Boolean expandRange); - /// - /// Inserts X number of rows on top of this row. - /// This row and all cells below it will be shifted X number of rows. - /// - /// Number of rows to insert. - IXLRangeRows InsertRowsAbove(int numberOfRows); - IXLRangeRows InsertRowsAbove(int numberOfRows, Boolean expandRange); - /// - /// Inserts X number of rows below this row. - /// All cells below this row will be shifted X number of rows. - /// - /// Number of rows to insert. - IXLRangeRows InsertRowsBelow(int numberOfRows); - IXLRangeRows InsertRowsBelow(int numberOfRows, Boolean expandRange); - - /// - /// Deletes this range and shifts the cells below. - /// - void Delete(); - /// - /// Deletes this range and shifts the surrounding cells accordingly. - /// - /// How to shift the surrounding cells. - void Delete(XLShiftDeletedCells shiftDeleteCells); - - /// - /// Gets this row's number in the range - /// - Int32 RowNumber(); - - Int32 CellCount(); - - IXLRangeRow CopyTo(IXLCell target); - IXLRangeRow CopyTo(IXLRangeBase target); - - IXLRangeRow Sort(); - IXLRangeRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - - IXLRangeRow Row(Int32 start, Int32 end); - IXLRangeRow Row(IXLCell start, IXLCell end); - IXLRangeRows Rows(String rows); - - IXLRangeRow SetDataType(XLCellValues dataType); - - IXLRangeRow RowAbove(); - IXLRangeRow RowAbove(Int32 step); - IXLRangeRow RowBelow(); - IXLRangeRow RowBelow(Int32 step); - - IXLRow WorksheetRow(); - - /// - /// Clears the contents of this row. - /// - /// Specify what you want to clear. - new IXLRangeRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - IXLRangeRow RowUsed(Boolean includeFormats = false); - } -} - +using System; + + +namespace ClosedXML.Excel +{ + public interface IXLRangeRow: IXLRangeBase + { + /// + /// Gets the cell in the specified column. + /// + /// The cell's column. + IXLCell Cell(Int32 columnNumber); + + /// + /// Gets the cell in the specified column. + /// + /// The cell's column. + IXLCell Cell(String columnLetter); + + /// + /// Returns the specified group of cells, separated by commas. + /// e.g. Cells("1"), Cells("1:5"), Cells("1:2,4:5") + /// + /// The row's cells to return. + new IXLCells Cells(String cellsInRow); + /// + /// Returns the specified group of cells. + /// + /// The first column in the group of cells to return. + /// The last column in the group of cells to return. + IXLCells Cells(Int32 firstColumn, Int32 lastColumn); + /// + /// Returns the specified group of cells. + /// + /// The first column in the group of cells to return. + /// The last column in the group of cells to return. + IXLCells Cells(String firstColumn, String lastColumn); + + /// + /// Inserts X number of cells to the right of this row. + /// All cells to the right of this row will be shifted X number of columns. + /// + /// Number of cells to insert. + IXLCells InsertCellsAfter(int numberOfColumns); + IXLCells InsertCellsAfter(int numberOfColumns, Boolean expandRange); + /// + /// Inserts X number of cells to the left of this row. + /// This row and all cells to the right of it will be shifted X number of columns. + /// + /// Number of cells to insert. + IXLCells InsertCellsBefore(int numberOfColumns); + IXLCells InsertCellsBefore(int numberOfColumns, Boolean expandRange); + /// + /// Inserts X number of rows on top of this row. + /// This row and all cells below it will be shifted X number of rows. + /// + /// Number of rows to insert. + IXLRangeRows InsertRowsAbove(int numberOfRows); + IXLRangeRows InsertRowsAbove(int numberOfRows, Boolean expandRange); + /// + /// Inserts X number of rows below this row. + /// All cells below this row will be shifted X number of rows. + /// + /// Number of rows to insert. + IXLRangeRows InsertRowsBelow(int numberOfRows); + IXLRangeRows InsertRowsBelow(int numberOfRows, Boolean expandRange); + + /// + /// Deletes this range and shifts the cells below. + /// + void Delete(); + /// + /// Deletes this range and shifts the surrounding cells accordingly. + /// + /// How to shift the surrounding cells. + void Delete(XLShiftDeletedCells shiftDeleteCells); + + /// + /// Gets this row's number in the range + /// + Int32 RowNumber(); + + Int32 CellCount(); + + IXLRangeRow CopyTo(IXLCell target); + IXLRangeRow CopyTo(IXLRangeBase target); + + IXLRangeRow Sort(); + IXLRangeRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRangeRow Row(Int32 start, Int32 end); + IXLRangeRow Row(IXLCell start, IXLCell end); + IXLRangeRows Rows(String rows); + + IXLRangeRow SetDataType(XLCellValues dataType); + + IXLRangeRow RowAbove(); + IXLRangeRow RowAbove(Int32 step); + IXLRangeRow RowBelow(); + IXLRangeRow RowBelow(Int32 step); + + IXLRow WorksheetRow(); + + /// + /// Clears the contents of this row. + /// + /// Specify what you want to clear. + new IXLRangeRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + IXLRangeRow RowUsed(Boolean includeFormats = false); + } +} + diff --git a/ClosedXML/Excel/Ranges/IXLRangeRows.cs b/ClosedXML/Excel/Ranges/IXLRangeRows.cs index 5c8d0c4..6c2da5a 100644 --- a/ClosedXML/Excel/Ranges/IXLRangeRows.cs +++ b/ClosedXML/Excel/Ranges/IXLRangeRows.cs @@ -1,47 +1,47 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLRangeRows : IEnumerable, IDisposable - { - /// - /// Adds a row range to this group. - /// - /// The row range to add. - void Add(IXLRangeRow rowRange); - - /// - /// Returns the collection of cells. - /// - IXLCells Cells(); - - /// - /// Returns the collection of cells that have a value. - /// - IXLCells CellsUsed(); - - /// - /// Returns the collection of cells that have a value. - /// - /// if set to true will return all cells with a value or a style different than the default. - IXLCells CellsUsed(Boolean includeFormats); - - /// - /// Deletes all rows and shifts the rows below them accordingly. - /// - void Delete(); - - IXLStyle Style { get; set; } - - IXLRangeRows SetDataType(XLCellValues dataType); - - /// - /// Clears the contents of these rows. - /// - /// Specify what you want to clear. - IXLRangeRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - void Select(); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLRangeRows : IEnumerable, IDisposable + { + /// + /// Adds a row range to this group. + /// + /// The row range to add. + void Add(IXLRangeRow rowRange); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + IXLCells CellsUsed(Boolean includeFormats); + + /// + /// Deletes all rows and shifts the rows below them accordingly. + /// + void Delete(); + + IXLStyle Style { get; set; } + + IXLRangeRows SetDataType(XLCellValues dataType); + + /// + /// Clears the contents of these rows. + /// + /// Specify what you want to clear. + IXLRangeRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Ranges/IXLRanges.cs b/ClosedXML/Excel/Ranges/IXLRanges.cs index f73e201..48aeaff 100644 --- a/ClosedXML/Excel/Ranges/IXLRanges.cs +++ b/ClosedXML/Excel/Ranges/IXLRanges.cs @@ -1,95 +1,95 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLRanges: IEnumerable, IDisposable - { - /// - /// Adds the specified range to this group. - /// - /// The range to add to this group. - void Add(IXLRangeBase range); - - void Add(IXLCell range); - - /// - /// Removes the specified range from this group. - /// - /// The range to remove from this group. - void Remove(IXLRange range); - - Int32 Count { get; } - - Boolean Contains(IXLRange range); - - IXLStyle Style { get; set; } - - IXLDataValidation SetDataValidation(); - - /// - /// Creates a named range out of these ranges. - /// If the named range exists, it will add these ranges to that named range. - /// The default scope for the named range is Workbook. - /// - /// Name of the range. - IXLRanges AddToNamed(String rangeName); - - /// - /// Creates a named range out of these ranges. - /// If the named range exists, it will add these ranges to that named range. - /// Name of the range. - /// The scope for the named range. - /// - IXLRanges AddToNamed(String rangeName, XLScope scope); - - /// - /// Creates a named range out of these ranges. - /// If the named range exists, it will add these ranges to that named range. - /// Name of the range. - /// The scope for the named range. - /// The comments for the named range. - /// - IXLRanges AddToNamed(String rangeName, XLScope scope, String comment); - - /// - /// Sets the cells' value. - /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. - /// If the object is a range ClosedXML will copy the range starting from each cell. - /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. - /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. - /// - /// - /// The object containing the value(s) to set. - /// - Object Value { set; } - - IXLRanges SetValue(T value); - - /// - /// Returns the collection of cells. - /// - IXLCells Cells(); - - /// - /// Returns the collection of cells that have a value. - /// - IXLCells CellsUsed(); - - /// - /// Returns the collection of cells that have a value. - /// - /// if set to true will return all cells with a value or a style different than the default. - IXLCells CellsUsed(Boolean includeFormats); - - IXLRanges SetDataType(XLCellValues dataType); - - /// - /// Clears the contents of these ranges. - /// - /// Specify what you want to clear. - IXLRanges Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - void Select(); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLRanges: IEnumerable, IDisposable + { + /// + /// Adds the specified range to this group. + /// + /// The range to add to this group. + void Add(IXLRangeBase range); + + void Add(IXLCell range); + + /// + /// Removes the specified range from this group. + /// + /// The range to remove from this group. + void Remove(IXLRange range); + + Int32 Count { get; } + + Boolean Contains(IXLRange range); + + IXLStyle Style { get; set; } + + IXLDataValidation SetDataValidation(); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// The default scope for the named range is Workbook. + /// + /// Name of the range. + IXLRanges AddToNamed(String rangeName); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// Name of the range. + /// The scope for the named range. + /// + IXLRanges AddToNamed(String rangeName, XLScope scope); + + /// + /// Creates a named range out of these ranges. + /// If the named range exists, it will add these ranges to that named range. + /// Name of the range. + /// The scope for the named range. + /// The comments for the named range. + /// + IXLRanges AddToNamed(String rangeName, XLScope scope, String comment); + + /// + /// Sets the cells' value. + /// If the object is an IEnumerable ClosedXML will copy the collection's data into a table starting from each cell. + /// If the object is a range ClosedXML will copy the range starting from each cell. + /// Setting the value to an object (not IEnumerable/range) will call the object's ToString() method. + /// ClosedXML will try to translate it to the corresponding type, if it can't then the value will be left as a string. + /// + /// + /// The object containing the value(s) to set. + /// + Object Value { set; } + + IXLRanges SetValue(T value); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + IXLCells CellsUsed(Boolean includeFormats); + + IXLRanges SetDataType(XLCellValues dataType); + + /// + /// Clears the contents of these ranges. + /// + /// Specify what you want to clear. + IXLRanges Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Ranges/Sort/IXLSortElement.cs b/ClosedXML/Excel/Ranges/Sort/IXLSortElement.cs index e687bdc..e7ec5d9 100644 --- a/ClosedXML/Excel/Ranges/Sort/IXLSortElement.cs +++ b/ClosedXML/Excel/Ranges/Sort/IXLSortElement.cs @@ -1,14 +1,14 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLSortOrder { Ascending, Descending } - public enum XLSortOrientation { TopToBottom, LeftToRight } - public interface IXLSortElement - { - Int32 ElementNumber { get; set; } - XLSortOrder SortOrder { get; set; } - Boolean IgnoreBlanks { get; set; } - Boolean MatchCase { get; set; } - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLSortOrder { Ascending, Descending } + public enum XLSortOrientation { TopToBottom, LeftToRight } + public interface IXLSortElement + { + Int32 ElementNumber { get; set; } + XLSortOrder SortOrder { get; set; } + Boolean IgnoreBlanks { get; set; } + Boolean MatchCase { get; set; } + } +} diff --git a/ClosedXML/Excel/Ranges/Sort/IXLSortElements.cs b/ClosedXML/Excel/Ranges/Sort/IXLSortElements.cs index 8d7c630..24f2fc9 100644 --- a/ClosedXML/Excel/Ranges/Sort/IXLSortElements.cs +++ b/ClosedXML/Excel/Ranges/Sort/IXLSortElements.cs @@ -1,22 +1,22 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLSortElements: IEnumerable - { - void Add(Int32 elementNumber); - void Add(Int32 elementNumber, XLSortOrder sortOrder); - void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks); - void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase); - - void Add(String elementNumber); - void Add(String elementNumber, XLSortOrder sortOrder); - void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks); - void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase); - - void Clear(); - - void Remove(Int32 elementNumber); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLSortElements: IEnumerable + { + void Add(Int32 elementNumber); + void Add(Int32 elementNumber, XLSortOrder sortOrder); + void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks); + void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase); + + void Add(String elementNumber); + void Add(String elementNumber, XLSortOrder sortOrder); + void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks); + void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase); + + void Clear(); + + void Remove(Int32 elementNumber); + } +} diff --git a/ClosedXML/Excel/Ranges/Sort/XLSortElement.cs b/ClosedXML/Excel/Ranges/Sort/XLSortElement.cs index 6c17e2d..bb801d7 100644 --- a/ClosedXML/Excel/Ranges/Sort/XLSortElement.cs +++ b/ClosedXML/Excel/Ranges/Sort/XLSortElement.cs @@ -1,12 +1,12 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLSortElement: IXLSortElement - { - public Int32 ElementNumber { get; set; } - public XLSortOrder SortOrder { get; set; } - public Boolean IgnoreBlanks { get; set; } - public Boolean MatchCase { get; set; } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLSortElement: IXLSortElement + { + public Int32 ElementNumber { get; set; } + public XLSortOrder SortOrder { get; set; } + public Boolean IgnoreBlanks { get; set; } + public Boolean MatchCase { get; set; } + } +} diff --git a/ClosedXML/Excel/Ranges/Sort/XLSortElements.cs b/ClosedXML/Excel/Ranges/Sort/XLSortElements.cs index adbc4cb..7aa7c8b 100644 --- a/ClosedXML/Excel/Ranges/Sort/XLSortElements.cs +++ b/ClosedXML/Excel/Ranges/Sort/XLSortElements.cs @@ -1,75 +1,75 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - internal class XLSortElements: IXLSortElements - { - List elements = new List(); - public void Add(Int32 elementNumber) - { - Add(elementNumber, XLSortOrder.Ascending); - } - public void Add(Int32 elementNumber, XLSortOrder sortOrder) - { - Add(elementNumber, sortOrder, true); - } - public void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks) - { - Add(elementNumber, sortOrder, ignoreBlanks, false); - } - public void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase) - { - elements.Add(new XLSortElement() - { - ElementNumber = elementNumber, - SortOrder = sortOrder, - IgnoreBlanks = ignoreBlanks, - MatchCase = matchCase - }); - } - - public void Add(String elementNumber) - { - Add(elementNumber, XLSortOrder.Ascending); - } - public void Add(String elementNumber, XLSortOrder sortOrder) - { - Add(elementNumber, sortOrder, true); - } - public void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks) - { - Add(elementNumber, sortOrder, ignoreBlanks, false); - } - public void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase) - { - elements.Add(new XLSortElement() - { - ElementNumber = XLHelper.GetColumnNumberFromLetter(elementNumber), - SortOrder = sortOrder, - IgnoreBlanks = ignoreBlanks, - MatchCase = matchCase - }); - } - - public IEnumerator GetEnumerator() - { - return elements.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void Clear() - { - elements.Clear(); - } - - public void Remove(Int32 elementNumber) - { - elements.RemoveAt(elementNumber - 1); - } - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLSortElements: IXLSortElements + { + List elements = new List(); + public void Add(Int32 elementNumber) + { + Add(elementNumber, XLSortOrder.Ascending); + } + public void Add(Int32 elementNumber, XLSortOrder sortOrder) + { + Add(elementNumber, sortOrder, true); + } + public void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks) + { + Add(elementNumber, sortOrder, ignoreBlanks, false); + } + public void Add(Int32 elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase) + { + elements.Add(new XLSortElement() + { + ElementNumber = elementNumber, + SortOrder = sortOrder, + IgnoreBlanks = ignoreBlanks, + MatchCase = matchCase + }); + } + + public void Add(String elementNumber) + { + Add(elementNumber, XLSortOrder.Ascending); + } + public void Add(String elementNumber, XLSortOrder sortOrder) + { + Add(elementNumber, sortOrder, true); + } + public void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks) + { + Add(elementNumber, sortOrder, ignoreBlanks, false); + } + public void Add(String elementNumber, XLSortOrder sortOrder, Boolean ignoreBlanks, Boolean matchCase) + { + elements.Add(new XLSortElement() + { + ElementNumber = XLHelper.GetColumnNumberFromLetter(elementNumber), + SortOrder = sortOrder, + IgnoreBlanks = ignoreBlanks, + MatchCase = matchCase + }); + } + + public IEnumerator GetEnumerator() + { + return elements.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Clear() + { + elements.Clear(); + } + + public void Remove(Int32 elementNumber) + { + elements.RemoveAt(elementNumber - 1); + } + } +} diff --git a/ClosedXML/Excel/Ranges/XLRange.cs b/ClosedXML/Excel/Ranges/XLRange.cs index d032c83..94d53e3 100644 --- a/ClosedXML/Excel/Ranges/XLRange.cs +++ b/ClosedXML/Excel/Ranges/XLRange.cs @@ -1,838 +1,838 @@ -using System; -using System.Collections.Generic; -using System.Linq; - - -namespace ClosedXML.Excel -{ - internal class XLRange : XLRangeBase, IXLRange - { - #region Constructor - - public XLRange(XLRangeParameters xlRangeParameters) - : base(xlRangeParameters.RangeAddress) - { - RangeParameters = new XLRangeParameters(xlRangeParameters.RangeAddress, xlRangeParameters.DefaultStyle); - - if (!xlRangeParameters.IgnoreEvents) - { - SubscribeToShiftedRows((range, rowShifted) => this.WorksheetRangeShiftedRows(range, rowShifted)); - SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); - //xlRangeParameters.IgnoreEvents = true; - } - SetStyle(xlRangeParameters.DefaultStyle); - } - - #endregion - - public XLRangeParameters RangeParameters { get; private set; } - - #region IXLRange Members - - - IXLRangeRow IXLRange.Row(Int32 row) - { - return Row(row); - } - - IXLRangeColumn IXLRange.Column(Int32 column) - { - return Column(column); - } - - IXLRangeColumn IXLRange.Column(String column) - { - return Column(column); - } - - public IXLRangeColumns Columns(Func predicate = null) - { - var retVal = new XLRangeColumns(); - Int32 columnCount = ColumnCount(); - for (Int32 c = 1; c <= columnCount; c++) - { - var column = Column(c); - if (predicate == null || predicate(column)) - retVal.Add(column); - else - column.Dispose(); - } - return retVal; - } - - public virtual IXLRangeColumns Columns(Int32 firstColumn, Int32 lastColumn) - { - var retVal = new XLRangeColumns(); - - for (int co = firstColumn; co <= lastColumn; co++) - retVal.Add(Column(co)); - return retVal; - } - - public IXLRangeColumns Columns(String firstColumn, String lastColumn) - { - return Columns(XLHelper.GetColumnNumberFromLetter(firstColumn), - XLHelper.GetColumnNumberFromLetter(lastColumn)); - } - - public IXLRangeColumns Columns(String columns) - { - var retVal = new XLRangeColumns(); - var columnPairs = columns.Split(','); - foreach (string tPair in columnPairs.Select(pair => pair.Trim())) - { - String firstColumn; - String lastColumn; - if (tPair.Contains(':') || tPair.Contains('-')) - { - string[] columnRange = XLHelper.SplitRange(tPair); - - firstColumn = columnRange[0]; - lastColumn = columnRange[1]; - } - else - { - firstColumn = tPair; - lastColumn = tPair; - } - - Int32 tmp; - if (Int32.TryParse(firstColumn, out tmp)) - { - foreach (IXLRangeColumn col in Columns(Int32.Parse(firstColumn), Int32.Parse(lastColumn))) - retVal.Add(col); - } - else - { - foreach (IXLRangeColumn col in Columns(firstColumn, lastColumn)) - retVal.Add(col); - } - } - return retVal; - } - - IXLCell IXLRange.Cell(int row, int column) - { - return Cell(row, column); - } - - IXLCell IXLRange.Cell(string cellAddressInRange) - { - return Cell(cellAddressInRange); - } - - IXLCell IXLRange.Cell(int row, string column) - { - return Cell(row, column); - } - - IXLCell IXLRange.Cell(IXLAddress cellAddressInRange) - { - return Cell(cellAddressInRange); - } - - IXLRange IXLRange.Range(IXLRangeAddress rangeAddress) - { - return Range(rangeAddress); - } - - IXLRange IXLRange.Range(string rangeAddress) - { - return Range(rangeAddress); - } - - IXLRange IXLRange.Range(IXLCell firstCell, IXLCell lastCell) - { - return Range(firstCell, lastCell); - } - - IXLRange IXLRange.Range(string firstCellAddress, string lastCellAddress) - { - return Range(firstCellAddress, lastCellAddress); - } - - IXLRange IXLRange.Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress) - { - return Range(firstCellAddress, lastCellAddress); - } - - IXLRange IXLRange.Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn) - { - return Range(firstCellRow, firstCellColumn, lastCellRow, lastCellColumn); - } - - public IXLRangeRows Rows(Func predicate = null) - { - var retVal = new XLRangeRows(); - Int32 rowCount = RowCount(); - for (Int32 r = 1; r <= rowCount; r++) - { - var row = Row(r); - if (predicate == null || predicate(row)) - retVal.Add(Row(r)); - else - row.Dispose(); - } - return retVal; - } - - public IXLRangeRows Rows(Int32 firstRow, Int32 lastRow) - { - var retVal = new XLRangeRows(); - - for (int ro = firstRow; ro <= lastRow; ro++) - retVal.Add(Row(ro)); - return retVal; - } - - public IXLRangeRows Rows(String rows) - { - var retVal = new XLRangeRows(); - var rowPairs = rows.Split(','); - foreach (string tPair in rowPairs.Select(pair => pair.Trim())) - { - String firstRow; - String lastRow; - if (tPair.Contains(':') || tPair.Contains('-')) - { - string[] rowRange = XLHelper.SplitRange(tPair); - - firstRow = rowRange[0]; - lastRow = rowRange[1]; - } - else - { - firstRow = tPair; - lastRow = tPair; - } - foreach (IXLRangeRow row in Rows(Int32.Parse(firstRow), Int32.Parse(lastRow))) - retVal.Add(row); - } - return retVal; - } - - public void Transpose(XLTransposeOptions transposeOption) - { - int rowCount = RowCount(); - int columnCount = ColumnCount(); - int squareSide = rowCount > columnCount ? rowCount : columnCount; - - var firstCell = FirstCell(); - - MoveOrClearForTranspose(transposeOption, rowCount, columnCount); - TransposeMerged(squareSide); - TransposeRange(squareSide); - RangeAddress.LastAddress = new XLAddress(Worksheet, - firstCell.Address.RowNumber + columnCount - 1, - firstCell.Address.ColumnNumber + rowCount - 1, - RangeAddress.LastAddress.FixedRow, - RangeAddress.LastAddress.FixedColumn); - if (rowCount > columnCount) - { - var rng = Worksheet.Range( - RangeAddress.LastAddress.RowNumber + 1, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.LastAddress.RowNumber + (rowCount - columnCount), - RangeAddress.LastAddress.ColumnNumber); - rng.Delete(XLShiftDeletedCells.ShiftCellsUp); - } - else if (columnCount > rowCount) - { - var rng = Worksheet.Range( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber + 1, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber + (columnCount - rowCount)); - rng.Delete(XLShiftDeletedCells.ShiftCellsLeft); - } - - foreach (IXLCell c in Range(1, 1, columnCount, rowCount).Cells()) - { - var border = new XLBorder(this, c.Style.Border); - c.Style.Border.TopBorder = border.LeftBorder; - c.Style.Border.TopBorderColor = border.LeftBorderColor; - c.Style.Border.LeftBorder = border.TopBorder; - c.Style.Border.LeftBorderColor = border.TopBorderColor; - c.Style.Border.RightBorder = border.BottomBorder; - c.Style.Border.RightBorderColor = border.BottomBorderColor; - c.Style.Border.BottomBorder = border.RightBorder; - c.Style.Border.BottomBorderColor = border.RightBorderColor; - } - } - - public IXLTable AsTable() - { - return new XLTable(this, false); - } - - public IXLTable AsTable(String name) - { - return new XLTable(this, name, false); - } - - IXLTable IXLRange.CreateTable() - { - return CreateTable(); - } - public XLTable CreateTable() - { - return new XLTable(this, true, true); - } - - IXLTable IXLRange.CreateTable(String name) - { - return CreateTable(name); - } - public XLTable CreateTable(String name) - { - return new XLTable(this, name, true, true); - } - - public IXLTable CreateTable(String name, Boolean setAutofilter) - { - return new XLTable(this, name, true, setAutofilter); - } - - public new IXLRange CopyTo(IXLCell target) - { - base.CopyTo(target); - - Int32 lastRowNumber = target.Address.RowNumber + RowCount() - 1; - if (lastRowNumber > XLHelper.MaxRowNumber) - lastRowNumber = XLHelper.MaxRowNumber; - Int32 lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLHelper.MaxColumnNumber) - lastColumnNumber = XLHelper.MaxColumnNumber; - - return target.Worksheet.Range(target.Address.RowNumber, - target.Address.ColumnNumber, - lastRowNumber, - lastColumnNumber); - } - - public new IXLRange CopyTo(IXLRangeBase target) - { - base.CopyTo(target); - - Int32 lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; - if (lastRowNumber > XLHelper.MaxRowNumber) - lastRowNumber = XLHelper.MaxRowNumber; - Int32 lastColumnNumber = target.RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLHelper.MaxColumnNumber) - lastColumnNumber = XLHelper.MaxColumnNumber; - - return target.Worksheet.Range(target.RangeAddress.FirstAddress.RowNumber, - target.RangeAddress.FirstAddress.ColumnNumber, - lastRowNumber, - lastColumnNumber); - } - - public IXLRange SetDataType(XLCellValues dataType) - { - DataType = dataType; - return this; - } - - - public new IXLRange Sort() - { - return base.Sort().AsRange(); - } - - public new IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) - { - return base.Sort(columnsToSortBy, sortOrder, matchCase, ignoreBlanks).AsRange(); - } - public new IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) - { - return base.Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks).AsRange(); - } - public new IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) - { - return base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks).AsRange(); - } - - - #endregion - - private void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) - { - ShiftColumns(RangeAddress, range, columnsShifted); - } - - private void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) - { - ShiftRows(RangeAddress, range, rowsShifted); - } - - IXLRangeColumn IXLRange.FirstColumn(Func predicate) - { - return FirstColumn(predicate); - } - public XLRangeColumn FirstColumn(Func predicate = null) - { - if (predicate == null) - return Column(1); - - Int32 columnCount = ColumnCount(); - for (Int32 c = 1; c <= columnCount; c++) - { - var column = Column(c); - if (predicate(column)) return column; - - column.Dispose(); - } - - return null; - } - - IXLRangeColumn IXLRange.LastColumn(Func predicate) - { - return LastColumn(predicate); - } - public XLRangeColumn LastColumn(Func predicate = null) - { - Int32 columnCount = ColumnCount(); - if (predicate == null) - return Column(columnCount); - - for (Int32 c = columnCount; c >= 1; c--) - { - var column = Column(c); - if (predicate(column)) return column; - - column.Dispose(); - } - - return null; - } - - IXLRangeColumn IXLRange.FirstColumnUsed(Func predicate ) - { - return FirstColumnUsed(false, predicate); - } - public XLRangeColumn FirstColumnUsed(Func predicate = null) - { - return FirstColumnUsed(false, predicate); - } - - IXLRangeColumn IXLRange.FirstColumnUsed(Boolean includeFormats, Func predicate) - { - return FirstColumnUsed(includeFormats, predicate); - } - public XLRangeColumn FirstColumnUsed(Boolean includeFormats, Func predicate = null) - { - if (predicate == null) - { - Int32 firstColumnUsed = Worksheet.Internals.CellsCollection.FirstColumnUsed( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber, - includeFormats); - - return firstColumnUsed == 0 ? null : Column(firstColumnUsed - RangeAddress.FirstAddress.ColumnNumber + 1); - } - - Int32 columnCount = ColumnCount(); - for (Int32 co = 1; co <= columnCount; co++) - { - var column = Column(co); - - if (!column.IsEmpty(includeFormats) && predicate(column)) - return column; - column.Dispose(); - } - return null; - } - - IXLRangeColumn IXLRange.LastColumnUsed(Func predicate) - { - return LastColumnUsed(false, predicate); - } - public XLRangeColumn LastColumnUsed(Func predicate = null) - { - return LastColumnUsed(false, predicate); - } - - IXLRangeColumn IXLRange.LastColumnUsed(Boolean includeFormats, Func predicate) - { - return LastColumnUsed(includeFormats, predicate); - } - public XLRangeColumn LastColumnUsed(Boolean includeFormats, Func predicate = null) - { - if (predicate == null) - { - Int32 lastColumnUsed = Worksheet.Internals.CellsCollection.LastColumnUsed( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber, - includeFormats); - - return lastColumnUsed == 0 ? null : Column(lastColumnUsed - RangeAddress.FirstAddress.ColumnNumber + 1); - } - - Int32 columnCount = ColumnCount(); - for (Int32 co = columnCount; co >= 1; co--) - { - var column = Column(co); - - if (!column.IsEmpty(includeFormats) && predicate(column)) - return column; - column.Dispose(); - } - return null; - } - - IXLRangeRow IXLRange.FirstRow(Func predicate) - { - return FirstRow(predicate); - } - public XLRangeRow FirstRow(Func predicate = null) - { - if (predicate == null) - return Row(1); - - Int32 rowCount = RowCount(); - for (Int32 ro = 1; ro <= rowCount; ro++) - { - var row = Row(ro); - if (predicate(row)) return row; - - row.Dispose(); - } - - return null; - } - - IXLRangeRow IXLRange.LastRow(Func predicate) - { - return LastRow(predicate); - } - public XLRangeRow LastRow(Func predicate = null) - { - Int32 rowCount = RowCount(); - if (predicate == null) - return Row(rowCount); - - for (Int32 ro = rowCount; ro >= 1; ro--) - { - var row = Row(ro); - if (predicate(row)) return row; - - row.Dispose(); - } - - return null; - } - - IXLRangeRow IXLRange.FirstRowUsed(Func predicate) - { - return FirstRowUsed(false, predicate); - } - public XLRangeRow FirstRowUsed(Func predicate = null) - { - return FirstRowUsed(false, predicate); - } - - IXLRangeRow IXLRange.FirstRowUsed(Boolean includeFormats, Func predicate) - { - return FirstRowUsed(includeFormats, predicate); - } - public XLRangeRow FirstRowUsed(Boolean includeFormats, Func predicate = null) - { - if (predicate == null) - { - Int32 rowFromCells = Worksheet.Internals.CellsCollection.FirstRowUsed( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber, - includeFormats); - - //Int32 rowFromRows = Worksheet.Internals.RowsCollection.FirstRowUsed(includeFormats); - - return rowFromCells == 0 ? null : Row(rowFromCells - RangeAddress.FirstAddress.RowNumber + 1); - } - - Int32 rowCount = RowCount(); - for (Int32 ro = 1; ro <= rowCount; ro++) - { - var row = Row(ro); - - if (!row.IsEmpty(includeFormats) && predicate(row)) - return row; - row.Dispose(); - } - return null; - } - - IXLRangeRow IXLRange.LastRowUsed(Func predicate) - { - return LastRowUsed(false, predicate); - } - public XLRangeRow LastRowUsed(Func predicate = null) - { - return LastRowUsed(false, predicate); - } - - IXLRangeRow IXLRange.LastRowUsed(Boolean includeFormats, Func predicate) - { - return LastRowUsed(includeFormats, predicate); - } - public XLRangeRow LastRowUsed(Boolean includeFormats, Func predicate = null) - { - if (predicate == null) - { - Int32 lastRowUsed = Worksheet.Internals.CellsCollection.LastRowUsed( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber, - includeFormats); - - return lastRowUsed == 0 ? null : Row(lastRowUsed - RangeAddress.FirstAddress.RowNumber + 1); - } - - Int32 rowCount = RowCount(); - for (Int32 ro = rowCount; ro >= 1; ro--) - { - var row = Row(ro); - - if (!row.IsEmpty(includeFormats) && predicate(row)) - return row; - row.Dispose(); - } - return null; - } - - - IXLRangeRows IXLRange.RowsUsed(Boolean includeFormats, Func predicate) - { - return RowsUsed(includeFormats, predicate); - } - public XLRangeRows RowsUsed(Boolean includeFormats, Func predicate = null) - { - XLRangeRows rows = new XLRangeRows(); - Int32 rowCount = RowCount(); - for (Int32 ro = 1; ro <= rowCount; ro++) - { - var row = Row(ro); - - if (!row.IsEmpty(includeFormats) && (predicate == null || predicate(row))) - rows.Add(row); - else - row.Dispose(); - } - return rows; - } - IXLRangeRows IXLRange.RowsUsed(Func predicate) - { - return RowsUsed(predicate); - } - public XLRangeRows RowsUsed(Func predicate = null) - { - return RowsUsed(false, predicate); - } - IXLRangeColumns IXLRange.ColumnsUsed(Boolean includeFormats, Func predicate) - { - return ColumnsUsed(includeFormats, predicate); - } - public XLRangeColumns ColumnsUsed(Boolean includeFormats, Func predicate = null) - { - XLRangeColumns columns = new XLRangeColumns(); - Int32 columnCount = ColumnCount(); - for (Int32 co = 1; co <= columnCount; co++) - { - var column = Column(co); - - if (!column.IsEmpty(includeFormats) && (predicate == null || predicate(column))) - columns.Add(column); - else - column.Dispose(); - } - return columns; - } - IXLRangeColumns IXLRange.ColumnsUsed(Func predicate) - { - return ColumnsUsed(predicate); - } - public XLRangeColumns ColumnsUsed(Func predicate = null) - { - return ColumnsUsed(false, predicate); - } - - public XLRangeRow Row(Int32 row) - { - if (row <= 0 || row > XLHelper.MaxRowNumber) - throw new IndexOutOfRangeException(String.Format("Row number must be between 1 and {0}", XLHelper.MaxRowNumber)); - - var firstCellAddress = new XLAddress(Worksheet, - RangeAddress.FirstAddress.RowNumber + row - 1, - RangeAddress.FirstAddress.ColumnNumber, - false, - false); - var lastCellAddress = new XLAddress(Worksheet, - RangeAddress.FirstAddress.RowNumber + row - 1, - RangeAddress.LastAddress.ColumnNumber, - false, - false); - return new XLRangeRow( - new XLRangeParameters(new XLRangeAddress(firstCellAddress, lastCellAddress), Worksheet.Style), false); - } - - - - public XLRangeColumn Column(Int32 column) - { - if (column <= 0 || column > XLHelper.MaxColumnNumber) - throw new IndexOutOfRangeException(String.Format("Column number must be between 1 and {0}", XLHelper.MaxColumnNumber)); - - var firstCellAddress = new XLAddress(Worksheet, - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber + column - 1, - false, - false); - var lastCellAddress = new XLAddress(Worksheet, - RangeAddress.LastAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber + column - 1, - false, - false); - return new XLRangeColumn( - new XLRangeParameters(new XLRangeAddress(firstCellAddress, lastCellAddress), Worksheet.Style), false); - } - - public XLRangeColumn Column(String column) - { - return Column(XLHelper.GetColumnNumberFromLetter(column)); - } - - - - private void TransposeRange(int squareSide) - { - var cellsToInsert = new Dictionary(); - var cellsToDelete = new List(); - var rngToTranspose = Worksheet.Range( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.FirstAddress.RowNumber + squareSide - 1, - RangeAddress.FirstAddress.ColumnNumber + squareSide - 1); - - Int32 roCount = rngToTranspose.RowCount(); - Int32 coCount = rngToTranspose.ColumnCount(); - for (Int32 ro = 1; ro <= roCount; ro++) - { - for (Int32 co = 1; co <= coCount; co++) - { - var oldCell = rngToTranspose.Cell(ro, co); - var newKey = rngToTranspose.Cell(co, ro).Address; - // new XLAddress(Worksheet, c.Address.ColumnNumber, c.Address.RowNumber); - var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); - newCell.CopyFrom(oldCell, true); - cellsToInsert.Add(new XLSheetPoint(newKey.RowNumber, newKey.ColumnNumber), newCell); - cellsToDelete.Add(new XLSheetPoint(oldCell.Address.RowNumber, oldCell.Address.ColumnNumber)); - } - } - - cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c)); - cellsToInsert.ForEach(c => Worksheet.Internals.CellsCollection.Add(c.Key, c.Value)); - } - - private void TransposeMerged(Int32 squareSide) - { - var rngToTranspose = Worksheet.Range( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.FirstAddress.RowNumber + squareSide - 1, - RangeAddress.FirstAddress.ColumnNumber + squareSide - 1); - - foreach (IXLRange merge in Worksheet.Internals.MergedRanges.Where(Contains)) - { - merge.RangeAddress.LastAddress = rngToTranspose.Cell(merge.ColumnCount(), merge.RowCount()).Address; - } - } - - private void MoveOrClearForTranspose(XLTransposeOptions transposeOption, int rowCount, int columnCount) - { - if (transposeOption == XLTransposeOptions.MoveCells) - { - if (rowCount > columnCount) - InsertColumnsAfter(false, rowCount - columnCount, false); - else if (columnCount > rowCount) - InsertRowsBelow(false, columnCount - rowCount, false); - } - else - { - if (rowCount > columnCount) - { - int toMove = rowCount - columnCount; - var rngToClear = Worksheet.Range( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber + 1, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber + toMove); - rngToClear.Clear(); - } - else if (columnCount > rowCount) - { - int toMove = columnCount - rowCount; - var rngToClear = Worksheet.Range( - RangeAddress.LastAddress.RowNumber + 1, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.LastAddress.RowNumber + toMove, - RangeAddress.LastAddress.ColumnNumber); - rngToClear.Clear(); - } - } - } - - public override bool Equals(object obj) - { - var other = (XLRange)obj; - return RangeAddress.Equals(other.RangeAddress) - && Worksheet.Equals(other.Worksheet); - } - - public override int GetHashCode() - { - return RangeAddress.GetHashCode() - ^ Worksheet.GetHashCode(); - } - - public new IXLRange Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - base.Clear(clearOptions); - return this; - } - - public IXLRangeColumn FindColumn(Func predicate) - { - Int32 columnCount = ColumnCount(); - for (Int32 c = 1; c <= columnCount; c++) - { - var column = Column(c); - if (predicate == null || predicate(column)) - return column; - else - column.Dispose(); - } - return null; - } - - public IXLRangeRow FindRow(Func predicate) - { - Int32 rowCount = RowCount(); - for (Int32 r = 1; r <= rowCount; r++) - { - var row = Row(r); - if (predicate(row)) - return row; - else - row.Dispose(); - } - return null; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; + + +namespace ClosedXML.Excel +{ + internal class XLRange : XLRangeBase, IXLRange + { + #region Constructor + + public XLRange(XLRangeParameters xlRangeParameters) + : base(xlRangeParameters.RangeAddress) + { + RangeParameters = new XLRangeParameters(xlRangeParameters.RangeAddress, xlRangeParameters.DefaultStyle); + + if (!xlRangeParameters.IgnoreEvents) + { + SubscribeToShiftedRows((range, rowShifted) => this.WorksheetRangeShiftedRows(range, rowShifted)); + SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); + //xlRangeParameters.IgnoreEvents = true; + } + SetStyle(xlRangeParameters.DefaultStyle); + } + + #endregion + + public XLRangeParameters RangeParameters { get; private set; } + + #region IXLRange Members + + + IXLRangeRow IXLRange.Row(Int32 row) + { + return Row(row); + } + + IXLRangeColumn IXLRange.Column(Int32 column) + { + return Column(column); + } + + IXLRangeColumn IXLRange.Column(String column) + { + return Column(column); + } + + public IXLRangeColumns Columns(Func predicate = null) + { + var retVal = new XLRangeColumns(); + Int32 columnCount = ColumnCount(); + for (Int32 c = 1; c <= columnCount; c++) + { + var column = Column(c); + if (predicate == null || predicate(column)) + retVal.Add(column); + else + column.Dispose(); + } + return retVal; + } + + public virtual IXLRangeColumns Columns(Int32 firstColumn, Int32 lastColumn) + { + var retVal = new XLRangeColumns(); + + for (int co = firstColumn; co <= lastColumn; co++) + retVal.Add(Column(co)); + return retVal; + } + + public IXLRangeColumns Columns(String firstColumn, String lastColumn) + { + return Columns(XLHelper.GetColumnNumberFromLetter(firstColumn), + XLHelper.GetColumnNumberFromLetter(lastColumn)); + } + + public IXLRangeColumns Columns(String columns) + { + var retVal = new XLRangeColumns(); + var columnPairs = columns.Split(','); + foreach (string tPair in columnPairs.Select(pair => pair.Trim())) + { + String firstColumn; + String lastColumn; + if (tPair.Contains(':') || tPair.Contains('-')) + { + string[] columnRange = XLHelper.SplitRange(tPair); + + firstColumn = columnRange[0]; + lastColumn = columnRange[1]; + } + else + { + firstColumn = tPair; + lastColumn = tPair; + } + + Int32 tmp; + if (Int32.TryParse(firstColumn, out tmp)) + { + foreach (IXLRangeColumn col in Columns(Int32.Parse(firstColumn), Int32.Parse(lastColumn))) + retVal.Add(col); + } + else + { + foreach (IXLRangeColumn col in Columns(firstColumn, lastColumn)) + retVal.Add(col); + } + } + return retVal; + } + + IXLCell IXLRange.Cell(int row, int column) + { + return Cell(row, column); + } + + IXLCell IXLRange.Cell(string cellAddressInRange) + { + return Cell(cellAddressInRange); + } + + IXLCell IXLRange.Cell(int row, string column) + { + return Cell(row, column); + } + + IXLCell IXLRange.Cell(IXLAddress cellAddressInRange) + { + return Cell(cellAddressInRange); + } + + IXLRange IXLRange.Range(IXLRangeAddress rangeAddress) + { + return Range(rangeAddress); + } + + IXLRange IXLRange.Range(string rangeAddress) + { + return Range(rangeAddress); + } + + IXLRange IXLRange.Range(IXLCell firstCell, IXLCell lastCell) + { + return Range(firstCell, lastCell); + } + + IXLRange IXLRange.Range(string firstCellAddress, string lastCellAddress) + { + return Range(firstCellAddress, lastCellAddress); + } + + IXLRange IXLRange.Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress) + { + return Range(firstCellAddress, lastCellAddress); + } + + IXLRange IXLRange.Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn) + { + return Range(firstCellRow, firstCellColumn, lastCellRow, lastCellColumn); + } + + public IXLRangeRows Rows(Func predicate = null) + { + var retVal = new XLRangeRows(); + Int32 rowCount = RowCount(); + for (Int32 r = 1; r <= rowCount; r++) + { + var row = Row(r); + if (predicate == null || predicate(row)) + retVal.Add(Row(r)); + else + row.Dispose(); + } + return retVal; + } + + public IXLRangeRows Rows(Int32 firstRow, Int32 lastRow) + { + var retVal = new XLRangeRows(); + + for (int ro = firstRow; ro <= lastRow; ro++) + retVal.Add(Row(ro)); + return retVal; + } + + public IXLRangeRows Rows(String rows) + { + var retVal = new XLRangeRows(); + var rowPairs = rows.Split(','); + foreach (string tPair in rowPairs.Select(pair => pair.Trim())) + { + String firstRow; + String lastRow; + if (tPair.Contains(':') || tPair.Contains('-')) + { + string[] rowRange = XLHelper.SplitRange(tPair); + + firstRow = rowRange[0]; + lastRow = rowRange[1]; + } + else + { + firstRow = tPair; + lastRow = tPair; + } + foreach (IXLRangeRow row in Rows(Int32.Parse(firstRow), Int32.Parse(lastRow))) + retVal.Add(row); + } + return retVal; + } + + public void Transpose(XLTransposeOptions transposeOption) + { + int rowCount = RowCount(); + int columnCount = ColumnCount(); + int squareSide = rowCount > columnCount ? rowCount : columnCount; + + var firstCell = FirstCell(); + + MoveOrClearForTranspose(transposeOption, rowCount, columnCount); + TransposeMerged(squareSide); + TransposeRange(squareSide); + RangeAddress.LastAddress = new XLAddress(Worksheet, + firstCell.Address.RowNumber + columnCount - 1, + firstCell.Address.ColumnNumber + rowCount - 1, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn); + if (rowCount > columnCount) + { + var rng = Worksheet.Range( + RangeAddress.LastAddress.RowNumber + 1, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber + (rowCount - columnCount), + RangeAddress.LastAddress.ColumnNumber); + rng.Delete(XLShiftDeletedCells.ShiftCellsUp); + } + else if (columnCount > rowCount) + { + var rng = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + 1, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + (columnCount - rowCount)); + rng.Delete(XLShiftDeletedCells.ShiftCellsLeft); + } + + foreach (IXLCell c in Range(1, 1, columnCount, rowCount).Cells()) + { + var border = new XLBorder(this, c.Style.Border); + c.Style.Border.TopBorder = border.LeftBorder; + c.Style.Border.TopBorderColor = border.LeftBorderColor; + c.Style.Border.LeftBorder = border.TopBorder; + c.Style.Border.LeftBorderColor = border.TopBorderColor; + c.Style.Border.RightBorder = border.BottomBorder; + c.Style.Border.RightBorderColor = border.BottomBorderColor; + c.Style.Border.BottomBorder = border.RightBorder; + c.Style.Border.BottomBorderColor = border.RightBorderColor; + } + } + + public IXLTable AsTable() + { + return new XLTable(this, false); + } + + public IXLTable AsTable(String name) + { + return new XLTable(this, name, false); + } + + IXLTable IXLRange.CreateTable() + { + return CreateTable(); + } + public XLTable CreateTable() + { + return new XLTable(this, true, true); + } + + IXLTable IXLRange.CreateTable(String name) + { + return CreateTable(name); + } + public XLTable CreateTable(String name) + { + return new XLTable(this, name, true, true); + } + + public IXLTable CreateTable(String name, Boolean setAutofilter) + { + return new XLTable(this, name, true, setAutofilter); + } + + public new IXLRange CopyTo(IXLCell target) + { + base.CopyTo(target); + + Int32 lastRowNumber = target.Address.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + Int32 lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range(target.Address.RowNumber, + target.Address.ColumnNumber, + lastRowNumber, + lastColumnNumber); + } + + public new IXLRange CopyTo(IXLRangeBase target) + { + base.CopyTo(target); + + Int32 lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + Int32 lastColumnNumber = target.RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range(target.RangeAddress.FirstAddress.RowNumber, + target.RangeAddress.FirstAddress.ColumnNumber, + lastRowNumber, + lastColumnNumber); + } + + public IXLRange SetDataType(XLCellValues dataType) + { + DataType = dataType; + return this; + } + + + public new IXLRange Sort() + { + return base.Sort().AsRange(); + } + + public new IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return base.Sort(columnsToSortBy, sortOrder, matchCase, ignoreBlanks).AsRange(); + } + public new IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return base.Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks).AsRange(); + } + public new IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks).AsRange(); + } + + + #endregion + + private void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) + { + ShiftColumns(RangeAddress, range, columnsShifted); + } + + private void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) + { + ShiftRows(RangeAddress, range, rowsShifted); + } + + IXLRangeColumn IXLRange.FirstColumn(Func predicate) + { + return FirstColumn(predicate); + } + public XLRangeColumn FirstColumn(Func predicate = null) + { + if (predicate == null) + return Column(1); + + Int32 columnCount = ColumnCount(); + for (Int32 c = 1; c <= columnCount; c++) + { + var column = Column(c); + if (predicate(column)) return column; + + column.Dispose(); + } + + return null; + } + + IXLRangeColumn IXLRange.LastColumn(Func predicate) + { + return LastColumn(predicate); + } + public XLRangeColumn LastColumn(Func predicate = null) + { + Int32 columnCount = ColumnCount(); + if (predicate == null) + return Column(columnCount); + + for (Int32 c = columnCount; c >= 1; c--) + { + var column = Column(c); + if (predicate(column)) return column; + + column.Dispose(); + } + + return null; + } + + IXLRangeColumn IXLRange.FirstColumnUsed(Func predicate ) + { + return FirstColumnUsed(false, predicate); + } + public XLRangeColumn FirstColumnUsed(Func predicate = null) + { + return FirstColumnUsed(false, predicate); + } + + IXLRangeColumn IXLRange.FirstColumnUsed(Boolean includeFormats, Func predicate) + { + return FirstColumnUsed(includeFormats, predicate); + } + public XLRangeColumn FirstColumnUsed(Boolean includeFormats, Func predicate = null) + { + if (predicate == null) + { + Int32 firstColumnUsed = Worksheet.Internals.CellsCollection.FirstColumnUsed( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + includeFormats); + + return firstColumnUsed == 0 ? null : Column(firstColumnUsed - RangeAddress.FirstAddress.ColumnNumber + 1); + } + + Int32 columnCount = ColumnCount(); + for (Int32 co = 1; co <= columnCount; co++) + { + var column = Column(co); + + if (!column.IsEmpty(includeFormats) && predicate(column)) + return column; + column.Dispose(); + } + return null; + } + + IXLRangeColumn IXLRange.LastColumnUsed(Func predicate) + { + return LastColumnUsed(false, predicate); + } + public XLRangeColumn LastColumnUsed(Func predicate = null) + { + return LastColumnUsed(false, predicate); + } + + IXLRangeColumn IXLRange.LastColumnUsed(Boolean includeFormats, Func predicate) + { + return LastColumnUsed(includeFormats, predicate); + } + public XLRangeColumn LastColumnUsed(Boolean includeFormats, Func predicate = null) + { + if (predicate == null) + { + Int32 lastColumnUsed = Worksheet.Internals.CellsCollection.LastColumnUsed( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + includeFormats); + + return lastColumnUsed == 0 ? null : Column(lastColumnUsed - RangeAddress.FirstAddress.ColumnNumber + 1); + } + + Int32 columnCount = ColumnCount(); + for (Int32 co = columnCount; co >= 1; co--) + { + var column = Column(co); + + if (!column.IsEmpty(includeFormats) && predicate(column)) + return column; + column.Dispose(); + } + return null; + } + + IXLRangeRow IXLRange.FirstRow(Func predicate) + { + return FirstRow(predicate); + } + public XLRangeRow FirstRow(Func predicate = null) + { + if (predicate == null) + return Row(1); + + Int32 rowCount = RowCount(); + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = Row(ro); + if (predicate(row)) return row; + + row.Dispose(); + } + + return null; + } + + IXLRangeRow IXLRange.LastRow(Func predicate) + { + return LastRow(predicate); + } + public XLRangeRow LastRow(Func predicate = null) + { + Int32 rowCount = RowCount(); + if (predicate == null) + return Row(rowCount); + + for (Int32 ro = rowCount; ro >= 1; ro--) + { + var row = Row(ro); + if (predicate(row)) return row; + + row.Dispose(); + } + + return null; + } + + IXLRangeRow IXLRange.FirstRowUsed(Func predicate) + { + return FirstRowUsed(false, predicate); + } + public XLRangeRow FirstRowUsed(Func predicate = null) + { + return FirstRowUsed(false, predicate); + } + + IXLRangeRow IXLRange.FirstRowUsed(Boolean includeFormats, Func predicate) + { + return FirstRowUsed(includeFormats, predicate); + } + public XLRangeRow FirstRowUsed(Boolean includeFormats, Func predicate = null) + { + if (predicate == null) + { + Int32 rowFromCells = Worksheet.Internals.CellsCollection.FirstRowUsed( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + includeFormats); + + //Int32 rowFromRows = Worksheet.Internals.RowsCollection.FirstRowUsed(includeFormats); + + return rowFromCells == 0 ? null : Row(rowFromCells - RangeAddress.FirstAddress.RowNumber + 1); + } + + Int32 rowCount = RowCount(); + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = Row(ro); + + if (!row.IsEmpty(includeFormats) && predicate(row)) + return row; + row.Dispose(); + } + return null; + } + + IXLRangeRow IXLRange.LastRowUsed(Func predicate) + { + return LastRowUsed(false, predicate); + } + public XLRangeRow LastRowUsed(Func predicate = null) + { + return LastRowUsed(false, predicate); + } + + IXLRangeRow IXLRange.LastRowUsed(Boolean includeFormats, Func predicate) + { + return LastRowUsed(includeFormats, predicate); + } + public XLRangeRow LastRowUsed(Boolean includeFormats, Func predicate = null) + { + if (predicate == null) + { + Int32 lastRowUsed = Worksheet.Internals.CellsCollection.LastRowUsed( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + includeFormats); + + return lastRowUsed == 0 ? null : Row(lastRowUsed - RangeAddress.FirstAddress.RowNumber + 1); + } + + Int32 rowCount = RowCount(); + for (Int32 ro = rowCount; ro >= 1; ro--) + { + var row = Row(ro); + + if (!row.IsEmpty(includeFormats) && predicate(row)) + return row; + row.Dispose(); + } + return null; + } + + + IXLRangeRows IXLRange.RowsUsed(Boolean includeFormats, Func predicate) + { + return RowsUsed(includeFormats, predicate); + } + public XLRangeRows RowsUsed(Boolean includeFormats, Func predicate = null) + { + XLRangeRows rows = new XLRangeRows(); + Int32 rowCount = RowCount(); + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = Row(ro); + + if (!row.IsEmpty(includeFormats) && (predicate == null || predicate(row))) + rows.Add(row); + else + row.Dispose(); + } + return rows; + } + IXLRangeRows IXLRange.RowsUsed(Func predicate) + { + return RowsUsed(predicate); + } + public XLRangeRows RowsUsed(Func predicate = null) + { + return RowsUsed(false, predicate); + } + IXLRangeColumns IXLRange.ColumnsUsed(Boolean includeFormats, Func predicate) + { + return ColumnsUsed(includeFormats, predicate); + } + public XLRangeColumns ColumnsUsed(Boolean includeFormats, Func predicate = null) + { + XLRangeColumns columns = new XLRangeColumns(); + Int32 columnCount = ColumnCount(); + for (Int32 co = 1; co <= columnCount; co++) + { + var column = Column(co); + + if (!column.IsEmpty(includeFormats) && (predicate == null || predicate(column))) + columns.Add(column); + else + column.Dispose(); + } + return columns; + } + IXLRangeColumns IXLRange.ColumnsUsed(Func predicate) + { + return ColumnsUsed(predicate); + } + public XLRangeColumns ColumnsUsed(Func predicate = null) + { + return ColumnsUsed(false, predicate); + } + + public XLRangeRow Row(Int32 row) + { + if (row <= 0 || row > XLHelper.MaxRowNumber) + throw new IndexOutOfRangeException(String.Format("Row number must be between 1 and {0}", XLHelper.MaxRowNumber)); + + var firstCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber + row - 1, + RangeAddress.FirstAddress.ColumnNumber, + false, + false); + var lastCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber + row - 1, + RangeAddress.LastAddress.ColumnNumber, + false, + false); + return new XLRangeRow( + new XLRangeParameters(new XLRangeAddress(firstCellAddress, lastCellAddress), Worksheet.Style), false); + } + + + + public XLRangeColumn Column(Int32 column) + { + if (column <= 0 || column > XLHelper.MaxColumnNumber) + throw new IndexOutOfRangeException(String.Format("Column number must be between 1 and {0}", XLHelper.MaxColumnNumber)); + + var firstCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber + column - 1, + false, + false); + var lastCellAddress = new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber + column - 1, + false, + false); + return new XLRangeColumn( + new XLRangeParameters(new XLRangeAddress(firstCellAddress, lastCellAddress), Worksheet.Style), false); + } + + public XLRangeColumn Column(String column) + { + return Column(XLHelper.GetColumnNumberFromLetter(column)); + } + + + + private void TransposeRange(int squareSide) + { + var cellsToInsert = new Dictionary(); + var cellsToDelete = new List(); + var rngToTranspose = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.RowNumber + squareSide - 1, + RangeAddress.FirstAddress.ColumnNumber + squareSide - 1); + + Int32 roCount = rngToTranspose.RowCount(); + Int32 coCount = rngToTranspose.ColumnCount(); + for (Int32 ro = 1; ro <= roCount; ro++) + { + for (Int32 co = 1; co <= coCount; co++) + { + var oldCell = rngToTranspose.Cell(ro, co); + var newKey = rngToTranspose.Cell(co, ro).Address; + // new XLAddress(Worksheet, c.Address.ColumnNumber, c.Address.RowNumber); + var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); + newCell.CopyFrom(oldCell, true); + cellsToInsert.Add(new XLSheetPoint(newKey.RowNumber, newKey.ColumnNumber), newCell); + cellsToDelete.Add(new XLSheetPoint(oldCell.Address.RowNumber, oldCell.Address.ColumnNumber)); + } + } + + cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c)); + cellsToInsert.ForEach(c => Worksheet.Internals.CellsCollection.Add(c.Key, c.Value)); + } + + private void TransposeMerged(Int32 squareSide) + { + var rngToTranspose = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.RowNumber + squareSide - 1, + RangeAddress.FirstAddress.ColumnNumber + squareSide - 1); + + foreach (IXLRange merge in Worksheet.Internals.MergedRanges.Where(Contains)) + { + merge.RangeAddress.LastAddress = rngToTranspose.Cell(merge.ColumnCount(), merge.RowCount()).Address; + } + } + + private void MoveOrClearForTranspose(XLTransposeOptions transposeOption, int rowCount, int columnCount) + { + if (transposeOption == XLTransposeOptions.MoveCells) + { + if (rowCount > columnCount) + InsertColumnsAfter(false, rowCount - columnCount, false); + else if (columnCount > rowCount) + InsertRowsBelow(false, columnCount - rowCount, false); + } + else + { + if (rowCount > columnCount) + { + int toMove = rowCount - columnCount; + var rngToClear = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + 1, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + toMove); + rngToClear.Clear(); + } + else if (columnCount > rowCount) + { + int toMove = columnCount - rowCount; + var rngToClear = Worksheet.Range( + RangeAddress.LastAddress.RowNumber + 1, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber + toMove, + RangeAddress.LastAddress.ColumnNumber); + rngToClear.Clear(); + } + } + } + + public override bool Equals(object obj) + { + var other = (XLRange)obj; + return RangeAddress.Equals(other.RangeAddress) + && Worksheet.Equals(other.Worksheet); + } + + public override int GetHashCode() + { + return RangeAddress.GetHashCode() + ^ Worksheet.GetHashCode(); + } + + public new IXLRange Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + base.Clear(clearOptions); + return this; + } + + public IXLRangeColumn FindColumn(Func predicate) + { + Int32 columnCount = ColumnCount(); + for (Int32 c = 1; c <= columnCount; c++) + { + var column = Column(c); + if (predicate == null || predicate(column)) + return column; + else + column.Dispose(); + } + return null; + } + + public IXLRangeRow FindRow(Func predicate) + { + Int32 rowCount = RowCount(); + for (Int32 r = 1; r <= rowCount; r++) + { + var row = Row(r); + if (predicate(row)) + return row; + else + row.Dispose(); + } + return null; + } + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeAddress.cs b/ClosedXML/Excel/Ranges/XLRangeAddress.cs index ddf27f4..3a5a1cd 100644 --- a/ClosedXML/Excel/Ranges/XLRangeAddress.cs +++ b/ClosedXML/Excel/Ranges/XLRangeAddress.cs @@ -1,191 +1,191 @@ -using System; -using System.Diagnostics; -using System.Globalization; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLRangeAddress : IXLRangeAddress - { - #region Private fields - - [DebuggerBrowsable(DebuggerBrowsableState.Never)] private XLAddress _firstAddress; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] private XLAddress _lastAddress; - - #endregion - - #region Constructor - - public XLRangeAddress(XLRangeAddress rangeAddress): this(rangeAddress.FirstAddress, rangeAddress.LastAddress) - { - - } - - public XLRangeAddress(XLAddress firstAddress, XLAddress lastAddress) - { - Worksheet = firstAddress.Worksheet; - FirstAddress = XLAddress.Create(firstAddress); - LastAddress = XLAddress.Create(lastAddress); - } - - public XLRangeAddress(XLWorksheet worksheet, String rangeAddress) - { - string addressToUse = rangeAddress.Contains("!") - ? rangeAddress.Substring(rangeAddress.IndexOf("!") + 1) - : rangeAddress; - - string firstPart; - string secondPart; - if (addressToUse.Contains(':')) - { - var arrRange = addressToUse.Split(':'); - firstPart = arrRange[0]; - secondPart = arrRange[1]; - } - else - { - firstPart = addressToUse; - secondPart = addressToUse; - } - - if (XLHelper.IsValidA1Address(firstPart)) - { - FirstAddress = XLAddress.Create(worksheet, firstPart); - LastAddress = XLAddress.Create(worksheet, secondPart); - } - else - { - firstPart = firstPart.Replace("$", String.Empty); - secondPart = secondPart.Replace("$", String.Empty); - if (char.IsDigit(firstPart[0])) - { - FirstAddress = XLAddress.Create(worksheet, "A" + firstPart); - LastAddress = XLAddress.Create(worksheet, XLHelper.MaxColumnLetter + secondPart); - } - else - { - FirstAddress = XLAddress.Create(worksheet, firstPart + "1"); - LastAddress = XLAddress.Create(worksheet, secondPart + XLHelper.MaxRowNumber.ToInvariantString()); - } - } - - Worksheet = worksheet; - } - - #endregion - - #region Public properties - - public XLWorksheet Worksheet { get; internal set; } - - public XLAddress FirstAddress - { - get - { - if (IsInvalid) - throw new Exception("Range is invalid."); - - return _firstAddress; - } - set { _firstAddress = value; } - } - - public XLAddress LastAddress - { - get - { - if (IsInvalid) - throw new Exception("Range is an invalid state."); - - return _lastAddress; - } - set { _lastAddress = value; } - } - - IXLWorksheet IXLRangeAddress.Worksheet - { - get { return Worksheet; } - } - - IXLAddress IXLRangeAddress.FirstAddress - { - [DebuggerStepThrough] - get { return FirstAddress; } - set { FirstAddress = value as XLAddress; } - } - - IXLAddress IXLRangeAddress.LastAddress - { - [DebuggerStepThrough] - get { return LastAddress; } - set { LastAddress = value as XLAddress; } - } - - - public bool IsInvalid { get; set; } - - #endregion - - #region Public methods - - public String ToStringRelative() - { - return ToStringRelative(false); - } - - public String ToStringFixed() - { - return ToStringFixed(XLReferenceStyle.A1); - } - - public String ToStringRelative(Boolean includeSheet) - { - if (includeSheet) - return String.Format("'{0}'!{1}:{2}", - Worksheet.Name, - _firstAddress.ToStringRelative(), - _lastAddress.ToStringRelative()); - - return _firstAddress.ToStringRelative() + ":" + _lastAddress.ToStringRelative(); - } - - public String ToStringFixed(XLReferenceStyle referenceStyle) - { - return ToStringFixed(referenceStyle, false); - } - - public String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet) - { - if (includeSheet) - return String.Format("'{0}'!{1}:{2}", - Worksheet.Name, - _firstAddress.ToStringFixed(referenceStyle), - _lastAddress.ToStringFixed(referenceStyle)); - - return _firstAddress.ToStringFixed(referenceStyle) + ":" + _lastAddress.ToStringFixed(referenceStyle); - } - - public override string ToString() - { - return _firstAddress + ":" + _lastAddress; - } - - public override bool Equals(object obj) - { - var other = (XLRangeAddress)obj; - return Worksheet.Equals(other.Worksheet) - && FirstAddress.Equals(other.FirstAddress) - && LastAddress.Equals(other.LastAddress); - } - - public override int GetHashCode() - { - return - Worksheet.GetHashCode() - ^ FirstAddress.GetHashCode() - ^ LastAddress.GetHashCode(); - } - - #endregion - } +using System; +using System.Diagnostics; +using System.Globalization; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLRangeAddress : IXLRangeAddress + { + #region Private fields + + [DebuggerBrowsable(DebuggerBrowsableState.Never)] private XLAddress _firstAddress; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] private XLAddress _lastAddress; + + #endregion + + #region Constructor + + public XLRangeAddress(XLRangeAddress rangeAddress): this(rangeAddress.FirstAddress, rangeAddress.LastAddress) + { + + } + + public XLRangeAddress(XLAddress firstAddress, XLAddress lastAddress) + { + Worksheet = firstAddress.Worksheet; + FirstAddress = XLAddress.Create(firstAddress); + LastAddress = XLAddress.Create(lastAddress); + } + + public XLRangeAddress(XLWorksheet worksheet, String rangeAddress) + { + string addressToUse = rangeAddress.Contains("!") + ? rangeAddress.Substring(rangeAddress.IndexOf("!") + 1) + : rangeAddress; + + string firstPart; + string secondPart; + if (addressToUse.Contains(':')) + { + var arrRange = addressToUse.Split(':'); + firstPart = arrRange[0]; + secondPart = arrRange[1]; + } + else + { + firstPart = addressToUse; + secondPart = addressToUse; + } + + if (XLHelper.IsValidA1Address(firstPart)) + { + FirstAddress = XLAddress.Create(worksheet, firstPart); + LastAddress = XLAddress.Create(worksheet, secondPart); + } + else + { + firstPart = firstPart.Replace("$", String.Empty); + secondPart = secondPart.Replace("$", String.Empty); + if (char.IsDigit(firstPart[0])) + { + FirstAddress = XLAddress.Create(worksheet, "A" + firstPart); + LastAddress = XLAddress.Create(worksheet, XLHelper.MaxColumnLetter + secondPart); + } + else + { + FirstAddress = XLAddress.Create(worksheet, firstPart + "1"); + LastAddress = XLAddress.Create(worksheet, secondPart + XLHelper.MaxRowNumber.ToInvariantString()); + } + } + + Worksheet = worksheet; + } + + #endregion + + #region Public properties + + public XLWorksheet Worksheet { get; internal set; } + + public XLAddress FirstAddress + { + get + { + if (IsInvalid) + throw new Exception("Range is invalid."); + + return _firstAddress; + } + set { _firstAddress = value; } + } + + public XLAddress LastAddress + { + get + { + if (IsInvalid) + throw new Exception("Range is an invalid state."); + + return _lastAddress; + } + set { _lastAddress = value; } + } + + IXLWorksheet IXLRangeAddress.Worksheet + { + get { return Worksheet; } + } + + IXLAddress IXLRangeAddress.FirstAddress + { + [DebuggerStepThrough] + get { return FirstAddress; } + set { FirstAddress = value as XLAddress; } + } + + IXLAddress IXLRangeAddress.LastAddress + { + [DebuggerStepThrough] + get { return LastAddress; } + set { LastAddress = value as XLAddress; } + } + + + public bool IsInvalid { get; set; } + + #endregion + + #region Public methods + + public String ToStringRelative() + { + return ToStringRelative(false); + } + + public String ToStringFixed() + { + return ToStringFixed(XLReferenceStyle.A1); + } + + public String ToStringRelative(Boolean includeSheet) + { + if (includeSheet) + return String.Format("'{0}'!{1}:{2}", + Worksheet.Name, + _firstAddress.ToStringRelative(), + _lastAddress.ToStringRelative()); + + return _firstAddress.ToStringRelative() + ":" + _lastAddress.ToStringRelative(); + } + + public String ToStringFixed(XLReferenceStyle referenceStyle) + { + return ToStringFixed(referenceStyle, false); + } + + public String ToStringFixed(XLReferenceStyle referenceStyle, Boolean includeSheet) + { + if (includeSheet) + return String.Format("'{0}'!{1}:{2}", + Worksheet.Name, + _firstAddress.ToStringFixed(referenceStyle), + _lastAddress.ToStringFixed(referenceStyle)); + + return _firstAddress.ToStringFixed(referenceStyle) + ":" + _lastAddress.ToStringFixed(referenceStyle); + } + + public override string ToString() + { + return _firstAddress + ":" + _lastAddress; + } + + public override bool Equals(object obj) + { + var other = (XLRangeAddress)obj; + return Worksheet.Equals(other.Worksheet) + && FirstAddress.Equals(other.FirstAddress) + && LastAddress.Equals(other.LastAddress); + } + + public override int GetHashCode() + { + return + Worksheet.GetHashCode() + ^ FirstAddress.GetHashCode() + ^ LastAddress.GetHashCode(); + } + + #endregion + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/Excel/Ranges/XLRangeBase.cs index a6038bc..c4f8381 100644 --- a/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -1,2029 +1,2029 @@ -using ClosedXML.Excel.Misc; -using System; -using System.Collections.Generic; -using System.Linq; - - - -namespace ClosedXML.Excel -{ - internal abstract class XLRangeBase : IXLRangeBase, IXLStylized - { - public Boolean StyleChanged { get; set; } - #region Fields - - private IXLStyle _style; - private XLSortElements _sortRows; - private XLSortElements _sortColumns; - - #endregion - - private Int32 _styleCacheId; - protected void SetStyle(IXLStyle styleToUse) - { - _styleCacheId = Worksheet.Workbook.GetStyleId(styleToUse); - _style = null; - StyleChanged = false; - } - protected void SetStyle(Int32 styleId) - { - _styleCacheId = styleId; - _style = null; - StyleChanged = false; - } - public Int32 GetStyleId() - { - if (StyleChanged) - SetStyle(Style); - - return _styleCacheId; - } - protected IXLStyle GetStyle() - { - return _style ?? (_style = new XLStyle(this, Worksheet.Workbook.GetStyleById(_styleCacheId))); - } - - #region Constructor - - static Int32 IdCounter = 0; - readonly Int32 Id; - - protected XLRangeBase(XLRangeAddress rangeAddress) - { - - Id = ++IdCounter; - - RangeAddress = new XLRangeAddress(rangeAddress); - } - - #endregion - - private XLCallbackAction _shiftedRowsAction; - - protected void SubscribeToShiftedRows(Action action) - { - if (Worksheet == null || !Worksheet.EventTrackingEnabled) return; - - _shiftedRowsAction = new XLCallbackAction(action); - - RangeAddress.Worksheet.RangeShiftedRows.Add(_shiftedRowsAction); - } - - private XLCallbackAction _shiftedColumnsAction; - protected void SubscribeToShiftedColumns(Action action) - { - if (Worksheet == null || !Worksheet.EventTrackingEnabled) return; - - _shiftedColumnsAction = new XLCallbackAction(action); - - RangeAddress.Worksheet.RangeShiftedColumns.Add(_shiftedColumnsAction); - } - - #region Public properties - - //public XLRangeAddress RangeAddress { get; protected set; } - - private XLRangeAddress _rangeAddress; - public XLRangeAddress RangeAddress - { - get { return _rangeAddress; } - protected set { _rangeAddress = value; } - } - - public XLWorksheet Worksheet - { - get { return RangeAddress.Worksheet; } - } - - public XLDataValidation NewDataValidation - { - get - { - var newRanges = new XLRanges { AsRange() }; - var dataValidation = new XLDataValidation(newRanges); - - Worksheet.DataValidations.Add(dataValidation); - return dataValidation; - } - } - - public XLDataValidation DataValidation - { - get - { - IXLDataValidation dataValidationToCopy = null; - var dvEmpty = new List(); - foreach (IXLDataValidation dv in Worksheet.DataValidations) - { - foreach (IXLRange dvRange in dv.Ranges.Where(dvRange => dvRange.Intersects(this))) - { - if (dataValidationToCopy == null) - dataValidationToCopy = dv; - - dv.Ranges.Remove(dvRange); - foreach (var column in dvRange.Columns()) - { - if (column.Intersects(this)) - { - Int32 dvStart = column.RangeAddress.FirstAddress.RowNumber; - Int32 dvEnd = column.RangeAddress.LastAddress.RowNumber; - Int32 thisStart = RangeAddress.FirstAddress.RowNumber; - Int32 thisEnd = RangeAddress.LastAddress.RowNumber; - - if (thisStart > dvStart && thisEnd < dvEnd) - { - var r1 = Worksheet.Column(column.ColumnNumber()).Column(dvStart, thisStart - 1); - r1.Dispose(); - dv.Ranges.Add(r1); - var r2 = Worksheet.Column(column.ColumnNumber()).Column(thisEnd + 1, dvEnd); - r2.Dispose(); - dv.Ranges.Add(r2); - } - else - { - Int32 coStart; - if (dvStart < thisStart) - coStart = dvStart; - else - coStart = thisEnd + 1; - - if (coStart <= dvEnd) - { - Int32 coEnd; - if (dvEnd > thisEnd) - coEnd = dvEnd; - else - coEnd = thisStart - 1; - - if (coEnd >= dvStart) - { - var r = Worksheet.Column(column.ColumnNumber()).Column(coStart, coEnd); - r.Dispose(); - dv.Ranges.Add(r); - } - } - } - } - else - { - column.Dispose(); - dv.Ranges.Add(column); - } - } - - if (!dv.Ranges.Any()) - dvEmpty.Add(dv); - } - } - - dvEmpty.ForEach(dv => Worksheet.DataValidations.Delete(dv)); - - var newRanges = new XLRanges { AsRange() }; - var dataValidation = new XLDataValidation(newRanges); - if (dataValidationToCopy != null) - dataValidation.CopyFrom(dataValidationToCopy); - - Worksheet.DataValidations.Add(dataValidation); - return dataValidation; - } - } - - #region IXLRangeBase Members - - IXLRangeAddress IXLRangeBase.RangeAddress - { - get { return RangeAddress; } - } - - IXLWorksheet IXLRangeBase.Worksheet - { - get { return RangeAddress.Worksheet; } - } - - public String FormulaA1 - { - set - { - Cells().ForEach(c => - { - c.FormulaA1 = value; - c.FormulaReference = RangeAddress; - }); - } - } - - public String FormulaR1C1 - { - set - { - Cells().ForEach(c => - { - c.FormulaR1C1 = value; - c.FormulaReference = RangeAddress; - }); - } - } - - public Boolean ShareString - { - set { Cells().ForEach(c => c.ShareString = value); } - } - - public IXLHyperlinks Hyperlinks - { - get - { - var hyperlinks = new XLHyperlinks(); - var hls = from hl in Worksheet.Hyperlinks - where Contains(hl.Cell.AsRange()) - select hl; - hls.ForEach(hyperlinks.Add); - return hyperlinks; - } - } - - - - public Object Value - { - set { Cells().ForEach(c => c.Value = value); } - } - - public XLCellValues DataType - { - set { Cells().ForEach(c => c.DataType = value); } - } - - #endregion - - #region IXLStylized Members - - public IXLRanges RangesUsed - { - get - { - var retVal = new XLRanges { AsRange() }; - return retVal; - } - } - - #endregion - - #endregion - - #region IXLRangeBase Members - - IXLCell IXLRangeBase.FirstCell() - { - return FirstCell(); - } - - IXLCell IXLRangeBase.LastCell() - { - return LastCell(); - } - - IXLCell IXLRangeBase.FirstCellUsed() - { - return FirstCellUsed(false); - } - - IXLCell IXLRangeBase.FirstCellUsed(bool includeFormats) - { - return FirstCellUsed(includeFormats); - } - - IXLCell IXLRangeBase.LastCellUsed() - { - return LastCellUsed(false); - } - - IXLCell IXLRangeBase.LastCellUsed(bool includeFormats) - { - return LastCellUsed(includeFormats); - } - - public IXLCells Cells() - { - return Cells(false); - } - - public IXLCells Cells(Boolean usedCellsOnly) - { - return Cells(usedCellsOnly, false); - } - - public IXLCells Cells(Boolean usedCellsOnly, Boolean includeFormats) - { - var cells = new XLCells(usedCellsOnly, includeFormats) { RangeAddress }; - return cells; - } - - public IXLCells Cells(String cells) - { - return Ranges(cells).Cells(); - } - - public IXLCells Cells(Func predicate) - { - var cells = new XLCells(false, false, predicate) { RangeAddress }; - return cells; - } - - public IXLCells CellsUsed() - { - return Cells(true); - } - - public IXLRange Merge() - { - return Merge(true); - } - - public IXLRange Merge(Boolean checkIntersect) - { - if (checkIntersect) - { - using (IXLRange range = Worksheet.Range(RangeAddress)) - { - foreach (var mergedRange in Worksheet.Internals.MergedRanges) - { - if (mergedRange.Intersects(range)) - { - Worksheet.Internals.MergedRanges.Remove(mergedRange); - } - } - } - } - - var asRange = AsRange(); - Worksheet.Internals.MergedRanges.Add(asRange); - - return asRange; - } - - public IXLRange Unmerge() - { - string tAddress = RangeAddress.ToString(); - var asRange = AsRange(); - if (Worksheet.Internals.MergedRanges.Select(m => m.RangeAddress.ToString()).Any(mAddress => mAddress == tAddress)) - Worksheet.Internals.MergedRanges.Remove(asRange); - - return asRange; - } - - public IXLRangeBase Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - var includeFormats = clearOptions == XLClearOptions.Formats || - clearOptions == XLClearOptions.ContentsAndFormats; - foreach (var cell in CellsUsed(includeFormats)) - { - (cell as XLCell).Clear(clearOptions, true); - } - - if (includeFormats) - { - ClearMerged(); - } - - if (clearOptions == XLClearOptions.ContentsAndFormats) - { - Worksheet.Internals.CellsCollection.RemoveAll( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber - ); - } - return this; - } - - public void DeleteComments() - { - Cells().DeleteComments(); - } - - public bool Contains(String rangeAddress) - { - string addressToUse = rangeAddress.Contains("!") - ? rangeAddress.Substring(rangeAddress.IndexOf("!") + 1) - : rangeAddress; - - XLAddress firstAddress; - XLAddress lastAddress; - if (addressToUse.Contains(':')) - { - var arrRange = addressToUse.Split(':'); - firstAddress = XLAddress.Create(Worksheet, arrRange[0]); - lastAddress = XLAddress.Create(Worksheet, arrRange[1]); - } - else - { - firstAddress = XLAddress.Create(Worksheet, addressToUse); - lastAddress = XLAddress.Create(Worksheet, addressToUse); - } - return Contains(firstAddress, lastAddress); - } - - public bool Contains(IXLRangeBase range) - { - return Contains((XLAddress)range.RangeAddress.FirstAddress, (XLAddress)range.RangeAddress.LastAddress); - } - - public bool Intersects(string rangeAddress) - { - using (var range = Worksheet.Range(rangeAddress)) - return Intersects(range); - } - - public bool Intersects(IXLRangeBase range) - { - if (range.RangeAddress.IsInvalid || RangeAddress.IsInvalid) - return false; - 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 virtual IXLStyle Style - { - get { return GetStyle(); } - set { Cells().ForEach(c => c.Style = value); } - } - IXLRange IXLRangeBase.AsRange() - { - return AsRange(); - } - public virtual XLRange AsRange() - { - return Worksheet.Range(RangeAddress.FirstAddress, RangeAddress.LastAddress); - } - - - - public IXLRange AddToNamed(String rangeName) - { - return AddToNamed(rangeName, XLScope.Workbook); - } - - public IXLRange AddToNamed(String rangeName, XLScope scope) - { - return AddToNamed(rangeName, scope, null); - } - - public IXLRange AddToNamed(String rangeName, XLScope scope, String comment) - { - var namedRanges = scope == XLScope.Workbook - ? Worksheet.Workbook.NamedRanges - : Worksheet.NamedRanges; - - if (namedRanges.Any(nr => String.Compare(nr.Name, rangeName, true) == 0)) - { - var namedRange = namedRanges.Single(nr => String.Compare(nr.Name, rangeName, true) == 0); - namedRange.Add(Worksheet.Workbook, RangeAddress.ToStringFixed(XLReferenceStyle.A1, true)); - } - else - namedRanges.Add(rangeName, RangeAddress.ToStringFixed(XLReferenceStyle.A1, true), comment); - return AsRange(); - } - - public IXLRangeBase SetValue(T value) - { - Cells().ForEach(c => c.SetValue(value)); - return this; - } - - public Boolean IsMerged() - { - return Cells().Any(c => c.IsMerged()); - } - - public Boolean IsEmpty() - { - return !CellsUsed().Any() || CellsUsed().Any(c => c.IsEmpty()); - } - - public Boolean IsEmpty(Boolean includeFormats) - { - return !CellsUsed(includeFormats).Cast().Any() || - CellsUsed(includeFormats).Cast().Any(c => c.IsEmpty(includeFormats)); - } - - #endregion - - #region IXLStylized Members - - public virtual IEnumerable Styles - { - get - { - UpdatingStyle = true; - foreach (IXLCell cell in Cells()) - yield return cell.Style; - UpdatingStyle = false; - } - } - - public virtual Boolean UpdatingStyle { get; set; } - - public virtual IXLStyle InnerStyle - { - get { return GetStyle(); } - set { SetStyle(value); } - } - - #endregion - - public XLCell FirstCell() - { - return Cell(1, 1); - } - - public XLCell LastCell() - { - return Cell(RowCount(), ColumnCount()); - } - - public XLCell FirstCellUsed() - { - return FirstCellUsed(false, null); - } - - public XLCell FirstCellUsed(Boolean includeFormats) - { - return FirstCellUsed(includeFormats, null); - } - - IXLCell IXLRangeBase.FirstCellUsed(Func predicate) - { - return FirstCellUsed(predicate); - } - - public XLCell FirstCellUsed(Func predicate) - { - return FirstCellUsed(false, predicate); - } - - IXLCell IXLRangeBase.FirstCellUsed(Boolean includeFormats, Func predicate) - { - return FirstCellUsed(includeFormats, predicate); - } - - public XLCell FirstCellUsed(Boolean includeFormats, Func predicate) - { - Int32 fRow = RangeAddress.FirstAddress.RowNumber; - Int32 lRow = RangeAddress.LastAddress.RowNumber; - Int32 fColumn = RangeAddress.FirstAddress.ColumnNumber; - Int32 lColumn = RangeAddress.LastAddress.ColumnNumber; - - var sp = Worksheet.Internals.CellsCollection.FirstPointUsed(fRow, fColumn, lRow, lColumn, includeFormats, predicate); - - if (includeFormats) - { - var rowsUsed = - Worksheet.Internals.RowsCollection.Where(r => r.Key >= fRow && r.Key <= lRow && !r.Value.IsEmpty(true)); - - var columnsUsed = - Worksheet.Internals.ColumnsCollection.Where(c => c.Key >= fColumn && c.Key <= lColumn && !c.Value.IsEmpty(true)); - - // If there's a row or a column then check if the style is different - // and pick the first cell and check the style of it, if different - // than default then it's your cell. - - Int32 ro = 0; - if (rowsUsed.Any()) - if (sp.Row > 0) - ro = Math.Min(sp.Row, rowsUsed.First().Key); - else - ro = rowsUsed.First().Key; - - Int32 co = 0; - if (columnsUsed.Any()) - if (sp.Column > 0) - co = Math.Min(sp.Column, columnsUsed.First().Key); - else - co = columnsUsed.First().Key; - - if (ro > 0 && co > 0) - return Worksheet.Cell(ro, co); - - if (ro > 0 && lColumn < XLHelper.MaxColumnNumber) - { - for (co = fColumn; co <= lColumn; co++) - { - var cell = Worksheet.Cell(ro, co); - if (!cell.IsEmpty(true)) return cell; - } - } - else if (co > 0 && lRow < XLHelper.MaxRowNumber) - { - for (ro = fRow; ro <= lRow; ro++) - { - var cell = Worksheet.Cell(ro, co); - if (!cell.IsEmpty(true)) return cell; - } - } - - if (Worksheet.MergedRanges.Any(r => r.Intersects(this))) - { - Int32 minRo = - Worksheet.MergedRanges.Where(r => r.Intersects(this)).Min(r => r.RangeAddress.FirstAddress.RowNumber); - Int32 minCo = - Worksheet.MergedRanges.Where(r => r.Intersects(this)).Min(r => r.RangeAddress.FirstAddress.ColumnNumber); - - return Worksheet.Cell(minRo, minCo); - } - } - - - if (sp.Row > 0) - return Worksheet.Cell(sp.Row, sp.Column); - - return null; - } - - public XLCell LastCellUsed() - { - return LastCellUsed(false, null); - } - - public XLCell LastCellUsed(Boolean includeFormats) - { - return LastCellUsed(includeFormats, null); - } - - IXLCell IXLRangeBase.LastCellUsed(Func predicate) - { - return LastCellUsed(predicate); - } - - public XLCell LastCellUsed(Func predicate) - { - return LastCellUsed(false, predicate); - } - - IXLCell IXLRangeBase.LastCellUsed(Boolean includeFormats, Func predicate) - { - return LastCellUsed(includeFormats, predicate); - } - - public XLCell LastCellUsed(Boolean includeFormats, Func predicate) - { - Int32 fRow = RangeAddress.FirstAddress.RowNumber; - Int32 lRow = RangeAddress.LastAddress.RowNumber; - Int32 fColumn = RangeAddress.FirstAddress.ColumnNumber; - Int32 lColumn = RangeAddress.LastAddress.ColumnNumber; - - var sp = Worksheet.Internals.CellsCollection.LastPointUsed(fRow, fColumn, lRow, lColumn, includeFormats, predicate); - - if (includeFormats) - { - var rowsUsed = - Worksheet.Internals.RowsCollection.Where(r => r.Key >= fRow && r.Key <= lRow && !r.Value.IsEmpty(true)); - - var columnsUsed = - Worksheet.Internals.ColumnsCollection.Where(c => c.Key >= fColumn && c.Key <= lColumn && !c.Value.IsEmpty(true)); - - // If there's a row or a column then check if the style is different - // and pick the first cell and check the style of it, if different - // than default then it's your cell. - - Int32 ro = 0; - if (rowsUsed.Any()) - ro = Math.Max(sp.Row, rowsUsed.Last().Key); - - Int32 co = 0; - if (columnsUsed.Any()) - co = Math.Max(sp.Column, columnsUsed.Last().Key); - - if (ro > 0 && co > 0) - return Worksheet.Cell(ro, co); - - if (ro > 0 && lColumn < XLHelper.MaxColumnNumber) - { - for (co = lColumn; co >= fColumn; co--) - { - var cell = Worksheet.Cell(ro, co); - if (!cell.IsEmpty(true)) return cell; - } - } - else if (co > 0 && lRow < XLHelper.MaxRowNumber) - { - for (ro = lRow; ro >= fRow; ro--) - { - var cell = Worksheet.Cell(ro, co); - if (!cell.IsEmpty(true)) return cell; - } - } - - if (Worksheet.MergedRanges.Any(r => r.Intersects(this))) - { - Int32 minRo = - Worksheet.MergedRanges.Where(r => r.Intersects(this)).Max(r => r.RangeAddress.LastAddress.RowNumber); - Int32 minCo = - Worksheet.MergedRanges.Where(r => r.Intersects(this)).Max(r => r.RangeAddress.LastAddress.ColumnNumber); - - return Worksheet.Cell(minRo, minCo); - } - } - - - if (sp.Row > 0) - return Worksheet.Cell(sp.Row, sp.Column); - - return null; - } - - public XLCell Cell(Int32 row, Int32 column) - { - return Cell(new XLAddress(Worksheet, row, column, false, false)); - } - - public XLCell Cell(String cellAddressInRange) - { - - if (XLHelper.IsValidA1Address(cellAddressInRange)) - return Cell(XLAddress.Create(Worksheet, cellAddressInRange)); - - return (XLCell)Worksheet.NamedRange(cellAddressInRange).Ranges.First().FirstCell(); - } - - public XLCell Cell(Int32 row, String column) - { - return Cell(new XLAddress(Worksheet, row, column, false, false)); - } - - public XLCell Cell(IXLAddress cellAddressInRange) - { - return Cell(cellAddressInRange.RowNumber, cellAddressInRange.ColumnNumber); - } - - public XLCell Cell(XLAddress cellAddressInRange) - { - Int32 absRow = cellAddressInRange.RowNumber + RangeAddress.FirstAddress.RowNumber - 1; - Int32 absColumn = cellAddressInRange.ColumnNumber + RangeAddress.FirstAddress.ColumnNumber - 1; - - if (absRow <= 0 || absRow > XLHelper.MaxRowNumber) - { - throw new IndexOutOfRangeException(String.Format("Row number must be between 1 and {0}", - XLHelper.MaxRowNumber)); - } - - if (absColumn <= 0 || absColumn > XLHelper.MaxColumnNumber) - { - throw new IndexOutOfRangeException(String.Format("Column number must be between 1 and {0}", - XLHelper.MaxColumnNumber)); - } - - var cell = Worksheet.Internals.CellsCollection.GetCell(absRow, - absColumn); - - if (cell != null) - return cell; - - //var style = Style; - Int32 styleId = GetStyleId(); - Int32 worksheetStyleId = Worksheet.GetStyleId(); - - if (styleId == worksheetStyleId) - { - XLRow row; - XLColumn column; - if (Worksheet.Internals.RowsCollection.TryGetValue(absRow, out row) - && row.GetStyleId() != worksheetStyleId) - styleId = row.GetStyleId(); - else if (Worksheet.Internals.ColumnsCollection.TryGetValue(absColumn, out column) - && column.GetStyleId() != worksheetStyleId) - styleId = column.GetStyleId(); - } - var absoluteAddress = new XLAddress(cellAddressInRange.Worksheet, - absRow, - absColumn, - cellAddressInRange.FixedRow, - cellAddressInRange.FixedColumn); - var newCell = new XLCell(Worksheet, absoluteAddress, styleId); - Worksheet.Internals.CellsCollection.Add(absRow, absColumn, newCell); - return newCell; - } - - public Int32 RowCount() - { - return RangeAddress.LastAddress.RowNumber - RangeAddress.FirstAddress.RowNumber + 1; - } - - public Int32 RowNumber() - { - return RangeAddress.FirstAddress.RowNumber; - } - - public Int32 ColumnCount() - { - return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; - } - - public Int32 ColumnNumber() - { - return RangeAddress.FirstAddress.ColumnNumber; - } - - public String ColumnLetter() - { - return RangeAddress.FirstAddress.ColumnLetter; - } - - public virtual XLRange Range(String rangeAddressStr) - { - var rangeAddress = new XLRangeAddress(Worksheet, rangeAddressStr); - return Range(rangeAddress); - } - - public XLRange Range(IXLCell firstCell, IXLCell lastCell) - { - var newFirstCellAddress = firstCell.Address as XLAddress; - var newLastCellAddress = lastCell.Address as XLAddress; - - return GetRange(newFirstCellAddress, newLastCellAddress); - } - - private XLRange GetRange(XLAddress newFirstCellAddress, XLAddress newLastCellAddress) - { - var newRangeAddress = new XLRangeAddress(newFirstCellAddress, newLastCellAddress); - var xlRangeParameters = new XLRangeParameters(newRangeAddress, Style); - if ( - newFirstCellAddress.RowNumber < RangeAddress.FirstAddress.RowNumber - || newFirstCellAddress.RowNumber > RangeAddress.LastAddress.RowNumber - || newLastCellAddress.RowNumber > RangeAddress.LastAddress.RowNumber - || newFirstCellAddress.ColumnNumber < RangeAddress.FirstAddress.ColumnNumber - || newFirstCellAddress.ColumnNumber > RangeAddress.LastAddress.ColumnNumber - || newLastCellAddress.ColumnNumber > RangeAddress.LastAddress.ColumnNumber - ) - { - throw new ArgumentOutOfRangeException(String.Format( - "The cells {0} and {1} are outside the range '{2}'.", - newFirstCellAddress, - newLastCellAddress, - ToString())); - } - - return new XLRange(xlRangeParameters); - } - - public XLRange Range(String firstCellAddress, String lastCellAddress) - { - var rangeAddress = new XLRangeAddress(XLAddress.Create(Worksheet, firstCellAddress), - XLAddress.Create(Worksheet, lastCellAddress)); - return Range(rangeAddress); - } - - public XLRange Range(Int32 firstCellRow, Int32 firstCellColumn, Int32 lastCellRow, Int32 lastCellColumn) - { - var rangeAddress = new XLRangeAddress(new XLAddress(Worksheet, firstCellRow, firstCellColumn, false, false), - new XLAddress(Worksheet, lastCellRow, lastCellColumn, false, false)); - return Range(rangeAddress); - } - - public XLRange Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress) - { - var rangeAddress = new XLRangeAddress(firstCellAddress as XLAddress, lastCellAddress as XLAddress); - return Range(rangeAddress); - } - - public XLRange Range(IXLRangeAddress rangeAddress) - { - - var newFirstCellAddress = new XLAddress((XLWorksheet)rangeAddress.FirstAddress.Worksheet, - rangeAddress.FirstAddress.RowNumber + RangeAddress.FirstAddress.RowNumber - 1, - rangeAddress.FirstAddress.ColumnNumber + RangeAddress.FirstAddress.ColumnNumber - 1, - rangeAddress.FirstAddress.FixedRow, - rangeAddress.FirstAddress.FixedColumn); - - newFirstCellAddress.FixedRow = rangeAddress.FirstAddress.FixedRow; - newFirstCellAddress.FixedColumn = rangeAddress.FirstAddress.FixedColumn; - - var newLastCellAddress = new XLAddress((XLWorksheet)rangeAddress.LastAddress.Worksheet, - rangeAddress.LastAddress.RowNumber + RangeAddress.FirstAddress.RowNumber - 1, - rangeAddress.LastAddress.ColumnNumber + RangeAddress.FirstAddress.ColumnNumber - 1, - rangeAddress.LastAddress.FixedRow, - rangeAddress.LastAddress.FixedColumn); - - newLastCellAddress.FixedRow = rangeAddress.LastAddress.FixedRow; - newLastCellAddress.FixedColumn = rangeAddress.LastAddress.FixedColumn; - - return GetRange(newFirstCellAddress, newLastCellAddress); - } - - public IXLRanges Ranges(String ranges) - { - var retVal = new XLRanges(); - var rangePairs = ranges.Split(','); - foreach (string pair in rangePairs) - retVal.Add(Range(pair.Trim())); - return retVal; - } - - public IXLRanges Ranges(params String[] ranges) - { - var retVal = new XLRanges(); - foreach (string pair in ranges) - retVal.Add(Range(pair)); - return retVal; - } - - protected String FixColumnAddress(String address) - { - Int32 test; - if (Int32.TryParse(address, out test)) - return "A" + address; - return address; - } - - protected String FixRowAddress(String address) - { - Int32 test; - if (Int32.TryParse(address, out test)) - return XLHelper.GetColumnLetterFromNumber(test) + "1"; - return address; - } - - public IXLCells CellsUsed(bool includeFormats) - { - var cells = new XLCells(true, includeFormats) { RangeAddress }; - return cells; - } - - public IXLCells CellsUsed(Func predicate) - { - var cells = new XLCells(true, false, predicate) { RangeAddress }; - return cells; - } - - public IXLCells CellsUsed(Boolean includeFormats, Func predicate) - { - var cells = new XLCells(true, includeFormats, predicate) { RangeAddress }; - return cells; - } - - public IXLRangeColumns InsertColumnsAfter(Int32 numberOfColumns) - { - return InsertColumnsAfter(numberOfColumns, true); - } - - public IXLRangeColumns InsertColumnsAfter(Int32 numberOfColumns, Boolean expandRange) - { - var retVal = InsertColumnsAfter(false, numberOfColumns); - // Adjust the range - if (expandRange) - { - RangeAddress = new XLRangeAddress( - new XLAddress(Worksheet, - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.FirstAddress.FixedRow, - RangeAddress.FirstAddress.FixedColumn), - new XLAddress(Worksheet, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber + numberOfColumns, - RangeAddress.LastAddress.FixedRow, - RangeAddress.LastAddress.FixedColumn)); - } - return retVal; - } - - public IXLRangeColumns InsertColumnsAfter(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) - { - return InsertColumnsAfterInternal(onlyUsedCells, numberOfColumns, formatFromLeft); - } - - public void InsertColumnsAfterVoid(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) - { - InsertColumnsAfterInternal(onlyUsedCells, numberOfColumns, formatFromLeft, nullReturn: true); - } - - private IXLRangeColumns InsertColumnsAfterInternal(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true, Boolean nullReturn = false) - { - int columnCount = ColumnCount(); - int firstColumn = RangeAddress.FirstAddress.ColumnNumber + columnCount; - if (firstColumn > XLHelper.MaxColumnNumber) - firstColumn = XLHelper.MaxColumnNumber; - int lastColumn = firstColumn + ColumnCount() - 1; - if (lastColumn > XLHelper.MaxColumnNumber) - lastColumn = XLHelper.MaxColumnNumber; - - int firstRow = RangeAddress.FirstAddress.RowNumber; - int lastRow = firstRow + RowCount() - 1; - if (lastRow > XLHelper.MaxRowNumber) - lastRow = XLHelper.MaxRowNumber; - - var newRange = Worksheet.Range(firstRow, firstColumn, lastRow, lastColumn); - return newRange.InsertColumnsBeforeInternal(onlyUsedCells, numberOfColumns, formatFromLeft, nullReturn); - } - - public IXLRangeColumns InsertColumnsBefore(Int32 numberOfColumns) - { - return InsertColumnsBefore(numberOfColumns, false); - } - - public IXLRangeColumns InsertColumnsBefore(Int32 numberOfColumns, Boolean expandRange) - { - var retVal = InsertColumnsBefore(false, numberOfColumns); - // Adjust the range - if (expandRange) - { - RangeAddress = new XLRangeAddress( - new XLAddress(Worksheet, - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber - numberOfColumns, - RangeAddress.FirstAddress.FixedRow, - RangeAddress.FirstAddress.FixedColumn), - new XLAddress(Worksheet, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber, - RangeAddress.LastAddress.FixedRow, - RangeAddress.LastAddress.FixedColumn)); - } - return retVal; - } - - public IXLRangeColumns InsertColumnsBefore(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) - { - return InsertColumnsBeforeInternal(onlyUsedCells, numberOfColumns, formatFromLeft); - } - - public void InsertColumnsBeforeVoid(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) - { - InsertColumnsBeforeInternal(onlyUsedCells, numberOfColumns, formatFromLeft, nullReturn: true); - } - - private IXLRangeColumns InsertColumnsBeforeInternal(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true, Boolean nullReturn = false) - { - foreach (XLWorksheet ws in Worksheet.Workbook.WorksheetsInternal) - { - foreach (XLCell cell in ws.Internals.CellsCollection.GetCells(c => !XLHelper.IsNullOrWhiteSpace(c.FormulaA1))) - using (var asRange = AsRange()) - cell.ShiftFormulaColumns(asRange, numberOfColumns); - } - - - var cellsDataValidations = new Dictionary(); - var cellsToInsert = new Dictionary(); - var cellsToDelete = new List(); - int firstColumn = RangeAddress.FirstAddress.ColumnNumber; - int firstRow = RangeAddress.FirstAddress.RowNumber; - int lastRow = RangeAddress.FirstAddress.RowNumber + RowCount() - 1; - - if (!onlyUsedCells) - { - int lastColumn = Worksheet.Internals.CellsCollection.MaxColumnUsed; - if (lastColumn > 0) - { - for (int co = lastColumn; co >= firstColumn; co--) - { - for (int ro = lastRow; ro >= firstRow; ro--) - { - var oldKey = new XLAddress(Worksheet, ro, co, false, false); - int newColumn = co + numberOfColumns; - var newKey = new XLAddress(Worksheet, ro, newColumn, false, false); - var oldCell = Worksheet.Internals.CellsCollection.GetCell(ro, co) ?? - Worksheet.Cell(oldKey); - - var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); - newCell.CopyValuesFrom(oldCell); - newCell.FormulaA1 = oldCell.FormulaA1; - cellsToInsert.Add(newKey, newCell); - cellsToDelete.Add(oldKey); - } - } - } - } - else - { - foreach ( - XLCell c in - Worksheet.Internals.CellsCollection.GetCells(firstRow, firstColumn, lastRow, - Worksheet.Internals.CellsCollection.MaxColumnUsed)) - { - int newColumn = c.Address.ColumnNumber + numberOfColumns; - var newKey = new XLAddress(Worksheet, c.Address.RowNumber, newColumn, false, false); - var newCell = new XLCell(Worksheet, newKey, c.GetStyleId()); - newCell.CopyValuesFrom(c); - if (c.HasDataValidation) - { - cellsDataValidations.Add(newCell.Address, - new DataValidationToCopy - { DataValidation = c.DataValidation, SourceAddress = c.Address }); - c.DataValidation.Clear(); - } - newCell.FormulaA1 = c.FormulaA1; - cellsToInsert.Add(newKey, newCell); - cellsToDelete.Add(c.Address); - } - } - - cellsDataValidations.ForEach(kp => - { - XLCell targetCell; - if (!cellsToInsert.TryGetValue(kp.Key, out targetCell)) - targetCell = Worksheet.Cell(kp.Key); - - targetCell.CopyDataValidation(Worksheet.Cell(kp.Value.SourceAddress), kp.Value.DataValidation); - }); - - cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c.RowNumber, c.ColumnNumber)); - cellsToInsert.ForEach( - c => Worksheet.Internals.CellsCollection.Add(c.Key.RowNumber, c.Key.ColumnNumber, c.Value)); - //cellsDataValidations.ForEach(kp => Worksheet.Cell(kp.Key).CopyDataValidation(Worksheet.Cell(kp.Value.SourceAddress), kp.Value.DataValidation)); - - Int32 firstRowReturn = RangeAddress.FirstAddress.RowNumber; - Int32 lastRowReturn = RangeAddress.LastAddress.RowNumber; - Int32 firstColumnReturn = RangeAddress.FirstAddress.ColumnNumber; - Int32 lastColumnReturn = RangeAddress.FirstAddress.ColumnNumber + numberOfColumns - 1; - - Worksheet.BreakConditionalFormatsIntoCells(cellsToDelete.Except(cellsToInsert.Keys).ToList()); - using (var asRange = AsRange()) - Worksheet.NotifyRangeShiftedColumns(asRange, numberOfColumns); - - var rangeToReturn = Worksheet.Range(firstRowReturn, firstColumnReturn, lastRowReturn, lastColumnReturn); - - if (formatFromLeft && rangeToReturn.RangeAddress.FirstAddress.ColumnNumber > 1) - { - using (var firstColumnUsed = rangeToReturn.FirstColumn()) - { - using (var model = firstColumnUsed.ColumnLeft()) - { - var modelFirstRow = model.FirstCellUsed(true); - var modelLastRow = model.LastCellUsed(true); - if (modelLastRow != null) - { - Int32 firstRoReturned = modelFirstRow.Address.RowNumber - - model.RangeAddress.FirstAddress.RowNumber + 1; - Int32 lastRoReturned = modelLastRow.Address.RowNumber - - model.RangeAddress.FirstAddress.RowNumber + 1; - for (Int32 ro = firstRoReturned; ro <= lastRoReturned; ro++) - { - rangeToReturn.Row(ro).Style = model.Cell(ro).Style; - } - } - } - } - } - else - { - var lastRoUsed = rangeToReturn.LastRowUsed(true); - if (lastRoUsed != null) - { - Int32 lastRoReturned = lastRoUsed.RowNumber(); - for (Int32 ro = 1; ro <= lastRoReturned; ro++) - { - var styleToUse = Worksheet.Internals.RowsCollection.ContainsKey(ro) - ? Worksheet.Internals.RowsCollection[ro].Style - : Worksheet.Style; - rangeToReturn.Row(ro).Style = styleToUse; - } - - } - } - - if (nullReturn) - return null; - - return rangeToReturn.Columns(); - } - - public IXLRangeRows InsertRowsBelow(Int32 numberOfRows) - { - return InsertRowsBelow(numberOfRows, true); - } - - public IXLRangeRows InsertRowsBelow(Int32 numberOfRows, Boolean expandRange) - { - var retVal = InsertRowsBelow(false, numberOfRows); - // Adjust the range - if (expandRange) - { - RangeAddress = new XLRangeAddress( - new XLAddress(Worksheet, - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.FirstAddress.FixedRow, - RangeAddress.FirstAddress.FixedColumn), - new XLAddress(Worksheet, - RangeAddress.LastAddress.RowNumber + numberOfRows, - RangeAddress.LastAddress.ColumnNumber, - RangeAddress.LastAddress.FixedRow, - RangeAddress.LastAddress.FixedColumn)); - } - return retVal; - } - - public IXLRangeRows InsertRowsBelow(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) - { - return InsertRowsBelowInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: false); - } - - public void InsertRowsBelowVoid(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) - { - InsertRowsBelowInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: true); - } - - private IXLRangeRows InsertRowsBelowInternal(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove, Boolean nullReturn) - { - int rowCount = RowCount(); - int firstRow = RangeAddress.FirstAddress.RowNumber + rowCount; - if (firstRow > XLHelper.MaxRowNumber) - firstRow = XLHelper.MaxRowNumber; - int lastRow = firstRow + RowCount() - 1; - if (lastRow > XLHelper.MaxRowNumber) - lastRow = XLHelper.MaxRowNumber; - - int firstColumn = RangeAddress.FirstAddress.ColumnNumber; - int lastColumn = firstColumn + ColumnCount() - 1; - if (lastColumn > XLHelper.MaxColumnNumber) - lastColumn = XLHelper.MaxColumnNumber; - - var newRange = Worksheet.Range(firstRow, firstColumn, lastRow, lastColumn); - return newRange.InsertRowsAboveInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn); - } - - public IXLRangeRows InsertRowsAbove(Int32 numberOfRows) - { - return InsertRowsAbove(numberOfRows, false); - } - - public IXLRangeRows InsertRowsAbove(Int32 numberOfRows, Boolean expandRange) - { - var retVal = InsertRowsAbove(false, numberOfRows); - // Adjust the range - if (expandRange) - { - RangeAddress = new XLRangeAddress( - new XLAddress(Worksheet, - RangeAddress.FirstAddress.RowNumber - numberOfRows, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.FirstAddress.FixedRow, - RangeAddress.FirstAddress.FixedColumn), - new XLAddress(Worksheet, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber, - RangeAddress.LastAddress.FixedRow, - RangeAddress.LastAddress.FixedColumn)); - } - return retVal; - } - - struct DataValidationToCopy - { - public XLAddress SourceAddress; - public XLDataValidation DataValidation; - } - public void InsertRowsAboveVoid(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) - { - InsertRowsAboveInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: true); - } - public IXLRangeRows InsertRowsAbove(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) - { - return InsertRowsAboveInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: false); - } - - private IXLRangeRows InsertRowsAboveInternal(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove, Boolean nullReturn) - { - using (var asRange = AsRange()) - foreach (XLWorksheet ws in Worksheet.Workbook.WorksheetsInternal) - { - foreach (XLCell cell in ws.Internals.CellsCollection.GetCells(c => !XLHelper.IsNullOrWhiteSpace(c.FormulaA1))) - cell.ShiftFormulaRows(asRange, numberOfRows); - } - - var cellsToInsert = new Dictionary(); - var cellsToDelete = new List(); - var cellsDataValidations = new Dictionary(); - int firstRow = RangeAddress.FirstAddress.RowNumber; - int firstColumn = RangeAddress.FirstAddress.ColumnNumber; - int lastColumn = Math.Min( - RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1, - Worksheet.Internals.CellsCollection.MaxColumnUsed); - - if (!onlyUsedCells) - { - int lastRow = Worksheet.Internals.CellsCollection.MaxRowUsed; - if (lastRow > 0) - { - for (int ro = lastRow; ro >= firstRow; ro--) - { - for (int co = lastColumn; co >= firstColumn; co--) - { - var oldKey = new XLAddress(Worksheet, ro, co, false, false); - int newRow = ro + numberOfRows; - var newKey = new XLAddress(Worksheet, newRow, co, false, false); - var oldCell = Worksheet.Internals.CellsCollection.GetCell(ro, co); - if (oldCell != null) - { - var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); - newCell.CopyValuesFrom(oldCell); - newCell.FormulaA1 = oldCell.FormulaA1; - cellsToInsert.Add(newKey, newCell); - cellsToDelete.Add(oldKey); - } - } - } - } - } - else - { - foreach ( - XLCell c in - Worksheet.Internals.CellsCollection.GetCells(firstRow, firstColumn, - Worksheet.Internals.CellsCollection.MaxRowUsed, - lastColumn)) - { - int newRow = c.Address.RowNumber + numberOfRows; - var newKey = new XLAddress(Worksheet, newRow, c.Address.ColumnNumber, false, false); - var newCell = new XLCell(Worksheet, newKey, c.GetStyleId()); - newCell.CopyValuesFrom(c); - if (c.HasDataValidation) - { - cellsDataValidations.Add(newCell.Address, - new DataValidationToCopy - { DataValidation = c.DataValidation, SourceAddress = c.Address }); - c.DataValidation.Clear(); - } - newCell.FormulaA1 = c.FormulaA1; - cellsToInsert.Add(newKey, newCell); - cellsToDelete.Add(c.Address); - - } - } - - cellsDataValidations - .ForEach(kp => - { - XLCell targetCell; - if (!cellsToInsert.TryGetValue(kp.Key, out targetCell)) - targetCell = Worksheet.Cell(kp.Key); - - targetCell.CopyDataValidation( - Worksheet.Cell(kp.Value.SourceAddress), kp.Value.DataValidation); - }); - - cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c.RowNumber, c.ColumnNumber)); - cellsToInsert.ForEach(c => Worksheet.Internals.CellsCollection.Add(c.Key.RowNumber, c.Key.ColumnNumber, c.Value)); - - - Int32 firstRowReturn = RangeAddress.FirstAddress.RowNumber; - Int32 lastRowReturn = RangeAddress.FirstAddress.RowNumber + numberOfRows - 1; - Int32 firstColumnReturn = RangeAddress.FirstAddress.ColumnNumber; - Int32 lastColumnReturn = RangeAddress.LastAddress.ColumnNumber; - - Worksheet.BreakConditionalFormatsIntoCells(cellsToDelete.Except(cellsToInsert.Keys).ToList()); - using (var asRange = AsRange()) - Worksheet.NotifyRangeShiftedRows(asRange, numberOfRows); - - var rangeToReturn = Worksheet.Range(firstRowReturn, firstColumnReturn, lastRowReturn, lastColumnReturn); - - if (formatFromAbove && rangeToReturn.RangeAddress.FirstAddress.RowNumber > 1) - { - using (var fr = rangeToReturn.FirstRow()) - { - using (var model = fr.RowAbove()) - { - var modelFirstColumn = model.FirstCellUsed(true); - var modelLastColumn = model.LastCellUsed(true); - if (modelFirstColumn != null && modelLastColumn != null) - { - Int32 firstCoReturned = modelFirstColumn.Address.ColumnNumber - - model.RangeAddress.FirstAddress.ColumnNumber + 1; - Int32 lastCoReturned = modelLastColumn.Address.ColumnNumber - - model.RangeAddress.FirstAddress.ColumnNumber + 1; - for (Int32 co = firstCoReturned; co <= lastCoReturned; co++) - { - rangeToReturn.Column(co).Style = model.Cell(co).Style; - } - } - } - } - } - else - { - var lastCoUsed = rangeToReturn.LastColumnUsed(true); - if (lastCoUsed != null) - { - Int32 lastCoReturned = lastCoUsed.ColumnNumber(); - for (Int32 co = 1; co <= lastCoReturned; co++) - { - var styleToUse = Worksheet.Internals.ColumnsCollection.ContainsKey(co) - ? Worksheet.Internals.ColumnsCollection[co].Style - : Worksheet.Style; - rangeToReturn.Column(co).Style = styleToUse; - } - } - } - - // Skip calling .Rows() for performance reasons if required. - if (nullReturn) - return null; - - return rangeToReturn.Rows(); - } - - private void ClearMerged() - { - var mergeToDelete = Worksheet.Internals.MergedRanges.Where(Intersects).ToList(); - mergeToDelete.ForEach(m => Worksheet.Internals.MergedRanges.Remove(m)); - } - - public Boolean Contains(IXLCell cell) - { - return Contains(cell.Address as XLAddress); - } - - public bool Contains(XLAddress first, XLAddress last) - { - return Contains(first) && Contains(last); - } - - public bool Contains(XLAddress address) - { - return RangeAddress.FirstAddress.RowNumber <= address.RowNumber && - address.RowNumber <= RangeAddress.LastAddress.RowNumber && - RangeAddress.FirstAddress.ColumnNumber <= address.ColumnNumber && - address.ColumnNumber <= RangeAddress.LastAddress.ColumnNumber; - } - - public void Delete(XLShiftDeletedCells shiftDeleteCells) - { - int numberOfRows = RowCount(); - int numberOfColumns = ColumnCount(); - IXLRange shiftedRangeFormula = Worksheet.Range( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber); - - - foreach ( - XLCell cell in - Worksheet.Workbook.Worksheets.Cast().SelectMany( - xlWorksheet => (xlWorksheet).Internals.CellsCollection.GetCells( - c => !XLHelper.IsNullOrWhiteSpace(c.FormulaA1)))) - { - if (shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp) - cell.ShiftFormulaRows((XLRange)shiftedRangeFormula, numberOfRows * -1); - else - cell.ShiftFormulaColumns((XLRange)shiftedRangeFormula, numberOfColumns * -1); - } - - // Range to shift... - var cellsToInsert = new Dictionary(); - //var cellsDataValidations = new Dictionary(); - var cellsToDelete = new List(); - var shiftLeftQuery = Worksheet.Internals.CellsCollection.GetCells( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.LastAddress.RowNumber, - Worksheet.Internals.CellsCollection.MaxColumnUsed); - - var shiftUpQuery = Worksheet.Internals.CellsCollection.GetCells( - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber, - Worksheet.Internals.CellsCollection.MaxRowUsed, - RangeAddress.LastAddress.ColumnNumber); - - - int columnModifier = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft ? ColumnCount() : 0; - int rowModifier = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp ? RowCount() : 0; - var cellsQuery = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft ? shiftLeftQuery : shiftUpQuery; - foreach (XLCell c in cellsQuery) - { - var newKey = new XLAddress(Worksheet, c.Address.RowNumber - rowModifier, - c.Address.ColumnNumber - columnModifier, - false, false); - var newCell = new XLCell(Worksheet, newKey, c.GetStyleId()); - newCell.CopyValuesFrom(c); - newCell.FormulaA1 = c.FormulaA1; - cellsToDelete.Add(c.Address); - - bool canInsert = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft - ? c.Address.ColumnNumber > RangeAddress.LastAddress.ColumnNumber - : c.Address.RowNumber > RangeAddress.LastAddress.RowNumber; - - if (canInsert) - cellsToInsert.Add(newKey, newCell); - } - - - cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c.RowNumber, c.ColumnNumber)); - cellsToInsert.ForEach( - c => Worksheet.Internals.CellsCollection.Add(c.Key.RowNumber, c.Key.ColumnNumber, c.Value)); - - var mergesToRemove = Worksheet.Internals.MergedRanges.Where(Contains).ToList(); - mergesToRemove.ForEach(r => Worksheet.Internals.MergedRanges.Remove(r)); - - var hyperlinksToRemove = Worksheet.Hyperlinks.Where(hl => Contains(hl.Cell.AsRange())).ToList(); - hyperlinksToRemove.ForEach(hl => Worksheet.Hyperlinks.Delete(hl)); - - Worksheet.BreakConditionalFormatsIntoCells(cellsToDelete.Except(cellsToInsert.Keys).ToList()); - using (var shiftedRange = AsRange()) - { - if (shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp) - Worksheet.NotifyRangeShiftedRows(shiftedRange, rowModifier * -1); - else - Worksheet.NotifyRangeShiftedColumns(shiftedRange, columnModifier * -1); - } - } - - public override string ToString() - { - return String.Format("'{0}'!{1}:{2}", Worksheet.Name, RangeAddress.FirstAddress, RangeAddress.LastAddress); - } - - protected void ShiftColumns(IXLRangeAddress thisRangeAddress, XLRange shiftedRange, int columnsShifted) - { - if (thisRangeAddress.IsInvalid || shiftedRange.RangeAddress.IsInvalid) return; - - if ((columnsShifted < 0 - // all columns - && - thisRangeAddress.FirstAddress.ColumnNumber >= shiftedRange.RangeAddress.FirstAddress.ColumnNumber - && - thisRangeAddress.LastAddress.ColumnNumber <= - shiftedRange.RangeAddress.FirstAddress.ColumnNumber - columnsShifted - // all rows - && thisRangeAddress.FirstAddress.RowNumber >= shiftedRange.RangeAddress.FirstAddress.RowNumber - && thisRangeAddress.LastAddress.RowNumber <= shiftedRange.RangeAddress.LastAddress.RowNumber - ) || ( - shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= - thisRangeAddress.FirstAddress.ColumnNumber - && - shiftedRange.RangeAddress.FirstAddress.RowNumber <= thisRangeAddress.FirstAddress.RowNumber - && - shiftedRange.RangeAddress.LastAddress.RowNumber >= thisRangeAddress.LastAddress.RowNumber - && shiftedRange.ColumnCount() > - (thisRangeAddress.LastAddress.ColumnNumber - thisRangeAddress.FirstAddress.ColumnNumber + 1) - + - (thisRangeAddress.FirstAddress.ColumnNumber - - shiftedRange.RangeAddress.FirstAddress.ColumnNumber))) - thisRangeAddress.IsInvalid = true; - else - { - if (shiftedRange.RangeAddress.FirstAddress.RowNumber <= thisRangeAddress.FirstAddress.RowNumber - && shiftedRange.RangeAddress.LastAddress.RowNumber >= thisRangeAddress.LastAddress.RowNumber) - { - if ( - (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= - thisRangeAddress.FirstAddress.ColumnNumber && - columnsShifted > 0) - || - (shiftedRange.RangeAddress.FirstAddress.ColumnNumber < - thisRangeAddress.FirstAddress.ColumnNumber && - columnsShifted < 0) - ) - { - thisRangeAddress.FirstAddress = new XLAddress(Worksheet, - thisRangeAddress.FirstAddress.RowNumber, - thisRangeAddress.FirstAddress.ColumnNumber + - columnsShifted, - thisRangeAddress.FirstAddress.FixedRow, - thisRangeAddress.FirstAddress.FixedColumn); - } - - if (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= - thisRangeAddress.LastAddress.ColumnNumber) - { - thisRangeAddress.LastAddress = new XLAddress(Worksheet, - thisRangeAddress.LastAddress.RowNumber, - thisRangeAddress.LastAddress.ColumnNumber + - columnsShifted, - thisRangeAddress.LastAddress.FixedRow, - thisRangeAddress.LastAddress.FixedColumn); - } - } - } - } - - protected void ShiftRows(IXLRangeAddress thisRangeAddress, XLRange shiftedRange, int rowsShifted) - { - if (thisRangeAddress.IsInvalid || shiftedRange.RangeAddress.IsInvalid) return; - - if ((rowsShifted < 0 - // all columns - && thisRangeAddress.FirstAddress.ColumnNumber >= shiftedRange.RangeAddress.FirstAddress.ColumnNumber - && thisRangeAddress.LastAddress.ColumnNumber <= shiftedRange.RangeAddress.FirstAddress.ColumnNumber - // all rows - && thisRangeAddress.FirstAddress.RowNumber >= shiftedRange.RangeAddress.FirstAddress.RowNumber - && thisRangeAddress.LastAddress.RowNumber <= shiftedRange.RangeAddress.LastAddress.RowNumber - rowsShifted - ) || ( - shiftedRange.RangeAddress.FirstAddress.RowNumber <= thisRangeAddress.FirstAddress.RowNumber - && shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= thisRangeAddress.FirstAddress.ColumnNumber - && shiftedRange.RangeAddress.LastAddress.ColumnNumber >= thisRangeAddress.LastAddress.ColumnNumber - && shiftedRange.RowCount() > - (thisRangeAddress.LastAddress.RowNumber - thisRangeAddress.FirstAddress.RowNumber + 1) - + (thisRangeAddress.FirstAddress.RowNumber - shiftedRange.RangeAddress.FirstAddress.RowNumber))) - thisRangeAddress.IsInvalid = true; - else - { - if (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= thisRangeAddress.FirstAddress.ColumnNumber - && shiftedRange.RangeAddress.LastAddress.ColumnNumber >= thisRangeAddress.LastAddress.ColumnNumber) - { - if ( - (shiftedRange.RangeAddress.FirstAddress.RowNumber <= thisRangeAddress.FirstAddress.RowNumber && rowsShifted > 0) - || (shiftedRange.RangeAddress.FirstAddress.RowNumber < thisRangeAddress.FirstAddress.RowNumber && rowsShifted < 0) - ) - { - thisRangeAddress.FirstAddress = new XLAddress(Worksheet, - thisRangeAddress.FirstAddress.RowNumber + - rowsShifted, - thisRangeAddress.FirstAddress.ColumnNumber, - thisRangeAddress.FirstAddress.FixedRow, - thisRangeAddress.FirstAddress.FixedColumn); - } - - if (shiftedRange.RangeAddress.FirstAddress.RowNumber <= thisRangeAddress.LastAddress.RowNumber) - { - thisRangeAddress.LastAddress = new XLAddress(Worksheet, - thisRangeAddress.LastAddress.RowNumber + - rowsShifted, - thisRangeAddress.LastAddress.ColumnNumber, - thisRangeAddress.LastAddress.FixedRow, - thisRangeAddress.LastAddress.FixedColumn); - } - } - } - } - - public IXLRange RangeUsed() - { - return RangeUsed(false); - } - - public IXLRange RangeUsed(bool includeFormats) - { - var firstCell = FirstCellUsed(includeFormats); - if (firstCell == null) - return null; - var lastCell = LastCellUsed(includeFormats); - return Worksheet.Range(firstCell, lastCell); - } - - public virtual void CopyTo(IXLRangeBase target) - { - CopyTo(target.FirstCell()); - } - - public virtual void CopyTo(IXLCell target) - { - target.Value = this; - } - - //public IXLChart CreateChart(Int32 firstRow, Int32 firstColumn, Int32 lastRow, Int32 lastColumn) - //{ - // IXLChart chart = new XLChartWorksheet; - // chart.FirstRow = firstRow; - // chart.LastRow = lastRow; - // chart.LastColumn = lastColumn; - // chart.FirstColumn = firstColumn; - // Worksheet.Charts.Add(chart); - // return chart; - //} - - - IXLPivotTable IXLRangeBase.CreatePivotTable(IXLCell targetCell) - { - return CreatePivotTable(targetCell); - } - IXLPivotTable IXLRangeBase.CreatePivotTable(IXLCell targetCell, String name) - { - return CreatePivotTable(targetCell, name); - } - - - public XLPivotTable CreatePivotTable(IXLCell targetCell) - { - return CreatePivotTable(targetCell, Guid.NewGuid().ToString()); - } - - public XLPivotTable CreatePivotTable(IXLCell targetCell, String name) - { - return (XLPivotTable)Worksheet.PivotTables.AddNew(name, targetCell, AsRange()); - } - - public IXLAutoFilter SetAutoFilter() - { - using (var asRange = AsRange()) - return Worksheet.AutoFilter.Set(asRange); - } - - #region Sort - - public IXLSortElements SortRows - { - get { return _sortRows ?? (_sortRows = new XLSortElements()); } - } - - public IXLSortElements SortColumns - { - get { return _sortColumns ?? (_sortColumns = new XLSortElements()); } - } - - public IXLRangeBase Sort() - { - if (!SortColumns.Any()) - { - String columnsToSortBy = String.Empty; - Int32 maxColumn = ColumnCount(); - if (maxColumn == XLHelper.MaxColumnNumber) - maxColumn = LastCellUsed(true).Address.ColumnNumber; - for (int i = 1; i <= maxColumn; i++) - { - columnsToSortBy += i + ","; - } - columnsToSortBy = columnsToSortBy.Substring(0, columnsToSortBy.Length - 1); - return Sort(columnsToSortBy); - } - - SortRangeRows(); - return this; - } - - public IXLRangeBase Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) - { - SortColumns.Clear(); - if (XLHelper.IsNullOrWhiteSpace(columnsToSortBy)) - { - columnsToSortBy = String.Empty; - Int32 maxColumn = ColumnCount(); - if (maxColumn == XLHelper.MaxColumnNumber) - maxColumn = LastCellUsed(true).Address.ColumnNumber; - for (int i = 1; i <= maxColumn; i++) - { - columnsToSortBy += i + ","; - } - columnsToSortBy = columnsToSortBy.Substring(0, columnsToSortBy.Length - 1); - } - - foreach (string coPairTrimmed in columnsToSortBy.Split(',').Select(coPair => coPair.Trim())) - { - String coString; - String order; - if (coPairTrimmed.Contains(' ')) - { - var pair = coPairTrimmed.Split(' '); - coString = pair[0]; - order = pair[1]; - } - else - { - coString = coPairTrimmed; - order = sortOrder == XLSortOrder.Ascending ? "ASC" : "DESC"; - } - - Int32 co; - if (!Int32.TryParse(coString, out co)) - co = XLHelper.GetColumnNumberFromLetter(coString); - - SortColumns.Add(co, String.Compare(order, "ASC", true) == 0 ? XLSortOrder.Ascending : XLSortOrder.Descending, ignoreBlanks, matchCase); - } - - SortRangeRows(); - return this; - } - - public IXLRangeBase Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) - { - return Sort(columnToSortBy.ToString(), sortOrder, matchCase, ignoreBlanks); - } - - public IXLRangeBase SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) - { - SortRows.Clear(); - Int32 maxColumn = ColumnCount(); - if (maxColumn == XLHelper.MaxColumnNumber) - maxColumn = LastCellUsed(true).Address.ColumnNumber; - - for (int i = 1; i <= maxColumn; i++) - { - SortRows.Add(i, sortOrder, ignoreBlanks, matchCase); - } - - SortRangeColumns(); - return this; - } - - - #region Sort Rows - - private void SortRangeRows() - { - Int32 maxRow = RowCount(); - if (maxRow == XLHelper.MaxRowNumber) - maxRow = LastCellUsed(true).Address.RowNumber; - - SortingRangeRows(1, maxRow); - } - - private void SwapRows(Int32 row1, Int32 row2) - { - int row1InWs = RangeAddress.FirstAddress.RowNumber + row1 - 1; - int row2InWs = RangeAddress.FirstAddress.RowNumber + row2 - 1; - - Int32 firstColumn = RangeAddress.FirstAddress.ColumnNumber; - Int32 lastColumn = RangeAddress.LastAddress.ColumnNumber; - - var range1Sp1 = new XLSheetPoint(row1InWs, firstColumn); - var range1Sp2 = new XLSheetPoint(row1InWs, lastColumn); - var range2Sp1 = new XLSheetPoint(row2InWs, firstColumn); - var range2Sp2 = new XLSheetPoint(row2InWs, lastColumn); - - Worksheet.Internals.CellsCollection.SwapRanges(new XLSheetRange(range1Sp1, range1Sp2), - new XLSheetRange(range2Sp1, range2Sp2), Worksheet); - } - - private int SortRangeRows(int begPoint, int endPoint) - { - int pivot = begPoint; - int m = begPoint + 1; - int n = endPoint; - while ((m < endPoint) && RowQuick(pivot).CompareTo(RowQuick(m), SortColumns) >= 0) - m++; - - while (n > begPoint && RowQuick(pivot).CompareTo(RowQuick(n), SortColumns) <= 0) - n--; - while (m < n) - { - SwapRows(m, n); - - while (m < endPoint && RowQuick(pivot).CompareTo(RowQuick(m), SortColumns) >= 0) - m++; - - while (n > begPoint && RowQuick(pivot).CompareTo(RowQuick(n), SortColumns) <= 0) - n--; - } - if (pivot != n) - SwapRows(n, pivot); - return n; - } - - private void SortingRangeRows(int beg, int end) - { - if (end == beg) - return; - int pivot = SortRangeRows(beg, end); - if (pivot > beg) - SortingRangeRows(beg, pivot - 1); - if (pivot < end) - SortingRangeRows(pivot + 1, end); - } - - #endregion - - #region Sort Columns - - private void SortRangeColumns() - { - Int32 maxColumn = ColumnCount(); - if (maxColumn == XLHelper.MaxColumnNumber) - maxColumn = LastCellUsed(true).Address.ColumnNumber; - SortingRangeColumns(1, maxColumn); - } - - private void SwapColumns(Int32 column1, Int32 column2) - { - int col1InWs = RangeAddress.FirstAddress.ColumnNumber + column1 - 1; - int col2InWs = RangeAddress.FirstAddress.ColumnNumber + column2 - 1; - - Int32 firstRow = RangeAddress.FirstAddress.RowNumber; - Int32 lastRow = RangeAddress.LastAddress.RowNumber; - - var range1Sp1 = new XLSheetPoint(firstRow, col1InWs); - var range1Sp2 = new XLSheetPoint(lastRow, col1InWs); - var range2Sp1 = new XLSheetPoint(firstRow, col2InWs); - var range2Sp2 = new XLSheetPoint(lastRow, col2InWs); - - Worksheet.Internals.CellsCollection.SwapRanges(new XLSheetRange(range1Sp1, range1Sp2), - new XLSheetRange(range2Sp1, range2Sp2), Worksheet); - } - - private int SortRangeColumns(int begPoint, int endPoint) - { - int pivot = begPoint; - int m = begPoint + 1; - int n = endPoint; - while ((m < endPoint) && ColumnQuick(pivot).CompareTo((ColumnQuick(m)), SortRows) >= 0) - m++; - - while ((n > begPoint) && ((ColumnQuick(pivot)).CompareTo((ColumnQuick(n)), SortRows) <= 0)) - n--; - while (m < n) - { - SwapColumns(m, n); - - while ((m < endPoint) && (ColumnQuick(pivot)).CompareTo((ColumnQuick(m)), SortRows) >= 0) - m++; - - while ((n > begPoint) && (ColumnQuick(pivot)).CompareTo((ColumnQuick(n)), SortRows) <= 0) - n--; - } - if (pivot != n) - SwapColumns(n, pivot); - return n; - } - - private void SortingRangeColumns(int beg, int end) - { - if (end == beg) - return; - int pivot = SortRangeColumns(beg, end); - if (pivot > beg) - SortingRangeColumns(beg, pivot - 1); - if (pivot < end) - SortingRangeColumns(pivot + 1, end); - } - - #endregion - - #endregion - - public XLRangeColumn ColumnQuick(Int32 column) - { - var firstCellAddress = new XLAddress(Worksheet, - RangeAddress.FirstAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber + column - 1, - false, - false); - var lastCellAddress = new XLAddress(Worksheet, - RangeAddress.LastAddress.RowNumber, - RangeAddress.FirstAddress.ColumnNumber + column - 1, - false, - false); - return new XLRangeColumn( - new XLRangeParameters(new XLRangeAddress(firstCellAddress, lastCellAddress), Worksheet.Style), true); - } - - public XLRangeRow RowQuick(Int32 row) - { - var firstCellAddress = new XLAddress(Worksheet, - RangeAddress.FirstAddress.RowNumber + row - 1, - RangeAddress.FirstAddress.ColumnNumber, - false, - false); - var lastCellAddress = new XLAddress(Worksheet, - RangeAddress.FirstAddress.RowNumber + row - 1, - RangeAddress.LastAddress.ColumnNumber, - false, - false); - return new XLRangeRow( - new XLRangeParameters(new XLRangeAddress(firstCellAddress, lastCellAddress), Worksheet.Style), true); - } - - public void Dispose() - { - if (_shiftedRowsAction != null) - { - RangeAddress.Worksheet.RangeShiftedRows.Remove(_shiftedRowsAction); - _shiftedRowsAction = null; - } - - if (_shiftedColumnsAction != null) - { - RangeAddress.Worksheet.RangeShiftedColumns.Remove(_shiftedColumnsAction); - _shiftedColumnsAction = null; - } - } - - public IXLDataValidation SetDataValidation() - { - return DataValidation; - } - - public IXLConditionalFormat AddConditionalFormat() - { - using (var asRange = AsRange()) - { - var cf = new XLConditionalFormat(asRange); - Worksheet.ConditionalFormats.Add(cf); - return cf; - } - } - - - internal IXLConditionalFormat AddConditionalFormat(IXLConditionalFormat source) - { - using (var asRange = AsRange()) - { - var cf = new XLConditionalFormat(asRange); - cf.CopyFrom(source); - Worksheet.ConditionalFormats.Add(cf); - return cf; - } - } - - public void Select() - { - Worksheet.SelectedRanges.Add(AsRange()); - } - } -} +using ClosedXML.Excel.Misc; +using System; +using System.Collections.Generic; +using System.Linq; + + + +namespace ClosedXML.Excel +{ + internal abstract class XLRangeBase : IXLRangeBase, IXLStylized + { + public Boolean StyleChanged { get; set; } + #region Fields + + private IXLStyle _style; + private XLSortElements _sortRows; + private XLSortElements _sortColumns; + + #endregion + + private Int32 _styleCacheId; + protected void SetStyle(IXLStyle styleToUse) + { + _styleCacheId = Worksheet.Workbook.GetStyleId(styleToUse); + _style = null; + StyleChanged = false; + } + protected void SetStyle(Int32 styleId) + { + _styleCacheId = styleId; + _style = null; + StyleChanged = false; + } + public Int32 GetStyleId() + { + if (StyleChanged) + SetStyle(Style); + + return _styleCacheId; + } + protected IXLStyle GetStyle() + { + return _style ?? (_style = new XLStyle(this, Worksheet.Workbook.GetStyleById(_styleCacheId))); + } + + #region Constructor + + static Int32 IdCounter = 0; + readonly Int32 Id; + + protected XLRangeBase(XLRangeAddress rangeAddress) + { + + Id = ++IdCounter; + + RangeAddress = new XLRangeAddress(rangeAddress); + } + + #endregion + + private XLCallbackAction _shiftedRowsAction; + + protected void SubscribeToShiftedRows(Action action) + { + if (Worksheet == null || !Worksheet.EventTrackingEnabled) return; + + _shiftedRowsAction = new XLCallbackAction(action); + + RangeAddress.Worksheet.RangeShiftedRows.Add(_shiftedRowsAction); + } + + private XLCallbackAction _shiftedColumnsAction; + protected void SubscribeToShiftedColumns(Action action) + { + if (Worksheet == null || !Worksheet.EventTrackingEnabled) return; + + _shiftedColumnsAction = new XLCallbackAction(action); + + RangeAddress.Worksheet.RangeShiftedColumns.Add(_shiftedColumnsAction); + } + + #region Public properties + + //public XLRangeAddress RangeAddress { get; protected set; } + + private XLRangeAddress _rangeAddress; + public XLRangeAddress RangeAddress + { + get { return _rangeAddress; } + protected set { _rangeAddress = value; } + } + + public XLWorksheet Worksheet + { + get { return RangeAddress.Worksheet; } + } + + public XLDataValidation NewDataValidation + { + get + { + var newRanges = new XLRanges { AsRange() }; + var dataValidation = new XLDataValidation(newRanges); + + Worksheet.DataValidations.Add(dataValidation); + return dataValidation; + } + } + + public XLDataValidation DataValidation + { + get + { + IXLDataValidation dataValidationToCopy = null; + var dvEmpty = new List(); + foreach (IXLDataValidation dv in Worksheet.DataValidations) + { + foreach (IXLRange dvRange in dv.Ranges.Where(dvRange => dvRange.Intersects(this))) + { + if (dataValidationToCopy == null) + dataValidationToCopy = dv; + + dv.Ranges.Remove(dvRange); + foreach (var column in dvRange.Columns()) + { + if (column.Intersects(this)) + { + Int32 dvStart = column.RangeAddress.FirstAddress.RowNumber; + Int32 dvEnd = column.RangeAddress.LastAddress.RowNumber; + Int32 thisStart = RangeAddress.FirstAddress.RowNumber; + Int32 thisEnd = RangeAddress.LastAddress.RowNumber; + + if (thisStart > dvStart && thisEnd < dvEnd) + { + var r1 = Worksheet.Column(column.ColumnNumber()).Column(dvStart, thisStart - 1); + r1.Dispose(); + dv.Ranges.Add(r1); + var r2 = Worksheet.Column(column.ColumnNumber()).Column(thisEnd + 1, dvEnd); + r2.Dispose(); + dv.Ranges.Add(r2); + } + else + { + Int32 coStart; + if (dvStart < thisStart) + coStart = dvStart; + else + coStart = thisEnd + 1; + + if (coStart <= dvEnd) + { + Int32 coEnd; + if (dvEnd > thisEnd) + coEnd = dvEnd; + else + coEnd = thisStart - 1; + + if (coEnd >= dvStart) + { + var r = Worksheet.Column(column.ColumnNumber()).Column(coStart, coEnd); + r.Dispose(); + dv.Ranges.Add(r); + } + } + } + } + else + { + column.Dispose(); + dv.Ranges.Add(column); + } + } + + if (!dv.Ranges.Any()) + dvEmpty.Add(dv); + } + } + + dvEmpty.ForEach(dv => Worksheet.DataValidations.Delete(dv)); + + var newRanges = new XLRanges { AsRange() }; + var dataValidation = new XLDataValidation(newRanges); + if (dataValidationToCopy != null) + dataValidation.CopyFrom(dataValidationToCopy); + + Worksheet.DataValidations.Add(dataValidation); + return dataValidation; + } + } + + #region IXLRangeBase Members + + IXLRangeAddress IXLRangeBase.RangeAddress + { + get { return RangeAddress; } + } + + IXLWorksheet IXLRangeBase.Worksheet + { + get { return RangeAddress.Worksheet; } + } + + public String FormulaA1 + { + set + { + Cells().ForEach(c => + { + c.FormulaA1 = value; + c.FormulaReference = RangeAddress; + }); + } + } + + public String FormulaR1C1 + { + set + { + Cells().ForEach(c => + { + c.FormulaR1C1 = value; + c.FormulaReference = RangeAddress; + }); + } + } + + public Boolean ShareString + { + set { Cells().ForEach(c => c.ShareString = value); } + } + + public IXLHyperlinks Hyperlinks + { + get + { + var hyperlinks = new XLHyperlinks(); + var hls = from hl in Worksheet.Hyperlinks + where Contains(hl.Cell.AsRange()) + select hl; + hls.ForEach(hyperlinks.Add); + return hyperlinks; + } + } + + + + public Object Value + { + set { Cells().ForEach(c => c.Value = value); } + } + + public XLCellValues DataType + { + set { Cells().ForEach(c => c.DataType = value); } + } + + #endregion + + #region IXLStylized Members + + public IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges { AsRange() }; + return retVal; + } + } + + #endregion + + #endregion + + #region IXLRangeBase Members + + IXLCell IXLRangeBase.FirstCell() + { + return FirstCell(); + } + + IXLCell IXLRangeBase.LastCell() + { + return LastCell(); + } + + IXLCell IXLRangeBase.FirstCellUsed() + { + return FirstCellUsed(false); + } + + IXLCell IXLRangeBase.FirstCellUsed(bool includeFormats) + { + return FirstCellUsed(includeFormats); + } + + IXLCell IXLRangeBase.LastCellUsed() + { + return LastCellUsed(false); + } + + IXLCell IXLRangeBase.LastCellUsed(bool includeFormats) + { + return LastCellUsed(includeFormats); + } + + public IXLCells Cells() + { + return Cells(false); + } + + public IXLCells Cells(Boolean usedCellsOnly) + { + return Cells(usedCellsOnly, false); + } + + public IXLCells Cells(Boolean usedCellsOnly, Boolean includeFormats) + { + var cells = new XLCells(usedCellsOnly, includeFormats) { RangeAddress }; + return cells; + } + + public IXLCells Cells(String cells) + { + return Ranges(cells).Cells(); + } + + public IXLCells Cells(Func predicate) + { + var cells = new XLCells(false, false, predicate) { RangeAddress }; + return cells; + } + + public IXLCells CellsUsed() + { + return Cells(true); + } + + public IXLRange Merge() + { + return Merge(true); + } + + public IXLRange Merge(Boolean checkIntersect) + { + if (checkIntersect) + { + using (IXLRange range = Worksheet.Range(RangeAddress)) + { + foreach (var mergedRange in Worksheet.Internals.MergedRanges) + { + if (mergedRange.Intersects(range)) + { + Worksheet.Internals.MergedRanges.Remove(mergedRange); + } + } + } + } + + var asRange = AsRange(); + Worksheet.Internals.MergedRanges.Add(asRange); + + return asRange; + } + + public IXLRange Unmerge() + { + string tAddress = RangeAddress.ToString(); + var asRange = AsRange(); + if (Worksheet.Internals.MergedRanges.Select(m => m.RangeAddress.ToString()).Any(mAddress => mAddress == tAddress)) + Worksheet.Internals.MergedRanges.Remove(asRange); + + return asRange; + } + + public IXLRangeBase Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + var includeFormats = clearOptions == XLClearOptions.Formats || + clearOptions == XLClearOptions.ContentsAndFormats; + foreach (var cell in CellsUsed(includeFormats)) + { + (cell as XLCell).Clear(clearOptions, true); + } + + if (includeFormats) + { + ClearMerged(); + } + + if (clearOptions == XLClearOptions.ContentsAndFormats) + { + Worksheet.Internals.CellsCollection.RemoveAll( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + ); + } + return this; + } + + public void DeleteComments() + { + Cells().DeleteComments(); + } + + public bool Contains(String rangeAddress) + { + string addressToUse = rangeAddress.Contains("!") + ? rangeAddress.Substring(rangeAddress.IndexOf("!") + 1) + : rangeAddress; + + XLAddress firstAddress; + XLAddress lastAddress; + if (addressToUse.Contains(':')) + { + var arrRange = addressToUse.Split(':'); + firstAddress = XLAddress.Create(Worksheet, arrRange[0]); + lastAddress = XLAddress.Create(Worksheet, arrRange[1]); + } + else + { + firstAddress = XLAddress.Create(Worksheet, addressToUse); + lastAddress = XLAddress.Create(Worksheet, addressToUse); + } + return Contains(firstAddress, lastAddress); + } + + public bool Contains(IXLRangeBase range) + { + return Contains((XLAddress)range.RangeAddress.FirstAddress, (XLAddress)range.RangeAddress.LastAddress); + } + + public bool Intersects(string rangeAddress) + { + using (var range = Worksheet.Range(rangeAddress)) + return Intersects(range); + } + + public bool Intersects(IXLRangeBase range) + { + if (range.RangeAddress.IsInvalid || RangeAddress.IsInvalid) + return false; + 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 virtual IXLStyle Style + { + get { return GetStyle(); } + set { Cells().ForEach(c => c.Style = value); } + } + IXLRange IXLRangeBase.AsRange() + { + return AsRange(); + } + public virtual XLRange AsRange() + { + return Worksheet.Range(RangeAddress.FirstAddress, RangeAddress.LastAddress); + } + + + + public IXLRange AddToNamed(String rangeName) + { + return AddToNamed(rangeName, XLScope.Workbook); + } + + public IXLRange AddToNamed(String rangeName, XLScope scope) + { + return AddToNamed(rangeName, scope, null); + } + + public IXLRange AddToNamed(String rangeName, XLScope scope, String comment) + { + var namedRanges = scope == XLScope.Workbook + ? Worksheet.Workbook.NamedRanges + : Worksheet.NamedRanges; + + if (namedRanges.Any(nr => String.Compare(nr.Name, rangeName, true) == 0)) + { + var namedRange = namedRanges.Single(nr => String.Compare(nr.Name, rangeName, true) == 0); + namedRange.Add(Worksheet.Workbook, RangeAddress.ToStringFixed(XLReferenceStyle.A1, true)); + } + else + namedRanges.Add(rangeName, RangeAddress.ToStringFixed(XLReferenceStyle.A1, true), comment); + return AsRange(); + } + + public IXLRangeBase SetValue(T value) + { + Cells().ForEach(c => c.SetValue(value)); + return this; + } + + public Boolean IsMerged() + { + return Cells().Any(c => c.IsMerged()); + } + + public Boolean IsEmpty() + { + return !CellsUsed().Any() || CellsUsed().Any(c => c.IsEmpty()); + } + + public Boolean IsEmpty(Boolean includeFormats) + { + return !CellsUsed(includeFormats).Cast().Any() || + CellsUsed(includeFormats).Cast().Any(c => c.IsEmpty(includeFormats)); + } + + #endregion + + #region IXLStylized Members + + public virtual IEnumerable Styles + { + get + { + UpdatingStyle = true; + foreach (IXLCell cell in Cells()) + yield return cell.Style; + UpdatingStyle = false; + } + } + + public virtual Boolean UpdatingStyle { get; set; } + + public virtual IXLStyle InnerStyle + { + get { return GetStyle(); } + set { SetStyle(value); } + } + + #endregion + + public XLCell FirstCell() + { + return Cell(1, 1); + } + + public XLCell LastCell() + { + return Cell(RowCount(), ColumnCount()); + } + + public XLCell FirstCellUsed() + { + return FirstCellUsed(false, null); + } + + public XLCell FirstCellUsed(Boolean includeFormats) + { + return FirstCellUsed(includeFormats, null); + } + + IXLCell IXLRangeBase.FirstCellUsed(Func predicate) + { + return FirstCellUsed(predicate); + } + + public XLCell FirstCellUsed(Func predicate) + { + return FirstCellUsed(false, predicate); + } + + IXLCell IXLRangeBase.FirstCellUsed(Boolean includeFormats, Func predicate) + { + return FirstCellUsed(includeFormats, predicate); + } + + public XLCell FirstCellUsed(Boolean includeFormats, Func predicate) + { + Int32 fRow = RangeAddress.FirstAddress.RowNumber; + Int32 lRow = RangeAddress.LastAddress.RowNumber; + Int32 fColumn = RangeAddress.FirstAddress.ColumnNumber; + Int32 lColumn = RangeAddress.LastAddress.ColumnNumber; + + var sp = Worksheet.Internals.CellsCollection.FirstPointUsed(fRow, fColumn, lRow, lColumn, includeFormats, predicate); + + if (includeFormats) + { + var rowsUsed = + Worksheet.Internals.RowsCollection.Where(r => r.Key >= fRow && r.Key <= lRow && !r.Value.IsEmpty(true)); + + var columnsUsed = + Worksheet.Internals.ColumnsCollection.Where(c => c.Key >= fColumn && c.Key <= lColumn && !c.Value.IsEmpty(true)); + + // If there's a row or a column then check if the style is different + // and pick the first cell and check the style of it, if different + // than default then it's your cell. + + Int32 ro = 0; + if (rowsUsed.Any()) + if (sp.Row > 0) + ro = Math.Min(sp.Row, rowsUsed.First().Key); + else + ro = rowsUsed.First().Key; + + Int32 co = 0; + if (columnsUsed.Any()) + if (sp.Column > 0) + co = Math.Min(sp.Column, columnsUsed.First().Key); + else + co = columnsUsed.First().Key; + + if (ro > 0 && co > 0) + return Worksheet.Cell(ro, co); + + if (ro > 0 && lColumn < XLHelper.MaxColumnNumber) + { + for (co = fColumn; co <= lColumn; co++) + { + var cell = Worksheet.Cell(ro, co); + if (!cell.IsEmpty(true)) return cell; + } + } + else if (co > 0 && lRow < XLHelper.MaxRowNumber) + { + for (ro = fRow; ro <= lRow; ro++) + { + var cell = Worksheet.Cell(ro, co); + if (!cell.IsEmpty(true)) return cell; + } + } + + if (Worksheet.MergedRanges.Any(r => r.Intersects(this))) + { + Int32 minRo = + Worksheet.MergedRanges.Where(r => r.Intersects(this)).Min(r => r.RangeAddress.FirstAddress.RowNumber); + Int32 minCo = + Worksheet.MergedRanges.Where(r => r.Intersects(this)).Min(r => r.RangeAddress.FirstAddress.ColumnNumber); + + return Worksheet.Cell(minRo, minCo); + } + } + + + if (sp.Row > 0) + return Worksheet.Cell(sp.Row, sp.Column); + + return null; + } + + public XLCell LastCellUsed() + { + return LastCellUsed(false, null); + } + + public XLCell LastCellUsed(Boolean includeFormats) + { + return LastCellUsed(includeFormats, null); + } + + IXLCell IXLRangeBase.LastCellUsed(Func predicate) + { + return LastCellUsed(predicate); + } + + public XLCell LastCellUsed(Func predicate) + { + return LastCellUsed(false, predicate); + } + + IXLCell IXLRangeBase.LastCellUsed(Boolean includeFormats, Func predicate) + { + return LastCellUsed(includeFormats, predicate); + } + + public XLCell LastCellUsed(Boolean includeFormats, Func predicate) + { + Int32 fRow = RangeAddress.FirstAddress.RowNumber; + Int32 lRow = RangeAddress.LastAddress.RowNumber; + Int32 fColumn = RangeAddress.FirstAddress.ColumnNumber; + Int32 lColumn = RangeAddress.LastAddress.ColumnNumber; + + var sp = Worksheet.Internals.CellsCollection.LastPointUsed(fRow, fColumn, lRow, lColumn, includeFormats, predicate); + + if (includeFormats) + { + var rowsUsed = + Worksheet.Internals.RowsCollection.Where(r => r.Key >= fRow && r.Key <= lRow && !r.Value.IsEmpty(true)); + + var columnsUsed = + Worksheet.Internals.ColumnsCollection.Where(c => c.Key >= fColumn && c.Key <= lColumn && !c.Value.IsEmpty(true)); + + // If there's a row or a column then check if the style is different + // and pick the first cell and check the style of it, if different + // than default then it's your cell. + + Int32 ro = 0; + if (rowsUsed.Any()) + ro = Math.Max(sp.Row, rowsUsed.Last().Key); + + Int32 co = 0; + if (columnsUsed.Any()) + co = Math.Max(sp.Column, columnsUsed.Last().Key); + + if (ro > 0 && co > 0) + return Worksheet.Cell(ro, co); + + if (ro > 0 && lColumn < XLHelper.MaxColumnNumber) + { + for (co = lColumn; co >= fColumn; co--) + { + var cell = Worksheet.Cell(ro, co); + if (!cell.IsEmpty(true)) return cell; + } + } + else if (co > 0 && lRow < XLHelper.MaxRowNumber) + { + for (ro = lRow; ro >= fRow; ro--) + { + var cell = Worksheet.Cell(ro, co); + if (!cell.IsEmpty(true)) return cell; + } + } + + if (Worksheet.MergedRanges.Any(r => r.Intersects(this))) + { + Int32 minRo = + Worksheet.MergedRanges.Where(r => r.Intersects(this)).Max(r => r.RangeAddress.LastAddress.RowNumber); + Int32 minCo = + Worksheet.MergedRanges.Where(r => r.Intersects(this)).Max(r => r.RangeAddress.LastAddress.ColumnNumber); + + return Worksheet.Cell(minRo, minCo); + } + } + + + if (sp.Row > 0) + return Worksheet.Cell(sp.Row, sp.Column); + + return null; + } + + public XLCell Cell(Int32 row, Int32 column) + { + return Cell(new XLAddress(Worksheet, row, column, false, false)); + } + + public XLCell Cell(String cellAddressInRange) + { + + if (XLHelper.IsValidA1Address(cellAddressInRange)) + return Cell(XLAddress.Create(Worksheet, cellAddressInRange)); + + return (XLCell)Worksheet.NamedRange(cellAddressInRange).Ranges.First().FirstCell(); + } + + public XLCell Cell(Int32 row, String column) + { + return Cell(new XLAddress(Worksheet, row, column, false, false)); + } + + public XLCell Cell(IXLAddress cellAddressInRange) + { + return Cell(cellAddressInRange.RowNumber, cellAddressInRange.ColumnNumber); + } + + public XLCell Cell(XLAddress cellAddressInRange) + { + Int32 absRow = cellAddressInRange.RowNumber + RangeAddress.FirstAddress.RowNumber - 1; + Int32 absColumn = cellAddressInRange.ColumnNumber + RangeAddress.FirstAddress.ColumnNumber - 1; + + if (absRow <= 0 || absRow > XLHelper.MaxRowNumber) + { + throw new IndexOutOfRangeException(String.Format("Row number must be between 1 and {0}", + XLHelper.MaxRowNumber)); + } + + if (absColumn <= 0 || absColumn > XLHelper.MaxColumnNumber) + { + throw new IndexOutOfRangeException(String.Format("Column number must be between 1 and {0}", + XLHelper.MaxColumnNumber)); + } + + var cell = Worksheet.Internals.CellsCollection.GetCell(absRow, + absColumn); + + if (cell != null) + return cell; + + //var style = Style; + Int32 styleId = GetStyleId(); + Int32 worksheetStyleId = Worksheet.GetStyleId(); + + if (styleId == worksheetStyleId) + { + XLRow row; + XLColumn column; + if (Worksheet.Internals.RowsCollection.TryGetValue(absRow, out row) + && row.GetStyleId() != worksheetStyleId) + styleId = row.GetStyleId(); + else if (Worksheet.Internals.ColumnsCollection.TryGetValue(absColumn, out column) + && column.GetStyleId() != worksheetStyleId) + styleId = column.GetStyleId(); + } + var absoluteAddress = new XLAddress(cellAddressInRange.Worksheet, + absRow, + absColumn, + cellAddressInRange.FixedRow, + cellAddressInRange.FixedColumn); + var newCell = new XLCell(Worksheet, absoluteAddress, styleId); + Worksheet.Internals.CellsCollection.Add(absRow, absColumn, newCell); + return newCell; + } + + public Int32 RowCount() + { + return RangeAddress.LastAddress.RowNumber - RangeAddress.FirstAddress.RowNumber + 1; + } + + public Int32 RowNumber() + { + return RangeAddress.FirstAddress.RowNumber; + } + + public Int32 ColumnCount() + { + return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; + } + + public Int32 ColumnNumber() + { + return RangeAddress.FirstAddress.ColumnNumber; + } + + public String ColumnLetter() + { + return RangeAddress.FirstAddress.ColumnLetter; + } + + public virtual XLRange Range(String rangeAddressStr) + { + var rangeAddress = new XLRangeAddress(Worksheet, rangeAddressStr); + return Range(rangeAddress); + } + + public XLRange Range(IXLCell firstCell, IXLCell lastCell) + { + var newFirstCellAddress = firstCell.Address as XLAddress; + var newLastCellAddress = lastCell.Address as XLAddress; + + return GetRange(newFirstCellAddress, newLastCellAddress); + } + + private XLRange GetRange(XLAddress newFirstCellAddress, XLAddress newLastCellAddress) + { + var newRangeAddress = new XLRangeAddress(newFirstCellAddress, newLastCellAddress); + var xlRangeParameters = new XLRangeParameters(newRangeAddress, Style); + if ( + newFirstCellAddress.RowNumber < RangeAddress.FirstAddress.RowNumber + || newFirstCellAddress.RowNumber > RangeAddress.LastAddress.RowNumber + || newLastCellAddress.RowNumber > RangeAddress.LastAddress.RowNumber + || newFirstCellAddress.ColumnNumber < RangeAddress.FirstAddress.ColumnNumber + || newFirstCellAddress.ColumnNumber > RangeAddress.LastAddress.ColumnNumber + || newLastCellAddress.ColumnNumber > RangeAddress.LastAddress.ColumnNumber + ) + { + throw new ArgumentOutOfRangeException(String.Format( + "The cells {0} and {1} are outside the range '{2}'.", + newFirstCellAddress, + newLastCellAddress, + ToString())); + } + + return new XLRange(xlRangeParameters); + } + + public XLRange Range(String firstCellAddress, String lastCellAddress) + { + var rangeAddress = new XLRangeAddress(XLAddress.Create(Worksheet, firstCellAddress), + XLAddress.Create(Worksheet, lastCellAddress)); + return Range(rangeAddress); + } + + public XLRange Range(Int32 firstCellRow, Int32 firstCellColumn, Int32 lastCellRow, Int32 lastCellColumn) + { + var rangeAddress = new XLRangeAddress(new XLAddress(Worksheet, firstCellRow, firstCellColumn, false, false), + new XLAddress(Worksheet, lastCellRow, lastCellColumn, false, false)); + return Range(rangeAddress); + } + + public XLRange Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress) + { + var rangeAddress = new XLRangeAddress(firstCellAddress as XLAddress, lastCellAddress as XLAddress); + return Range(rangeAddress); + } + + public XLRange Range(IXLRangeAddress rangeAddress) + { + + var newFirstCellAddress = new XLAddress((XLWorksheet)rangeAddress.FirstAddress.Worksheet, + rangeAddress.FirstAddress.RowNumber + RangeAddress.FirstAddress.RowNumber - 1, + rangeAddress.FirstAddress.ColumnNumber + RangeAddress.FirstAddress.ColumnNumber - 1, + rangeAddress.FirstAddress.FixedRow, + rangeAddress.FirstAddress.FixedColumn); + + newFirstCellAddress.FixedRow = rangeAddress.FirstAddress.FixedRow; + newFirstCellAddress.FixedColumn = rangeAddress.FirstAddress.FixedColumn; + + var newLastCellAddress = new XLAddress((XLWorksheet)rangeAddress.LastAddress.Worksheet, + rangeAddress.LastAddress.RowNumber + RangeAddress.FirstAddress.RowNumber - 1, + rangeAddress.LastAddress.ColumnNumber + RangeAddress.FirstAddress.ColumnNumber - 1, + rangeAddress.LastAddress.FixedRow, + rangeAddress.LastAddress.FixedColumn); + + newLastCellAddress.FixedRow = rangeAddress.LastAddress.FixedRow; + newLastCellAddress.FixedColumn = rangeAddress.LastAddress.FixedColumn; + + return GetRange(newFirstCellAddress, newLastCellAddress); + } + + public IXLRanges Ranges(String ranges) + { + var retVal = new XLRanges(); + var rangePairs = ranges.Split(','); + foreach (string pair in rangePairs) + retVal.Add(Range(pair.Trim())); + return retVal; + } + + public IXLRanges Ranges(params String[] ranges) + { + var retVal = new XLRanges(); + foreach (string pair in ranges) + retVal.Add(Range(pair)); + return retVal; + } + + protected String FixColumnAddress(String address) + { + Int32 test; + if (Int32.TryParse(address, out test)) + return "A" + address; + return address; + } + + protected String FixRowAddress(String address) + { + Int32 test; + if (Int32.TryParse(address, out test)) + return XLHelper.GetColumnLetterFromNumber(test) + "1"; + return address; + } + + public IXLCells CellsUsed(bool includeFormats) + { + var cells = new XLCells(true, includeFormats) { RangeAddress }; + return cells; + } + + public IXLCells CellsUsed(Func predicate) + { + var cells = new XLCells(true, false, predicate) { RangeAddress }; + return cells; + } + + public IXLCells CellsUsed(Boolean includeFormats, Func predicate) + { + var cells = new XLCells(true, includeFormats, predicate) { RangeAddress }; + return cells; + } + + public IXLRangeColumns InsertColumnsAfter(Int32 numberOfColumns) + { + return InsertColumnsAfter(numberOfColumns, true); + } + + public IXLRangeColumns InsertColumnsAfter(Int32 numberOfColumns, Boolean expandRange) + { + var retVal = InsertColumnsAfter(false, numberOfColumns); + // Adjust the range + if (expandRange) + { + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + numberOfColumns, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + } + return retVal; + } + + public IXLRangeColumns InsertColumnsAfter(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) + { + return InsertColumnsAfterInternal(onlyUsedCells, numberOfColumns, formatFromLeft); + } + + public void InsertColumnsAfterVoid(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) + { + InsertColumnsAfterInternal(onlyUsedCells, numberOfColumns, formatFromLeft, nullReturn: true); + } + + private IXLRangeColumns InsertColumnsAfterInternal(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true, Boolean nullReturn = false) + { + int columnCount = ColumnCount(); + int firstColumn = RangeAddress.FirstAddress.ColumnNumber + columnCount; + if (firstColumn > XLHelper.MaxColumnNumber) + firstColumn = XLHelper.MaxColumnNumber; + int lastColumn = firstColumn + ColumnCount() - 1; + if (lastColumn > XLHelper.MaxColumnNumber) + lastColumn = XLHelper.MaxColumnNumber; + + int firstRow = RangeAddress.FirstAddress.RowNumber; + int lastRow = firstRow + RowCount() - 1; + if (lastRow > XLHelper.MaxRowNumber) + lastRow = XLHelper.MaxRowNumber; + + var newRange = Worksheet.Range(firstRow, firstColumn, lastRow, lastColumn); + return newRange.InsertColumnsBeforeInternal(onlyUsedCells, numberOfColumns, formatFromLeft, nullReturn); + } + + public IXLRangeColumns InsertColumnsBefore(Int32 numberOfColumns) + { + return InsertColumnsBefore(numberOfColumns, false); + } + + public IXLRangeColumns InsertColumnsBefore(Int32 numberOfColumns, Boolean expandRange) + { + var retVal = InsertColumnsBefore(false, numberOfColumns); + // Adjust the range + if (expandRange) + { + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber - numberOfColumns, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + } + return retVal; + } + + public IXLRangeColumns InsertColumnsBefore(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) + { + return InsertColumnsBeforeInternal(onlyUsedCells, numberOfColumns, formatFromLeft); + } + + public void InsertColumnsBeforeVoid(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true) + { + InsertColumnsBeforeInternal(onlyUsedCells, numberOfColumns, formatFromLeft, nullReturn: true); + } + + private IXLRangeColumns InsertColumnsBeforeInternal(Boolean onlyUsedCells, Int32 numberOfColumns, Boolean formatFromLeft = true, Boolean nullReturn = false) + { + foreach (XLWorksheet ws in Worksheet.Workbook.WorksheetsInternal) + { + foreach (XLCell cell in ws.Internals.CellsCollection.GetCells(c => !XLHelper.IsNullOrWhiteSpace(c.FormulaA1))) + using (var asRange = AsRange()) + cell.ShiftFormulaColumns(asRange, numberOfColumns); + } + + + var cellsDataValidations = new Dictionary(); + var cellsToInsert = new Dictionary(); + var cellsToDelete = new List(); + int firstColumn = RangeAddress.FirstAddress.ColumnNumber; + int firstRow = RangeAddress.FirstAddress.RowNumber; + int lastRow = RangeAddress.FirstAddress.RowNumber + RowCount() - 1; + + if (!onlyUsedCells) + { + int lastColumn = Worksheet.Internals.CellsCollection.MaxColumnUsed; + if (lastColumn > 0) + { + for (int co = lastColumn; co >= firstColumn; co--) + { + for (int ro = lastRow; ro >= firstRow; ro--) + { + var oldKey = new XLAddress(Worksheet, ro, co, false, false); + int newColumn = co + numberOfColumns; + var newKey = new XLAddress(Worksheet, ro, newColumn, false, false); + var oldCell = Worksheet.Internals.CellsCollection.GetCell(ro, co) ?? + Worksheet.Cell(oldKey); + + var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); + newCell.CopyValuesFrom(oldCell); + newCell.FormulaA1 = oldCell.FormulaA1; + cellsToInsert.Add(newKey, newCell); + cellsToDelete.Add(oldKey); + } + } + } + } + else + { + foreach ( + XLCell c in + Worksheet.Internals.CellsCollection.GetCells(firstRow, firstColumn, lastRow, + Worksheet.Internals.CellsCollection.MaxColumnUsed)) + { + int newColumn = c.Address.ColumnNumber + numberOfColumns; + var newKey = new XLAddress(Worksheet, c.Address.RowNumber, newColumn, false, false); + var newCell = new XLCell(Worksheet, newKey, c.GetStyleId()); + newCell.CopyValuesFrom(c); + if (c.HasDataValidation) + { + cellsDataValidations.Add(newCell.Address, + new DataValidationToCopy + { DataValidation = c.DataValidation, SourceAddress = c.Address }); + c.DataValidation.Clear(); + } + newCell.FormulaA1 = c.FormulaA1; + cellsToInsert.Add(newKey, newCell); + cellsToDelete.Add(c.Address); + } + } + + cellsDataValidations.ForEach(kp => + { + XLCell targetCell; + if (!cellsToInsert.TryGetValue(kp.Key, out targetCell)) + targetCell = Worksheet.Cell(kp.Key); + + targetCell.CopyDataValidation(Worksheet.Cell(kp.Value.SourceAddress), kp.Value.DataValidation); + }); + + cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c.RowNumber, c.ColumnNumber)); + cellsToInsert.ForEach( + c => Worksheet.Internals.CellsCollection.Add(c.Key.RowNumber, c.Key.ColumnNumber, c.Value)); + //cellsDataValidations.ForEach(kp => Worksheet.Cell(kp.Key).CopyDataValidation(Worksheet.Cell(kp.Value.SourceAddress), kp.Value.DataValidation)); + + Int32 firstRowReturn = RangeAddress.FirstAddress.RowNumber; + Int32 lastRowReturn = RangeAddress.LastAddress.RowNumber; + Int32 firstColumnReturn = RangeAddress.FirstAddress.ColumnNumber; + Int32 lastColumnReturn = RangeAddress.FirstAddress.ColumnNumber + numberOfColumns - 1; + + Worksheet.BreakConditionalFormatsIntoCells(cellsToDelete.Except(cellsToInsert.Keys).ToList()); + using (var asRange = AsRange()) + Worksheet.NotifyRangeShiftedColumns(asRange, numberOfColumns); + + var rangeToReturn = Worksheet.Range(firstRowReturn, firstColumnReturn, lastRowReturn, lastColumnReturn); + + if (formatFromLeft && rangeToReturn.RangeAddress.FirstAddress.ColumnNumber > 1) + { + using (var firstColumnUsed = rangeToReturn.FirstColumn()) + { + using (var model = firstColumnUsed.ColumnLeft()) + { + var modelFirstRow = model.FirstCellUsed(true); + var modelLastRow = model.LastCellUsed(true); + if (modelLastRow != null) + { + Int32 firstRoReturned = modelFirstRow.Address.RowNumber + - model.RangeAddress.FirstAddress.RowNumber + 1; + Int32 lastRoReturned = modelLastRow.Address.RowNumber + - model.RangeAddress.FirstAddress.RowNumber + 1; + for (Int32 ro = firstRoReturned; ro <= lastRoReturned; ro++) + { + rangeToReturn.Row(ro).Style = model.Cell(ro).Style; + } + } + } + } + } + else + { + var lastRoUsed = rangeToReturn.LastRowUsed(true); + if (lastRoUsed != null) + { + Int32 lastRoReturned = lastRoUsed.RowNumber(); + for (Int32 ro = 1; ro <= lastRoReturned; ro++) + { + var styleToUse = Worksheet.Internals.RowsCollection.ContainsKey(ro) + ? Worksheet.Internals.RowsCollection[ro].Style + : Worksheet.Style; + rangeToReturn.Row(ro).Style = styleToUse; + } + + } + } + + if (nullReturn) + return null; + + return rangeToReturn.Columns(); + } + + public IXLRangeRows InsertRowsBelow(Int32 numberOfRows) + { + return InsertRowsBelow(numberOfRows, true); + } + + public IXLRangeRows InsertRowsBelow(Int32 numberOfRows, Boolean expandRange) + { + var retVal = InsertRowsBelow(false, numberOfRows); + // Adjust the range + if (expandRange) + { + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber + numberOfRows, + RangeAddress.LastAddress.ColumnNumber, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + } + return retVal; + } + + public IXLRangeRows InsertRowsBelow(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) + { + return InsertRowsBelowInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: false); + } + + public void InsertRowsBelowVoid(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) + { + InsertRowsBelowInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: true); + } + + private IXLRangeRows InsertRowsBelowInternal(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove, Boolean nullReturn) + { + int rowCount = RowCount(); + int firstRow = RangeAddress.FirstAddress.RowNumber + rowCount; + if (firstRow > XLHelper.MaxRowNumber) + firstRow = XLHelper.MaxRowNumber; + int lastRow = firstRow + RowCount() - 1; + if (lastRow > XLHelper.MaxRowNumber) + lastRow = XLHelper.MaxRowNumber; + + int firstColumn = RangeAddress.FirstAddress.ColumnNumber; + int lastColumn = firstColumn + ColumnCount() - 1; + if (lastColumn > XLHelper.MaxColumnNumber) + lastColumn = XLHelper.MaxColumnNumber; + + var newRange = Worksheet.Range(firstRow, firstColumn, lastRow, lastColumn); + return newRange.InsertRowsAboveInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn); + } + + public IXLRangeRows InsertRowsAbove(Int32 numberOfRows) + { + return InsertRowsAbove(numberOfRows, false); + } + + public IXLRangeRows InsertRowsAbove(Int32 numberOfRows, Boolean expandRange) + { + var retVal = InsertRowsAbove(false, numberOfRows); + // Adjust the range + if (expandRange) + { + RangeAddress = new XLRangeAddress( + new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber - numberOfRows, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn), + new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn)); + } + return retVal; + } + + struct DataValidationToCopy + { + public XLAddress SourceAddress; + public XLDataValidation DataValidation; + } + public void InsertRowsAboveVoid(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) + { + InsertRowsAboveInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: true); + } + public IXLRangeRows InsertRowsAbove(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove = true) + { + return InsertRowsAboveInternal(onlyUsedCells, numberOfRows, formatFromAbove, nullReturn: false); + } + + private IXLRangeRows InsertRowsAboveInternal(Boolean onlyUsedCells, Int32 numberOfRows, Boolean formatFromAbove, Boolean nullReturn) + { + using (var asRange = AsRange()) + foreach (XLWorksheet ws in Worksheet.Workbook.WorksheetsInternal) + { + foreach (XLCell cell in ws.Internals.CellsCollection.GetCells(c => !XLHelper.IsNullOrWhiteSpace(c.FormulaA1))) + cell.ShiftFormulaRows(asRange, numberOfRows); + } + + var cellsToInsert = new Dictionary(); + var cellsToDelete = new List(); + var cellsDataValidations = new Dictionary(); + int firstRow = RangeAddress.FirstAddress.RowNumber; + int firstColumn = RangeAddress.FirstAddress.ColumnNumber; + int lastColumn = Math.Min( + RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1, + Worksheet.Internals.CellsCollection.MaxColumnUsed); + + if (!onlyUsedCells) + { + int lastRow = Worksheet.Internals.CellsCollection.MaxRowUsed; + if (lastRow > 0) + { + for (int ro = lastRow; ro >= firstRow; ro--) + { + for (int co = lastColumn; co >= firstColumn; co--) + { + var oldKey = new XLAddress(Worksheet, ro, co, false, false); + int newRow = ro + numberOfRows; + var newKey = new XLAddress(Worksheet, newRow, co, false, false); + var oldCell = Worksheet.Internals.CellsCollection.GetCell(ro, co); + if (oldCell != null) + { + var newCell = new XLCell(Worksheet, newKey, oldCell.GetStyleId()); + newCell.CopyValuesFrom(oldCell); + newCell.FormulaA1 = oldCell.FormulaA1; + cellsToInsert.Add(newKey, newCell); + cellsToDelete.Add(oldKey); + } + } + } + } + } + else + { + foreach ( + XLCell c in + Worksheet.Internals.CellsCollection.GetCells(firstRow, firstColumn, + Worksheet.Internals.CellsCollection.MaxRowUsed, + lastColumn)) + { + int newRow = c.Address.RowNumber + numberOfRows; + var newKey = new XLAddress(Worksheet, newRow, c.Address.ColumnNumber, false, false); + var newCell = new XLCell(Worksheet, newKey, c.GetStyleId()); + newCell.CopyValuesFrom(c); + if (c.HasDataValidation) + { + cellsDataValidations.Add(newCell.Address, + new DataValidationToCopy + { DataValidation = c.DataValidation, SourceAddress = c.Address }); + c.DataValidation.Clear(); + } + newCell.FormulaA1 = c.FormulaA1; + cellsToInsert.Add(newKey, newCell); + cellsToDelete.Add(c.Address); + + } + } + + cellsDataValidations + .ForEach(kp => + { + XLCell targetCell; + if (!cellsToInsert.TryGetValue(kp.Key, out targetCell)) + targetCell = Worksheet.Cell(kp.Key); + + targetCell.CopyDataValidation( + Worksheet.Cell(kp.Value.SourceAddress), kp.Value.DataValidation); + }); + + cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c.RowNumber, c.ColumnNumber)); + cellsToInsert.ForEach(c => Worksheet.Internals.CellsCollection.Add(c.Key.RowNumber, c.Key.ColumnNumber, c.Value)); + + + Int32 firstRowReturn = RangeAddress.FirstAddress.RowNumber; + Int32 lastRowReturn = RangeAddress.FirstAddress.RowNumber + numberOfRows - 1; + Int32 firstColumnReturn = RangeAddress.FirstAddress.ColumnNumber; + Int32 lastColumnReturn = RangeAddress.LastAddress.ColumnNumber; + + Worksheet.BreakConditionalFormatsIntoCells(cellsToDelete.Except(cellsToInsert.Keys).ToList()); + using (var asRange = AsRange()) + Worksheet.NotifyRangeShiftedRows(asRange, numberOfRows); + + var rangeToReturn = Worksheet.Range(firstRowReturn, firstColumnReturn, lastRowReturn, lastColumnReturn); + + if (formatFromAbove && rangeToReturn.RangeAddress.FirstAddress.RowNumber > 1) + { + using (var fr = rangeToReturn.FirstRow()) + { + using (var model = fr.RowAbove()) + { + var modelFirstColumn = model.FirstCellUsed(true); + var modelLastColumn = model.LastCellUsed(true); + if (modelFirstColumn != null && modelLastColumn != null) + { + Int32 firstCoReturned = modelFirstColumn.Address.ColumnNumber + - model.RangeAddress.FirstAddress.ColumnNumber + 1; + Int32 lastCoReturned = modelLastColumn.Address.ColumnNumber + - model.RangeAddress.FirstAddress.ColumnNumber + 1; + for (Int32 co = firstCoReturned; co <= lastCoReturned; co++) + { + rangeToReturn.Column(co).Style = model.Cell(co).Style; + } + } + } + } + } + else + { + var lastCoUsed = rangeToReturn.LastColumnUsed(true); + if (lastCoUsed != null) + { + Int32 lastCoReturned = lastCoUsed.ColumnNumber(); + for (Int32 co = 1; co <= lastCoReturned; co++) + { + var styleToUse = Worksheet.Internals.ColumnsCollection.ContainsKey(co) + ? Worksheet.Internals.ColumnsCollection[co].Style + : Worksheet.Style; + rangeToReturn.Column(co).Style = styleToUse; + } + } + } + + // Skip calling .Rows() for performance reasons if required. + if (nullReturn) + return null; + + return rangeToReturn.Rows(); + } + + private void ClearMerged() + { + var mergeToDelete = Worksheet.Internals.MergedRanges.Where(Intersects).ToList(); + mergeToDelete.ForEach(m => Worksheet.Internals.MergedRanges.Remove(m)); + } + + public Boolean Contains(IXLCell cell) + { + return Contains(cell.Address as XLAddress); + } + + public bool Contains(XLAddress first, XLAddress last) + { + return Contains(first) && Contains(last); + } + + public bool Contains(XLAddress address) + { + return RangeAddress.FirstAddress.RowNumber <= address.RowNumber && + address.RowNumber <= RangeAddress.LastAddress.RowNumber && + RangeAddress.FirstAddress.ColumnNumber <= address.ColumnNumber && + address.ColumnNumber <= RangeAddress.LastAddress.ColumnNumber; + } + + public void Delete(XLShiftDeletedCells shiftDeleteCells) + { + int numberOfRows = RowCount(); + int numberOfColumns = ColumnCount(); + IXLRange shiftedRangeFormula = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber); + + + foreach ( + XLCell cell in + Worksheet.Workbook.Worksheets.Cast().SelectMany( + xlWorksheet => (xlWorksheet).Internals.CellsCollection.GetCells( + c => !XLHelper.IsNullOrWhiteSpace(c.FormulaA1)))) + { + if (shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp) + cell.ShiftFormulaRows((XLRange)shiftedRangeFormula, numberOfRows * -1); + else + cell.ShiftFormulaColumns((XLRange)shiftedRangeFormula, numberOfColumns * -1); + } + + // Range to shift... + var cellsToInsert = new Dictionary(); + //var cellsDataValidations = new Dictionary(); + var cellsToDelete = new List(); + var shiftLeftQuery = Worksheet.Internals.CellsCollection.GetCells( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + Worksheet.Internals.CellsCollection.MaxColumnUsed); + + var shiftUpQuery = Worksheet.Internals.CellsCollection.GetCells( + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber, + Worksheet.Internals.CellsCollection.MaxRowUsed, + RangeAddress.LastAddress.ColumnNumber); + + + int columnModifier = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft ? ColumnCount() : 0; + int rowModifier = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp ? RowCount() : 0; + var cellsQuery = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft ? shiftLeftQuery : shiftUpQuery; + foreach (XLCell c in cellsQuery) + { + var newKey = new XLAddress(Worksheet, c.Address.RowNumber - rowModifier, + c.Address.ColumnNumber - columnModifier, + false, false); + var newCell = new XLCell(Worksheet, newKey, c.GetStyleId()); + newCell.CopyValuesFrom(c); + newCell.FormulaA1 = c.FormulaA1; + cellsToDelete.Add(c.Address); + + bool canInsert = shiftDeleteCells == XLShiftDeletedCells.ShiftCellsLeft + ? c.Address.ColumnNumber > RangeAddress.LastAddress.ColumnNumber + : c.Address.RowNumber > RangeAddress.LastAddress.RowNumber; + + if (canInsert) + cellsToInsert.Add(newKey, newCell); + } + + + cellsToDelete.ForEach(c => Worksheet.Internals.CellsCollection.Remove(c.RowNumber, c.ColumnNumber)); + cellsToInsert.ForEach( + c => Worksheet.Internals.CellsCollection.Add(c.Key.RowNumber, c.Key.ColumnNumber, c.Value)); + + var mergesToRemove = Worksheet.Internals.MergedRanges.Where(Contains).ToList(); + mergesToRemove.ForEach(r => Worksheet.Internals.MergedRanges.Remove(r)); + + var hyperlinksToRemove = Worksheet.Hyperlinks.Where(hl => Contains(hl.Cell.AsRange())).ToList(); + hyperlinksToRemove.ForEach(hl => Worksheet.Hyperlinks.Delete(hl)); + + Worksheet.BreakConditionalFormatsIntoCells(cellsToDelete.Except(cellsToInsert.Keys).ToList()); + using (var shiftedRange = AsRange()) + { + if (shiftDeleteCells == XLShiftDeletedCells.ShiftCellsUp) + Worksheet.NotifyRangeShiftedRows(shiftedRange, rowModifier * -1); + else + Worksheet.NotifyRangeShiftedColumns(shiftedRange, columnModifier * -1); + } + } + + public override string ToString() + { + return String.Format("'{0}'!{1}:{2}", Worksheet.Name, RangeAddress.FirstAddress, RangeAddress.LastAddress); + } + + protected void ShiftColumns(IXLRangeAddress thisRangeAddress, XLRange shiftedRange, int columnsShifted) + { + if (thisRangeAddress.IsInvalid || shiftedRange.RangeAddress.IsInvalid) return; + + if ((columnsShifted < 0 + // all columns + && + thisRangeAddress.FirstAddress.ColumnNumber >= shiftedRange.RangeAddress.FirstAddress.ColumnNumber + && + thisRangeAddress.LastAddress.ColumnNumber <= + shiftedRange.RangeAddress.FirstAddress.ColumnNumber - columnsShifted + // all rows + && thisRangeAddress.FirstAddress.RowNumber >= shiftedRange.RangeAddress.FirstAddress.RowNumber + && thisRangeAddress.LastAddress.RowNumber <= shiftedRange.RangeAddress.LastAddress.RowNumber + ) || ( + shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= + thisRangeAddress.FirstAddress.ColumnNumber + && + shiftedRange.RangeAddress.FirstAddress.RowNumber <= thisRangeAddress.FirstAddress.RowNumber + && + shiftedRange.RangeAddress.LastAddress.RowNumber >= thisRangeAddress.LastAddress.RowNumber + && shiftedRange.ColumnCount() > + (thisRangeAddress.LastAddress.ColumnNumber - thisRangeAddress.FirstAddress.ColumnNumber + 1) + + + (thisRangeAddress.FirstAddress.ColumnNumber - + shiftedRange.RangeAddress.FirstAddress.ColumnNumber))) + thisRangeAddress.IsInvalid = true; + else + { + if (shiftedRange.RangeAddress.FirstAddress.RowNumber <= thisRangeAddress.FirstAddress.RowNumber + && shiftedRange.RangeAddress.LastAddress.RowNumber >= thisRangeAddress.LastAddress.RowNumber) + { + if ( + (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= + thisRangeAddress.FirstAddress.ColumnNumber && + columnsShifted > 0) + || + (shiftedRange.RangeAddress.FirstAddress.ColumnNumber < + thisRangeAddress.FirstAddress.ColumnNumber && + columnsShifted < 0) + ) + { + thisRangeAddress.FirstAddress = new XLAddress(Worksheet, + thisRangeAddress.FirstAddress.RowNumber, + thisRangeAddress.FirstAddress.ColumnNumber + + columnsShifted, + thisRangeAddress.FirstAddress.FixedRow, + thisRangeAddress.FirstAddress.FixedColumn); + } + + if (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= + thisRangeAddress.LastAddress.ColumnNumber) + { + thisRangeAddress.LastAddress = new XLAddress(Worksheet, + thisRangeAddress.LastAddress.RowNumber, + thisRangeAddress.LastAddress.ColumnNumber + + columnsShifted, + thisRangeAddress.LastAddress.FixedRow, + thisRangeAddress.LastAddress.FixedColumn); + } + } + } + } + + protected void ShiftRows(IXLRangeAddress thisRangeAddress, XLRange shiftedRange, int rowsShifted) + { + if (thisRangeAddress.IsInvalid || shiftedRange.RangeAddress.IsInvalid) return; + + if ((rowsShifted < 0 + // all columns + && thisRangeAddress.FirstAddress.ColumnNumber >= shiftedRange.RangeAddress.FirstAddress.ColumnNumber + && thisRangeAddress.LastAddress.ColumnNumber <= shiftedRange.RangeAddress.FirstAddress.ColumnNumber + // all rows + && thisRangeAddress.FirstAddress.RowNumber >= shiftedRange.RangeAddress.FirstAddress.RowNumber + && thisRangeAddress.LastAddress.RowNumber <= shiftedRange.RangeAddress.LastAddress.RowNumber - rowsShifted + ) || ( + shiftedRange.RangeAddress.FirstAddress.RowNumber <= thisRangeAddress.FirstAddress.RowNumber + && shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= thisRangeAddress.FirstAddress.ColumnNumber + && shiftedRange.RangeAddress.LastAddress.ColumnNumber >= thisRangeAddress.LastAddress.ColumnNumber + && shiftedRange.RowCount() > + (thisRangeAddress.LastAddress.RowNumber - thisRangeAddress.FirstAddress.RowNumber + 1) + + (thisRangeAddress.FirstAddress.RowNumber - shiftedRange.RangeAddress.FirstAddress.RowNumber))) + thisRangeAddress.IsInvalid = true; + else + { + if (shiftedRange.RangeAddress.FirstAddress.ColumnNumber <= thisRangeAddress.FirstAddress.ColumnNumber + && shiftedRange.RangeAddress.LastAddress.ColumnNumber >= thisRangeAddress.LastAddress.ColumnNumber) + { + if ( + (shiftedRange.RangeAddress.FirstAddress.RowNumber <= thisRangeAddress.FirstAddress.RowNumber && rowsShifted > 0) + || (shiftedRange.RangeAddress.FirstAddress.RowNumber < thisRangeAddress.FirstAddress.RowNumber && rowsShifted < 0) + ) + { + thisRangeAddress.FirstAddress = new XLAddress(Worksheet, + thisRangeAddress.FirstAddress.RowNumber + + rowsShifted, + thisRangeAddress.FirstAddress.ColumnNumber, + thisRangeAddress.FirstAddress.FixedRow, + thisRangeAddress.FirstAddress.FixedColumn); + } + + if (shiftedRange.RangeAddress.FirstAddress.RowNumber <= thisRangeAddress.LastAddress.RowNumber) + { + thisRangeAddress.LastAddress = new XLAddress(Worksheet, + thisRangeAddress.LastAddress.RowNumber + + rowsShifted, + thisRangeAddress.LastAddress.ColumnNumber, + thisRangeAddress.LastAddress.FixedRow, + thisRangeAddress.LastAddress.FixedColumn); + } + } + } + } + + public IXLRange RangeUsed() + { + return RangeUsed(false); + } + + public IXLRange RangeUsed(bool includeFormats) + { + var firstCell = FirstCellUsed(includeFormats); + if (firstCell == null) + return null; + var lastCell = LastCellUsed(includeFormats); + return Worksheet.Range(firstCell, lastCell); + } + + public virtual void CopyTo(IXLRangeBase target) + { + CopyTo(target.FirstCell()); + } + + public virtual void CopyTo(IXLCell target) + { + target.Value = this; + } + + //public IXLChart CreateChart(Int32 firstRow, Int32 firstColumn, Int32 lastRow, Int32 lastColumn) + //{ + // IXLChart chart = new XLChartWorksheet; + // chart.FirstRow = firstRow; + // chart.LastRow = lastRow; + // chart.LastColumn = lastColumn; + // chart.FirstColumn = firstColumn; + // Worksheet.Charts.Add(chart); + // return chart; + //} + + + IXLPivotTable IXLRangeBase.CreatePivotTable(IXLCell targetCell) + { + return CreatePivotTable(targetCell); + } + IXLPivotTable IXLRangeBase.CreatePivotTable(IXLCell targetCell, String name) + { + return CreatePivotTable(targetCell, name); + } + + + public XLPivotTable CreatePivotTable(IXLCell targetCell) + { + return CreatePivotTable(targetCell, Guid.NewGuid().ToString()); + } + + public XLPivotTable CreatePivotTable(IXLCell targetCell, String name) + { + return (XLPivotTable)Worksheet.PivotTables.AddNew(name, targetCell, AsRange()); + } + + public IXLAutoFilter SetAutoFilter() + { + using (var asRange = AsRange()) + return Worksheet.AutoFilter.Set(asRange); + } + + #region Sort + + public IXLSortElements SortRows + { + get { return _sortRows ?? (_sortRows = new XLSortElements()); } + } + + public IXLSortElements SortColumns + { + get { return _sortColumns ?? (_sortColumns = new XLSortElements()); } + } + + public IXLRangeBase Sort() + { + if (!SortColumns.Any()) + { + String columnsToSortBy = String.Empty; + Int32 maxColumn = ColumnCount(); + if (maxColumn == XLHelper.MaxColumnNumber) + maxColumn = LastCellUsed(true).Address.ColumnNumber; + for (int i = 1; i <= maxColumn; i++) + { + columnsToSortBy += i + ","; + } + columnsToSortBy = columnsToSortBy.Substring(0, columnsToSortBy.Length - 1); + return Sort(columnsToSortBy); + } + + SortRangeRows(); + return this; + } + + public IXLRangeBase Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + SortColumns.Clear(); + if (XLHelper.IsNullOrWhiteSpace(columnsToSortBy)) + { + columnsToSortBy = String.Empty; + Int32 maxColumn = ColumnCount(); + if (maxColumn == XLHelper.MaxColumnNumber) + maxColumn = LastCellUsed(true).Address.ColumnNumber; + for (int i = 1; i <= maxColumn; i++) + { + columnsToSortBy += i + ","; + } + columnsToSortBy = columnsToSortBy.Substring(0, columnsToSortBy.Length - 1); + } + + foreach (string coPairTrimmed in columnsToSortBy.Split(',').Select(coPair => coPair.Trim())) + { + String coString; + String order; + if (coPairTrimmed.Contains(' ')) + { + var pair = coPairTrimmed.Split(' '); + coString = pair[0]; + order = pair[1]; + } + else + { + coString = coPairTrimmed; + order = sortOrder == XLSortOrder.Ascending ? "ASC" : "DESC"; + } + + Int32 co; + if (!Int32.TryParse(coString, out co)) + co = XLHelper.GetColumnNumberFromLetter(coString); + + SortColumns.Add(co, String.Compare(order, "ASC", true) == 0 ? XLSortOrder.Ascending : XLSortOrder.Descending, ignoreBlanks, matchCase); + } + + SortRangeRows(); + return this; + } + + public IXLRangeBase Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return Sort(columnToSortBy.ToString(), sortOrder, matchCase, ignoreBlanks); + } + + public IXLRangeBase SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + SortRows.Clear(); + Int32 maxColumn = ColumnCount(); + if (maxColumn == XLHelper.MaxColumnNumber) + maxColumn = LastCellUsed(true).Address.ColumnNumber; + + for (int i = 1; i <= maxColumn; i++) + { + SortRows.Add(i, sortOrder, ignoreBlanks, matchCase); + } + + SortRangeColumns(); + return this; + } + + + #region Sort Rows + + private void SortRangeRows() + { + Int32 maxRow = RowCount(); + if (maxRow == XLHelper.MaxRowNumber) + maxRow = LastCellUsed(true).Address.RowNumber; + + SortingRangeRows(1, maxRow); + } + + private void SwapRows(Int32 row1, Int32 row2) + { + int row1InWs = RangeAddress.FirstAddress.RowNumber + row1 - 1; + int row2InWs = RangeAddress.FirstAddress.RowNumber + row2 - 1; + + Int32 firstColumn = RangeAddress.FirstAddress.ColumnNumber; + Int32 lastColumn = RangeAddress.LastAddress.ColumnNumber; + + var range1Sp1 = new XLSheetPoint(row1InWs, firstColumn); + var range1Sp2 = new XLSheetPoint(row1InWs, lastColumn); + var range2Sp1 = new XLSheetPoint(row2InWs, firstColumn); + var range2Sp2 = new XLSheetPoint(row2InWs, lastColumn); + + Worksheet.Internals.CellsCollection.SwapRanges(new XLSheetRange(range1Sp1, range1Sp2), + new XLSheetRange(range2Sp1, range2Sp2), Worksheet); + } + + private int SortRangeRows(int begPoint, int endPoint) + { + int pivot = begPoint; + int m = begPoint + 1; + int n = endPoint; + while ((m < endPoint) && RowQuick(pivot).CompareTo(RowQuick(m), SortColumns) >= 0) + m++; + + while (n > begPoint && RowQuick(pivot).CompareTo(RowQuick(n), SortColumns) <= 0) + n--; + while (m < n) + { + SwapRows(m, n); + + while (m < endPoint && RowQuick(pivot).CompareTo(RowQuick(m), SortColumns) >= 0) + m++; + + while (n > begPoint && RowQuick(pivot).CompareTo(RowQuick(n), SortColumns) <= 0) + n--; + } + if (pivot != n) + SwapRows(n, pivot); + return n; + } + + private void SortingRangeRows(int beg, int end) + { + if (end == beg) + return; + int pivot = SortRangeRows(beg, end); + if (pivot > beg) + SortingRangeRows(beg, pivot - 1); + if (pivot < end) + SortingRangeRows(pivot + 1, end); + } + + #endregion + + #region Sort Columns + + private void SortRangeColumns() + { + Int32 maxColumn = ColumnCount(); + if (maxColumn == XLHelper.MaxColumnNumber) + maxColumn = LastCellUsed(true).Address.ColumnNumber; + SortingRangeColumns(1, maxColumn); + } + + private void SwapColumns(Int32 column1, Int32 column2) + { + int col1InWs = RangeAddress.FirstAddress.ColumnNumber + column1 - 1; + int col2InWs = RangeAddress.FirstAddress.ColumnNumber + column2 - 1; + + Int32 firstRow = RangeAddress.FirstAddress.RowNumber; + Int32 lastRow = RangeAddress.LastAddress.RowNumber; + + var range1Sp1 = new XLSheetPoint(firstRow, col1InWs); + var range1Sp2 = new XLSheetPoint(lastRow, col1InWs); + var range2Sp1 = new XLSheetPoint(firstRow, col2InWs); + var range2Sp2 = new XLSheetPoint(lastRow, col2InWs); + + Worksheet.Internals.CellsCollection.SwapRanges(new XLSheetRange(range1Sp1, range1Sp2), + new XLSheetRange(range2Sp1, range2Sp2), Worksheet); + } + + private int SortRangeColumns(int begPoint, int endPoint) + { + int pivot = begPoint; + int m = begPoint + 1; + int n = endPoint; + while ((m < endPoint) && ColumnQuick(pivot).CompareTo((ColumnQuick(m)), SortRows) >= 0) + m++; + + while ((n > begPoint) && ((ColumnQuick(pivot)).CompareTo((ColumnQuick(n)), SortRows) <= 0)) + n--; + while (m < n) + { + SwapColumns(m, n); + + while ((m < endPoint) && (ColumnQuick(pivot)).CompareTo((ColumnQuick(m)), SortRows) >= 0) + m++; + + while ((n > begPoint) && (ColumnQuick(pivot)).CompareTo((ColumnQuick(n)), SortRows) <= 0) + n--; + } + if (pivot != n) + SwapColumns(n, pivot); + return n; + } + + private void SortingRangeColumns(int beg, int end) + { + if (end == beg) + return; + int pivot = SortRangeColumns(beg, end); + if (pivot > beg) + SortingRangeColumns(beg, pivot - 1); + if (pivot < end) + SortingRangeColumns(pivot + 1, end); + } + + #endregion + + #endregion + + public XLRangeColumn ColumnQuick(Int32 column) + { + var firstCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber + column - 1, + false, + false); + var lastCellAddress = new XLAddress(Worksheet, + RangeAddress.LastAddress.RowNumber, + RangeAddress.FirstAddress.ColumnNumber + column - 1, + false, + false); + return new XLRangeColumn( + new XLRangeParameters(new XLRangeAddress(firstCellAddress, lastCellAddress), Worksheet.Style), true); + } + + public XLRangeRow RowQuick(Int32 row) + { + var firstCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber + row - 1, + RangeAddress.FirstAddress.ColumnNumber, + false, + false); + var lastCellAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber + row - 1, + RangeAddress.LastAddress.ColumnNumber, + false, + false); + return new XLRangeRow( + new XLRangeParameters(new XLRangeAddress(firstCellAddress, lastCellAddress), Worksheet.Style), true); + } + + public void Dispose() + { + if (_shiftedRowsAction != null) + { + RangeAddress.Worksheet.RangeShiftedRows.Remove(_shiftedRowsAction); + _shiftedRowsAction = null; + } + + if (_shiftedColumnsAction != null) + { + RangeAddress.Worksheet.RangeShiftedColumns.Remove(_shiftedColumnsAction); + _shiftedColumnsAction = null; + } + } + + public IXLDataValidation SetDataValidation() + { + return DataValidation; + } + + public IXLConditionalFormat AddConditionalFormat() + { + using (var asRange = AsRange()) + { + var cf = new XLConditionalFormat(asRange); + Worksheet.ConditionalFormats.Add(cf); + return cf; + } + } + + + internal IXLConditionalFormat AddConditionalFormat(IXLConditionalFormat source) + { + using (var asRange = AsRange()) + { + var cf = new XLConditionalFormat(asRange); + cf.CopyFrom(source); + Worksheet.ConditionalFormats.Add(cf); + return cf; + } + } + + public void Select() + { + Worksheet.SelectedRanges.Add(AsRange()); + } + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeColumn.cs b/ClosedXML/Excel/Ranges/XLRangeColumn.cs index 50841a9..7449d3c 100644 --- a/ClosedXML/Excel/Ranges/XLRangeColumn.cs +++ b/ClosedXML/Excel/Ranges/XLRangeColumn.cs @@ -1,355 +1,355 @@ -namespace ClosedXML.Excel -{ - using System; - using System.Linq; - - - internal class XLRangeColumn : XLRangeBase, IXLRangeColumn - { - #region Constructor - - public XLRangeColumn(XLRangeParameters rangeParameters, bool quickLoad) - : base(rangeParameters.RangeAddress) - { - if (quickLoad) return; - - SubscribeToShiftedRows((range, rowsShifted) => this.WorksheetRangeShiftedRows(range, rowsShifted)); - SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); - SetStyle(rangeParameters.DefaultStyle); - } - - #endregion - - #region IXLRangeColumn Members - - IXLCell IXLRangeColumn.Cell(int row) - { - return Cell(row); - } - - public new IXLCells Cells(string cellsInColumn) - { - var retVal = new XLCells(false, false); - var rangePairs = cellsInColumn.Split(','); - foreach (string pair in rangePairs) - retVal.Add(Range(pair.Trim()).RangeAddress); - return retVal; - } - - public IXLCells Cells(int firstRow, int lastRow) - { - return Cells(firstRow + ":" + lastRow); - } - - public void Delete() - { - Delete(XLShiftDeletedCells.ShiftCellsLeft); - } - - public IXLCells InsertCellsAbove(int numberOfRows) - { - return InsertCellsAbove(numberOfRows, false); - } - - public IXLCells InsertCellsAbove(int numberOfRows, bool expandRange) - { - return InsertRowsAbove(numberOfRows, expandRange).Cells(); - } - - public IXLCells InsertCellsBelow(int numberOfRows) - { - return InsertCellsBelow(numberOfRows, true); - } - - public IXLCells InsertCellsBelow(int numberOfRows, bool expandRange) - { - return InsertRowsBelow(numberOfRows, expandRange).Cells(); - } - - public int CellCount() - { - return RangeAddress.LastAddress.RowNumber - RangeAddress.FirstAddress.RowNumber + 1; - } - - public IXLRangeColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) - { - base.Sort(1, sortOrder, matchCase, ignoreBlanks); - return this; - } - - - public new IXLRangeColumn CopyTo(IXLCell target) - { - base.CopyTo(target); - - int lastRowNumber = target.Address.RowNumber + RowCount() - 1; - if (lastRowNumber > XLHelper.MaxRowNumber) - lastRowNumber = XLHelper.MaxRowNumber; - int lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLHelper.MaxColumnNumber) - lastColumnNumber = XLHelper.MaxColumnNumber; - - return target.Worksheet.Range( - target.Address.RowNumber, - target.Address.ColumnNumber, - lastRowNumber, - lastColumnNumber) - .Column(1); - } - - public new IXLRangeColumn CopyTo(IXLRangeBase target) - { - base.CopyTo(target); - - int lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; - if (lastRowNumber > XLHelper.MaxRowNumber) - lastRowNumber = XLHelper.MaxRowNumber; - int lastColumnNumber = target.RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLHelper.MaxColumnNumber) - lastColumnNumber = XLHelper.MaxColumnNumber; - - return target.Worksheet.Range( - target.RangeAddress.FirstAddress.RowNumber, - target.RangeAddress.FirstAddress.ColumnNumber, - lastRowNumber, - lastColumnNumber) - .Column(1); - } - - public IXLRangeColumn Column(int start, int end) - { - return Range(start, end).FirstColumn(); - } - - public IXLRangeColumn Column(IXLCell start, IXLCell end) - { - return Column(start.Address.RowNumber, end.Address.RowNumber); - } - - public IXLRangeColumns Columns(string columns) - { - var retVal = new XLRangeColumns(); - var rowPairs = columns.Split(','); - foreach (string trimmedPair in rowPairs.Select(pair => pair.Trim())) - { - string firstRow; - string lastRow; - if (trimmedPair.Contains(':') || trimmedPair.Contains('-')) - { - var rowRange = trimmedPair.Contains('-') - ? trimmedPair.Replace('-', ':').Split(':') - : trimmedPair.Split(':'); - - firstRow = rowRange[0]; - lastRow = rowRange[1]; - } - else - { - firstRow = trimmedPair; - lastRow = trimmedPair; - } - - retVal.Add(Range(firstRow, lastRow).FirstColumn()); - } - - return retVal; - } - - public IXLRangeColumn SetDataType(XLCellValues dataType) - { - DataType = dataType; - return this; - } - - public IXLColumn WorksheetColumn() - { - return Worksheet.Column(RangeAddress.FirstAddress.ColumnNumber); - } - - #endregion - - public XLCell Cell(int row) - { - return Cell(row, 1); - } - - private void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) - { - ShiftColumns(RangeAddress, range, columnsShifted); - } - - private void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) - { - ShiftRows(RangeAddress, range, rowsShifted); - } - - public XLRange Range(int firstRow, int lastRow) - { - return Range(firstRow, 1, lastRow, 1); - } - - 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 int CompareTo(XLRangeColumn otherColumn, IXLSortElements rowsToSort) - { - foreach (IXLSortElement e in rowsToSort) - { - var thisCell = Cell(e.ElementNumber); - var otherCell = otherColumn.Cell(e.ElementNumber); - int comparison; - bool thisCellIsBlank = thisCell.IsEmpty(); - bool otherCellIsBlank = otherCell.IsEmpty(); - if (e.IgnoreBlanks && (thisCellIsBlank || otherCellIsBlank)) - { - if (thisCellIsBlank && otherCellIsBlank) - comparison = 0; - else - { - if (thisCellIsBlank) - comparison = e.SortOrder == XLSortOrder.Ascending ? 1 : -1; - else - comparison = e.SortOrder == XLSortOrder.Ascending ? -1 : 1; - } - } - else - { - if (thisCell.DataType == otherCell.DataType) - { - if (thisCell.DataType == XLCellValues.Text) - { - comparison = e.MatchCase - ? thisCell.InnerText.CompareTo(otherCell.InnerText) - : String.Compare(thisCell.InnerText, otherCell.InnerText, true); - } - else if (thisCell.DataType == XLCellValues.TimeSpan) - comparison = thisCell.GetTimeSpan().CompareTo(otherCell.GetTimeSpan()); - else - comparison = Double.Parse(thisCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture).CompareTo(Double.Parse(otherCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture)); - } - else if (e.MatchCase) - comparison = String.Compare(thisCell.GetString(), otherCell.GetString(), true); - else - comparison = thisCell.GetString().CompareTo(otherCell.GetString()); - } - - if (comparison != 0) - return e.SortOrder == XLSortOrder.Ascending ? comparison : comparison * -1; - } - - return 0; - } - - private XLRangeColumn ColumnShift(Int32 columnsToShift) - { - Int32 columnNumber = ColumnNumber() + columnsToShift; - return Worksheet.Range( - RangeAddress.FirstAddress.RowNumber, - columnNumber, - RangeAddress.LastAddress.RowNumber, - columnNumber).FirstColumn(); - } - - #region XLRangeColumn Left - - IXLRangeColumn IXLRangeColumn.ColumnLeft() - { - return ColumnLeft(); - } - - IXLRangeColumn IXLRangeColumn.ColumnLeft(Int32 step) - { - return ColumnLeft(step); - } - - public XLRangeColumn ColumnLeft() - { - return ColumnLeft(1); - } - - public XLRangeColumn ColumnLeft(Int32 step) - { - return ColumnShift(step * -1); - } - - #endregion - - #region XLRangeColumn Right - - IXLRangeColumn IXLRangeColumn.ColumnRight() - { - return ColumnRight(); - } - - IXLRangeColumn IXLRangeColumn.ColumnRight(Int32 step) - { - return ColumnRight(step); - } - - public XLRangeColumn ColumnRight() - { - return ColumnRight(1); - } - - public XLRangeColumn ColumnRight(Int32 step) - { - return ColumnShift(step); - } - - #endregion - - - public IXLTable AsTable() - { - using (var asRange = AsRange()) - return asRange.AsTable(); - } - - public IXLTable AsTable(string name) - { - using (var asRange = AsRange()) - return asRange.AsTable(name); - } - - public IXLTable CreateTable() - { - using (var asRange = AsRange()) - return asRange.CreateTable(); - } - - public IXLTable CreateTable(string name) - { - using (var asRange = AsRange()) - return asRange.CreateTable(name); - } - - public new IXLRangeColumn Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - base.Clear(clearOptions); - return this; - } - - public IXLRangeColumn ColumnUsed(Boolean includeFormats = false) - { - return Column(FirstCellUsed(includeFormats), LastCellUsed(includeFormats)); - } - - } -} +namespace ClosedXML.Excel +{ + using System; + using System.Linq; + + + internal class XLRangeColumn : XLRangeBase, IXLRangeColumn + { + #region Constructor + + public XLRangeColumn(XLRangeParameters rangeParameters, bool quickLoad) + : base(rangeParameters.RangeAddress) + { + if (quickLoad) return; + + SubscribeToShiftedRows((range, rowsShifted) => this.WorksheetRangeShiftedRows(range, rowsShifted)); + SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); + SetStyle(rangeParameters.DefaultStyle); + } + + #endregion + + #region IXLRangeColumn Members + + IXLCell IXLRangeColumn.Cell(int row) + { + return Cell(row); + } + + public new IXLCells Cells(string cellsInColumn) + { + var retVal = new XLCells(false, false); + var rangePairs = cellsInColumn.Split(','); + foreach (string pair in rangePairs) + retVal.Add(Range(pair.Trim()).RangeAddress); + return retVal; + } + + public IXLCells Cells(int firstRow, int lastRow) + { + return Cells(firstRow + ":" + lastRow); + } + + public void Delete() + { + Delete(XLShiftDeletedCells.ShiftCellsLeft); + } + + public IXLCells InsertCellsAbove(int numberOfRows) + { + return InsertCellsAbove(numberOfRows, false); + } + + public IXLCells InsertCellsAbove(int numberOfRows, bool expandRange) + { + return InsertRowsAbove(numberOfRows, expandRange).Cells(); + } + + public IXLCells InsertCellsBelow(int numberOfRows) + { + return InsertCellsBelow(numberOfRows, true); + } + + public IXLCells InsertCellsBelow(int numberOfRows, bool expandRange) + { + return InsertRowsBelow(numberOfRows, expandRange).Cells(); + } + + public int CellCount() + { + return RangeAddress.LastAddress.RowNumber - RangeAddress.FirstAddress.RowNumber + 1; + } + + public IXLRangeColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + base.Sort(1, sortOrder, matchCase, ignoreBlanks); + return this; + } + + + public new IXLRangeColumn CopyTo(IXLCell target) + { + base.CopyTo(target); + + int lastRowNumber = target.Address.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + int lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range( + target.Address.RowNumber, + target.Address.ColumnNumber, + lastRowNumber, + lastColumnNumber) + .Column(1); + } + + public new IXLRangeColumn CopyTo(IXLRangeBase target) + { + base.CopyTo(target); + + int lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + int lastColumnNumber = target.RangeAddress.FirstAddress.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range( + target.RangeAddress.FirstAddress.RowNumber, + target.RangeAddress.FirstAddress.ColumnNumber, + lastRowNumber, + lastColumnNumber) + .Column(1); + } + + public IXLRangeColumn Column(int start, int end) + { + return Range(start, end).FirstColumn(); + } + + public IXLRangeColumn Column(IXLCell start, IXLCell end) + { + return Column(start.Address.RowNumber, end.Address.RowNumber); + } + + public IXLRangeColumns Columns(string columns) + { + var retVal = new XLRangeColumns(); + var rowPairs = columns.Split(','); + foreach (string trimmedPair in rowPairs.Select(pair => pair.Trim())) + { + string firstRow; + string lastRow; + if (trimmedPair.Contains(':') || trimmedPair.Contains('-')) + { + var rowRange = trimmedPair.Contains('-') + ? trimmedPair.Replace('-', ':').Split(':') + : trimmedPair.Split(':'); + + firstRow = rowRange[0]; + lastRow = rowRange[1]; + } + else + { + firstRow = trimmedPair; + lastRow = trimmedPair; + } + + retVal.Add(Range(firstRow, lastRow).FirstColumn()); + } + + return retVal; + } + + public IXLRangeColumn SetDataType(XLCellValues dataType) + { + DataType = dataType; + return this; + } + + public IXLColumn WorksheetColumn() + { + return Worksheet.Column(RangeAddress.FirstAddress.ColumnNumber); + } + + #endregion + + public XLCell Cell(int row) + { + return Cell(row, 1); + } + + private void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) + { + ShiftColumns(RangeAddress, range, columnsShifted); + } + + private void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) + { + ShiftRows(RangeAddress, range, rowsShifted); + } + + public XLRange Range(int firstRow, int lastRow) + { + return Range(firstRow, 1, lastRow, 1); + } + + 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 int CompareTo(XLRangeColumn otherColumn, IXLSortElements rowsToSort) + { + foreach (IXLSortElement e in rowsToSort) + { + var thisCell = Cell(e.ElementNumber); + var otherCell = otherColumn.Cell(e.ElementNumber); + int comparison; + bool thisCellIsBlank = thisCell.IsEmpty(); + bool otherCellIsBlank = otherCell.IsEmpty(); + if (e.IgnoreBlanks && (thisCellIsBlank || otherCellIsBlank)) + { + if (thisCellIsBlank && otherCellIsBlank) + comparison = 0; + else + { + if (thisCellIsBlank) + comparison = e.SortOrder == XLSortOrder.Ascending ? 1 : -1; + else + comparison = e.SortOrder == XLSortOrder.Ascending ? -1 : 1; + } + } + else + { + if (thisCell.DataType == otherCell.DataType) + { + if (thisCell.DataType == XLCellValues.Text) + { + comparison = e.MatchCase + ? thisCell.InnerText.CompareTo(otherCell.InnerText) + : String.Compare(thisCell.InnerText, otherCell.InnerText, true); + } + else if (thisCell.DataType == XLCellValues.TimeSpan) + comparison = thisCell.GetTimeSpan().CompareTo(otherCell.GetTimeSpan()); + else + comparison = Double.Parse(thisCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture).CompareTo(Double.Parse(otherCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture)); + } + else if (e.MatchCase) + comparison = String.Compare(thisCell.GetString(), otherCell.GetString(), true); + else + comparison = thisCell.GetString().CompareTo(otherCell.GetString()); + } + + if (comparison != 0) + return e.SortOrder == XLSortOrder.Ascending ? comparison : comparison * -1; + } + + return 0; + } + + private XLRangeColumn ColumnShift(Int32 columnsToShift) + { + Int32 columnNumber = ColumnNumber() + columnsToShift; + return Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, + columnNumber, + RangeAddress.LastAddress.RowNumber, + columnNumber).FirstColumn(); + } + + #region XLRangeColumn Left + + IXLRangeColumn IXLRangeColumn.ColumnLeft() + { + return ColumnLeft(); + } + + IXLRangeColumn IXLRangeColumn.ColumnLeft(Int32 step) + { + return ColumnLeft(step); + } + + public XLRangeColumn ColumnLeft() + { + return ColumnLeft(1); + } + + public XLRangeColumn ColumnLeft(Int32 step) + { + return ColumnShift(step * -1); + } + + #endregion + + #region XLRangeColumn Right + + IXLRangeColumn IXLRangeColumn.ColumnRight() + { + return ColumnRight(); + } + + IXLRangeColumn IXLRangeColumn.ColumnRight(Int32 step) + { + return ColumnRight(step); + } + + public XLRangeColumn ColumnRight() + { + return ColumnRight(1); + } + + public XLRangeColumn ColumnRight(Int32 step) + { + return ColumnShift(step); + } + + #endregion + + + public IXLTable AsTable() + { + using (var asRange = AsRange()) + return asRange.AsTable(); + } + + public IXLTable AsTable(string name) + { + using (var asRange = AsRange()) + return asRange.AsTable(name); + } + + public IXLTable CreateTable() + { + using (var asRange = AsRange()) + return asRange.CreateTable(); + } + + public IXLTable CreateTable(string name) + { + using (var asRange = AsRange()) + return asRange.CreateTable(name); + } + + public new IXLRangeColumn Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + base.Clear(clearOptions); + return this; + } + + public IXLRangeColumn ColumnUsed(Boolean includeFormats = false) + { + return Column(FirstCellUsed(includeFormats), LastCellUsed(includeFormats)); + } + + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeColumns.cs b/ClosedXML/Excel/Ranges/XLRangeColumns.cs index 83dbfa0..5c78861 100644 --- a/ClosedXML/Excel/Ranges/XLRangeColumns.cs +++ b/ClosedXML/Excel/Ranges/XLRangeColumns.cs @@ -1,148 +1,148 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - using System.Collections; - - internal class XLRangeColumns : IXLRangeColumns, IXLStylized - { - public Boolean StyleChanged { get; set; } - private readonly List _ranges = new List(); - private IXLStyle _style; - - public XLRangeColumns() - { - _style = new XLStyle(this, XLWorkbook.DefaultStyle); - } - - #region IXLRangeColumns Members - - public IXLRangeColumns Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - _ranges.ForEach(c => c.Clear(clearOptions)); - return this; - } - - public void Delete() - { - _ranges.OrderByDescending(c => c.ColumnNumber()).ForEach(r => r.Delete()); - _ranges.Clear(); - } - - public void Add(IXLRangeColumn range) - { - _ranges.Add((XLRangeColumn)range); - } - - public IEnumerator GetEnumerator() - { - return _ranges.Cast() - .OrderBy(r => r.Worksheet.Position) - .ThenBy(r => r.ColumnNumber()) - .GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IXLStyle Style - { - get { return _style; } - set - { - _style = new XLStyle(this, value); - _ranges.ForEach(r => r.Style = value); - } - } - - public IXLCells Cells() - { - var cells = new XLCells(false, false); - foreach (XLRangeColumn container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed() - { - var cells = new XLCells(true, false); - foreach (XLRangeColumn container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed(Boolean includeFormats) - { - var cells = new XLCells(true, includeFormats); - foreach (XLRangeColumn container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLRangeColumns SetDataType(XLCellValues dataType) - { - _ranges.ForEach(c => c.DataType = dataType); - return this; - } - - #endregion - - #region IXLStylized Members - - public IEnumerable Styles - { - get - { - UpdatingStyle = true; - yield return _style; - foreach (XLRangeColumn rng in _ranges) - { - yield return rng.Style; - foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( - rng.RangeAddress.FirstAddress.RowNumber, - rng.RangeAddress.FirstAddress.ColumnNumber, - rng.RangeAddress.LastAddress.RowNumber, - rng.RangeAddress.LastAddress.ColumnNumber)) - yield return r.Style; - } - UpdatingStyle = false; - } - } - - public Boolean UpdatingStyle { get; set; } - - public IXLStyle InnerStyle - { - get { return _style; } - set { _style = new XLStyle(this, value); } - } - - public IXLRanges RangesUsed - { - get - { - var retVal = new XLRanges(); - this.ForEach(c => retVal.Add(c.AsRange())); - return retVal; - } - } - - #endregion - - public void Dispose() - { - if (_ranges != null) - _ranges.ForEach(r => r.Dispose()); - } - - public void Select() - { - foreach (var range in this) - range.Select(); - } - } +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLRangeColumns : IXLRangeColumns, IXLStylized + { + public Boolean StyleChanged { get; set; } + private readonly List _ranges = new List(); + private IXLStyle _style; + + public XLRangeColumns() + { + _style = new XLStyle(this, XLWorkbook.DefaultStyle); + } + + #region IXLRangeColumns Members + + public IXLRangeColumns Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + _ranges.ForEach(c => c.Clear(clearOptions)); + return this; + } + + public void Delete() + { + _ranges.OrderByDescending(c => c.ColumnNumber()).ForEach(r => r.Delete()); + _ranges.Clear(); + } + + public void Add(IXLRangeColumn range) + { + _ranges.Add((XLRangeColumn)range); + } + + public IEnumerator GetEnumerator() + { + return _ranges.Cast() + .OrderBy(r => r.Worksheet.Position) + .ThenBy(r => r.ColumnNumber()) + .GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLStyle Style + { + get { return _style; } + set + { + _style = new XLStyle(this, value); + _ranges.ForEach(r => r.Style = value); + } + } + + public IXLCells Cells() + { + var cells = new XLCells(false, false); + foreach (XLRangeColumn container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(true, false); + foreach (XLRangeColumn container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed(Boolean includeFormats) + { + var cells = new XLCells(true, includeFormats); + foreach (XLRangeColumn container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLRangeColumns SetDataType(XLCellValues dataType) + { + _ranges.ForEach(c => c.DataType = dataType); + return this; + } + + #endregion + + #region IXLStylized Members + + public IEnumerable Styles + { + get + { + UpdatingStyle = true; + yield return _style; + foreach (XLRangeColumn rng in _ranges) + { + yield return rng.Style; + foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( + rng.RangeAddress.FirstAddress.RowNumber, + rng.RangeAddress.FirstAddress.ColumnNumber, + rng.RangeAddress.LastAddress.RowNumber, + rng.RangeAddress.LastAddress.ColumnNumber)) + yield return r.Style; + } + UpdatingStyle = false; + } + } + + public Boolean UpdatingStyle { get; set; } + + public IXLStyle InnerStyle + { + get { return _style; } + set { _style = new XLStyle(this, value); } + } + + public IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion + + public void Dispose() + { + if (_ranges != null) + _ranges.ForEach(r => r.Dispose()); + } + + public void Select() + { + foreach (var range in this) + range.Select(); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Ranges/XLRangeParameters.cs b/ClosedXML/Excel/Ranges/XLRangeParameters.cs index f86d3ac..97b19ab 100644 --- a/ClosedXML/Excel/Ranges/XLRangeParameters.cs +++ b/ClosedXML/Excel/Ranges/XLRangeParameters.cs @@ -1,33 +1,33 @@ -namespace ClosedXML.Excel -{ - internal class XLRangeParameters - { - #region Constructor - - public XLRangeParameters(XLRangeAddress rangeAddress, IXLStyle defaultStyle) - { - RangeAddress = rangeAddress; - _ignoreEvents = !rangeAddress.Worksheet.EventTrackingEnabled; - DefaultStyle = defaultStyle; - } - - #endregion - - #region Properties - - public XLRangeAddress RangeAddress { get; private set; } - - public IXLStyle DefaultStyle { get; private set; } - private bool _ignoreEvents; - public bool IgnoreEvents - { - get { return _ignoreEvents; } - set - { - _ignoreEvents = value; - } - } - - #endregion - } +namespace ClosedXML.Excel +{ + internal class XLRangeParameters + { + #region Constructor + + public XLRangeParameters(XLRangeAddress rangeAddress, IXLStyle defaultStyle) + { + RangeAddress = rangeAddress; + _ignoreEvents = !rangeAddress.Worksheet.EventTrackingEnabled; + DefaultStyle = defaultStyle; + } + + #endregion + + #region Properties + + public XLRangeAddress RangeAddress { get; private set; } + + public IXLStyle DefaultStyle { get; private set; } + private bool _ignoreEvents; + public bool IgnoreEvents + { + get { return _ignoreEvents; } + set + { + _ignoreEvents = value; + } + } + + #endregion + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Ranges/XLRangeRow.cs b/ClosedXML/Excel/Ranges/XLRangeRow.cs index df4e9da..a579975 100644 --- a/ClosedXML/Excel/Ranges/XLRangeRow.cs +++ b/ClosedXML/Excel/Ranges/XLRangeRow.cs @@ -1,350 +1,350 @@ -namespace ClosedXML.Excel -{ - using System; - using System.Linq; - - - internal class XLRangeRow : XLRangeBase, IXLRangeRow - { - #region Constructor - - public XLRangeRow(XLRangeParameters rangeParameters, bool quickLoad) - : base(rangeParameters.RangeAddress) - { - RangeParameters = rangeParameters; - if (quickLoad) return; - if (!RangeParameters.IgnoreEvents) - { - SubscribeToShiftedRows((range, rowsShifted) => this.WorksheetRangeShiftedRows(range, rowsShifted)); - SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); - } - SetStyle(rangeParameters.DefaultStyle); - } - - #endregion - - - public XLRangeParameters RangeParameters { get; private set; } - - #region IXLRangeRow Members - - public IXLCell Cell(int column) - { - return Cell(1, column); - } - - public new IXLCell Cell(string column) - { - return Cell(1, column); - } - - public void Delete() - { - Delete(XLShiftDeletedCells.ShiftCellsUp); - } - - public IXLCells InsertCellsAfter(int numberOfColumns) - { - return InsertCellsAfter(numberOfColumns, true); - } - - public IXLCells InsertCellsAfter(int numberOfColumns, bool expandRange) - { - return InsertColumnsAfter(numberOfColumns, expandRange).Cells(); - } - - public IXLCells InsertCellsBefore(int numberOfColumns) - { - return InsertCellsBefore(numberOfColumns, false); - } - - public IXLCells InsertCellsBefore(int numberOfColumns, bool expandRange) - { - return InsertColumnsBefore(numberOfColumns, expandRange).Cells(); - } - - public new IXLCells Cells(string cellsInRow) - { - var retVal = new XLCells(false, false); - var rangePairs = cellsInRow.Split(','); - foreach (string pair in rangePairs) - retVal.Add(Range(pair.Trim()).RangeAddress); - return retVal; - } - - public IXLCells Cells(int firstColumn, int lastColumn) - { - return Cells(firstColumn + ":" + lastColumn); - } - - public IXLCells Cells(string firstColumn, string lastColumn) - { - return Cells(XLHelper.GetColumnNumberFromLetter(firstColumn) + ":" - + XLHelper.GetColumnNumberFromLetter(lastColumn)); - } - - public int CellCount() - { - return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; - } - - public new IXLRangeRow Sort() - { - return SortLeftToRight(); - } - - public new IXLRangeRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) - { - base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks); - return this; - } - - public new IXLRangeRow CopyTo(IXLCell target) - { - base.CopyTo(target); - - int lastRowNumber = target.Address.RowNumber + RowCount() - 1; - if (lastRowNumber > XLHelper.MaxRowNumber) - lastRowNumber = XLHelper.MaxRowNumber; - int lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLHelper.MaxColumnNumber) - lastColumnNumber = XLHelper.MaxColumnNumber; - - return target.Worksheet.Range( - target.Address.RowNumber, - target.Address.ColumnNumber, - lastRowNumber, - lastColumnNumber) - .Row(1); - } - - public new IXLRangeRow CopyTo(IXLRangeBase target) - { - base.CopyTo(target); - int lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; - if (lastRowNumber > XLHelper.MaxRowNumber) - lastRowNumber = XLHelper.MaxRowNumber; - int lastColumnNumber = target.RangeAddress.LastAddress.ColumnNumber + ColumnCount() - 1; - if (lastColumnNumber > XLHelper.MaxColumnNumber) - lastColumnNumber = XLHelper.MaxColumnNumber; - - return target.Worksheet.Range( - target.RangeAddress.FirstAddress.RowNumber, - target.RangeAddress.LastAddress.ColumnNumber, - lastRowNumber, - lastColumnNumber) - .Row(1); - } - - public IXLRangeRow Row(int start, int end) - { - return Range(1, start, 1, end).Row(1); - } - - public IXLRangeRow Row(IXLCell start, IXLCell end) - { - return Row(start.Address.ColumnNumber, end.Address.ColumnNumber); - } - - public IXLRangeRows Rows(string rows) - { - var retVal = new XLRangeRows(); - var columnPairs = rows.Split(','); - foreach (string trimmedPair in columnPairs.Select(pair => pair.Trim())) - { - string firstColumn; - string lastColumn; - if (trimmedPair.Contains(':') || trimmedPair.Contains('-')) - { - var columnRange = trimmedPair.Contains('-') - ? trimmedPair.Replace('-', ':').Split(':') - : trimmedPair.Split(':'); - firstColumn = columnRange[0]; - lastColumn = columnRange[1]; - } - else - { - firstColumn = trimmedPair; - lastColumn = trimmedPair; - } - - retVal.Add(Range(firstColumn, lastColumn).FirstRow()); - } - - return retVal; - } - - public IXLRangeRow SetDataType(XLCellValues dataType) - { - DataType = dataType; - return this; - } - - public IXLRow WorksheetRow() - { - return Worksheet.Row(RangeAddress.FirstAddress.RowNumber); - } - - #endregion - - private void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) - { - ShiftColumns(RangeAddress, range, columnsShifted); - } - - private void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) - { - ShiftRows(RangeAddress, range, rowsShifted); - } - - public IXLRange Range(int firstColumn, int lastColumn) - { - return Range(1, firstColumn, 1, lastColumn); - } - - 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 int CompareTo(XLRangeRow otherRow, IXLSortElements columnsToSort) - { - foreach (IXLSortElement e in columnsToSort) - { - var thisCell = (XLCell)Cell(e.ElementNumber); - var otherCell = (XLCell)otherRow.Cell(e.ElementNumber); - int comparison; - bool thisCellIsBlank = thisCell.IsEmpty(); - bool otherCellIsBlank = otherCell.IsEmpty(); - if (e.IgnoreBlanks && (thisCellIsBlank || otherCellIsBlank)) - { - if (thisCellIsBlank && otherCellIsBlank) - comparison = 0; - else - { - if (thisCellIsBlank) - comparison = e.SortOrder == XLSortOrder.Ascending ? 1 : -1; - else - comparison = e.SortOrder == XLSortOrder.Ascending ? -1 : 1; - } - } - else - { - if (thisCell.DataType == otherCell.DataType) - { - if (thisCell.DataType == XLCellValues.Text) - { - comparison = e.MatchCase - ? thisCell.InnerText.CompareTo(otherCell.InnerText) - : String.Compare(thisCell.InnerText, otherCell.InnerText, true); - } - else if (thisCell.DataType == XLCellValues.TimeSpan) - comparison = thisCell.GetTimeSpan().CompareTo(otherCell.GetTimeSpan()); - else - comparison = Double.Parse(thisCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture).CompareTo(Double.Parse(otherCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture)); - } - else if (e.MatchCase) - comparison = String.Compare(thisCell.GetString(), otherCell.GetString(), true); - else - comparison = thisCell.GetString().CompareTo(otherCell.GetString()); - } - - if (comparison != 0) - return e.SortOrder == XLSortOrder.Ascending ? comparison : comparison * -1; - } - - return 0; - } - - private XLRangeRow RowShift(Int32 rowsToShift) - { - Int32 rowNum = RowNumber() + rowsToShift; - - var range = Worksheet.Range( - rowNum, - RangeAddress.FirstAddress.ColumnNumber, - rowNum, - RangeAddress.LastAddress.ColumnNumber); - - var result = range.FirstRow(); - range.Dispose(); - - return result; - } - - #region XLRangeRow Above - - IXLRangeRow IXLRangeRow.RowAbove() - { - return RowAbove(); - } - - IXLRangeRow IXLRangeRow.RowAbove(Int32 step) - { - return RowAbove(step); - } - - public XLRangeRow RowAbove() - { - return RowAbove(1); - } - - public XLRangeRow RowAbove(Int32 step) - { - return RowShift(step * -1); - } - - #endregion - - #region XLRangeRow Below - - IXLRangeRow IXLRangeRow.RowBelow() - { - return RowBelow(); - } - - IXLRangeRow IXLRangeRow.RowBelow(Int32 step) - { - return RowBelow(step); - } - - public XLRangeRow RowBelow() - { - return RowBelow(1); - } - - public XLRangeRow RowBelow(Int32 step) - { - return RowShift(step); - } - - #endregion - - public new IXLRangeRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - base.Clear(clearOptions); - return this; - } - - public IXLRangeRow RowUsed(Boolean includeFormats = false) - { - return Row(FirstCellUsed(includeFormats), LastCellUsed(includeFormats)); - } - - } +namespace ClosedXML.Excel +{ + using System; + using System.Linq; + + + internal class XLRangeRow : XLRangeBase, IXLRangeRow + { + #region Constructor + + public XLRangeRow(XLRangeParameters rangeParameters, bool quickLoad) + : base(rangeParameters.RangeAddress) + { + RangeParameters = rangeParameters; + if (quickLoad) return; + if (!RangeParameters.IgnoreEvents) + { + SubscribeToShiftedRows((range, rowsShifted) => this.WorksheetRangeShiftedRows(range, rowsShifted)); + SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); + } + SetStyle(rangeParameters.DefaultStyle); + } + + #endregion + + + public XLRangeParameters RangeParameters { get; private set; } + + #region IXLRangeRow Members + + public IXLCell Cell(int column) + { + return Cell(1, column); + } + + public new IXLCell Cell(string column) + { + return Cell(1, column); + } + + public void Delete() + { + Delete(XLShiftDeletedCells.ShiftCellsUp); + } + + public IXLCells InsertCellsAfter(int numberOfColumns) + { + return InsertCellsAfter(numberOfColumns, true); + } + + public IXLCells InsertCellsAfter(int numberOfColumns, bool expandRange) + { + return InsertColumnsAfter(numberOfColumns, expandRange).Cells(); + } + + public IXLCells InsertCellsBefore(int numberOfColumns) + { + return InsertCellsBefore(numberOfColumns, false); + } + + public IXLCells InsertCellsBefore(int numberOfColumns, bool expandRange) + { + return InsertColumnsBefore(numberOfColumns, expandRange).Cells(); + } + + public new IXLCells Cells(string cellsInRow) + { + var retVal = new XLCells(false, false); + var rangePairs = cellsInRow.Split(','); + foreach (string pair in rangePairs) + retVal.Add(Range(pair.Trim()).RangeAddress); + return retVal; + } + + public IXLCells Cells(int firstColumn, int lastColumn) + { + return Cells(firstColumn + ":" + lastColumn); + } + + public IXLCells Cells(string firstColumn, string lastColumn) + { + return Cells(XLHelper.GetColumnNumberFromLetter(firstColumn) + ":" + + XLHelper.GetColumnNumberFromLetter(lastColumn)); + } + + public int CellCount() + { + return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; + } + + public new IXLRangeRow Sort() + { + return SortLeftToRight(); + } + + public new IXLRangeRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks); + return this; + } + + public new IXLRangeRow CopyTo(IXLCell target) + { + base.CopyTo(target); + + int lastRowNumber = target.Address.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + int lastColumnNumber = target.Address.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range( + target.Address.RowNumber, + target.Address.ColumnNumber, + lastRowNumber, + lastColumnNumber) + .Row(1); + } + + public new IXLRangeRow CopyTo(IXLRangeBase target) + { + base.CopyTo(target); + int lastRowNumber = target.RangeAddress.FirstAddress.RowNumber + RowCount() - 1; + if (lastRowNumber > XLHelper.MaxRowNumber) + lastRowNumber = XLHelper.MaxRowNumber; + int lastColumnNumber = target.RangeAddress.LastAddress.ColumnNumber + ColumnCount() - 1; + if (lastColumnNumber > XLHelper.MaxColumnNumber) + lastColumnNumber = XLHelper.MaxColumnNumber; + + return target.Worksheet.Range( + target.RangeAddress.FirstAddress.RowNumber, + target.RangeAddress.LastAddress.ColumnNumber, + lastRowNumber, + lastColumnNumber) + .Row(1); + } + + public IXLRangeRow Row(int start, int end) + { + return Range(1, start, 1, end).Row(1); + } + + public IXLRangeRow Row(IXLCell start, IXLCell end) + { + return Row(start.Address.ColumnNumber, end.Address.ColumnNumber); + } + + public IXLRangeRows Rows(string rows) + { + var retVal = new XLRangeRows(); + var columnPairs = rows.Split(','); + foreach (string trimmedPair in columnPairs.Select(pair => pair.Trim())) + { + string firstColumn; + string lastColumn; + if (trimmedPair.Contains(':') || trimmedPair.Contains('-')) + { + var columnRange = trimmedPair.Contains('-') + ? trimmedPair.Replace('-', ':').Split(':') + : trimmedPair.Split(':'); + firstColumn = columnRange[0]; + lastColumn = columnRange[1]; + } + else + { + firstColumn = trimmedPair; + lastColumn = trimmedPair; + } + + retVal.Add(Range(firstColumn, lastColumn).FirstRow()); + } + + return retVal; + } + + public IXLRangeRow SetDataType(XLCellValues dataType) + { + DataType = dataType; + return this; + } + + public IXLRow WorksheetRow() + { + return Worksheet.Row(RangeAddress.FirstAddress.RowNumber); + } + + #endregion + + private void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) + { + ShiftColumns(RangeAddress, range, columnsShifted); + } + + private void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) + { + ShiftRows(RangeAddress, range, rowsShifted); + } + + public IXLRange Range(int firstColumn, int lastColumn) + { + return Range(1, firstColumn, 1, lastColumn); + } + + 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 int CompareTo(XLRangeRow otherRow, IXLSortElements columnsToSort) + { + foreach (IXLSortElement e in columnsToSort) + { + var thisCell = (XLCell)Cell(e.ElementNumber); + var otherCell = (XLCell)otherRow.Cell(e.ElementNumber); + int comparison; + bool thisCellIsBlank = thisCell.IsEmpty(); + bool otherCellIsBlank = otherCell.IsEmpty(); + if (e.IgnoreBlanks && (thisCellIsBlank || otherCellIsBlank)) + { + if (thisCellIsBlank && otherCellIsBlank) + comparison = 0; + else + { + if (thisCellIsBlank) + comparison = e.SortOrder == XLSortOrder.Ascending ? 1 : -1; + else + comparison = e.SortOrder == XLSortOrder.Ascending ? -1 : 1; + } + } + else + { + if (thisCell.DataType == otherCell.DataType) + { + if (thisCell.DataType == XLCellValues.Text) + { + comparison = e.MatchCase + ? thisCell.InnerText.CompareTo(otherCell.InnerText) + : String.Compare(thisCell.InnerText, otherCell.InnerText, true); + } + else if (thisCell.DataType == XLCellValues.TimeSpan) + comparison = thisCell.GetTimeSpan().CompareTo(otherCell.GetTimeSpan()); + else + comparison = Double.Parse(thisCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture).CompareTo(Double.Parse(otherCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture)); + } + else if (e.MatchCase) + comparison = String.Compare(thisCell.GetString(), otherCell.GetString(), true); + else + comparison = thisCell.GetString().CompareTo(otherCell.GetString()); + } + + if (comparison != 0) + return e.SortOrder == XLSortOrder.Ascending ? comparison : comparison * -1; + } + + return 0; + } + + private XLRangeRow RowShift(Int32 rowsToShift) + { + Int32 rowNum = RowNumber() + rowsToShift; + + var range = Worksheet.Range( + rowNum, + RangeAddress.FirstAddress.ColumnNumber, + rowNum, + RangeAddress.LastAddress.ColumnNumber); + + var result = range.FirstRow(); + range.Dispose(); + + return result; + } + + #region XLRangeRow Above + + IXLRangeRow IXLRangeRow.RowAbove() + { + return RowAbove(); + } + + IXLRangeRow IXLRangeRow.RowAbove(Int32 step) + { + return RowAbove(step); + } + + public XLRangeRow RowAbove() + { + return RowAbove(1); + } + + public XLRangeRow RowAbove(Int32 step) + { + return RowShift(step * -1); + } + + #endregion + + #region XLRangeRow Below + + IXLRangeRow IXLRangeRow.RowBelow() + { + return RowBelow(); + } + + IXLRangeRow IXLRangeRow.RowBelow(Int32 step) + { + return RowBelow(step); + } + + public XLRangeRow RowBelow() + { + return RowBelow(1); + } + + public XLRangeRow RowBelow(Int32 step) + { + return RowShift(step); + } + + #endregion + + public new IXLRangeRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + base.Clear(clearOptions); + return this; + } + + public IXLRangeRow RowUsed(Boolean includeFormats = false) + { + return Row(FirstCellUsed(includeFormats), LastCellUsed(includeFormats)); + } + + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Ranges/XLRangeRows.cs b/ClosedXML/Excel/Ranges/XLRangeRows.cs index 76dd6f7..205d04b 100644 --- a/ClosedXML/Excel/Ranges/XLRangeRows.cs +++ b/ClosedXML/Excel/Ranges/XLRangeRows.cs @@ -1,149 +1,149 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - using System.Collections; - - internal class XLRangeRows : IXLRangeRows, IXLStylized - { - public Boolean StyleChanged { get; set; } - private readonly List _ranges = new List(); - private IXLStyle _style; - - public XLRangeRows() - { - _style = new XLStyle(this, XLWorkbook.DefaultStyle); - } - - #region IXLRangeRows Members - - public IXLRangeRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - _ranges.ForEach(c => c.Clear(clearOptions)); - return this; - } - - public void Delete() - { - _ranges.OrderByDescending(r => r.RowNumber()).ForEach(r => r.Delete()); - _ranges.Clear(); - } - - public void Add(IXLRangeRow range) - { - _ranges.Add((XLRangeRow)range); - } - - public IEnumerator GetEnumerator() - { - return _ranges.Cast() - .OrderBy(r=>r.Worksheet.Position) - .ThenBy(r => r.RowNumber()) - .GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IXLStyle Style - { - get { return _style; } - set - { - _style = new XLStyle(this, value); - _ranges.ForEach(r => r.Style = value); - } - } - - public IXLCells Cells() - { - var cells = new XLCells(false, false); - foreach (XLRangeRow container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed() - { - var cells = new XLCells(true, false); - foreach (XLRangeRow container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed(Boolean includeFormats) - { - var cells = new XLCells(true, includeFormats); - foreach (XLRangeRow container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLRangeRows SetDataType(XLCellValues dataType) - { - _ranges.ForEach(c => c.DataType = dataType); - return this; - } - - #endregion - - #region IXLStylized Members - - public IEnumerable Styles - { - get - { - UpdatingStyle = true; - yield return _style; - foreach (XLRangeRow rng in _ranges) - { - yield return rng.Style; - foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( - rng.RangeAddress.FirstAddress.RowNumber, - rng.RangeAddress.FirstAddress.ColumnNumber, - rng.RangeAddress.LastAddress.RowNumber, - rng.RangeAddress.LastAddress.ColumnNumber)) - yield return r.Style; - } - UpdatingStyle = false; - } - } - - public Boolean UpdatingStyle { get; set; } - - public IXLStyle InnerStyle - { - get { return _style; } - set { _style = new XLStyle(this, value); } - } - - public IXLRanges RangesUsed - { - get - { - var retVal = new XLRanges(); - this.ForEach(c => retVal.Add(c.AsRange())); - return retVal; - } - } - - #endregion - - public void Dispose() - { - if (_ranges != null) - _ranges.ForEach(r => r.Dispose()); - } - - public void Select() - { - foreach (var range in this) - range.Select(); - } - - } +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLRangeRows : IXLRangeRows, IXLStylized + { + public Boolean StyleChanged { get; set; } + private readonly List _ranges = new List(); + private IXLStyle _style; + + public XLRangeRows() + { + _style = new XLStyle(this, XLWorkbook.DefaultStyle); + } + + #region IXLRangeRows Members + + public IXLRangeRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + _ranges.ForEach(c => c.Clear(clearOptions)); + return this; + } + + public void Delete() + { + _ranges.OrderByDescending(r => r.RowNumber()).ForEach(r => r.Delete()); + _ranges.Clear(); + } + + public void Add(IXLRangeRow range) + { + _ranges.Add((XLRangeRow)range); + } + + public IEnumerator GetEnumerator() + { + return _ranges.Cast() + .OrderBy(r=>r.Worksheet.Position) + .ThenBy(r => r.RowNumber()) + .GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLStyle Style + { + get { return _style; } + set + { + _style = new XLStyle(this, value); + _ranges.ForEach(r => r.Style = value); + } + } + + public IXLCells Cells() + { + var cells = new XLCells(false, false); + foreach (XLRangeRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(true, false); + foreach (XLRangeRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed(Boolean includeFormats) + { + var cells = new XLCells(true, includeFormats); + foreach (XLRangeRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLRangeRows SetDataType(XLCellValues dataType) + { + _ranges.ForEach(c => c.DataType = dataType); + return this; + } + + #endregion + + #region IXLStylized Members + + public IEnumerable Styles + { + get + { + UpdatingStyle = true; + yield return _style; + foreach (XLRangeRow rng in _ranges) + { + yield return rng.Style; + foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( + rng.RangeAddress.FirstAddress.RowNumber, + rng.RangeAddress.FirstAddress.ColumnNumber, + rng.RangeAddress.LastAddress.RowNumber, + rng.RangeAddress.LastAddress.ColumnNumber)) + yield return r.Style; + } + UpdatingStyle = false; + } + } + + public Boolean UpdatingStyle { get; set; } + + public IXLStyle InnerStyle + { + get { return _style; } + set { _style = new XLStyle(this, value); } + } + + public IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion + + public void Dispose() + { + if (_ranges != null) + _ranges.ForEach(r => r.Dispose()); + } + + public void Select() + { + foreach (var range in this) + range.Select(); + } + + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Ranges/XLRanges.cs b/ClosedXML/Excel/Ranges/XLRanges.cs index a3b5940..b783762 100644 --- a/ClosedXML/Excel/Ranges/XLRanges.cs +++ b/ClosedXML/Excel/Ranges/XLRanges.cs @@ -1,241 +1,241 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - using System.Collections; - - internal class XLRanges : IXLRanges, IXLStylized - { - private readonly List _ranges = new List(); - private IXLStyle _style; - - public XLRanges() - { - _style = new XLStyle(this, XLWorkbook.DefaultStyle); - } - - #region IXLRanges Members - - public IXLRanges Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - _ranges.ForEach(c => c.Clear(clearOptions)); - return this; - } - - public void Add(XLRange range) - { - Count++; - _ranges.Add(range); - } - - public void Add(IXLRangeBase range) - { - Count++; - _ranges.Add(range.AsRange() as XLRange); - } - - public void Add(IXLCell cell) - { - Add(cell.AsRange()); - } - - public void Remove(IXLRange range) - { - Count--; - _ranges.RemoveAll(r => r.ToString() == range.ToString()); - } - - public int Count { get; private set; } - - public IEnumerator GetEnumerator() - { - var retList = new List(); - retList.AddRange(_ranges.Where(r => XLHelper.IsValidRangeAddress(r.RangeAddress)).Cast()); - return retList.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IXLStyle Style - { - get { return _style; } - set - { - _style = new XLStyle(this, value); - foreach (XLRange rng in _ranges) - rng.Style = value; - } - } - - public Boolean Contains(IXLRange range) - { - return _ranges.Any(r => !r.RangeAddress.IsInvalid && r.Contains(range)); - } - - public IXLDataValidation DataValidation - { - get - { - foreach (XLRange range in _ranges) - { - foreach (IXLDataValidation dv in range.Worksheet.DataValidations) - { - foreach (IXLRange dvRange in dv.Ranges.Where(dvRange => dvRange.Intersects(range))) - { - dv.Ranges.Remove(dvRange); - foreach (IXLCell c in dvRange.Cells().Where(c => !range.Contains(c.Address.ToString()))) - { - var r = c.AsRange(); - r.Dispose(); - dv.Ranges.Add(r); - } - } - } - } - var dataValidation = new XLDataValidation(this); - - _ranges.First().Worksheet.DataValidations.Add(dataValidation); - return dataValidation; - } - } - - public IXLRanges AddToNamed(String rangeName) - { - return AddToNamed(rangeName, XLScope.Workbook); - } - - public IXLRanges AddToNamed(String rangeName, XLScope scope) - { - return AddToNamed(rangeName, XLScope.Workbook, null); - } - - public IXLRanges AddToNamed(String rangeName, XLScope scope, String comment) - { - _ranges.ForEach(r => r.AddToNamed(rangeName, scope, comment)); - return this; - } - - public Object Value - { - set { _ranges.ForEach(r => r.Value = value); } - } - - public IXLRanges SetValue(T value) - { - _ranges.ForEach(r => r.SetValue(value)); - return this; - } - - public IXLCells Cells() - { - var cells = new XLCells(false, false); - foreach (XLRange container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed() - { - var cells = new XLCells(true, false); - foreach (XLRange container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed(Boolean includeFormats) - { - var cells = new XLCells(true, includeFormats); - foreach (XLRange container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLRanges SetDataType(XLCellValues dataType) - { - _ranges.ForEach(c => c.DataType = dataType); - return this; - } - - public void Dispose() - { - _ranges.ForEach(r => r.Dispose()); - } - - #endregion - - #region IXLStylized Members - - public Boolean StyleChanged { get; set; } - - public IEnumerable Styles - { - get - { - UpdatingStyle = true; - yield return _style; - foreach (XLRange rng in _ranges) - { - yield return rng.Style; - foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( - rng.RangeAddress.FirstAddress.RowNumber, - rng.RangeAddress.FirstAddress.ColumnNumber, - rng.RangeAddress.LastAddress.RowNumber, - rng.RangeAddress.LastAddress.ColumnNumber)) - yield return r.Style; - } - UpdatingStyle = false; - } - } - - public Boolean UpdatingStyle { get; set; } - - public IXLStyle InnerStyle - { - get { return _style; } - set { _style = new XLStyle(this, value); } - } - - public IXLRanges RangesUsed - { - get { return this; } - } - - #endregion - - public override string ToString() - { - String retVal = _ranges.Aggregate(String.Empty, (agg, r) => agg + (r.ToString() + ",")); - if (retVal.Length > 0) retVal = retVal.Substring(0, retVal.Length - 1); - return retVal; - } - - public override bool Equals(object obj) - { - var other = (XLRanges)obj; - - return _ranges.Count == other._ranges.Count && - _ranges.Select(thisRange => Enumerable.Contains(other._ranges, thisRange)).All(foundOne => foundOne); - } - - public override int GetHashCode() - { - return _ranges.Aggregate(0, (current, r) => current ^ r.GetHashCode()); - } - - public IXLDataValidation SetDataValidation() - { - return DataValidation; - } - - public void Select() - { - foreach (var range in this) - range.Select(); - } - } +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLRanges : IXLRanges, IXLStylized + { + private readonly List _ranges = new List(); + private IXLStyle _style; + + public XLRanges() + { + _style = new XLStyle(this, XLWorkbook.DefaultStyle); + } + + #region IXLRanges Members + + public IXLRanges Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + _ranges.ForEach(c => c.Clear(clearOptions)); + return this; + } + + public void Add(XLRange range) + { + Count++; + _ranges.Add(range); + } + + public void Add(IXLRangeBase range) + { + Count++; + _ranges.Add(range.AsRange() as XLRange); + } + + public void Add(IXLCell cell) + { + Add(cell.AsRange()); + } + + public void Remove(IXLRange range) + { + Count--; + _ranges.RemoveAll(r => r.ToString() == range.ToString()); + } + + public int Count { get; private set; } + + public IEnumerator GetEnumerator() + { + var retList = new List(); + retList.AddRange(_ranges.Where(r => XLHelper.IsValidRangeAddress(r.RangeAddress)).Cast()); + return retList.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLStyle Style + { + get { return _style; } + set + { + _style = new XLStyle(this, value); + foreach (XLRange rng in _ranges) + rng.Style = value; + } + } + + public Boolean Contains(IXLRange range) + { + return _ranges.Any(r => !r.RangeAddress.IsInvalid && r.Contains(range)); + } + + public IXLDataValidation DataValidation + { + get + { + foreach (XLRange range in _ranges) + { + foreach (IXLDataValidation dv in range.Worksheet.DataValidations) + { + foreach (IXLRange dvRange in dv.Ranges.Where(dvRange => dvRange.Intersects(range))) + { + dv.Ranges.Remove(dvRange); + foreach (IXLCell c in dvRange.Cells().Where(c => !range.Contains(c.Address.ToString()))) + { + var r = c.AsRange(); + r.Dispose(); + dv.Ranges.Add(r); + } + } + } + } + var dataValidation = new XLDataValidation(this); + + _ranges.First().Worksheet.DataValidations.Add(dataValidation); + return dataValidation; + } + } + + public IXLRanges AddToNamed(String rangeName) + { + return AddToNamed(rangeName, XLScope.Workbook); + } + + public IXLRanges AddToNamed(String rangeName, XLScope scope) + { + return AddToNamed(rangeName, XLScope.Workbook, null); + } + + public IXLRanges AddToNamed(String rangeName, XLScope scope, String comment) + { + _ranges.ForEach(r => r.AddToNamed(rangeName, scope, comment)); + return this; + } + + public Object Value + { + set { _ranges.ForEach(r => r.Value = value); } + } + + public IXLRanges SetValue(T value) + { + _ranges.ForEach(r => r.SetValue(value)); + return this; + } + + public IXLCells Cells() + { + var cells = new XLCells(false, false); + foreach (XLRange container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(true, false); + foreach (XLRange container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed(Boolean includeFormats) + { + var cells = new XLCells(true, includeFormats); + foreach (XLRange container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLRanges SetDataType(XLCellValues dataType) + { + _ranges.ForEach(c => c.DataType = dataType); + return this; + } + + public void Dispose() + { + _ranges.ForEach(r => r.Dispose()); + } + + #endregion + + #region IXLStylized Members + + public Boolean StyleChanged { get; set; } + + public IEnumerable Styles + { + get + { + UpdatingStyle = true; + yield return _style; + foreach (XLRange rng in _ranges) + { + yield return rng.Style; + foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( + rng.RangeAddress.FirstAddress.RowNumber, + rng.RangeAddress.FirstAddress.ColumnNumber, + rng.RangeAddress.LastAddress.RowNumber, + rng.RangeAddress.LastAddress.ColumnNumber)) + yield return r.Style; + } + UpdatingStyle = false; + } + } + + public Boolean UpdatingStyle { get; set; } + + public IXLStyle InnerStyle + { + get { return _style; } + set { _style = new XLStyle(this, value); } + } + + public IXLRanges RangesUsed + { + get { return this; } + } + + #endregion + + public override string ToString() + { + String retVal = _ranges.Aggregate(String.Empty, (agg, r) => agg + (r.ToString() + ",")); + if (retVal.Length > 0) retVal = retVal.Substring(0, retVal.Length - 1); + return retVal; + } + + public override bool Equals(object obj) + { + var other = (XLRanges)obj; + + return _ranges.Count == other._ranges.Count && + _ranges.Select(thisRange => Enumerable.Contains(other._ranges, thisRange)).All(foundOne => foundOne); + } + + public override int GetHashCode() + { + return _ranges.Aggregate(0, (current, r) => current ^ r.GetHashCode()); + } + + public IXLDataValidation SetDataValidation() + { + return DataValidation; + } + + public void Select() + { + foreach (var range in this) + range.Select(); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/RichText/IXLFormattedText.cs b/ClosedXML/Excel/RichText/IXLFormattedText.cs index b17836c..3180bee 100644 --- a/ClosedXML/Excel/RichText/IXLFormattedText.cs +++ b/ClosedXML/Excel/RichText/IXLFormattedText.cs @@ -1,42 +1,42 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLFormattedText : IEnumerable, IEquatable>, IXLWithRichString - { - Boolean Bold { set; } - Boolean Italic { set; } - XLFontUnderlineValues Underline { set; } - Boolean Strikethrough { set; } - XLFontVerticalTextAlignmentValues VerticalAlignment { set; } - Boolean Shadow { set; } - Double FontSize { set; } - XLColor FontColor { set; } - String FontName { set; } - XLFontFamilyNumberingValues FontFamilyNumbering { set; } - - IXLFormattedText SetBold(); IXLFormattedText SetBold(Boolean value); - IXLFormattedText SetItalic(); IXLFormattedText SetItalic(Boolean value); - IXLFormattedText SetUnderline(); IXLFormattedText SetUnderline(XLFontUnderlineValues value); - IXLFormattedText SetStrikethrough(); IXLFormattedText SetStrikethrough(Boolean value); - IXLFormattedText SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); - IXLFormattedText SetShadow(); IXLFormattedText SetShadow(Boolean value); - IXLFormattedText SetFontSize(Double value); - IXLFormattedText SetFontColor(XLColor value); - IXLFormattedText SetFontName(String value); - IXLFormattedText SetFontFamilyNumbering(XLFontFamilyNumberingValues value); - - IXLRichString AddText(String text, IXLFontBase font); - IXLFormattedText ClearText(); - IXLFormattedText ClearFont(); - IXLFormattedText Substring(Int32 index); - IXLFormattedText Substring(Int32 index, Int32 length); - Int32 Count { get; } - Int32 Length { get; } - - String Text { get; } - IXLPhonetics Phonetics { get; } - Boolean HasPhonetics { get; } - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLFormattedText : IEnumerable, IEquatable>, IXLWithRichString + { + Boolean Bold { set; } + Boolean Italic { set; } + XLFontUnderlineValues Underline { set; } + Boolean Strikethrough { set; } + XLFontVerticalTextAlignmentValues VerticalAlignment { set; } + Boolean Shadow { set; } + Double FontSize { set; } + XLColor FontColor { set; } + String FontName { set; } + XLFontFamilyNumberingValues FontFamilyNumbering { set; } + + IXLFormattedText SetBold(); IXLFormattedText SetBold(Boolean value); + IXLFormattedText SetItalic(); IXLFormattedText SetItalic(Boolean value); + IXLFormattedText SetUnderline(); IXLFormattedText SetUnderline(XLFontUnderlineValues value); + IXLFormattedText SetStrikethrough(); IXLFormattedText SetStrikethrough(Boolean value); + IXLFormattedText SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); + IXLFormattedText SetShadow(); IXLFormattedText SetShadow(Boolean value); + IXLFormattedText SetFontSize(Double value); + IXLFormattedText SetFontColor(XLColor value); + IXLFormattedText SetFontName(String value); + IXLFormattedText SetFontFamilyNumbering(XLFontFamilyNumberingValues value); + + IXLRichString AddText(String text, IXLFontBase font); + IXLFormattedText ClearText(); + IXLFormattedText ClearFont(); + IXLFormattedText Substring(Int32 index); + IXLFormattedText Substring(Int32 index, Int32 length); + Int32 Count { get; } + Int32 Length { get; } + + String Text { get; } + IXLPhonetics Phonetics { get; } + Boolean HasPhonetics { get; } + } +} diff --git a/ClosedXML/Excel/RichText/IXLPhonetic.cs b/ClosedXML/Excel/RichText/IXLPhonetic.cs index a38a5c1..56e20f9 100644 --- a/ClosedXML/Excel/RichText/IXLPhonetic.cs +++ b/ClosedXML/Excel/RichText/IXLPhonetic.cs @@ -1,11 +1,11 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLPhonetic: IEquatable - { - String Text { get; set; } - Int32 Start { get; set; } - Int32 End { get; set; } - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLPhonetic: IEquatable + { + String Text { get; set; } + Int32 Start { get; set; } + Int32 End { get; set; } + } +} diff --git a/ClosedXML/Excel/RichText/IXLPhonetics.cs b/ClosedXML/Excel/RichText/IXLPhonetics.cs index 7a14614..0330b61 100644 --- a/ClosedXML/Excel/RichText/IXLPhonetics.cs +++ b/ClosedXML/Excel/RichText/IXLPhonetics.cs @@ -1,32 +1,32 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public enum XLPhoneticAlignment { Center, Distributed, Left, NoControl } - public enum XLPhoneticType { FullWidthKatakana, HalfWidthKatakana, Hiragana, NoConversion } - public interface IXLPhonetics : IXLFontBase, IEnumerable, IEquatable - { - IXLPhonetics SetBold(); IXLPhonetics SetBold(Boolean value); - IXLPhonetics SetItalic(); IXLPhonetics SetItalic(Boolean value); - IXLPhonetics SetUnderline(); IXLPhonetics SetUnderline(XLFontUnderlineValues value); - IXLPhonetics SetStrikethrough(); IXLPhonetics SetStrikethrough(Boolean value); - IXLPhonetics SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); - IXLPhonetics SetShadow(); IXLPhonetics SetShadow(Boolean value); - IXLPhonetics SetFontSize(Double value); - IXLPhonetics SetFontColor(XLColor value); - IXLPhonetics SetFontName(String value); - IXLPhonetics SetFontFamilyNumbering(XLFontFamilyNumberingValues value); - - IXLPhonetics Add(String text, Int32 start, Int32 end); - IXLPhonetics ClearText(); - IXLPhonetics ClearFont(); - Int32 Count { get; } - - XLPhoneticAlignment Alignment { get; set; } - XLPhoneticType Type { get; set; } - - IXLPhonetics SetAlignment(XLPhoneticAlignment phoneticAlignment); - IXLPhonetics SetType(XLPhoneticType phoneticType); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public enum XLPhoneticAlignment { Center, Distributed, Left, NoControl } + public enum XLPhoneticType { FullWidthKatakana, HalfWidthKatakana, Hiragana, NoConversion } + public interface IXLPhonetics : IXLFontBase, IEnumerable, IEquatable + { + IXLPhonetics SetBold(); IXLPhonetics SetBold(Boolean value); + IXLPhonetics SetItalic(); IXLPhonetics SetItalic(Boolean value); + IXLPhonetics SetUnderline(); IXLPhonetics SetUnderline(XLFontUnderlineValues value); + IXLPhonetics SetStrikethrough(); IXLPhonetics SetStrikethrough(Boolean value); + IXLPhonetics SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); + IXLPhonetics SetShadow(); IXLPhonetics SetShadow(Boolean value); + IXLPhonetics SetFontSize(Double value); + IXLPhonetics SetFontColor(XLColor value); + IXLPhonetics SetFontName(String value); + IXLPhonetics SetFontFamilyNumbering(XLFontFamilyNumberingValues value); + + IXLPhonetics Add(String text, Int32 start, Int32 end); + IXLPhonetics ClearText(); + IXLPhonetics ClearFont(); + Int32 Count { get; } + + XLPhoneticAlignment Alignment { get; set; } + XLPhoneticType Type { get; set; } + + IXLPhonetics SetAlignment(XLPhoneticAlignment phoneticAlignment); + IXLPhonetics SetType(XLPhoneticType phoneticType); + } +} diff --git a/ClosedXML/Excel/RichText/IXLRichString.cs b/ClosedXML/Excel/RichText/IXLRichString.cs index 3d97406..b41b537 100644 --- a/ClosedXML/Excel/RichText/IXLRichString.cs +++ b/ClosedXML/Excel/RichText/IXLRichString.cs @@ -1,26 +1,26 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLWithRichString - { - IXLRichString AddText(String text); - IXLRichString AddNewLine(); - } - public interface IXLRichString: IXLFontBase, IEquatable, IXLWithRichString - { - String Text { get; set; } - - - IXLRichString SetBold(); IXLRichString SetBold(Boolean value); - IXLRichString SetItalic(); IXLRichString SetItalic(Boolean value); - IXLRichString SetUnderline(); IXLRichString SetUnderline(XLFontUnderlineValues value); - IXLRichString SetStrikethrough(); IXLRichString SetStrikethrough(Boolean value); - IXLRichString SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); - IXLRichString SetShadow(); IXLRichString SetShadow(Boolean value); - IXLRichString SetFontSize(Double value); - IXLRichString SetFontColor(XLColor value); - IXLRichString SetFontName(String value); - IXLRichString SetFontFamilyNumbering(XLFontFamilyNumberingValues value); - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLWithRichString + { + IXLRichString AddText(String text); + IXLRichString AddNewLine(); + } + public interface IXLRichString: IXLFontBase, IEquatable, IXLWithRichString + { + String Text { get; set; } + + + IXLRichString SetBold(); IXLRichString SetBold(Boolean value); + IXLRichString SetItalic(); IXLRichString SetItalic(Boolean value); + IXLRichString SetUnderline(); IXLRichString SetUnderline(XLFontUnderlineValues value); + IXLRichString SetStrikethrough(); IXLRichString SetStrikethrough(Boolean value); + IXLRichString SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); + IXLRichString SetShadow(); IXLRichString SetShadow(Boolean value); + IXLRichString SetFontSize(Double value); + IXLRichString SetFontColor(XLColor value); + IXLRichString SetFontName(String value); + IXLRichString SetFontFamilyNumbering(XLFontFamilyNumberingValues value); + } +} diff --git a/ClosedXML/Excel/RichText/IXLRichText.cs b/ClosedXML/Excel/RichText/IXLRichText.cs index 36ac6fc..46efd41 100644 --- a/ClosedXML/Excel/RichText/IXLRichText.cs +++ b/ClosedXML/Excel/RichText/IXLRichText.cs @@ -1,9 +1,9 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLRichText : IXLFormattedText - { - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLRichText : IXLFormattedText + { + } +} diff --git a/ClosedXML/Excel/RichText/XLFormattedText.cs b/ClosedXML/Excel/RichText/XLFormattedText.cs index aa21ed7..3748478 100644 --- a/ClosedXML/Excel/RichText/XLFormattedText.cs +++ b/ClosedXML/Excel/RichText/XLFormattedText.cs @@ -1,189 +1,189 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLFormattedText: IXLFormattedText - { - List _richTexts = new List(); - - protected T Container; - readonly IXLFontBase _defaultFont; - public XLFormattedText(IXLFontBase defaultFont) - { - Length = 0; - _defaultFont = defaultFont; - } - - public XLFormattedText(IXLFormattedText defaultRichText, IXLFontBase defaultFont) - : this(defaultFont) - { - foreach (var rt in defaultRichText) - AddText(rt.Text, rt); - if (defaultRichText.HasPhonetics) - { - _phonetics = new XLPhonetics(defaultRichText.Phonetics, defaultFont); - } - } - - public XLFormattedText(String text, IXLFontBase defaultFont) - :this(defaultFont) - { - AddText(text); - } - - public Int32 Count { get { return _richTexts.Count; } } - public int Length { get; private set; } - - public IXLRichString AddText(String text) - { - return AddText(text, _defaultFont); - } - public IXLRichString AddText(String text, IXLFontBase font) - { - var richText = new XLRichString(text, font, this); - return AddText(richText); - } - - public IXLRichString AddText(IXLRichString richText) - { - _richTexts.Add(richText); - Length += richText.Text.Length; - return richText; - } - - public IXLRichString AddNewLine() - { - return AddText(Environment.NewLine); - } - - public IXLFormattedText ClearText() - { - _richTexts.Clear(); - Length = 0; - return this; - } - public IXLFormattedText ClearFont() - { - String text = Text; - ClearText(); - AddText(text); - return this; - } - - public override string ToString() - { - var sb = new StringBuilder(_richTexts.Count); - _richTexts.ForEach(rt => sb.Append(rt.Text)); - return sb.ToString(); - } - - public IXLFormattedText Substring(Int32 index) - { - return Substring(index, Length - index); - } - public IXLFormattedText Substring(Int32 index, Int32 length) - { - if (index + 1 > Length || (Length - index + 1) < length || length <= 0) - throw new IndexOutOfRangeException("Index and length must refer to a location within the string."); - - List newRichTexts = new List(); - var retVal = new XLFormattedText(_defaultFont); - - Int32 lastPosition = 0; - foreach (var rt in _richTexts) - { - if (lastPosition >= index + 1 + length) // We already have what we need - { - newRichTexts.Add(rt); - } - else if (lastPosition + rt.Text.Length >= index + 1) // Eureka! - { - Int32 startIndex = index - lastPosition; - - if (startIndex > 0) - newRichTexts.Add(new XLRichString(rt.Text.Substring(0, startIndex), rt, this)); - else if (startIndex < 0) - startIndex = 0; - - Int32 leftToTake = length - retVal.Length; - if (leftToTake > rt.Text.Length - startIndex) - leftToTake = rt.Text.Length - startIndex; - - XLRichString newRt = new XLRichString(rt.Text.Substring(startIndex, leftToTake), rt, this); - newRichTexts.Add(newRt); - retVal.AddText(newRt); - - if (startIndex + leftToTake < rt.Text.Length) - newRichTexts.Add(new XLRichString(rt.Text.Substring(startIndex + leftToTake), rt, this)); - } - else // We haven't reached the desired position yet - { - newRichTexts.Add(rt); - } - lastPosition += rt.Text.Length; - } - _richTexts = newRichTexts; - return retVal; - } - - public IEnumerator GetEnumerator() - { - return _richTexts.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public Boolean Bold { set { _richTexts.ForEach(rt => rt.Bold = value); } } - public Boolean Italic { set { _richTexts.ForEach(rt => rt.Italic = value); } } - public XLFontUnderlineValues Underline { set { _richTexts.ForEach(rt => rt.Underline = value); } } - public Boolean Strikethrough { set { _richTexts.ForEach(rt => rt.Strikethrough = value); } } - public XLFontVerticalTextAlignmentValues VerticalAlignment { set { _richTexts.ForEach(rt => rt.VerticalAlignment = value); } } - public Boolean Shadow { set { _richTexts.ForEach(rt => rt.Shadow = value); } } - public Double FontSize { set { _richTexts.ForEach(rt => rt.FontSize = value); } } - public XLColor FontColor { set { _richTexts.ForEach(rt => rt.FontColor = value); } } - public String FontName { set { _richTexts.ForEach(rt => rt.FontName = value); } } - public XLFontFamilyNumberingValues FontFamilyNumbering { set { _richTexts.ForEach(rt => rt.FontFamilyNumbering = value); } } - - public IXLFormattedText SetBold() { Bold = true; return this; } public IXLFormattedText SetBold(Boolean value) { Bold = value; return this; } - public IXLFormattedText SetItalic() { Italic = true; return this; } public IXLFormattedText SetItalic(Boolean value) { Italic = value; return this; } - public IXLFormattedText SetUnderline() { Underline = XLFontUnderlineValues.Single; return this; } public IXLFormattedText SetUnderline(XLFontUnderlineValues value) { Underline = value; return this; } - public IXLFormattedText SetStrikethrough() { Strikethrough = true; return this; } public IXLFormattedText SetStrikethrough(Boolean value) { Strikethrough = value; return this; } - public IXLFormattedText SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) { VerticalAlignment = value; return this; } - public IXLFormattedText SetShadow() { Shadow = true; return this; } public IXLFormattedText SetShadow(Boolean value) { Shadow = value; return this; } - public IXLFormattedText SetFontSize(Double value) { FontSize = value; return this; } - public IXLFormattedText SetFontColor(XLColor value) { FontColor = value; return this; } - public IXLFormattedText SetFontName(String value) { FontName = value; return this; } - public IXLFormattedText SetFontFamilyNumbering(XLFontFamilyNumberingValues value) { FontFamilyNumbering = value; return this; } - - public bool Equals(IXLFormattedText other) - { - Int32 count = Count; - if (count != other.Count) - return false; - - for (Int32 i = 0; i < count; i++) - { - if (_richTexts.ElementAt(i) != other.ElementAt(i)) - return false; - } - - return _phonetics == null || Phonetics.Equals(other.Phonetics); - } - - public String Text { get { return ToString(); } } - - private IXLPhonetics _phonetics; - public IXLPhonetics Phonetics - { - get { return _phonetics ?? (_phonetics = new XLPhonetics(_defaultFont)); } - } - - public Boolean HasPhonetics { get { return _phonetics != null; } } - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLFormattedText: IXLFormattedText + { + List _richTexts = new List(); + + protected T Container; + readonly IXLFontBase _defaultFont; + public XLFormattedText(IXLFontBase defaultFont) + { + Length = 0; + _defaultFont = defaultFont; + } + + public XLFormattedText(IXLFormattedText defaultRichText, IXLFontBase defaultFont) + : this(defaultFont) + { + foreach (var rt in defaultRichText) + AddText(rt.Text, rt); + if (defaultRichText.HasPhonetics) + { + _phonetics = new XLPhonetics(defaultRichText.Phonetics, defaultFont); + } + } + + public XLFormattedText(String text, IXLFontBase defaultFont) + :this(defaultFont) + { + AddText(text); + } + + public Int32 Count { get { return _richTexts.Count; } } + public int Length { get; private set; } + + public IXLRichString AddText(String text) + { + return AddText(text, _defaultFont); + } + public IXLRichString AddText(String text, IXLFontBase font) + { + var richText = new XLRichString(text, font, this); + return AddText(richText); + } + + public IXLRichString AddText(IXLRichString richText) + { + _richTexts.Add(richText); + Length += richText.Text.Length; + return richText; + } + + public IXLRichString AddNewLine() + { + return AddText(Environment.NewLine); + } + + public IXLFormattedText ClearText() + { + _richTexts.Clear(); + Length = 0; + return this; + } + public IXLFormattedText ClearFont() + { + String text = Text; + ClearText(); + AddText(text); + return this; + } + + public override string ToString() + { + var sb = new StringBuilder(_richTexts.Count); + _richTexts.ForEach(rt => sb.Append(rt.Text)); + return sb.ToString(); + } + + public IXLFormattedText Substring(Int32 index) + { + return Substring(index, Length - index); + } + public IXLFormattedText Substring(Int32 index, Int32 length) + { + if (index + 1 > Length || (Length - index + 1) < length || length <= 0) + throw new IndexOutOfRangeException("Index and length must refer to a location within the string."); + + List newRichTexts = new List(); + var retVal = new XLFormattedText(_defaultFont); + + Int32 lastPosition = 0; + foreach (var rt in _richTexts) + { + if (lastPosition >= index + 1 + length) // We already have what we need + { + newRichTexts.Add(rt); + } + else if (lastPosition + rt.Text.Length >= index + 1) // Eureka! + { + Int32 startIndex = index - lastPosition; + + if (startIndex > 0) + newRichTexts.Add(new XLRichString(rt.Text.Substring(0, startIndex), rt, this)); + else if (startIndex < 0) + startIndex = 0; + + Int32 leftToTake = length - retVal.Length; + if (leftToTake > rt.Text.Length - startIndex) + leftToTake = rt.Text.Length - startIndex; + + XLRichString newRt = new XLRichString(rt.Text.Substring(startIndex, leftToTake), rt, this); + newRichTexts.Add(newRt); + retVal.AddText(newRt); + + if (startIndex + leftToTake < rt.Text.Length) + newRichTexts.Add(new XLRichString(rt.Text.Substring(startIndex + leftToTake), rt, this)); + } + else // We haven't reached the desired position yet + { + newRichTexts.Add(rt); + } + lastPosition += rt.Text.Length; + } + _richTexts = newRichTexts; + return retVal; + } + + public IEnumerator GetEnumerator() + { + return _richTexts.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public Boolean Bold { set { _richTexts.ForEach(rt => rt.Bold = value); } } + public Boolean Italic { set { _richTexts.ForEach(rt => rt.Italic = value); } } + public XLFontUnderlineValues Underline { set { _richTexts.ForEach(rt => rt.Underline = value); } } + public Boolean Strikethrough { set { _richTexts.ForEach(rt => rt.Strikethrough = value); } } + public XLFontVerticalTextAlignmentValues VerticalAlignment { set { _richTexts.ForEach(rt => rt.VerticalAlignment = value); } } + public Boolean Shadow { set { _richTexts.ForEach(rt => rt.Shadow = value); } } + public Double FontSize { set { _richTexts.ForEach(rt => rt.FontSize = value); } } + public XLColor FontColor { set { _richTexts.ForEach(rt => rt.FontColor = value); } } + public String FontName { set { _richTexts.ForEach(rt => rt.FontName = value); } } + public XLFontFamilyNumberingValues FontFamilyNumbering { set { _richTexts.ForEach(rt => rt.FontFamilyNumbering = value); } } + + public IXLFormattedText SetBold() { Bold = true; return this; } public IXLFormattedText SetBold(Boolean value) { Bold = value; return this; } + public IXLFormattedText SetItalic() { Italic = true; return this; } public IXLFormattedText SetItalic(Boolean value) { Italic = value; return this; } + public IXLFormattedText SetUnderline() { Underline = XLFontUnderlineValues.Single; return this; } public IXLFormattedText SetUnderline(XLFontUnderlineValues value) { Underline = value; return this; } + public IXLFormattedText SetStrikethrough() { Strikethrough = true; return this; } public IXLFormattedText SetStrikethrough(Boolean value) { Strikethrough = value; return this; } + public IXLFormattedText SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) { VerticalAlignment = value; return this; } + public IXLFormattedText SetShadow() { Shadow = true; return this; } public IXLFormattedText SetShadow(Boolean value) { Shadow = value; return this; } + public IXLFormattedText SetFontSize(Double value) { FontSize = value; return this; } + public IXLFormattedText SetFontColor(XLColor value) { FontColor = value; return this; } + public IXLFormattedText SetFontName(String value) { FontName = value; return this; } + public IXLFormattedText SetFontFamilyNumbering(XLFontFamilyNumberingValues value) { FontFamilyNumbering = value; return this; } + + public bool Equals(IXLFormattedText other) + { + Int32 count = Count; + if (count != other.Count) + return false; + + for (Int32 i = 0; i < count; i++) + { + if (_richTexts.ElementAt(i) != other.ElementAt(i)) + return false; + } + + return _phonetics == null || Phonetics.Equals(other.Phonetics); + } + + public String Text { get { return ToString(); } } + + private IXLPhonetics _phonetics; + public IXLPhonetics Phonetics + { + get { return _phonetics ?? (_phonetics = new XLPhonetics(_defaultFont)); } + } + + public Boolean HasPhonetics { get { return _phonetics != null; } } + } +} diff --git a/ClosedXML/Excel/RichText/XLPhonetic.cs b/ClosedXML/Excel/RichText/XLPhonetic.cs index 73118c4..253a24f 100644 --- a/ClosedXML/Excel/RichText/XLPhonetic.cs +++ b/ClosedXML/Excel/RichText/XLPhonetic.cs @@ -1,25 +1,25 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLPhonetic: IXLPhonetic - { - public XLPhonetic(String text, Int32 start, Int32 end) - { - Text = text; - Start = start; - End = end; - } - public String Text { get; set; } - public Int32 Start { get; set; } - public Int32 End { get; set; } - - public bool Equals(IXLPhonetic other) - { - if (other == null) - return false; - - return Text == other.Text && Start == other.Start && End == other.End; - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLPhonetic: IXLPhonetic + { + public XLPhonetic(String text, Int32 start, Int32 end) + { + Text = text; + Start = start; + End = end; + } + public String Text { get; set; } + public Int32 Start { get; set; } + public Int32 End { get; set; } + + public bool Equals(IXLPhonetic other) + { + if (other == null) + return false; + + return Text == other.Text && Start == other.Start && End == other.End; + } + } +} diff --git a/ClosedXML/Excel/RichText/XLPhonetics.cs b/ClosedXML/Excel/RichText/XLPhonetics.cs index afc4e45..2cf1e02 100644 --- a/ClosedXML/Excel/RichText/XLPhonetics.cs +++ b/ClosedXML/Excel/RichText/XLPhonetics.cs @@ -1,111 +1,111 @@ -using System; -using System.Linq; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - internal class XLPhonetics : IXLPhonetics - { - private readonly List _phonetics = new List(); - - readonly IXLFontBase _defaultFont; - public XLPhonetics(IXLFontBase defaultFont) - { - _defaultFont = defaultFont; - Type = XLPhoneticType.FullWidthKatakana; - Alignment = XLPhoneticAlignment.Left; - this.CopyFont(_defaultFont); - } - - public XLPhonetics(IXLPhonetics defaultPhonetics, IXLFontBase defaultFont) - { - _defaultFont = defaultFont; - Type = defaultPhonetics.Type; - Alignment = defaultPhonetics.Alignment; - - this.CopyFont(defaultPhonetics); - } - - public Boolean Bold { get; set; } - public Boolean Italic { get; set; } - public XLFontUnderlineValues Underline { get; set; } - public Boolean Strikethrough { get; set; } - public XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } - public Boolean Shadow { get; set; } - public Double FontSize { get; set; } - public XLColor FontColor { get; set; } - public String FontName { get; set; } - public XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } - - public IXLPhonetics SetBold() { Bold = true; return this; } public IXLPhonetics SetBold(Boolean value) { Bold = value; return this; } - public IXLPhonetics SetItalic() { Italic = true; return this; } public IXLPhonetics SetItalic(Boolean value) { Italic = value; return this; } - public IXLPhonetics SetUnderline() { Underline = XLFontUnderlineValues.Single; return this; } public IXLPhonetics SetUnderline(XLFontUnderlineValues value) { Underline = value; return this; } - public IXLPhonetics SetStrikethrough() { Strikethrough = true; return this; } public IXLPhonetics SetStrikethrough(Boolean value) { Strikethrough = value; return this; } - public IXLPhonetics SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) { VerticalAlignment = value; return this; } - public IXLPhonetics SetShadow() { Shadow = true; return this; } public IXLPhonetics SetShadow(Boolean value) { Shadow = value; return this; } - public IXLPhonetics SetFontSize(Double value) { FontSize = value; return this; } - public IXLPhonetics SetFontColor(XLColor value) { FontColor = value; return this; } - public IXLPhonetics SetFontName(String value) { FontName = value; return this; } - public IXLPhonetics SetFontFamilyNumbering(XLFontFamilyNumberingValues value) { FontFamilyNumbering = value; return this; } - - public IXLPhonetics Add(String text, Int32 start, Int32 end) - { - _phonetics.Add(new XLPhonetic(text, start, end)); - return this; - } - public IXLPhonetics ClearText() - { - _phonetics.Clear(); - return this; - } - public IXLPhonetics ClearFont() - { - this.CopyFont(_defaultFont); - return this; - } - - public Int32 Count { get { return _phonetics.Count; } } - - public XLPhoneticAlignment Alignment { get; set; } - public XLPhoneticType Type { get; set; } - - public IXLPhonetics SetAlignment(XLPhoneticAlignment phoneticAlignment) { Alignment = phoneticAlignment; return this; } - public IXLPhonetics SetType(XLPhoneticType phoneticType) { Type = phoneticType; return this; } - - public IEnumerator GetEnumerator() - { - return _phonetics.GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public bool Equals(IXLPhonetics other) - { - if (other == null) - return false; - - Int32 phoneticsCount = _phonetics.Count; - for (Int32 i = 0; i < phoneticsCount; i++) - { - if (!_phonetics[i].Equals(other.ElementAt(i))) - return false; - } - - return - Bold == other.Bold - && Italic == other.Italic - && Underline == other.Underline - && Strikethrough == other.Strikethrough - && VerticalAlignment == other.VerticalAlignment - && Shadow == other.Shadow - && FontSize == other.FontSize - && FontColor.Equals(other.FontColor) - && FontName == other.FontName - && FontFamilyNumbering == other.FontFamilyNumbering - ; - } - } -} +using System; +using System.Linq; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal class XLPhonetics : IXLPhonetics + { + private readonly List _phonetics = new List(); + + readonly IXLFontBase _defaultFont; + public XLPhonetics(IXLFontBase defaultFont) + { + _defaultFont = defaultFont; + Type = XLPhoneticType.FullWidthKatakana; + Alignment = XLPhoneticAlignment.Left; + this.CopyFont(_defaultFont); + } + + public XLPhonetics(IXLPhonetics defaultPhonetics, IXLFontBase defaultFont) + { + _defaultFont = defaultFont; + Type = defaultPhonetics.Type; + Alignment = defaultPhonetics.Alignment; + + this.CopyFont(defaultPhonetics); + } + + public Boolean Bold { get; set; } + public Boolean Italic { get; set; } + public XLFontUnderlineValues Underline { get; set; } + public Boolean Strikethrough { get; set; } + public XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } + public Boolean Shadow { get; set; } + public Double FontSize { get; set; } + public XLColor FontColor { get; set; } + public String FontName { get; set; } + public XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } + + public IXLPhonetics SetBold() { Bold = true; return this; } public IXLPhonetics SetBold(Boolean value) { Bold = value; return this; } + public IXLPhonetics SetItalic() { Italic = true; return this; } public IXLPhonetics SetItalic(Boolean value) { Italic = value; return this; } + public IXLPhonetics SetUnderline() { Underline = XLFontUnderlineValues.Single; return this; } public IXLPhonetics SetUnderline(XLFontUnderlineValues value) { Underline = value; return this; } + public IXLPhonetics SetStrikethrough() { Strikethrough = true; return this; } public IXLPhonetics SetStrikethrough(Boolean value) { Strikethrough = value; return this; } + public IXLPhonetics SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) { VerticalAlignment = value; return this; } + public IXLPhonetics SetShadow() { Shadow = true; return this; } public IXLPhonetics SetShadow(Boolean value) { Shadow = value; return this; } + public IXLPhonetics SetFontSize(Double value) { FontSize = value; return this; } + public IXLPhonetics SetFontColor(XLColor value) { FontColor = value; return this; } + public IXLPhonetics SetFontName(String value) { FontName = value; return this; } + public IXLPhonetics SetFontFamilyNumbering(XLFontFamilyNumberingValues value) { FontFamilyNumbering = value; return this; } + + public IXLPhonetics Add(String text, Int32 start, Int32 end) + { + _phonetics.Add(new XLPhonetic(text, start, end)); + return this; + } + public IXLPhonetics ClearText() + { + _phonetics.Clear(); + return this; + } + public IXLPhonetics ClearFont() + { + this.CopyFont(_defaultFont); + return this; + } + + public Int32 Count { get { return _phonetics.Count; } } + + public XLPhoneticAlignment Alignment { get; set; } + public XLPhoneticType Type { get; set; } + + public IXLPhonetics SetAlignment(XLPhoneticAlignment phoneticAlignment) { Alignment = phoneticAlignment; return this; } + public IXLPhonetics SetType(XLPhoneticType phoneticType) { Type = phoneticType; return this; } + + public IEnumerator GetEnumerator() + { + return _phonetics.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public bool Equals(IXLPhonetics other) + { + if (other == null) + return false; + + Int32 phoneticsCount = _phonetics.Count; + for (Int32 i = 0; i < phoneticsCount; i++) + { + if (!_phonetics[i].Equals(other.ElementAt(i))) + return false; + } + + return + Bold == other.Bold + && Italic == other.Italic + && Underline == other.Underline + && Strikethrough == other.Strikethrough + && VerticalAlignment == other.VerticalAlignment + && Shadow == other.Shadow + && FontSize == other.FontSize + && FontColor.Equals(other.FontColor) + && FontName == other.FontName + && FontFamilyNumbering == other.FontFamilyNumbering + ; + } + } +} diff --git a/ClosedXML/Excel/RichText/XLRichString.cs b/ClosedXML/Excel/RichText/XLRichString.cs index 6500758..b9e9cdd 100644 --- a/ClosedXML/Excel/RichText/XLRichString.cs +++ b/ClosedXML/Excel/RichText/XLRichString.cs @@ -1,85 +1,85 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLRichString: IXLRichString - { - IXLWithRichString _withRichString; - public XLRichString(String text, IXLFontBase font, IXLWithRichString withRichString) - { - Text = text; - this.CopyFont(font); - _withRichString = withRichString; - } - - public String Text { get; set; } - public IXLRichString AddText(String text) - { - return _withRichString.AddText(text); - } - - public IXLRichString AddNewLine() - { - return AddText(Environment.NewLine); - } - - public Boolean Bold { get; set; } - public Boolean Italic { get; set; } - public XLFontUnderlineValues Underline { get; set; } - public Boolean Strikethrough { get; set; } - public XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } - public Boolean Shadow { get; set; } - public Double FontSize { get; set; } - public XLColor FontColor { get; set; } - public String FontName { get; set; } - public XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } - - public IXLRichString SetBold() { Bold = true; return this; } public IXLRichString SetBold(Boolean value) { Bold = value; return this; } - public IXLRichString SetItalic() { Italic = true; return this; } public IXLRichString SetItalic(Boolean value) { Italic = value; return this; } - public IXLRichString SetUnderline() { Underline = XLFontUnderlineValues.Single; return this; } public IXLRichString SetUnderline(XLFontUnderlineValues value) { Underline = value; return this; } - public IXLRichString SetStrikethrough() { Strikethrough = true; return this; } public IXLRichString SetStrikethrough(Boolean value) { Strikethrough = value; return this; } - public IXLRichString SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) { VerticalAlignment = value; return this; } - public IXLRichString SetShadow() { Shadow = true; return this; } public IXLRichString SetShadow(Boolean value) { Shadow = value; return this; } - public IXLRichString SetFontSize(Double value) { FontSize = value; return this; } - public IXLRichString SetFontColor(XLColor value) { FontColor = value; return this; } - public IXLRichString SetFontName(String value) { FontName = value; return this; } - public IXLRichString SetFontFamilyNumbering(XLFontFamilyNumberingValues value) { FontFamilyNumbering = value; return this; } - - public Boolean Equals(IXLRichString other) - { - return - Text == other.Text - && Bold.Equals(other.Bold) - && Italic.Equals(other.Italic) - && Underline.Equals(other.Underline) - && Strikethrough.Equals(other.Strikethrough) - && VerticalAlignment.Equals(other.VerticalAlignment) - && Shadow.Equals(other.Shadow) - && FontSize.Equals(other.FontSize) - && FontColor.Equals(other.FontColor) - && FontName.Equals(other.FontName) - && FontFamilyNumbering.Equals(other.FontFamilyNumbering) - ; - } - - public override bool Equals(object obj) - { - return Equals((XLRichString)obj); - } - - public override int GetHashCode() - { - return Text.GetHashCode() - ^ Bold.GetHashCode() - ^ Italic.GetHashCode() - ^ (Int32)Underline - ^ Strikethrough.GetHashCode() - ^ (Int32)VerticalAlignment - ^ Shadow.GetHashCode() - ^ FontSize.GetHashCode() - ^ FontColor.GetHashCode() - ^ FontName.GetHashCode() - ^ (Int32)FontFamilyNumbering; - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLRichString: IXLRichString + { + IXLWithRichString _withRichString; + public XLRichString(String text, IXLFontBase font, IXLWithRichString withRichString) + { + Text = text; + this.CopyFont(font); + _withRichString = withRichString; + } + + public String Text { get; set; } + public IXLRichString AddText(String text) + { + return _withRichString.AddText(text); + } + + public IXLRichString AddNewLine() + { + return AddText(Environment.NewLine); + } + + public Boolean Bold { get; set; } + public Boolean Italic { get; set; } + public XLFontUnderlineValues Underline { get; set; } + public Boolean Strikethrough { get; set; } + public XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } + public Boolean Shadow { get; set; } + public Double FontSize { get; set; } + public XLColor FontColor { get; set; } + public String FontName { get; set; } + public XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } + + public IXLRichString SetBold() { Bold = true; return this; } public IXLRichString SetBold(Boolean value) { Bold = value; return this; } + public IXLRichString SetItalic() { Italic = true; return this; } public IXLRichString SetItalic(Boolean value) { Italic = value; return this; } + public IXLRichString SetUnderline() { Underline = XLFontUnderlineValues.Single; return this; } public IXLRichString SetUnderline(XLFontUnderlineValues value) { Underline = value; return this; } + public IXLRichString SetStrikethrough() { Strikethrough = true; return this; } public IXLRichString SetStrikethrough(Boolean value) { Strikethrough = value; return this; } + public IXLRichString SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) { VerticalAlignment = value; return this; } + public IXLRichString SetShadow() { Shadow = true; return this; } public IXLRichString SetShadow(Boolean value) { Shadow = value; return this; } + public IXLRichString SetFontSize(Double value) { FontSize = value; return this; } + public IXLRichString SetFontColor(XLColor value) { FontColor = value; return this; } + public IXLRichString SetFontName(String value) { FontName = value; return this; } + public IXLRichString SetFontFamilyNumbering(XLFontFamilyNumberingValues value) { FontFamilyNumbering = value; return this; } + + public Boolean Equals(IXLRichString other) + { + return + Text == other.Text + && Bold.Equals(other.Bold) + && Italic.Equals(other.Italic) + && Underline.Equals(other.Underline) + && Strikethrough.Equals(other.Strikethrough) + && VerticalAlignment.Equals(other.VerticalAlignment) + && Shadow.Equals(other.Shadow) + && FontSize.Equals(other.FontSize) + && FontColor.Equals(other.FontColor) + && FontName.Equals(other.FontName) + && FontFamilyNumbering.Equals(other.FontFamilyNumbering) + ; + } + + public override bool Equals(object obj) + { + return Equals((XLRichString)obj); + } + + public override int GetHashCode() + { + return Text.GetHashCode() + ^ Bold.GetHashCode() + ^ Italic.GetHashCode() + ^ (Int32)Underline + ^ Strikethrough.GetHashCode() + ^ (Int32)VerticalAlignment + ^ Shadow.GetHashCode() + ^ FontSize.GetHashCode() + ^ FontColor.GetHashCode() + ^ FontName.GetHashCode() + ^ (Int32)FontFamilyNumbering; + } + } +} diff --git a/ClosedXML/Excel/RichText/XLRichText.cs b/ClosedXML/Excel/RichText/XLRichText.cs index 7d4c65b..aaad29a 100644 --- a/ClosedXML/Excel/RichText/XLRichText.cs +++ b/ClosedXML/Excel/RichText/XLRichText.cs @@ -1,30 +1,30 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLRichText: XLFormattedText, IXLRichText - { - - public XLRichText(IXLFontBase defaultFont) - :base(defaultFont) - { - Container = this; - } - - public XLRichText(XLFormattedText defaultRichText, IXLFontBase defaultFont) - :base(defaultRichText, defaultFont) - { - Container = this; - } - - public XLRichText(String text, IXLFontBase defaultFont) - :base(text, defaultFont) - { - Container = this; - } - - } -} +using System; +using System.Collections.Generic; +using System.Text; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLRichText: XLFormattedText, IXLRichText + { + + public XLRichText(IXLFontBase defaultFont) + :base(defaultFont) + { + Container = this; + } + + public XLRichText(XLFormattedText defaultRichText, IXLFontBase defaultFont) + :base(defaultRichText, defaultFont) + { + Container = this; + } + + public XLRichText(String text, IXLFontBase defaultFont) + :base(text, defaultFont) + { + Container = this; + } + + } +} diff --git a/ClosedXML/Excel/Rows/IXLRow.cs b/ClosedXML/Excel/Rows/IXLRow.cs index e77686d..3bec732 100644 --- a/ClosedXML/Excel/Rows/IXLRow.cs +++ b/ClosedXML/Excel/Rows/IXLRow.cs @@ -1,190 +1,190 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLRow : IXLRangeBase - { - - - /// - /// Gets or sets the height of this row. - /// - /// - /// The width of this row. - /// - Double Height { get; set; } - - /// - /// Deletes this row and shifts the rows below this one accordingly. - /// - void Delete(); - - /// - /// Gets this row's number - /// - Int32 RowNumber(); - - /// - /// Inserts X number of rows below this one. - /// All rows below will be shifted accordingly. - /// - /// The number of rows to insert. - IXLRows InsertRowsBelow(Int32 numberOfRows); - - /// - /// Inserts X number of rows above this one. - /// This row and all below will be shifted accordingly. - /// - /// The number of rows to insert. - IXLRows InsertRowsAbove(Int32 numberOfRows); - - IXLRow AdjustToContents(); - - /// - /// Adjusts the height of the row based on its contents, starting from the startColumn. - /// - /// The column to start calculating the row height. - IXLRow 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. - IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn); - - - IXLRow AdjustToContents(Double minHeight, Double maxHeight); - IXLRow AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight); - IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight); - - /// Hides this row. - IXLRow Hide(); - - /// Unhides this row. - IXLRow Unhide(); - - /// - /// Gets a value indicating whether this row is hidden or not. - /// - /// - /// true if this row is hidden; otherwise, false. - /// - Boolean IsHidden { get; } - - /// - /// Gets or sets the outline level of this row. - /// - /// - /// The outline level of this row. - /// - Int32 OutlineLevel { get; set; } - - /// - /// Adds this row to the next outline level (Increments the outline level for this row by 1). - /// - IXLRow Group(); - - /// - /// Adds this row to the next outline level (Increments the outline level for this row by 1). - /// - /// If set to true the row will be shown collapsed. - IXLRow Group(Boolean collapse); - - /// - /// Sets outline level for this row. - /// - /// The outline level. - IXLRow Group(Int32 outlineLevel); - - /// - /// Sets outline level for this row. - /// - /// The outline level. - /// If set to true the row will be shown collapsed. - IXLRow Group(Int32 outlineLevel, Boolean collapse); - - /// - /// Adds this row to the previous outline level (decrements the outline level for this row by 1). - /// - IXLRow Ungroup(); - - - /// - /// Adds this row to the previous outline level (decrements the outline level for this row by 1). - /// - /// If set to true it will remove this row from all outline levels. - IXLRow Ungroup(Boolean fromAll); - - /// - /// Show this row as collapsed. - /// - IXLRow Collapse(); - - /// - /// Gets the cell in the specified column. - /// - /// The cell's column. - IXLCell Cell(Int32 columnNumber); - - /// - /// Gets the cell in the specified column. - /// - /// The cell's column. - IXLCell Cell(String columnLetter); - - /// - /// Returns the specified group of cells, separated by commas. - /// e.g. Cells("1"), Cells("1:5"), Cells("1,3:5") - /// - /// The row's cells to return. - new IXLCells Cells(String cellsInRow); - /// - /// Returns the specified group of cells. - /// - /// The first column in the group of cells to return. - /// The last column in the group of cells to return. - IXLCells Cells(Int32 firstColumn, Int32 lastColumn); - /// - /// Returns the specified group of cells. - /// - /// The first column in the group of cells to return. - /// The last column in the group of cells to return. - IXLCells Cells(String firstColumn, String lastColumn); - - /// Expands this row (if it's collapsed). - IXLRow Expand(); - - Int32 CellCount(); - - IXLRangeRow CopyTo(IXLCell cell); - IXLRangeRow CopyTo(IXLRangeBase range); - IXLRow CopyTo(IXLRow row); - - IXLRow Sort(); - IXLRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - - IXLRangeRow Row(Int32 start, Int32 end); - IXLRangeRow Row(IXLCell start, IXLCell end); - IXLRangeRows Rows(String columns); - - /// - /// Adds a horizontal page break after this row. - /// - IXLRow AddHorizontalPageBreak(); - - IXLRow SetDataType(XLCellValues dataType); - - IXLRow RowAbove(); - IXLRow RowAbove(Int32 step); - IXLRow RowBelow(); - IXLRow RowBelow(Int32 step); - - /// - /// Clears the contents of this row. - /// - /// Specify what you want to clear. - new IXLRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - IXLRangeRow RowUsed(Boolean includeFormats = false); - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLRow : IXLRangeBase + { + + + /// + /// Gets or sets the height of this row. + /// + /// + /// The width of this row. + /// + Double Height { get; set; } + + /// + /// Deletes this row and shifts the rows below this one accordingly. + /// + void Delete(); + + /// + /// Gets this row's number + /// + Int32 RowNumber(); + + /// + /// Inserts X number of rows below this one. + /// All rows below will be shifted accordingly. + /// + /// The number of rows to insert. + IXLRows InsertRowsBelow(Int32 numberOfRows); + + /// + /// Inserts X number of rows above this one. + /// This row and all below will be shifted accordingly. + /// + /// The number of rows to insert. + IXLRows InsertRowsAbove(Int32 numberOfRows); + + IXLRow AdjustToContents(); + + /// + /// Adjusts the height of the row based on its contents, starting from the startColumn. + /// + /// The column to start calculating the row height. + IXLRow 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. + IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn); + + + IXLRow AdjustToContents(Double minHeight, Double maxHeight); + IXLRow AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight); + IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight); + + /// Hides this row. + IXLRow Hide(); + + /// Unhides this row. + IXLRow Unhide(); + + /// + /// Gets a value indicating whether this row is hidden or not. + /// + /// + /// true if this row is hidden; otherwise, false. + /// + Boolean IsHidden { get; } + + /// + /// Gets or sets the outline level of this row. + /// + /// + /// The outline level of this row. + /// + Int32 OutlineLevel { get; set; } + + /// + /// Adds this row to the next outline level (Increments the outline level for this row by 1). + /// + IXLRow Group(); + + /// + /// Adds this row to the next outline level (Increments the outline level for this row by 1). + /// + /// If set to true the row will be shown collapsed. + IXLRow Group(Boolean collapse); + + /// + /// Sets outline level for this row. + /// + /// The outline level. + IXLRow Group(Int32 outlineLevel); + + /// + /// Sets outline level for this row. + /// + /// The outline level. + /// If set to true the row will be shown collapsed. + IXLRow Group(Int32 outlineLevel, Boolean collapse); + + /// + /// Adds this row to the previous outline level (decrements the outline level for this row by 1). + /// + IXLRow Ungroup(); + + + /// + /// Adds this row to the previous outline level (decrements the outline level for this row by 1). + /// + /// If set to true it will remove this row from all outline levels. + IXLRow Ungroup(Boolean fromAll); + + /// + /// Show this row as collapsed. + /// + IXLRow Collapse(); + + /// + /// Gets the cell in the specified column. + /// + /// The cell's column. + IXLCell Cell(Int32 columnNumber); + + /// + /// Gets the cell in the specified column. + /// + /// The cell's column. + IXLCell Cell(String columnLetter); + + /// + /// Returns the specified group of cells, separated by commas. + /// e.g. Cells("1"), Cells("1:5"), Cells("1,3:5") + /// + /// The row's cells to return. + new IXLCells Cells(String cellsInRow); + /// + /// Returns the specified group of cells. + /// + /// The first column in the group of cells to return. + /// The last column in the group of cells to return. + IXLCells Cells(Int32 firstColumn, Int32 lastColumn); + /// + /// Returns the specified group of cells. + /// + /// The first column in the group of cells to return. + /// The last column in the group of cells to return. + IXLCells Cells(String firstColumn, String lastColumn); + + /// Expands this row (if it's collapsed). + IXLRow Expand(); + + Int32 CellCount(); + + IXLRangeRow CopyTo(IXLCell cell); + IXLRangeRow CopyTo(IXLRangeBase range); + IXLRow CopyTo(IXLRow row); + + IXLRow Sort(); + IXLRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + IXLRangeRow Row(Int32 start, Int32 end); + IXLRangeRow Row(IXLCell start, IXLCell end); + IXLRangeRows Rows(String columns); + + /// + /// Adds a horizontal page break after this row. + /// + IXLRow AddHorizontalPageBreak(); + + IXLRow SetDataType(XLCellValues dataType); + + IXLRow RowAbove(); + IXLRow RowAbove(Int32 step); + IXLRow RowBelow(); + IXLRow RowBelow(Int32 step); + + /// + /// Clears the contents of this row. + /// + /// Specify what you want to clear. + new IXLRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + IXLRangeRow RowUsed(Boolean includeFormats = false); + } +} diff --git a/ClosedXML/Excel/Rows/IXLRows.cs b/ClosedXML/Excel/Rows/IXLRows.cs index fd5a1ca..5249e64 100644 --- a/ClosedXML/Excel/Rows/IXLRows.cs +++ b/ClosedXML/Excel/Rows/IXLRows.cs @@ -1,125 +1,125 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLRows: IEnumerable, IDisposable - { - /// - /// Sets the height of all rows. - /// - /// - /// The height of all rows. - /// - Double Height { set; } - - /// - /// Deletes all rows and shifts the rows below them accordingly. - /// - void Delete(); - - /// - /// Adjusts the height of all rows based on its contents. - /// - IXLRows AdjustToContents(); - /// - /// Adjusts the height of all rows based on its contents, starting from the startColumn. - /// - /// The column to start calculating the row height. - IXLRows 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. - IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn); - - IXLRows AdjustToContents(Double minHeight, Double maxHeight); - IXLRows AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight); - IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight); - - /// - /// Hides all rows. - /// - void Hide(); - - /// Unhides all rows. - void Unhide(); - - /// - /// Increments the outline level of all rows by 1. - /// - void Group(); - - /// - /// Increments the outline level of all rows by 1. - /// - /// If set to true the rows will be shown collapsed. - void Group(Boolean collapse); - - /// - /// Sets outline level for all rows. - /// - /// The outline level. - void Group(Int32 outlineLevel); - - /// - /// Sets outline level for all rows. - /// - /// The outline level. - /// If set to true the rows will be shown collapsed. - void Group(Int32 outlineLevel, Boolean collapse); - - /// - /// Decrements the outline level of all rows by 1. - /// - void Ungroup(); - - /// - /// Decrements the outline level of all rows by 1. - /// - /// If set to true it will remove the rows from all outline levels. - void Ungroup(Boolean fromAll); - - /// - /// Show all rows as collapsed. - /// - void Collapse(); - - /// Expands all rows (if they're collapsed). - void Expand(); - - /// - /// Returns the collection of cells. - /// - IXLCells Cells(); - - /// - /// Returns the collection of cells that have a value. - /// - IXLCells CellsUsed(); - - /// - /// Returns the collection of cells that have a value. - /// - /// if set to true will return all cells with a value or a style different than the default. - IXLCells CellsUsed(Boolean includeFormats); - - IXLStyle Style { get; set; } - - /// - /// Adds a horizontal page break after these rows. - /// - IXLRows AddHorizontalPageBreaks(); - - IXLRows SetDataType(XLCellValues dataType); - - /// - /// Clears the contents of these rows. - /// - /// Specify what you want to clear. - IXLRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - void Select(); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLRows: IEnumerable, IDisposable + { + /// + /// Sets the height of all rows. + /// + /// + /// The height of all rows. + /// + Double Height { set; } + + /// + /// Deletes all rows and shifts the rows below them accordingly. + /// + void Delete(); + + /// + /// Adjusts the height of all rows based on its contents. + /// + IXLRows AdjustToContents(); + /// + /// Adjusts the height of all rows based on its contents, starting from the startColumn. + /// + /// The column to start calculating the row height. + IXLRows 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. + IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn); + + IXLRows AdjustToContents(Double minHeight, Double maxHeight); + IXLRows AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight); + IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight); + + /// + /// Hides all rows. + /// + void Hide(); + + /// Unhides all rows. + void Unhide(); + + /// + /// Increments the outline level of all rows by 1. + /// + void Group(); + + /// + /// Increments the outline level of all rows by 1. + /// + /// If set to true the rows will be shown collapsed. + void Group(Boolean collapse); + + /// + /// Sets outline level for all rows. + /// + /// The outline level. + void Group(Int32 outlineLevel); + + /// + /// Sets outline level for all rows. + /// + /// The outline level. + /// If set to true the rows will be shown collapsed. + void Group(Int32 outlineLevel, Boolean collapse); + + /// + /// Decrements the outline level of all rows by 1. + /// + void Ungroup(); + + /// + /// Decrements the outline level of all rows by 1. + /// + /// If set to true it will remove the rows from all outline levels. + void Ungroup(Boolean fromAll); + + /// + /// Show all rows as collapsed. + /// + void Collapse(); + + /// Expands all rows (if they're collapsed). + void Expand(); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + IXLCells CellsUsed(Boolean includeFormats); + + IXLStyle Style { get; set; } + + /// + /// Adds a horizontal page break after these rows. + /// + IXLRows AddHorizontalPageBreaks(); + + IXLRows SetDataType(XLCellValues dataType); + + /// + /// Clears the contents of these rows. + /// + /// Specify what you want to clear. + IXLRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Rows/XLRow.cs b/ClosedXML/Excel/Rows/XLRow.cs index b5447d5..944cb17 100644 --- a/ClosedXML/Excel/Rows/XLRow.cs +++ b/ClosedXML/Excel/Rows/XLRow.cs @@ -1,720 +1,720 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Drawing; - - -namespace ClosedXML.Excel -{ - internal class XLRow : XLRangeBase, IXLRow - { - #region Private fields - - private Boolean _collapsed; - private Double _height; - private Boolean _isHidden; - private Int32 _outlineLevel; - - #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, XLHelper.MaxColumnNumber, false, - false))) - { - SetRowNumber(row); - - IsReference = xlRowParameters.IsReference; - if (IsReference) - SubscribeToShiftedRows((range, rowShifted) => this.WorksheetRangeShiftedRows(range, rowShifted)); - else - { - SetStyle(xlRowParameters.DefaultStyleId); - _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(), XLHelper.MaxColumnNumber, false, - false))) - { - _height = row._height; - IsReference = row.IsReference; - if (IsReference) - SubscribeToShiftedRows((range, rowShifted) => this.WorksheetRangeShiftedRows(range, rowShifted)); - - _collapsed = row._collapsed; - _isHidden = row._isHidden; - _outlineLevel = row._outlineLevel; - HeightChanged = row.HeightChanged; - SetStyle(row.GetStyleId()); - } - - #endregion - - public Boolean IsReference { get; private set; } - - public override IEnumerable Styles - { - get - { - UpdatingStyle = true; - - yield return Style; - - int row = RowNumber(); - - foreach (XLCell cell in Worksheet.Internals.CellsCollection.GetCellsInRow(row)) - yield return cell.Style; - - UpdatingStyle = false; - } - } - - public override Boolean UpdatingStyle { get; set; } - - public override IXLStyle InnerStyle - { - get - { - return IsReference - ? Worksheet.Internals.RowsCollection[RowNumber()].InnerStyle - : GetStyle(); - } - set - { - if (IsReference) - Worksheet.Internals.RowsCollection[RowNumber()].InnerStyle = value; - else - SetStyle(value); - } - } - - public Boolean Collapsed - { - get { return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].Collapsed : _collapsed; } - set - { - if (IsReference) - Worksheet.Internals.RowsCollection[RowNumber()].Collapsed = value; - else - _collapsed = value; - } - } - - #region IXLRow Members - - private Boolean _loading; - public Boolean Loading - { - get { return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].Loading : _loading; } - set - { - if (IsReference) - Worksheet.Internals.RowsCollection[RowNumber()].Loading = value; - else - _loading = value; - } - } - - public Boolean HeightChanged { get; private set; } - public Double Height - { - get { return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].Height : _height; } - set - { - if (!Loading) - HeightChanged = true; - - if (IsReference) - Worksheet.Internals.RowsCollection[RowNumber()].Height = value; - else - _height = value; - } - } - - public void Delete() - { - int rowNumber = RowNumber(); - using (var asRange = AsRange()) - 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 (int row in rowsToMove.OrderBy(r => r)) - { - Worksheet.Internals.RowsCollection.Add(row - 1, Worksheet.Internals.RowsCollection[row]); - Worksheet.Internals.RowsCollection.Remove(row); - } - } - - public new IXLRows InsertRowsBelow(Int32 numberOfRows) - { - int rowNum = RowNumber(); - Worksheet.Internals.RowsCollection.ShiftRowsDown(rowNum + 1, numberOfRows); - using (var row = Worksheet.Row(rowNum)) - { - using (var asRange = row.AsRange()) - { - asRange.InsertRowsBelowVoid(true, numberOfRows); - } - } - var newRows = Worksheet.Rows(rowNum + 1, rowNum + numberOfRows); - - CopyRows(newRows); - - return newRows; - } - - private void CopyRows(IXLRows newRows) - { - foreach (var newRow in newRows) - { - var internalRow = Worksheet.Internals.RowsCollection[newRow.RowNumber()]; - internalRow._height = Height; - internalRow.SetStyle(Style); - internalRow._collapsed = Collapsed; - internalRow._isHidden = IsHidden; - internalRow._outlineLevel = OutlineLevel; - } - } - - public new IXLRows InsertRowsAbove(Int32 numberOfRows) - { - int rowNum = RowNumber(); - if (rowNum > 1) - { - using (var row = Worksheet.Row(rowNum - 1)) - { - return row.InsertRowsBelow(numberOfRows); - } - } - - Worksheet.Internals.RowsCollection.ShiftRowsDown(rowNum, numberOfRows); - using (var row = Worksheet.Row(rowNum)) - { - using (var asRange = row.AsRange()) - { - asRange.InsertRowsAboveVoid(true, numberOfRows); - } - } - - return Worksheet.Rows(rowNum, rowNum + numberOfRows - 1); - } - - public new IXLRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - base.Clear(clearOptions); - return this; - } - - public IXLCell Cell(Int32 columnNumber) - { - return Cell(1, columnNumber); - } - - public new IXLCell Cell(String columnLetter) - { - return Cell(1, columnLetter); - } - - public new IXLCells Cells() - { - return Cells(true, true); - } - - public new IXLCells Cells(Boolean usedCellsOnly) - { - if (usedCellsOnly) - return Cells(true, true); - else - return Cells(FirstCellUsed().Address.ColumnNumber, LastCellUsed().Address.ColumnNumber); - } - - public new IXLCells Cells(String cellsInRow) - { - var retVal = new XLCells(false, false); - var rangePairs = cellsInRow.Split(','); - foreach (string pair in rangePairs) - retVal.Add(Range(pair.Trim()).RangeAddress); - return retVal; - } - - public IXLCells Cells(Int32 firstColumn, Int32 lastColumn) - { - return Cells(firstColumn + ":" + lastColumn); - } - - public IXLCells Cells(String firstColumn, String lastColumn) - { - return Cells(XLHelper.GetColumnNumberFromLetter(firstColumn) + ":" - + XLHelper.GetColumnNumberFromLetter(lastColumn)); - } - - public IXLRow AdjustToContents(Int32 startColumn) - { - return AdjustToContents(startColumn, XLHelper.MaxColumnNumber); - } - - public IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn) - { - return AdjustToContents(startColumn, endColumn, 0, Double.MaxValue); - } - - public IXLRow AdjustToContents(Double minHeight, Double maxHeight) - { - return AdjustToContents(1, XLHelper.MaxColumnNumber, minHeight, maxHeight); - } - - public IXLRow AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight) - { - return AdjustToContents(startColumn, XLHelper.MaxColumnNumber, minHeight, maxHeight); - } - - public IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight) - { - var fontCache = new Dictionary(); - Double rowMaxHeight = minHeight; - foreach (XLCell c in from XLCell c in Row(startColumn, endColumn).CellsUsed() where !c.IsMerged() select c) - { - Double thisHeight; - Int32 textRotation = c.Style.Alignment.TextRotation; - if (c.HasRichText || textRotation != 0 || c.InnerText.Contains(Environment.NewLine)) - { - var kpList = new List>(); - if (c.HasRichText) - { - foreach (IXLRichString rt in c.RichText) - { - String formattedString = rt.Text; - var arr = formattedString.Split(new[] {Environment.NewLine}, StringSplitOptions.None); - Int32 arrCount = arr.Count(); - for (Int32 i = 0; i < arrCount; i++) - { - String s = arr[i]; - if (i < arrCount - 1) - s += Environment.NewLine; - kpList.Add(new KeyValuePair(rt, s)); - } - } - } - else - { - String formattedString = c.GetFormattedString(); - var arr = formattedString.Split(new[] {Environment.NewLine}, StringSplitOptions.None); - Int32 arrCount = arr.Count(); - for (Int32 i = 0; i < arrCount; i++) - { - String s = arr[i]; - if (i < arrCount - 1) - s += Environment.NewLine; - kpList.Add(new KeyValuePair(c.Style.Font, s)); - } - } - - Double maxLongCol = kpList.Max(kp => kp.Value.Length); - Double maxHeightCol = kpList.Max(kp => kp.Key.GetHeight(fontCache)); - Int32 lineCount = kpList.Count(kp => kp.Value.Contains(Environment.NewLine)) + 1; - 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( fontCache); - - if (thisHeight >= maxHeight) - { - rowMaxHeight = maxHeight; - break; - } - if (thisHeight > rowMaxHeight) - rowMaxHeight = thisHeight; - } - - if (rowMaxHeight <= 0) - rowMaxHeight = Worksheet.RowHeight; - - Height = rowMaxHeight; - - foreach (IDisposable font in fontCache.Values) - { - font.Dispose(); - } - return this; - } - - public IXLRow Hide() - { - IsHidden = true; - return this; - } - - public IXLRow Unhide() - { - IsHidden = false; - return this; - } - - public Boolean IsHidden - { - get { return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].IsHidden : _isHidden; } - set - { - if (IsReference) - Worksheet.Internals.RowsCollection[RowNumber()].IsHidden = value; - else - _isHidden = value; - } - } - - public override IXLStyle Style - { - get - { - return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].Style : GetStyle(); - } - set - { - if (IsReference) - Worksheet.Internals.RowsCollection[RowNumber()].Style = value; - else - { - SetStyle(value); - - Int32 minColumn = 1; - Int32 maxColumn = 0; - int row = RowNumber(); - if (Worksheet.Internals.CellsCollection.RowsUsed.ContainsKey(row)) - { - minColumn = Worksheet.Internals.CellsCollection.MinColumnInRow(row); - maxColumn = Worksheet.Internals.CellsCollection.MaxColumnInRow(row); - } - - if (Worksheet.Internals.ColumnsCollection.Count > 0) - { - Int32 minInCollection = Worksheet.Internals.ColumnsCollection.Keys.Min(); - Int32 maxInCollection = Worksheet.Internals.ColumnsCollection.Keys.Max(); - if (minInCollection < minColumn) - minColumn = minInCollection; - if (maxInCollection > maxColumn) - maxColumn = maxInCollection; - } - if (minColumn > 0 && maxColumn > 0) - { - for (Int32 co = minColumn; co <= maxColumn; co++) - Worksheet.Cell(row, co).Style = value; - } - } - } - } - - public Int32 OutlineLevel - { - get { return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].OutlineLevel : _outlineLevel; } - set - { - if (value < 0 || value > 8) - throw new ArgumentOutOfRangeException("value", "Outline level must be between 0 and 8."); - - if (IsReference) - Worksheet.Internals.RowsCollection[RowNumber()].OutlineLevel = value; - else - { - Worksheet.IncrementColumnOutline(value); - Worksheet.DecrementColumnOutline(_outlineLevel); - _outlineLevel = value; - } - } - } - - public IXLRow Group() - { - return Group(false); - } - - public IXLRow Group(Int32 outlineLevel) - { - return Group(outlineLevel, false); - } - - public IXLRow Ungroup() - { - return Ungroup(false); - } - - public IXLRow Group(Boolean collapse) - { - if (OutlineLevel < 8) - OutlineLevel += 1; - - Collapsed = collapse; - return this; - } - - public IXLRow Group(Int32 outlineLevel, Boolean collapse) - { - OutlineLevel = outlineLevel; - Collapsed = collapse; - return this; - } - - public IXLRow Ungroup(Boolean ungroupFromAll) - { - if (ungroupFromAll) - OutlineLevel = 0; - else - { - if (OutlineLevel > 0) - OutlineLevel -= 1; - } - return this; - } - - public IXLRow Collapse() - { - Collapsed = true; - return Hide(); - } - - public IXLRow Expand() - { - Collapsed = false; - return Unhide(); - } - - public Int32 CellCount() - { - return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; - } - - public new IXLRow Sort() - { - return SortLeftToRight(); - } - - public new IXLRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, - Boolean ignoreBlanks = true) - { - base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks); - return this; - } - - IXLRangeRow IXLRow.CopyTo(IXLCell target) - { - using (var asRange = AsRange()) - using (var copy = asRange.CopyTo(target)) - return copy.Row(1); - } - - IXLRangeRow IXLRow.CopyTo(IXLRangeBase target) - { - using (var asRange = AsRange()) - using (var copy = asRange.CopyTo(target)) - return copy.Row(1); - } - - public IXLRow CopyTo(IXLRow row) - { - row.Clear(); - var newRow = (XLRow)row; - newRow._height = _height; - newRow.Style = GetStyle(); - - using (var asRange = AsRange()) - asRange.CopyTo(row).Dispose(); - - return newRow; - } - - public IXLRangeRow Row(Int32 start, Int32 end) - { - return Range(1, start, 1, end).Row(1); - } - - public IXLRangeRow Row(IXLCell start, IXLCell end) - { - return Row(start.Address.ColumnNumber, end.Address.ColumnNumber); - } - - public IXLRangeRows Rows(String rows) - { - var retVal = new XLRangeRows(); - var rowPairs = rows.Split(','); - foreach (string pair in rowPairs) - using (var asRange = AsRange()) - asRange.Rows(pair.Trim()).ForEach(retVal.Add); - return retVal; - } - - public IXLRow AddHorizontalPageBreak() - { - Worksheet.PageSetup.AddHorizontalPageBreak(RowNumber()); - return this; - } - - public IXLRow SetDataType(XLCellValues dataType) - { - DataType = dataType; - return this; - } - - public IXLRangeRow RowUsed(Boolean includeFormats = false) - { - return Row(FirstCellUsed(includeFormats), LastCellUsed(includeFormats)); - } - - #endregion - - public override XLRange AsRange() - { - return Range(1, 1, 1, XLHelper.MaxColumnNumber); - } - - 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, - XLHelper.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 - { - SetStyle(value); - - int row = RowNumber(); - foreach (XLCell c in Worksheet.Internals.CellsCollection.GetCellsInRow(row)) - c.Style = value; - } - } - - private XLRow RowShift(Int32 rowsToShift) - { - return Worksheet.Row(RowNumber() + rowsToShift); - } - - #region XLRow Above - - IXLRow IXLRow.RowAbove() - { - return RowAbove(); - } - - IXLRow IXLRow.RowAbove(Int32 step) - { - return RowAbove(step); - } - - public XLRow RowAbove() - { - return RowAbove(1); - } - - public XLRow RowAbove(Int32 step) - { - return RowShift(step * -1); - } - - #endregion - - #region XLRow Below - - IXLRow IXLRow.RowBelow() - { - return RowBelow(); - } - - IXLRow IXLRow.RowBelow(Int32 step) - { - return RowBelow(step); - } - - public XLRow RowBelow() - { - return RowBelow(1); - } - - public XLRow RowBelow(Int32 step) - { - return RowShift(step); - } - - #endregion - - public new Boolean IsEmpty() - { - return IsEmpty(false); - } - - public new Boolean IsEmpty(Boolean includeFormats) - { - if (includeFormats && !Style.Equals(Worksheet.Style)) - return false; - - return base.IsEmpty(includeFormats); - } - - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Drawing; + + +namespace ClosedXML.Excel +{ + internal class XLRow : XLRangeBase, IXLRow + { + #region Private fields + + private Boolean _collapsed; + private Double _height; + private Boolean _isHidden; + private Int32 _outlineLevel; + + #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, XLHelper.MaxColumnNumber, false, + false))) + { + SetRowNumber(row); + + IsReference = xlRowParameters.IsReference; + if (IsReference) + SubscribeToShiftedRows((range, rowShifted) => this.WorksheetRangeShiftedRows(range, rowShifted)); + else + { + SetStyle(xlRowParameters.DefaultStyleId); + _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(), XLHelper.MaxColumnNumber, false, + false))) + { + _height = row._height; + IsReference = row.IsReference; + if (IsReference) + SubscribeToShiftedRows((range, rowShifted) => this.WorksheetRangeShiftedRows(range, rowShifted)); + + _collapsed = row._collapsed; + _isHidden = row._isHidden; + _outlineLevel = row._outlineLevel; + HeightChanged = row.HeightChanged; + SetStyle(row.GetStyleId()); + } + + #endregion + + public Boolean IsReference { get; private set; } + + public override IEnumerable Styles + { + get + { + UpdatingStyle = true; + + yield return Style; + + int row = RowNumber(); + + foreach (XLCell cell in Worksheet.Internals.CellsCollection.GetCellsInRow(row)) + yield return cell.Style; + + UpdatingStyle = false; + } + } + + public override Boolean UpdatingStyle { get; set; } + + public override IXLStyle InnerStyle + { + get + { + return IsReference + ? Worksheet.Internals.RowsCollection[RowNumber()].InnerStyle + : GetStyle(); + } + set + { + if (IsReference) + Worksheet.Internals.RowsCollection[RowNumber()].InnerStyle = value; + else + SetStyle(value); + } + } + + public Boolean Collapsed + { + get { return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].Collapsed : _collapsed; } + set + { + if (IsReference) + Worksheet.Internals.RowsCollection[RowNumber()].Collapsed = value; + else + _collapsed = value; + } + } + + #region IXLRow Members + + private Boolean _loading; + public Boolean Loading + { + get { return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].Loading : _loading; } + set + { + if (IsReference) + Worksheet.Internals.RowsCollection[RowNumber()].Loading = value; + else + _loading = value; + } + } + + public Boolean HeightChanged { get; private set; } + public Double Height + { + get { return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].Height : _height; } + set + { + if (!Loading) + HeightChanged = true; + + if (IsReference) + Worksheet.Internals.RowsCollection[RowNumber()].Height = value; + else + _height = value; + } + } + + public void Delete() + { + int rowNumber = RowNumber(); + using (var asRange = AsRange()) + 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 (int row in rowsToMove.OrderBy(r => r)) + { + Worksheet.Internals.RowsCollection.Add(row - 1, Worksheet.Internals.RowsCollection[row]); + Worksheet.Internals.RowsCollection.Remove(row); + } + } + + public new IXLRows InsertRowsBelow(Int32 numberOfRows) + { + int rowNum = RowNumber(); + Worksheet.Internals.RowsCollection.ShiftRowsDown(rowNum + 1, numberOfRows); + using (var row = Worksheet.Row(rowNum)) + { + using (var asRange = row.AsRange()) + { + asRange.InsertRowsBelowVoid(true, numberOfRows); + } + } + var newRows = Worksheet.Rows(rowNum + 1, rowNum + numberOfRows); + + CopyRows(newRows); + + return newRows; + } + + private void CopyRows(IXLRows newRows) + { + foreach (var newRow in newRows) + { + var internalRow = Worksheet.Internals.RowsCollection[newRow.RowNumber()]; + internalRow._height = Height; + internalRow.SetStyle(Style); + internalRow._collapsed = Collapsed; + internalRow._isHidden = IsHidden; + internalRow._outlineLevel = OutlineLevel; + } + } + + public new IXLRows InsertRowsAbove(Int32 numberOfRows) + { + int rowNum = RowNumber(); + if (rowNum > 1) + { + using (var row = Worksheet.Row(rowNum - 1)) + { + return row.InsertRowsBelow(numberOfRows); + } + } + + Worksheet.Internals.RowsCollection.ShiftRowsDown(rowNum, numberOfRows); + using (var row = Worksheet.Row(rowNum)) + { + using (var asRange = row.AsRange()) + { + asRange.InsertRowsAboveVoid(true, numberOfRows); + } + } + + return Worksheet.Rows(rowNum, rowNum + numberOfRows - 1); + } + + public new IXLRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + base.Clear(clearOptions); + return this; + } + + public IXLCell Cell(Int32 columnNumber) + { + return Cell(1, columnNumber); + } + + public new IXLCell Cell(String columnLetter) + { + return Cell(1, columnLetter); + } + + public new IXLCells Cells() + { + return Cells(true, true); + } + + public new IXLCells Cells(Boolean usedCellsOnly) + { + if (usedCellsOnly) + return Cells(true, true); + else + return Cells(FirstCellUsed().Address.ColumnNumber, LastCellUsed().Address.ColumnNumber); + } + + public new IXLCells Cells(String cellsInRow) + { + var retVal = new XLCells(false, false); + var rangePairs = cellsInRow.Split(','); + foreach (string pair in rangePairs) + retVal.Add(Range(pair.Trim()).RangeAddress); + return retVal; + } + + public IXLCells Cells(Int32 firstColumn, Int32 lastColumn) + { + return Cells(firstColumn + ":" + lastColumn); + } + + public IXLCells Cells(String firstColumn, String lastColumn) + { + return Cells(XLHelper.GetColumnNumberFromLetter(firstColumn) + ":" + + XLHelper.GetColumnNumberFromLetter(lastColumn)); + } + + public IXLRow AdjustToContents(Int32 startColumn) + { + return AdjustToContents(startColumn, XLHelper.MaxColumnNumber); + } + + public IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn) + { + return AdjustToContents(startColumn, endColumn, 0, Double.MaxValue); + } + + public IXLRow AdjustToContents(Double minHeight, Double maxHeight) + { + return AdjustToContents(1, XLHelper.MaxColumnNumber, minHeight, maxHeight); + } + + public IXLRow AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight) + { + return AdjustToContents(startColumn, XLHelper.MaxColumnNumber, minHeight, maxHeight); + } + + public IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight) + { + var fontCache = new Dictionary(); + Double rowMaxHeight = minHeight; + foreach (XLCell c in from XLCell c in Row(startColumn, endColumn).CellsUsed() where !c.IsMerged() select c) + { + Double thisHeight; + Int32 textRotation = c.Style.Alignment.TextRotation; + if (c.HasRichText || textRotation != 0 || c.InnerText.Contains(Environment.NewLine)) + { + var kpList = new List>(); + if (c.HasRichText) + { + foreach (IXLRichString rt in c.RichText) + { + String formattedString = rt.Text; + var arr = formattedString.Split(new[] {Environment.NewLine}, StringSplitOptions.None); + Int32 arrCount = arr.Count(); + for (Int32 i = 0; i < arrCount; i++) + { + String s = arr[i]; + if (i < arrCount - 1) + s += Environment.NewLine; + kpList.Add(new KeyValuePair(rt, s)); + } + } + } + else + { + String formattedString = c.GetFormattedString(); + var arr = formattedString.Split(new[] {Environment.NewLine}, StringSplitOptions.None); + Int32 arrCount = arr.Count(); + for (Int32 i = 0; i < arrCount; i++) + { + String s = arr[i]; + if (i < arrCount - 1) + s += Environment.NewLine; + kpList.Add(new KeyValuePair(c.Style.Font, s)); + } + } + + Double maxLongCol = kpList.Max(kp => kp.Value.Length); + Double maxHeightCol = kpList.Max(kp => kp.Key.GetHeight(fontCache)); + Int32 lineCount = kpList.Count(kp => kp.Value.Contains(Environment.NewLine)) + 1; + 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( fontCache); + + if (thisHeight >= maxHeight) + { + rowMaxHeight = maxHeight; + break; + } + if (thisHeight > rowMaxHeight) + rowMaxHeight = thisHeight; + } + + if (rowMaxHeight <= 0) + rowMaxHeight = Worksheet.RowHeight; + + Height = rowMaxHeight; + + foreach (IDisposable font in fontCache.Values) + { + font.Dispose(); + } + return this; + } + + public IXLRow Hide() + { + IsHidden = true; + return this; + } + + public IXLRow Unhide() + { + IsHidden = false; + return this; + } + + public Boolean IsHidden + { + get { return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].IsHidden : _isHidden; } + set + { + if (IsReference) + Worksheet.Internals.RowsCollection[RowNumber()].IsHidden = value; + else + _isHidden = value; + } + } + + public override IXLStyle Style + { + get + { + return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].Style : GetStyle(); + } + set + { + if (IsReference) + Worksheet.Internals.RowsCollection[RowNumber()].Style = value; + else + { + SetStyle(value); + + Int32 minColumn = 1; + Int32 maxColumn = 0; + int row = RowNumber(); + if (Worksheet.Internals.CellsCollection.RowsUsed.ContainsKey(row)) + { + minColumn = Worksheet.Internals.CellsCollection.MinColumnInRow(row); + maxColumn = Worksheet.Internals.CellsCollection.MaxColumnInRow(row); + } + + if (Worksheet.Internals.ColumnsCollection.Count > 0) + { + Int32 minInCollection = Worksheet.Internals.ColumnsCollection.Keys.Min(); + Int32 maxInCollection = Worksheet.Internals.ColumnsCollection.Keys.Max(); + if (minInCollection < minColumn) + minColumn = minInCollection; + if (maxInCollection > maxColumn) + maxColumn = maxInCollection; + } + if (minColumn > 0 && maxColumn > 0) + { + for (Int32 co = minColumn; co <= maxColumn; co++) + Worksheet.Cell(row, co).Style = value; + } + } + } + } + + public Int32 OutlineLevel + { + get { return IsReference ? Worksheet.Internals.RowsCollection[RowNumber()].OutlineLevel : _outlineLevel; } + set + { + if (value < 0 || value > 8) + throw new ArgumentOutOfRangeException("value", "Outline level must be between 0 and 8."); + + if (IsReference) + Worksheet.Internals.RowsCollection[RowNumber()].OutlineLevel = value; + else + { + Worksheet.IncrementColumnOutline(value); + Worksheet.DecrementColumnOutline(_outlineLevel); + _outlineLevel = value; + } + } + } + + public IXLRow Group() + { + return Group(false); + } + + public IXLRow Group(Int32 outlineLevel) + { + return Group(outlineLevel, false); + } + + public IXLRow Ungroup() + { + return Ungroup(false); + } + + public IXLRow Group(Boolean collapse) + { + if (OutlineLevel < 8) + OutlineLevel += 1; + + Collapsed = collapse; + return this; + } + + public IXLRow Group(Int32 outlineLevel, Boolean collapse) + { + OutlineLevel = outlineLevel; + Collapsed = collapse; + return this; + } + + public IXLRow Ungroup(Boolean ungroupFromAll) + { + if (ungroupFromAll) + OutlineLevel = 0; + else + { + if (OutlineLevel > 0) + OutlineLevel -= 1; + } + return this; + } + + public IXLRow Collapse() + { + Collapsed = true; + return Hide(); + } + + public IXLRow Expand() + { + Collapsed = false; + return Unhide(); + } + + public Int32 CellCount() + { + return RangeAddress.LastAddress.ColumnNumber - RangeAddress.FirstAddress.ColumnNumber + 1; + } + + public new IXLRow Sort() + { + return SortLeftToRight(); + } + + public new IXLRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, + Boolean ignoreBlanks = true) + { + base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks); + return this; + } + + IXLRangeRow IXLRow.CopyTo(IXLCell target) + { + using (var asRange = AsRange()) + using (var copy = asRange.CopyTo(target)) + return copy.Row(1); + } + + IXLRangeRow IXLRow.CopyTo(IXLRangeBase target) + { + using (var asRange = AsRange()) + using (var copy = asRange.CopyTo(target)) + return copy.Row(1); + } + + public IXLRow CopyTo(IXLRow row) + { + row.Clear(); + var newRow = (XLRow)row; + newRow._height = _height; + newRow.Style = GetStyle(); + + using (var asRange = AsRange()) + asRange.CopyTo(row).Dispose(); + + return newRow; + } + + public IXLRangeRow Row(Int32 start, Int32 end) + { + return Range(1, start, 1, end).Row(1); + } + + public IXLRangeRow Row(IXLCell start, IXLCell end) + { + return Row(start.Address.ColumnNumber, end.Address.ColumnNumber); + } + + public IXLRangeRows Rows(String rows) + { + var retVal = new XLRangeRows(); + var rowPairs = rows.Split(','); + foreach (string pair in rowPairs) + using (var asRange = AsRange()) + asRange.Rows(pair.Trim()).ForEach(retVal.Add); + return retVal; + } + + public IXLRow AddHorizontalPageBreak() + { + Worksheet.PageSetup.AddHorizontalPageBreak(RowNumber()); + return this; + } + + public IXLRow SetDataType(XLCellValues dataType) + { + DataType = dataType; + return this; + } + + public IXLRangeRow RowUsed(Boolean includeFormats = false) + { + return Row(FirstCellUsed(includeFormats), LastCellUsed(includeFormats)); + } + + #endregion + + public override XLRange AsRange() + { + return Range(1, 1, 1, XLHelper.MaxColumnNumber); + } + + 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, + XLHelper.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 + { + SetStyle(value); + + int row = RowNumber(); + foreach (XLCell c in Worksheet.Internals.CellsCollection.GetCellsInRow(row)) + c.Style = value; + } + } + + private XLRow RowShift(Int32 rowsToShift) + { + return Worksheet.Row(RowNumber() + rowsToShift); + } + + #region XLRow Above + + IXLRow IXLRow.RowAbove() + { + return RowAbove(); + } + + IXLRow IXLRow.RowAbove(Int32 step) + { + return RowAbove(step); + } + + public XLRow RowAbove() + { + return RowAbove(1); + } + + public XLRow RowAbove(Int32 step) + { + return RowShift(step * -1); + } + + #endregion + + #region XLRow Below + + IXLRow IXLRow.RowBelow() + { + return RowBelow(); + } + + IXLRow IXLRow.RowBelow(Int32 step) + { + return RowBelow(step); + } + + public XLRow RowBelow() + { + return RowBelow(1); + } + + public XLRow RowBelow(Int32 step) + { + return RowShift(step); + } + + #endregion + + public new Boolean IsEmpty() + { + return IsEmpty(false); + } + + public new Boolean IsEmpty(Boolean includeFormats) + { + if (includeFormats && !Style.Equals(Worksheet.Style)) + return false; + + return base.IsEmpty(includeFormats); + } + + + } +} diff --git a/ClosedXML/Excel/Rows/XLRowCollection.cs b/ClosedXML/Excel/Rows/XLRowCollection.cs index 96be962..6aa2e49 100644 --- a/ClosedXML/Excel/Rows/XLRowCollection.cs +++ b/ClosedXML/Excel/Rows/XLRowCollection.cs @@ -1,165 +1,165 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - using System.Collections; - - internal class XLRowsCollection : IDictionary, IDisposable - { - private readonly Dictionary _deleted = new Dictionary(); - private readonly Dictionary _dictionary = new Dictionary(); - - public Dictionary Deleted - { - get { return _deleted; } - } - - public Int32 MaxRowUsed; - - #region IDictionary Members - - public void Add(int key, XLRow value) - { - if (key > MaxRowUsed) MaxRowUsed = key; - - if (_deleted.ContainsKey(key)) - _deleted.Remove(key); - - _dictionary.Add(key, value); - } - - public bool ContainsKey(int key) - { - return _dictionary.ContainsKey(key); - } - - public ICollection Keys - { - get { return _dictionary.Keys; } - } - - public bool Remove(int key) - { - if (!_deleted.ContainsKey(key)) - _deleted.Add(key, _dictionary[key]); - - return _dictionary.Remove(key); - } - - public bool TryGetValue(int key, out XLRow value) - { - return _dictionary.TryGetValue(key, out value); - } - - public ICollection Values - { - get { return _dictionary.Values; } - } - - public XLRow this[int key] - { - get { return _dictionary[key]; } - set { _dictionary[key] = value; } - } - - public void Add(KeyValuePair item) - { - if (item.Key > MaxRowUsed) MaxRowUsed = item.Key; - - if (_deleted.ContainsKey(item.Key)) - _deleted.Remove(item.Key); - - _dictionary.Add(item.Key, item.Value); - } - - public void Clear() - { - foreach (KeyValuePair kp in _dictionary.Where(kp => !_deleted.ContainsKey(kp.Key))) - { - _deleted.Add(kp.Key, kp.Value); - } - - _dictionary.Clear(); - } - - public bool Contains(KeyValuePair item) - { - return _dictionary.Contains(item); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - throw new NotImplementedException(); - } - - public int Count - { - get { return _dictionary.Count; } - } - - public bool IsReadOnly - { - get { return false; } - } - - public bool Remove(KeyValuePair item) - { - if (!_deleted.ContainsKey(item.Key)) - _deleted.Add(item.Key, _dictionary[item.Key]); - - return _dictionary.Remove(item.Key); - } - - public IEnumerator> GetEnumerator() - { - return _dictionary.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return _dictionary.GetEnumerator(); - } - - #endregion - - public void ShiftRowsDown(Int32 startingRow, Int32 rowsToShift) - { - foreach (int ro in _dictionary.Keys.Where(k => k >= startingRow).OrderByDescending(k => k)) - { - var rowToMove = _dictionary[ro]; - Int32 newRowNum = ro + rowsToShift; - if (newRowNum <= XLHelper.MaxRowNumber) - { - var newRow = new XLRow(rowToMove) - { - RangeAddress = - { - FirstAddress = new XLAddress(newRowNum, 1, false, false), - LastAddress = - new XLAddress(newRowNum, XLHelper.MaxColumnNumber, false, false) - } - }; - _dictionary.Add(newRowNum, newRow); - } - _dictionary.Remove(ro); - } - } - - public void RemoveAll(Func predicate) - { - foreach (XLRow kp in _dictionary.Values.Where(predicate).Select(c => c).Where(kp => !_deleted.ContainsKey(kp.RowNumber()))) - { - _deleted.Add(kp.RowNumber(), kp); - } - - _dictionary.RemoveAll(predicate); - } - - public void Dispose() - { - _dictionary.Values.ForEach(r=>r.Dispose()); - } - } +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLRowsCollection : IDictionary, IDisposable + { + private readonly Dictionary _deleted = new Dictionary(); + private readonly Dictionary _dictionary = new Dictionary(); + + public Dictionary Deleted + { + get { return _deleted; } + } + + public Int32 MaxRowUsed; + + #region IDictionary Members + + public void Add(int key, XLRow value) + { + if (key > MaxRowUsed) MaxRowUsed = key; + + if (_deleted.ContainsKey(key)) + _deleted.Remove(key); + + _dictionary.Add(key, value); + } + + public bool ContainsKey(int key) + { + return _dictionary.ContainsKey(key); + } + + public ICollection Keys + { + get { return _dictionary.Keys; } + } + + public bool Remove(int key) + { + if (!_deleted.ContainsKey(key)) + _deleted.Add(key, _dictionary[key]); + + return _dictionary.Remove(key); + } + + public bool TryGetValue(int key, out XLRow value) + { + return _dictionary.TryGetValue(key, out value); + } + + public ICollection Values + { + get { return _dictionary.Values; } + } + + public XLRow this[int key] + { + get { return _dictionary[key]; } + set { _dictionary[key] = value; } + } + + public void Add(KeyValuePair item) + { + if (item.Key > MaxRowUsed) MaxRowUsed = item.Key; + + if (_deleted.ContainsKey(item.Key)) + _deleted.Remove(item.Key); + + _dictionary.Add(item.Key, item.Value); + } + + public void Clear() + { + foreach (KeyValuePair kp in _dictionary.Where(kp => !_deleted.ContainsKey(kp.Key))) + { + _deleted.Add(kp.Key, kp.Value); + } + + _dictionary.Clear(); + } + + public bool Contains(KeyValuePair item) + { + return _dictionary.Contains(item); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public int Count + { + get { return _dictionary.Count; } + } + + public bool IsReadOnly + { + get { return false; } + } + + public bool Remove(KeyValuePair item) + { + if (!_deleted.ContainsKey(item.Key)) + _deleted.Add(item.Key, _dictionary[item.Key]); + + return _dictionary.Remove(item.Key); + } + + public IEnumerator> GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + #endregion + + public void ShiftRowsDown(Int32 startingRow, Int32 rowsToShift) + { + foreach (int ro in _dictionary.Keys.Where(k => k >= startingRow).OrderByDescending(k => k)) + { + var rowToMove = _dictionary[ro]; + Int32 newRowNum = ro + rowsToShift; + if (newRowNum <= XLHelper.MaxRowNumber) + { + var newRow = new XLRow(rowToMove) + { + RangeAddress = + { + FirstAddress = new XLAddress(newRowNum, 1, false, false), + LastAddress = + new XLAddress(newRowNum, XLHelper.MaxColumnNumber, false, false) + } + }; + _dictionary.Add(newRowNum, newRow); + } + _dictionary.Remove(ro); + } + } + + public void RemoveAll(Func predicate) + { + foreach (XLRow kp in _dictionary.Values.Where(predicate).Select(c => c).Where(kp => !_deleted.ContainsKey(kp.RowNumber()))) + { + _deleted.Add(kp.RowNumber(), kp); + } + + _dictionary.RemoveAll(predicate); + } + + public void Dispose() + { + _dictionary.Values.ForEach(r=>r.Dispose()); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Rows/XLRowParameters.cs b/ClosedXML/Excel/Rows/XLRowParameters.cs index 99d1603..975b813 100644 --- a/ClosedXML/Excel/Rows/XLRowParameters.cs +++ b/ClosedXML/Excel/Rows/XLRowParameters.cs @@ -1,19 +1,19 @@ -using System; - - -namespace ClosedXML.Excel -{ - internal class XLRowParameters - { - public XLRowParameters(XLWorksheet worksheet, Int32 defaultStyleId, Boolean isReference = true) - { - Worksheet = worksheet; - DefaultStyleId = defaultStyleId; - IsReference = isReference; - } - - public Int32 DefaultStyleId { get; set; } - public XLWorksheet Worksheet { get; private set; } - public Boolean IsReference { get; private set; } - } +using System; + + +namespace ClosedXML.Excel +{ + internal class XLRowParameters + { + public XLRowParameters(XLWorksheet worksheet, Int32 defaultStyleId, Boolean isReference = true) + { + Worksheet = worksheet; + DefaultStyleId = defaultStyleId; + IsReference = isReference; + } + + public Int32 DefaultStyleId { get; set; } + public XLWorksheet Worksheet { get; private set; } + public Boolean IsReference { get; private set; } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Rows/XLRows.cs b/ClosedXML/Excel/Rows/XLRows.cs index 728395c..f44cb48 100644 --- a/ClosedXML/Excel/Rows/XLRows.cs +++ b/ClosedXML/Excel/Rows/XLRows.cs @@ -1,278 +1,278 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - using System.Collections; - - internal class XLRows : IXLRows, IXLStylized - { - public Boolean StyleChanged { get; set; } - private readonly List _rows = new List(); - private readonly XLWorksheet _worksheet; - internal IXLStyle style; - - public XLRows(XLWorksheet worksheet) - { - _worksheet = worksheet; - style = new XLStyle(this, XLWorkbook.DefaultStyle); - } - - #region IXLRows Members - - public IEnumerator GetEnumerator() - { - return _rows.Cast().OrderBy(r=>r.RowNumber()).GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IXLStyle Style - { - get { return style; } - set - { - style = new XLStyle(this, value); - - if (_worksheet != null) - _worksheet.Style = value; - else - { - foreach (XLRow row in _rows) - row.Style = value; - } - } - } - - public double Height - { - set - { - _rows.ForEach(c => c.Height = value); - if (_worksheet == null) return; - _worksheet.RowHeight = value; - _worksheet.Internals.RowsCollection.ForEach(r => r.Value.Height = value); - } - } - - public void Delete() - { - if (_worksheet != null) - { - _worksheet.Internals.RowsCollection.Clear(); - _worksheet.Internals.CellsCollection.Clear(); - } - else - { - var toDelete = new Dictionary>(); - foreach (XLRow r in _rows) - { - if (!toDelete.ContainsKey(r.Worksheet)) - toDelete.Add(r.Worksheet, new List()); - - toDelete[r.Worksheet].Add(r.RowNumber()); - } - - foreach (KeyValuePair> kp in toDelete) - { - foreach (int r in kp.Value.OrderByDescending(r => r)) - kp.Key.Row(r).Delete(); - } - } - } - - public IXLRows AdjustToContents() - { - _rows.ForEach(r => r.AdjustToContents()); - return this; - } - - public IXLRows AdjustToContents(Int32 startColumn) - { - _rows.ForEach(r => r.AdjustToContents(startColumn)); - return this; - } - - public IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn) - { - _rows.ForEach(r => r.AdjustToContents(startColumn, endColumn)); - return this; - } - - public IXLRows AdjustToContents(Double minHeight, Double maxHeight) - { - _rows.ForEach(r => r.AdjustToContents(minHeight, maxHeight)); - return this; - } - - public IXLRows AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight) - { - _rows.ForEach(r => r.AdjustToContents(startColumn, minHeight, maxHeight)); - return this; - } - - public IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight) - { - _rows.ForEach(r => r.AdjustToContents(startColumn, endColumn, minHeight, maxHeight)); - return this; - } - - - public void Hide() - { - _rows.ForEach(r => r.Hide()); - } - - public void Unhide() - { - _rows.ForEach(r => r.Unhide()); - } - - public void Group() - { - Group(false); - } - - public void Group(Int32 outlineLevel) - { - Group(outlineLevel, false); - } - - public void Ungroup() - { - Ungroup(false); - } - - public void Group(Boolean collapse) - { - _rows.ForEach(r => r.Group(collapse)); - } - - public void Group(Int32 outlineLevel, Boolean collapse) - { - _rows.ForEach(r => r.Group(outlineLevel, collapse)); - } - - public void Ungroup(Boolean ungroupFromAll) - { - _rows.ForEach(r => r.Ungroup(ungroupFromAll)); - } - - public void Collapse() - { - _rows.ForEach(r => r.Collapse()); - } - - public void Expand() - { - _rows.ForEach(r => r.Expand()); - } - - public IXLCells Cells() - { - var cells = new XLCells(false, false); - foreach (XLRow container in _rows) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed() - { - var cells = new XLCells(true, false); - foreach (XLRow container in _rows) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed(Boolean includeFormats) - { - var cells = new XLCells(true, includeFormats); - foreach (XLRow container in _rows) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLRows AddHorizontalPageBreaks() - { - foreach (XLRow row in _rows) - row.Worksheet.PageSetup.AddHorizontalPageBreak(row.RowNumber()); - return this; - } - - public IXLRows SetDataType(XLCellValues dataType) - { - _rows.ForEach(c => c.DataType = dataType); - return this; - } - - #endregion - - #region IXLStylized Members - - public IEnumerable Styles - { - get - { - UpdatingStyle = true; - yield return style; - if (_worksheet != null) - yield return _worksheet.Style; - else - { - foreach (IXLStyle s in _rows.SelectMany(row => row.Styles)) - { - yield return s; - } - } - UpdatingStyle = false; - } - } - - public Boolean UpdatingStyle { get; set; } - - public IXLStyle InnerStyle - { - get { return style; } - set { style = new XLStyle(this, value); } - } - - public IXLRanges RangesUsed - { - get - { - var retVal = new XLRanges(); - this.ForEach(c => retVal.Add(c.AsRange())); - return retVal; - } - } - - #endregion - - public void Add(XLRow row) - { - _rows.Add(row); - } - - public IXLRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - _rows.ForEach(c => c.Clear(clearOptions)); - return this; - } - - public void Dispose() - { - if (_rows != null) - _rows.ForEach(r => r.Dispose()); - } - - public void Select() - { - foreach (var range in this) - range.Select(); - } - } +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLRows : IXLRows, IXLStylized + { + public Boolean StyleChanged { get; set; } + private readonly List _rows = new List(); + private readonly XLWorksheet _worksheet; + internal IXLStyle style; + + public XLRows(XLWorksheet worksheet) + { + _worksheet = worksheet; + style = new XLStyle(this, XLWorkbook.DefaultStyle); + } + + #region IXLRows Members + + public IEnumerator GetEnumerator() + { + return _rows.Cast().OrderBy(r=>r.RowNumber()).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLStyle Style + { + get { return style; } + set + { + style = new XLStyle(this, value); + + if (_worksheet != null) + _worksheet.Style = value; + else + { + foreach (XLRow row in _rows) + row.Style = value; + } + } + } + + public double Height + { + set + { + _rows.ForEach(c => c.Height = value); + if (_worksheet == null) return; + _worksheet.RowHeight = value; + _worksheet.Internals.RowsCollection.ForEach(r => r.Value.Height = value); + } + } + + public void Delete() + { + if (_worksheet != null) + { + _worksheet.Internals.RowsCollection.Clear(); + _worksheet.Internals.CellsCollection.Clear(); + } + else + { + var toDelete = new Dictionary>(); + foreach (XLRow r in _rows) + { + if (!toDelete.ContainsKey(r.Worksheet)) + toDelete.Add(r.Worksheet, new List()); + + toDelete[r.Worksheet].Add(r.RowNumber()); + } + + foreach (KeyValuePair> kp in toDelete) + { + foreach (int r in kp.Value.OrderByDescending(r => r)) + kp.Key.Row(r).Delete(); + } + } + } + + public IXLRows AdjustToContents() + { + _rows.ForEach(r => r.AdjustToContents()); + return this; + } + + public IXLRows AdjustToContents(Int32 startColumn) + { + _rows.ForEach(r => r.AdjustToContents(startColumn)); + return this; + } + + public IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn) + { + _rows.ForEach(r => r.AdjustToContents(startColumn, endColumn)); + return this; + } + + public IXLRows AdjustToContents(Double minHeight, Double maxHeight) + { + _rows.ForEach(r => r.AdjustToContents(minHeight, maxHeight)); + return this; + } + + public IXLRows AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight) + { + _rows.ForEach(r => r.AdjustToContents(startColumn, minHeight, maxHeight)); + return this; + } + + public IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight) + { + _rows.ForEach(r => r.AdjustToContents(startColumn, endColumn, minHeight, maxHeight)); + return this; + } + + + public void Hide() + { + _rows.ForEach(r => r.Hide()); + } + + public void Unhide() + { + _rows.ForEach(r => r.Unhide()); + } + + public void Group() + { + Group(false); + } + + public void Group(Int32 outlineLevel) + { + Group(outlineLevel, false); + } + + public void Ungroup() + { + Ungroup(false); + } + + public void Group(Boolean collapse) + { + _rows.ForEach(r => r.Group(collapse)); + } + + public void Group(Int32 outlineLevel, Boolean collapse) + { + _rows.ForEach(r => r.Group(outlineLevel, collapse)); + } + + public void Ungroup(Boolean ungroupFromAll) + { + _rows.ForEach(r => r.Ungroup(ungroupFromAll)); + } + + public void Collapse() + { + _rows.ForEach(r => r.Collapse()); + } + + public void Expand() + { + _rows.ForEach(r => r.Expand()); + } + + public IXLCells Cells() + { + var cells = new XLCells(false, false); + foreach (XLRow container in _rows) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(true, false); + foreach (XLRow container in _rows) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed(Boolean includeFormats) + { + var cells = new XLCells(true, includeFormats); + foreach (XLRow container in _rows) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLRows AddHorizontalPageBreaks() + { + foreach (XLRow row in _rows) + row.Worksheet.PageSetup.AddHorizontalPageBreak(row.RowNumber()); + return this; + } + + public IXLRows SetDataType(XLCellValues dataType) + { + _rows.ForEach(c => c.DataType = dataType); + return this; + } + + #endregion + + #region IXLStylized Members + + public IEnumerable Styles + { + get + { + UpdatingStyle = true; + yield return style; + if (_worksheet != null) + yield return _worksheet.Style; + else + { + foreach (IXLStyle s in _rows.SelectMany(row => row.Styles)) + { + yield return s; + } + } + UpdatingStyle = false; + } + } + + public Boolean UpdatingStyle { get; set; } + + public IXLStyle InnerStyle + { + get { return style; } + set { style = new XLStyle(this, value); } + } + + public IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion + + public void Add(XLRow row) + { + _rows.Add(row); + } + + public IXLRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + _rows.ForEach(c => c.Clear(clearOptions)); + return this; + } + + public void Dispose() + { + if (_rows != null) + _rows.ForEach(r => r.Dispose()); + } + + public void Select() + { + foreach (var range in this) + range.Select(); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Style/Colors/XLColor_Internal.cs b/ClosedXML/Excel/Style/Colors/XLColor_Internal.cs index 003742c..a5aeafc 100644 --- a/ClosedXML/Excel/Style/Colors/XLColor_Internal.cs +++ b/ClosedXML/Excel/Style/Colors/XLColor_Internal.cs @@ -1,68 +1,68 @@ -using System; -using System.Drawing; - -namespace ClosedXML.Excel -{ - public partial class XLColor - { - private XLColor(XLColor defaultColor) - { - var dColor = defaultColor; - if (dColor._colorType == XLColorType.Color) - _color = dColor._color; - else if (dColor._colorType == XLColorType.Theme) - { - _themeColor = dColor._themeColor; - _themeTint = dColor._themeTint; - } - else - { - _indexed = dColor._indexed; - } - - HasValue = true; - _hashCode = dColor._hashCode; - _colorType = dColor._colorType; - } - - private XLColor() - { - HasValue = false; - _hashCode = 0; - } - - private XLColor(Color color) - { - _color = color; - _hashCode = 13 ^ color.ToArgb(); - HasValue = true; - _colorType = XLColorType.Color; - } - - private XLColor(Int32 index) - { - _indexed = index; - _hashCode = 11 ^ _indexed; - HasValue = true; - _colorType = XLColorType.Indexed; - } - - private XLColor(XLThemeColor themeColor) - { - _themeColor = themeColor; - _themeTint = 0; - _hashCode = 7 ^ _themeColor.GetHashCode() ^ _themeTint.GetHashCode(); - HasValue = true; - _colorType = XLColorType.Theme; - } - - private XLColor(XLThemeColor themeColor, Double themeTint) - { - _themeColor = themeColor; - _themeTint = themeTint; - _hashCode = 7 ^ _themeColor.GetHashCode() ^ _themeTint.GetHashCode(); - HasValue = true; - _colorType = XLColorType.Theme; - } - } +using System; +using System.Drawing; + +namespace ClosedXML.Excel +{ + public partial class XLColor + { + private XLColor(XLColor defaultColor) + { + var dColor = defaultColor; + if (dColor._colorType == XLColorType.Color) + _color = dColor._color; + else if (dColor._colorType == XLColorType.Theme) + { + _themeColor = dColor._themeColor; + _themeTint = dColor._themeTint; + } + else + { + _indexed = dColor._indexed; + } + + HasValue = true; + _hashCode = dColor._hashCode; + _colorType = dColor._colorType; + } + + private XLColor() + { + HasValue = false; + _hashCode = 0; + } + + private XLColor(Color color) + { + _color = color; + _hashCode = 13 ^ color.ToArgb(); + HasValue = true; + _colorType = XLColorType.Color; + } + + private XLColor(Int32 index) + { + _indexed = index; + _hashCode = 11 ^ _indexed; + HasValue = true; + _colorType = XLColorType.Indexed; + } + + private XLColor(XLThemeColor themeColor) + { + _themeColor = themeColor; + _themeTint = 0; + _hashCode = 7 ^ _themeColor.GetHashCode() ^ _themeTint.GetHashCode(); + HasValue = true; + _colorType = XLColorType.Theme; + } + + private XLColor(XLThemeColor themeColor, Double themeTint) + { + _themeColor = themeColor; + _themeTint = themeTint; + _hashCode = 7 ^ _themeColor.GetHashCode() ^ _themeTint.GetHashCode(); + HasValue = true; + _colorType = XLColorType.Theme; + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Style/Colors/XLColor_Public.cs b/ClosedXML/Excel/Style/Colors/XLColor_Public.cs index 7dcd8e4..8213608 100644 --- a/ClosedXML/Excel/Style/Colors/XLColor_Public.cs +++ b/ClosedXML/Excel/Style/Colors/XLColor_Public.cs @@ -1,173 +1,173 @@ -using System; -using System.Drawing; - -namespace ClosedXML.Excel -{ - public enum XLColorType - { - Color, - Theme, - Indexed - } - - public enum XLThemeColor - { - Background1, - Text1, - Background2, - Text2, - Accent1, - Accent2, - Accent3, - Accent4, - Accent5, - Accent6, - Hyperlink, - FollowedHyperlink - } - - public partial class XLColor : IEquatable - { - private readonly XLColorType _colorType; - private int _hashCode; - private readonly Int32 _indexed; - private readonly XLThemeColor _themeColor; - private readonly Double _themeTint; - - private Color _color; - public Boolean HasValue { get; private set; } - - public XLColorType ColorType - { - get { return _colorType; } - } - - public Color Color - { - get - { - if (_colorType == XLColorType.Theme) - throw new Exception("Cannot convert theme color to Color."); - - if (_colorType == XLColorType.Indexed) - return IndexedColors[_indexed].Color; - - return _color; - } - } - - public Int32 Indexed - { - get - { - if (ColorType == XLColorType.Theme) - throw new Exception("Cannot convert theme color to indexed color."); - - if (ColorType == XLColorType.Indexed) - return _indexed; - - throw new Exception("Cannot convert Color to indexed color."); - } - } - - public XLThemeColor ThemeColor - { - get - { - if (ColorType == XLColorType.Theme) - return _themeColor; - - if (ColorType == XLColorType.Indexed) - throw new Exception("Cannot convert indexed color to theme color."); - - throw new Exception("Cannot convert Color to theme color."); - } - } - - public Double ThemeTint - { - get - { - if (ColorType == XLColorType.Theme) - return _themeTint; - - if (ColorType == XLColorType.Indexed) - throw new Exception("Cannot extract theme tint from an indexed color."); - - return _color.A/255.0; - } - } - - #region IEquatable Members - - public bool Equals(XLColor other) - { - if (_colorType == other._colorType) - { - if (_colorType == XLColorType.Color) - { - // .NET Color.Equals() will return false for Color.FromArgb(255, 255, 255, 255) == Color.White - // Therefore we compare the ToArgb() values - return _color.ToArgb() == other._color.ToArgb(); - } - if (_colorType == XLColorType.Theme) - { - return _themeColor == other._themeColor - && Math.Abs(_themeTint - other._themeTint) < XLHelper.Epsilon; - } - return _indexed == other._indexed; - } - - return false; - } - - #endregion - - public override bool Equals(object obj) - { - return Equals((XLColor) obj); - } - - public override int GetHashCode() - { - if (_hashCode == 0) - { - if (_colorType == XLColorType.Color) - _hashCode = _color.GetHashCode(); - else if (_colorType == XLColorType.Theme) - _hashCode = _themeColor.GetHashCode() ^ _themeTint.GetHashCode(); - else - _hashCode = _indexed; - } - - return _hashCode; - } - - public override string ToString() - { - if (_colorType == XLColorType.Color) - return Color.ToHex(); - - if (_colorType == XLColorType.Theme) - return String.Format("Color Theme: {0}, Tint: {1}", _themeColor.ToString(), _themeTint.ToString()); - - return "Color Index: " + _indexed; - } - - public static Boolean operator ==(XLColor left, XLColor right) - { - // If both are null, or both are same instance, return true. - if (ReferenceEquals(left, right)) return true; - - // If one is null, but not both, return false. - if ((left as object) == null || (right as Object) == null) return false; - - return left.Equals(right); - } - - public static Boolean operator !=(XLColor left, XLColor right) - { - return !(left == right); - } - } +using System; +using System.Drawing; + +namespace ClosedXML.Excel +{ + public enum XLColorType + { + Color, + Theme, + Indexed + } + + public enum XLThemeColor + { + Background1, + Text1, + Background2, + Text2, + Accent1, + Accent2, + Accent3, + Accent4, + Accent5, + Accent6, + Hyperlink, + FollowedHyperlink + } + + public partial class XLColor : IEquatable + { + private readonly XLColorType _colorType; + private int _hashCode; + private readonly Int32 _indexed; + private readonly XLThemeColor _themeColor; + private readonly Double _themeTint; + + private Color _color; + public Boolean HasValue { get; private set; } + + public XLColorType ColorType + { + get { return _colorType; } + } + + public Color Color + { + get + { + if (_colorType == XLColorType.Theme) + throw new Exception("Cannot convert theme color to Color."); + + if (_colorType == XLColorType.Indexed) + return IndexedColors[_indexed].Color; + + return _color; + } + } + + public Int32 Indexed + { + get + { + if (ColorType == XLColorType.Theme) + throw new Exception("Cannot convert theme color to indexed color."); + + if (ColorType == XLColorType.Indexed) + return _indexed; + + throw new Exception("Cannot convert Color to indexed color."); + } + } + + public XLThemeColor ThemeColor + { + get + { + if (ColorType == XLColorType.Theme) + return _themeColor; + + if (ColorType == XLColorType.Indexed) + throw new Exception("Cannot convert indexed color to theme color."); + + throw new Exception("Cannot convert Color to theme color."); + } + } + + public Double ThemeTint + { + get + { + if (ColorType == XLColorType.Theme) + return _themeTint; + + if (ColorType == XLColorType.Indexed) + throw new Exception("Cannot extract theme tint from an indexed color."); + + return _color.A/255.0; + } + } + + #region IEquatable Members + + public bool Equals(XLColor other) + { + if (_colorType == other._colorType) + { + if (_colorType == XLColorType.Color) + { + // .NET Color.Equals() will return false for Color.FromArgb(255, 255, 255, 255) == Color.White + // Therefore we compare the ToArgb() values + return _color.ToArgb() == other._color.ToArgb(); + } + if (_colorType == XLColorType.Theme) + { + return _themeColor == other._themeColor + && Math.Abs(_themeTint - other._themeTint) < XLHelper.Epsilon; + } + return _indexed == other._indexed; + } + + return false; + } + + #endregion + + public override bool Equals(object obj) + { + return Equals((XLColor) obj); + } + + public override int GetHashCode() + { + if (_hashCode == 0) + { + if (_colorType == XLColorType.Color) + _hashCode = _color.GetHashCode(); + else if (_colorType == XLColorType.Theme) + _hashCode = _themeColor.GetHashCode() ^ _themeTint.GetHashCode(); + else + _hashCode = _indexed; + } + + return _hashCode; + } + + public override string ToString() + { + if (_colorType == XLColorType.Color) + return Color.ToHex(); + + if (_colorType == XLColorType.Theme) + return String.Format("Color Theme: {0}, Tint: {1}", _themeColor.ToString(), _themeTint.ToString()); + + return "Color Index: " + _indexed; + } + + public static Boolean operator ==(XLColor left, XLColor right) + { + // If both are null, or both are same instance, return true. + if (ReferenceEquals(left, right)) return true; + + // If one is null, but not both, return false. + if ((left as object) == null || (right as Object) == null) return false; + + return left.Equals(right); + } + + public static Boolean operator !=(XLColor left, XLColor right) + { + return !(left == right); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Style/Colors/XLColor_Static.cs b/ClosedXML/Excel/Style/Colors/XLColor_Static.cs index d66e191..bfeb90f 100644 --- a/ClosedXML/Excel/Style/Colors/XLColor_Static.cs +++ b/ClosedXML/Excel/Style/Colors/XLColor_Static.cs @@ -1,934 +1,934 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using DocumentFormat.OpenXml.Presentation; - -namespace ClosedXML.Excel -{ - public partial class XLColor - { - private static readonly Dictionary ByColor = new Dictionary(); - private static readonly Object ByColorLock = new Object(); - - public static XLColor FromColor(Color color) - { - XLColor ret; - lock (ByColorLock) - { - if (!ByColor.TryGetValue(color, out ret)) - { - ret = new XLColor(color); - ByColor.Add(color, ret); - } - } - return ret; - } - - public static XLColor FromArgb(Int32 argb) - { - return FromColor(Color.FromArgb(argb)); - } - public static XLColor FromArgb(Int32 r, Int32 g, Int32 b) - { - return FromColor(Color.FromArgb(r, g, b)); - } - public static XLColor FromArgb(Int32 a, Int32 r, Int32 g, Int32 b) - { - return FromColor(Color.FromArgb(a, r, g, b)); - } - public static XLColor FromKnownColor(KnownColor color) - { - return FromColor(Color.FromKnownColor(color)); - } - public static XLColor FromName(String name) - { - return FromColor(Color.FromName(name)); - } - public static XLColor FromHtml(String htmlColor) - { - return FromColor(ColorTranslator.FromHtml(htmlColor)); - } - - private static readonly Dictionary ByIndex = new Dictionary(); - private static readonly Object ByIndexLock = new Object(); - - public static XLColor FromIndex(Int32 index) - { - XLColor ret; - lock (ByIndexLock) - { - if (!ByIndex.TryGetValue(index, out ret)) - { - ret = new XLColor(index); - ByIndex.Add(index, ret); - } - } - return ret; - } - - private static readonly Dictionary ByTheme = new Dictionary(); - private static readonly Object ByThemeLock = new Object(); - - public static XLColor FromTheme(XLThemeColor themeColor) - { - XLColor ret; - lock (ByThemeLock) - { - if (!ByTheme.TryGetValue(themeColor, out ret)) - { - ret = new XLColor(themeColor); - ByTheme.Add(themeColor, ret); - } - } - return ret; - } - - private static readonly Dictionary> ByThemeTint = new Dictionary>(); - private static readonly Object ByThemeTintLock = new Object(); - - public static XLColor FromTheme(XLThemeColor themeColor, Double themeTint) - { - XLColor ret; - lock (ByThemeTintLock) - { - Dictionary themeTints; - if (ByThemeTint.TryGetValue(themeColor, out themeTints)) - { - if (!themeTints.TryGetValue(themeTint, out ret)) - { - ret = new XLColor(themeColor, themeTint); - themeTints.Add(themeTint, ret); - } - } - else - { - themeTints = new Dictionary(); - ret = new XLColor(themeColor, themeTint); - themeTints.Add(themeTint, ret); - - ByThemeTint.Add(themeColor, themeTints); - } - } - return ret; - } - - private static Dictionary _indexedColors; - public static Dictionary IndexedColors - { - get - { - if (_indexedColors == null) - { - var retVal = new Dictionary - { - {0, FromHtml("#FF000000")}, - {1, FromHtml("#FFFFFFFF")}, - {2, FromHtml("#FFFF0000")}, - {3, FromHtml("#FF00FF00")}, - {4, FromHtml("#FF0000FF")}, - {5, FromHtml("#FFFFFF00")}, - {6, FromHtml("#FFFF00FF")}, - {7, FromHtml("#FF00FFFF")}, - {8, FromHtml("#FF000000")}, - {9, FromHtml("#FFFFFFFF")}, - {10, FromHtml("#FFFF0000")}, - {11, FromHtml("#FF00FF00")}, - {12, FromHtml("#FF0000FF")}, - {13, FromHtml("#FFFFFF00")}, - {14, FromHtml("#FFFF00FF")}, - {15, FromHtml("#FF00FFFF")}, - {16, FromHtml("#FF800000")}, - {17, FromHtml("#FF008000")}, - {18, FromHtml("#FF000080")}, - {19, FromHtml("#FF808000")}, - {20, FromHtml("#FF800080")}, - {21, FromHtml("#FF008080")}, - {22, FromHtml("#FFC0C0C0")}, - {23, FromHtml("#FF808080")}, - {24, FromHtml("#FF9999FF")}, - {25, FromHtml("#FF993366")}, - {26, FromHtml("#FFFFFFCC")}, - {27, FromHtml("#FFCCFFFF")}, - {28, FromHtml("#FF660066")}, - {29, FromHtml("#FFFF8080")}, - {30, FromHtml("#FF0066CC")}, - {31, FromHtml("#FFCCCCFF")}, - {32, FromHtml("#FF000080")}, - {33, FromHtml("#FFFF00FF")}, - {34, FromHtml("#FFFFFF00")}, - {35, FromHtml("#FF00FFFF")}, - {36, FromHtml("#FF800080")}, - {37, FromHtml("#FF800000")}, - {38, FromHtml("#FF008080")}, - {39, FromHtml("#FF0000FF")}, - {40, FromHtml("#FF00CCFF")}, - {41, FromHtml("#FFCCFFFF")}, - {42, FromHtml("#FFCCFFCC")}, - {43, FromHtml("#FFFFFF99")}, - {44, FromHtml("#FF99CCFF")}, - {45, FromHtml("#FFFF99CC")}, - {46, FromHtml("#FFCC99FF")}, - {47, FromHtml("#FFFFCC99")}, - {48, FromHtml("#FF3366FF")}, - {49, FromHtml("#FF33CCCC")}, - {50, FromHtml("#FF99CC00")}, - {51, FromHtml("#FFFFCC00")}, - {52, FromHtml("#FFFF9900")}, - {53, FromHtml("#FFFF6600")}, - {54, FromHtml("#FF666699")}, - {55, FromHtml("#FF969696")}, - {56, FromHtml("#FF003366")}, - {57, FromHtml("#FF339966")}, - {58, FromHtml("#FF003300")}, - {59, FromHtml("#FF333300")}, - {60, FromHtml("#FF993300")}, - {61, FromHtml("#FF993366")}, - {62, FromHtml("#FF333399")}, - {63, FromHtml("#FF333333")}, - {64, FromColor(Color.Transparent)} - }; - _indexedColors = retVal; - } - return _indexedColors; - } - } - - private static XLColor noColor = new XLColor(); - public static XLColor NoColor { get { return noColor; } } - - public static XLColor AliceBlue { get { return FromColor(Color.AliceBlue); } } - public static XLColor AntiqueWhite { get { return FromColor(Color.AntiqueWhite); } } - public static XLColor Aqua { get { return FromColor(Color.Aqua); } } - public static XLColor Aquamarine { get { return FromColor(Color.Aquamarine); } } - public static XLColor Azure { get { return FromColor(Color.Azure); } } - public static XLColor Beige { get { return FromColor(Color.Beige); } } - public static XLColor Bisque { get { return FromColor(Color.Bisque); } } - public static XLColor Black { get { return FromColor(Color.Black); } } - public static XLColor BlanchedAlmond { get { return FromColor(Color.BlanchedAlmond); } } - public static XLColor Blue { get { return FromColor(Color.Blue); } } - public static XLColor BlueViolet { get { return FromColor(Color.BlueViolet); } } - public static XLColor Brown { get { return FromColor(Color.Brown); } } - public static XLColor BurlyWood { get { return FromColor(Color.BurlyWood); } } - public static XLColor CadetBlue { get { return FromColor(Color.CadetBlue); } } - public static XLColor Chartreuse { get { return FromColor(Color.Chartreuse); } } - public static XLColor Chocolate { get { return FromColor(Color.Chocolate); } } - public static XLColor Coral { get { return FromColor(Color.Coral); } } - public static XLColor CornflowerBlue { get { return FromColor(Color.CornflowerBlue); } } - public static XLColor Cornsilk { get { return FromColor(Color.Cornsilk); } } - public static XLColor Crimson { get { return FromColor(Color.Crimson); } } - public static XLColor Cyan { get { return FromColor(Color.Cyan); } } - public static XLColor DarkBlue { get { return FromColor(Color.DarkBlue); } } - public static XLColor DarkCyan { get { return FromColor(Color.DarkCyan); } } - public static XLColor DarkGoldenrod { get { return FromColor(Color.DarkGoldenrod); } } - public static XLColor DarkGray { get { return FromColor(Color.DarkGray); } } - public static XLColor DarkGreen { get { return FromColor(Color.DarkGreen); } } - public static XLColor DarkKhaki { get { return FromColor(Color.DarkKhaki); } } - public static XLColor DarkMagenta { get { return FromColor(Color.DarkMagenta); } } - public static XLColor DarkOliveGreen { get { return FromColor(Color.DarkOliveGreen); } } - public static XLColor DarkOrange { get { return FromColor(Color.DarkOrange); } } - public static XLColor DarkOrchid { get { return FromColor(Color.DarkOrchid); } } - public static XLColor DarkRed { get { return FromColor(Color.DarkRed); } } - public static XLColor DarkSalmon { get { return FromColor(Color.DarkSalmon); } } - public static XLColor DarkSeaGreen { get { return FromColor(Color.DarkSeaGreen); } } - public static XLColor DarkSlateBlue { get { return FromColor(Color.DarkSlateBlue); } } - public static XLColor DarkSlateGray { get { return FromColor(Color.DarkSlateGray); } } - public static XLColor DarkTurquoise { get { return FromColor(Color.DarkTurquoise); } } - public static XLColor DarkViolet { get { return FromColor(Color.DarkViolet); } } - public static XLColor DeepPink { get { return FromColor(Color.DeepPink); } } - public static XLColor DeepSkyBlue { get { return FromColor(Color.DeepSkyBlue); } } - public static XLColor DimGray { get { return FromColor(Color.DimGray); } } - public static XLColor DodgerBlue { get { return FromColor(Color.DodgerBlue); } } - public static XLColor Firebrick { get { return FromColor(Color.Firebrick); } } - public static XLColor FloralWhite { get { return FromColor(Color.FloralWhite); } } - public static XLColor ForestGreen { get { return FromColor(Color.ForestGreen); } } - public static XLColor Fuchsia { get { return FromColor(Color.Fuchsia); } } - public static XLColor Gainsboro { get { return FromColor(Color.Gainsboro); } } - public static XLColor GhostWhite { get { return FromColor(Color.GhostWhite); } } - public static XLColor Gold { get { return FromColor(Color.Gold); } } - public static XLColor Goldenrod { get { return FromColor(Color.Goldenrod); } } - public static XLColor Gray { get { return FromColor(Color.Gray); } } - public static XLColor Green { get { return FromColor(Color.Green); } } - public static XLColor GreenYellow { get { return FromColor(Color.GreenYellow); } } - public static XLColor Honeydew { get { return FromColor(Color.Honeydew); } } - public static XLColor HotPink { get { return FromColor(Color.HotPink); } } - public static XLColor IndianRed { get { return FromColor(Color.IndianRed); } } - public static XLColor Indigo { get { return FromColor(Color.Indigo); } } - public static XLColor Ivory { get { return FromColor(Color.Ivory); } } - public static XLColor Khaki { get { return FromColor(Color.Khaki); } } - public static XLColor Lavender { get { return FromColor(Color.Lavender); } } - public static XLColor LavenderBlush { get { return FromColor(Color.LavenderBlush); } } - public static XLColor LawnGreen { get { return FromColor(Color.LawnGreen); } } - public static XLColor LemonChiffon { get { return FromColor(Color.LemonChiffon); } } - public static XLColor LightBlue { get { return FromColor(Color.LightBlue); } } - public static XLColor LightCoral { get { return FromColor(Color.LightCoral); } } - public static XLColor LightCyan { get { return FromColor(Color.LightCyan); } } - public static XLColor LightGoldenrodYellow { get { return FromColor(Color.LightGoldenrodYellow); } } - public static XLColor LightGray { get { return FromColor(Color.LightGray); } } - public static XLColor LightGreen { get { return FromColor(Color.LightGreen); } } - public static XLColor LightPink { get { return FromColor(Color.LightPink); } } - public static XLColor LightSalmon { get { return FromColor(Color.LightSalmon); } } - public static XLColor LightSeaGreen { get { return FromColor(Color.LightSeaGreen); } } - public static XLColor LightSkyBlue { get { return FromColor(Color.LightSkyBlue); } } - public static XLColor LightSlateGray { get { return FromColor(Color.LightSlateGray); } } - public static XLColor LightSteelBlue { get { return FromColor(Color.LightSteelBlue); } } - public static XLColor LightYellow { get { return FromColor(Color.LightYellow); } } - public static XLColor Lime { get { return FromColor(Color.Lime); } } - public static XLColor LimeGreen { get { return FromColor(Color.LimeGreen); } } - public static XLColor Linen { get { return FromColor(Color.Linen); } } - public static XLColor Magenta { get { return FromColor(Color.Magenta); } } - public static XLColor Maroon { get { return FromColor(Color.Maroon); } } - public static XLColor MediumAquamarine { get { return FromColor(Color.MediumAquamarine); } } - public static XLColor MediumBlue { get { return FromColor(Color.MediumBlue); } } - public static XLColor MediumOrchid { get { return FromColor(Color.MediumOrchid); } } - public static XLColor MediumPurple { get { return FromColor(Color.MediumPurple); } } - public static XLColor MediumSeaGreen { get { return FromColor(Color.MediumSeaGreen); } } - public static XLColor MediumSlateBlue { get { return FromColor(Color.MediumSlateBlue); } } - public static XLColor MediumSpringGreen { get { return FromColor(Color.MediumSpringGreen); } } - public static XLColor MediumTurquoise { get { return FromColor(Color.MediumTurquoise); } } - public static XLColor MediumVioletRed { get { return FromColor(Color.MediumVioletRed); } } - public static XLColor MidnightBlue { get { return FromColor(Color.MidnightBlue); } } - public static XLColor MintCream { get { return FromColor(Color.MintCream); } } - public static XLColor MistyRose { get { return FromColor(Color.MistyRose); } } - public static XLColor Moccasin { get { return FromColor(Color.Moccasin); } } - public static XLColor NavajoWhite { get { return FromColor(Color.NavajoWhite); } } - public static XLColor Navy { get { return FromColor(Color.Navy); } } - public static XLColor OldLace { get { return FromColor(Color.OldLace); } } - public static XLColor Olive { get { return FromColor(Color.Olive); } } - public static XLColor OliveDrab { get { return FromColor(Color.OliveDrab); } } - public static XLColor Orange { get { return FromColor(Color.Orange); } } - public static XLColor OrangeRed { get { return FromColor(Color.OrangeRed); } } - public static XLColor Orchid { get { return FromColor(Color.Orchid); } } - public static XLColor PaleGoldenrod { get { return FromColor(Color.PaleGoldenrod); } } - public static XLColor PaleGreen { get { return FromColor(Color.PaleGreen); } } - public static XLColor PaleTurquoise { get { return FromColor(Color.PaleTurquoise); } } - public static XLColor PaleVioletRed { get { return FromColor(Color.PaleVioletRed); } } - public static XLColor PapayaWhip { get { return FromColor(Color.PapayaWhip); } } - public static XLColor PeachPuff { get { return FromColor(Color.PeachPuff); } } - public static XLColor Peru { get { return FromColor(Color.Peru); } } - public static XLColor Pink { get { return FromColor(Color.Pink); } } - public static XLColor Plum { get { return FromColor(Color.Plum); } } - public static XLColor PowderBlue { get { return FromColor(Color.PowderBlue); } } - public static XLColor Purple { get { return FromColor(Color.Purple); } } - public static XLColor Red { get { return FromColor(Color.Red); } } - public static XLColor RosyBrown { get { return FromColor(Color.RosyBrown); } } - public static XLColor RoyalBlue { get { return FromColor(Color.RoyalBlue); } } - public static XLColor SaddleBrown { get { return FromColor(Color.SaddleBrown); } } - public static XLColor Salmon { get { return FromColor(Color.Salmon); } } - public static XLColor SandyBrown { get { return FromColor(Color.SandyBrown); } } - public static XLColor SeaGreen { get { return FromColor(Color.SeaGreen); } } - public static XLColor SeaShell { get { return FromColor(Color.SeaShell); } } - public static XLColor Sienna { get { return FromColor(Color.Sienna); } } - public static XLColor Silver { get { return FromColor(Color.Silver); } } - public static XLColor SkyBlue { get { return FromColor(Color.SkyBlue); } } - public static XLColor SlateBlue { get { return FromColor(Color.SlateBlue); } } - public static XLColor SlateGray { get { return FromColor(Color.SlateGray); } } - public static XLColor Snow { get { return FromColor(Color.Snow); } } - public static XLColor SpringGreen { get { return FromColor(Color.SpringGreen); } } - public static XLColor SteelBlue { get { return FromColor(Color.SteelBlue); } } - public static XLColor Tan { get { return FromColor(Color.Tan); } } - public static XLColor Teal { get { return FromColor(Color.Teal); } } - public static XLColor Thistle { get { return FromColor(Color.Thistle); } } - public static XLColor Tomato { get { return FromColor(Color.Tomato); } } - public static XLColor Turquoise { get { return FromColor(Color.Turquoise); } } - public static XLColor Violet { get { return FromColor(Color.Violet); } } - public static XLColor Wheat { get { return FromColor(Color.Wheat); } } - public static XLColor White { get { return FromColor(Color.White); } } - public static XLColor WhiteSmoke { get { return FromColor(Color.WhiteSmoke); } } - public static XLColor Yellow { get { return FromColor(Color.Yellow); } } - public static XLColor YellowGreen { get { return FromColor(Color.YellowGreen); } } - public static XLColor AirForceBlue { get { return FromHtml("#FF5D8AA8"); } } - public static XLColor Alizarin { get { return FromHtml("#FFE32636"); } } - public static XLColor Almond { get { return FromHtml("#FFEFDECD"); } } - public static XLColor Amaranth { get { return FromHtml("#FFE52B50"); } } - public static XLColor Amber { get { return FromHtml("#FFFFBF00"); } } - public static XLColor AmberSaeEce { get { return FromHtml("#FFFF7E00"); } } - public static XLColor AmericanRose { get { return FromHtml("#FFFF033E"); } } - public static XLColor Amethyst { get { return FromHtml("#FF9966CC"); } } - public static XLColor AntiFlashWhite { get { return FromHtml("#FFF2F3F4"); } } - public static XLColor AntiqueBrass { get { return FromHtml("#FFCD9575"); } } - public static XLColor AntiqueFuchsia { get { return FromHtml("#FF915C83"); } } - public static XLColor AppleGreen { get { return FromHtml("#FF8DB600"); } } - public static XLColor Apricot { get { return FromHtml("#FFFBCEB1"); } } - public static XLColor Aquamarine1 { get { return FromHtml("#FF7FFFD0"); } } - public static XLColor ArmyGreen { get { return FromHtml("#FF4B5320"); } } - public static XLColor Arsenic { get { return FromHtml("#FF3B444B"); } } - public static XLColor ArylideYellow { get { return FromHtml("#FFE9D66B"); } } - public static XLColor AshGrey { get { return FromHtml("#FFB2BEB5"); } } - public static XLColor Asparagus { get { return FromHtml("#FF87A96B"); } } - public static XLColor AtomicTangerine { get { return FromHtml("#FFFF9966"); } } - public static XLColor Auburn { get { return FromHtml("#FF6D351A"); } } - public static XLColor Aureolin { get { return FromHtml("#FFFDEE00"); } } - public static XLColor Aurometalsaurus { get { return FromHtml("#FF6E7F80"); } } - public static XLColor Awesome { get { return FromHtml("#FFFF2052"); } } - public static XLColor AzureColorWheel { get { return FromHtml("#FF007FFF"); } } - public static XLColor BabyBlue { get { return FromHtml("#FF89CFF0"); } } - public static XLColor BabyBlueEyes { get { return FromHtml("#FFA1CAF1"); } } - public static XLColor BabyPink { get { return FromHtml("#FFF4C2C2"); } } - public static XLColor BallBlue { get { return FromHtml("#FF21ABCD"); } } - public static XLColor BananaMania { get { return FromHtml("#FFFAE7B5"); } } - public static XLColor BattleshipGrey { get { return FromHtml("#FF848482"); } } - public static XLColor Bazaar { get { return FromHtml("#FF98777B"); } } - public static XLColor BeauBlue { get { return FromHtml("#FFBCD4E6"); } } - public static XLColor Beaver { get { return FromHtml("#FF9F8170"); } } - public static XLColor Bistre { get { return FromHtml("#FF3D2B1F"); } } - public static XLColor Bittersweet { get { return FromHtml("#FFFE6F5E"); } } - public static XLColor BleuDeFrance { get { return FromHtml("#FF318CE7"); } } - public static XLColor BlizzardBlue { get { return FromHtml("#FFACE5EE"); } } - public static XLColor Blond { get { return FromHtml("#FFFAF0BE"); } } - public static XLColor BlueBell { get { return FromHtml("#FFA2A2D0"); } } - public static XLColor BlueGray { get { return FromHtml("#FF6699CC"); } } - public static XLColor BlueGreen { get { return FromHtml("#FF00DDDD"); } } - public static XLColor BluePigment { get { return FromHtml("#FF333399"); } } - public static XLColor BlueRyb { get { return FromHtml("#FF0247FE"); } } - public static XLColor Blush { get { return FromHtml("#FFDE5D83"); } } - public static XLColor Bole { get { return FromHtml("#FF79443B"); } } - public static XLColor BondiBlue { get { return FromHtml("#FF0095B6"); } } - public static XLColor BostonUniversityRed { get { return FromHtml("#FFCC0000"); } } - public static XLColor BrandeisBlue { get { return FromHtml("#FF0070FF"); } } - public static XLColor Brass { get { return FromHtml("#FFB5A642"); } } - public static XLColor BrickRed { get { return FromHtml("#FFCB4154"); } } - public static XLColor BrightCerulean { get { return FromHtml("#FF1DACD6"); } } - public static XLColor BrightGreen { get { return FromHtml("#FF66FF00"); } } - public static XLColor BrightLavender { get { return FromHtml("#FFBF94E4"); } } - public static XLColor BrightMaroon { get { return FromHtml("#FFC32148"); } } - public static XLColor BrightPink { get { return FromHtml("#FFFF007F"); } } - public static XLColor BrightTurquoise { get { return FromHtml("#FF08E8DE"); } } - public static XLColor BrightUbe { get { return FromHtml("#FFD19FE8"); } } - public static XLColor BrilliantLavender { get { return FromHtml("#FFF4BBFF"); } } - public static XLColor BrilliantRose { get { return FromHtml("#FFFF55A3"); } } - public static XLColor BrinkPink { get { return FromHtml("#FFFB607F"); } } - public static XLColor BritishRacingGreen { get { return FromHtml("#FF004225"); } } - public static XLColor Bronze { get { return FromHtml("#FFCD7F32"); } } - public static XLColor BrownTraditional { get { return FromHtml("#FF964B00"); } } - public static XLColor BubbleGum { get { return FromHtml("#FFFFC1CC"); } } - public static XLColor Bubbles { get { return FromHtml("#FFE7FEFF"); } } - public static XLColor Buff { get { return FromHtml("#FFF0DC82"); } } - public static XLColor BulgarianRose { get { return FromHtml("#FF480607"); } } - public static XLColor Burgundy { get { return FromHtml("#FF800020"); } } - public static XLColor BurntOrange { get { return FromHtml("#FFCC5500"); } } - public static XLColor BurntSienna { get { return FromHtml("#FFE97451"); } } - public static XLColor BurntUmber { get { return FromHtml("#FF8A3324"); } } - public static XLColor Byzantine { get { return FromHtml("#FFBD33A4"); } } - public static XLColor Byzantium { get { return FromHtml("#FF702963"); } } - public static XLColor Cadet { get { return FromHtml("#FF536872"); } } - public static XLColor CadetGrey { get { return FromHtml("#FF91A3B0"); } } - public static XLColor CadmiumGreen { get { return FromHtml("#FF006B3C"); } } - public static XLColor CadmiumOrange { get { return FromHtml("#FFED872D"); } } - public static XLColor CadmiumRed { get { return FromHtml("#FFE30022"); } } - public static XLColor CadmiumYellow { get { return FromHtml("#FFFFF600"); } } - public static XLColor CalPolyPomonaGreen { get { return FromHtml("#FF1E4D2B"); } } - public static XLColor CambridgeBlue { get { return FromHtml("#FFA3C1AD"); } } - public static XLColor Camel { get { return FromHtml("#FFC19A6B"); } } - public static XLColor CamouflageGreen { get { return FromHtml("#FF78866B"); } } - public static XLColor CanaryYellow { get { return FromHtml("#FFFFEF00"); } } - public static XLColor CandyAppleRed { get { return FromHtml("#FFFF0800"); } } - public static XLColor CandyPink { get { return FromHtml("#FFE4717A"); } } - public static XLColor CaputMortuum { get { return FromHtml("#FF592720"); } } - public static XLColor Cardinal { get { return FromHtml("#FFC41E3A"); } } - public static XLColor CaribbeanGreen { get { return FromHtml("#FF00CC99"); } } - public static XLColor Carmine { get { return FromHtml("#FF960018"); } } - public static XLColor CarminePink { get { return FromHtml("#FFEB4C42"); } } - public static XLColor CarmineRed { get { return FromHtml("#FFFF0038"); } } - public static XLColor CarnationPink { get { return FromHtml("#FFFFA6C9"); } } - public static XLColor Carnelian { get { return FromHtml("#FFB31B1B"); } } - public static XLColor CarolinaBlue { get { return FromHtml("#FF99BADD"); } } - public static XLColor CarrotOrange { get { return FromHtml("#FFED9121"); } } - public static XLColor Ceil { get { return FromHtml("#FF92A1CF"); } } - public static XLColor Celadon { get { return FromHtml("#FFACE1AF"); } } - public static XLColor CelestialBlue { get { return FromHtml("#FF4997D0"); } } - public static XLColor Cerise { get { return FromHtml("#FFDE3163"); } } - public static XLColor CerisePink { get { return FromHtml("#FFEC3B83"); } } - public static XLColor Cerulean { get { return FromHtml("#FF007BA7"); } } - public static XLColor CeruleanBlue { get { return FromHtml("#FF2A52BE"); } } - public static XLColor Chamoisee { get { return FromHtml("#FFA0785A"); } } - public static XLColor Champagne { get { return FromHtml("#FFF7E7CE"); } } - public static XLColor Charcoal { get { return FromHtml("#FF36454F"); } } - public static XLColor ChartreuseTraditional { get { return FromHtml("#FFDFFF00"); } } - public static XLColor CherryBlossomPink { get { return FromHtml("#FFFFB7C5"); } } - public static XLColor Chocolate1 { get { return FromHtml("#FF7B3F00"); } } - public static XLColor ChromeYellow { get { return FromHtml("#FFFFA700"); } } - public static XLColor Cinereous { get { return FromHtml("#FF98817B"); } } - public static XLColor Cinnabar { get { return FromHtml("#FFE34234"); } } - public static XLColor Citrine { get { return FromHtml("#FFE4D00A"); } } - public static XLColor ClassicRose { get { return FromHtml("#FFFBCCE7"); } } - public static XLColor Cobalt { get { return FromHtml("#FF0047AB"); } } - public static XLColor ColumbiaBlue { get { return FromHtml("#FF9BDDFF"); } } - public static XLColor CoolBlack { get { return FromHtml("#FF002E63"); } } - public static XLColor CoolGrey { get { return FromHtml("#FF8C92AC"); } } - public static XLColor Copper { get { return FromHtml("#FFB87333"); } } - public static XLColor CopperRose { get { return FromHtml("#FF996666"); } } - public static XLColor Coquelicot { get { return FromHtml("#FFFF3800"); } } - public static XLColor CoralPink { get { return FromHtml("#FFF88379"); } } - public static XLColor CoralRed { get { return FromHtml("#FFFF4040"); } } - public static XLColor Cordovan { get { return FromHtml("#FF893F45"); } } - public static XLColor Corn { get { return FromHtml("#FFFBEC5D"); } } - public static XLColor CornellRed { get { return FromHtml("#FFB31B1B"); } } - public static XLColor CosmicLatte { get { return FromHtml("#FFFFF8E7"); } } - public static XLColor CottonCandy { get { return FromHtml("#FFFFBCD9"); } } - public static XLColor Cream { get { return FromHtml("#FFFFFDD0"); } } - public static XLColor CrimsonGlory { get { return FromHtml("#FFBE0032"); } } - public static XLColor CyanProcess { get { return FromHtml("#FF00B7EB"); } } - public static XLColor Daffodil { get { return FromHtml("#FFFFFF31"); } } - public static XLColor Dandelion { get { return FromHtml("#FFF0E130"); } } - public static XLColor DarkBrown { get { return FromHtml("#FF654321"); } } - public static XLColor DarkByzantium { get { return FromHtml("#FF5D3954"); } } - public static XLColor DarkCandyAppleRed { get { return FromHtml("#FFA40000"); } } - public static XLColor DarkCerulean { get { return FromHtml("#FF08457E"); } } - public static XLColor DarkChampagne { get { return FromHtml("#FFC2B280"); } } - public static XLColor DarkChestnut { get { return FromHtml("#FF986960"); } } - public static XLColor DarkCoral { get { return FromHtml("#FFCD5B45"); } } - public static XLColor DarkElectricBlue { get { return FromHtml("#FF536878"); } } - public static XLColor DarkGreen1 { get { return FromHtml("#FF013220"); } } - public static XLColor DarkJungleGreen { get { return FromHtml("#FF1A2421"); } } - public static XLColor DarkLava { get { return FromHtml("#FF483C32"); } } - public static XLColor DarkLavender { get { return FromHtml("#FF734F96"); } } - public static XLColor DarkMidnightBlue { get { return FromHtml("#FF003366"); } } - public static XLColor DarkPastelBlue { get { return FromHtml("#FF779ECB"); } } - public static XLColor DarkPastelGreen { get { return FromHtml("#FF03C03C"); } } - public static XLColor DarkPastelPurple { get { return FromHtml("#FF966FD6"); } } - public static XLColor DarkPastelRed { get { return FromHtml("#FFC23B22"); } } - public static XLColor DarkPink { get { return FromHtml("#FFE75480"); } } - public static XLColor DarkPowderBlue { get { return FromHtml("#FF003399"); } } - public static XLColor DarkRaspberry { get { return FromHtml("#FF872657"); } } - public static XLColor DarkScarlet { get { return FromHtml("#FF560319"); } } - public static XLColor DarkSienna { get { return FromHtml("#FF3C1414"); } } - public static XLColor DarkSpringGreen { get { return FromHtml("#FF177245"); } } - public static XLColor DarkTan { get { return FromHtml("#FF918151"); } } - public static XLColor DarkTangerine { get { return FromHtml("#FFFFA812"); } } - public static XLColor DarkTaupe { get { return FromHtml("#FF483C32"); } } - public static XLColor DarkTerraCotta { get { return FromHtml("#FFCC4E5C"); } } - public static XLColor DartmouthGreen { get { return FromHtml("#FF00693E"); } } - public static XLColor DavysGrey { get { return FromHtml("#FF555555"); } } - public static XLColor DebianRed { get { return FromHtml("#FFD70A53"); } } - public static XLColor DeepCarmine { get { return FromHtml("#FFA9203E"); } } - public static XLColor DeepCarminePink { get { return FromHtml("#FFEF3038"); } } - public static XLColor DeepCarrotOrange { get { return FromHtml("#FFE9692C"); } } - public static XLColor DeepCerise { get { return FromHtml("#FFDA3287"); } } - public static XLColor DeepChampagne { get { return FromHtml("#FFFAD6A5"); } } - public static XLColor DeepChestnut { get { return FromHtml("#FFB94E48"); } } - public static XLColor DeepFuchsia { get { return FromHtml("#FFC154C1"); } } - public static XLColor DeepJungleGreen { get { return FromHtml("#FF004B49"); } } - public static XLColor DeepLilac { get { return FromHtml("#FF9955BB"); } } - public static XLColor DeepMagenta { get { return FromHtml("#FFCC00CC"); } } - public static XLColor DeepPeach { get { return FromHtml("#FFFFCBA4"); } } - public static XLColor DeepSaffron { get { return FromHtml("#FFFF9933"); } } - public static XLColor Denim { get { return FromHtml("#FF1560BD"); } } - public static XLColor Desert { get { return FromHtml("#FFC19A6B"); } } - public static XLColor DesertSand { get { return FromHtml("#FFEDC9AF"); } } - public static XLColor DogwoodRose { get { return FromHtml("#FFD71868"); } } - public static XLColor DollarBill { get { return FromHtml("#FF85BB65"); } } - public static XLColor Drab { get { return FromHtml("#FF967117"); } } - public static XLColor DukeBlue { get { return FromHtml("#FF00009C"); } } - public static XLColor EarthYellow { get { return FromHtml("#FFE1A95F"); } } - public static XLColor Ecru { get { return FromHtml("#FFC2B280"); } } - public static XLColor Eggplant { get { return FromHtml("#FF614051"); } } - public static XLColor Eggshell { get { return FromHtml("#FFF0EAD6"); } } - public static XLColor EgyptianBlue { get { return FromHtml("#FF1034A6"); } } - public static XLColor ElectricBlue { get { return FromHtml("#FF7DF9FF"); } } - public static XLColor ElectricCrimson { get { return FromHtml("#FFFF003F"); } } - public static XLColor ElectricIndigo { get { return FromHtml("#FF6F00FF"); } } - public static XLColor ElectricLavender { get { return FromHtml("#FFF4BBFF"); } } - public static XLColor ElectricLime { get { return FromHtml("#FFCCFF00"); } } - public static XLColor ElectricPurple { get { return FromHtml("#FFBF00FF"); } } - public static XLColor ElectricUltramarine { get { return FromHtml("#FF3F00FF"); } } - public static XLColor ElectricViolet { get { return FromHtml("#FF8F00FF"); } } - public static XLColor Emerald { get { return FromHtml("#FF50C878"); } } - public static XLColor EtonBlue { get { return FromHtml("#FF96C8A2"); } } - public static XLColor Fallow { get { return FromHtml("#FFC19A6B"); } } - public static XLColor FaluRed { get { return FromHtml("#FF801818"); } } - public static XLColor Fandango { get { return FromHtml("#FFB53389"); } } - public static XLColor FashionFuchsia { get { return FromHtml("#FFF400A1"); } } - public static XLColor Fawn { get { return FromHtml("#FFE5AA70"); } } - public static XLColor Feldgrau { get { return FromHtml("#FF4D5D53"); } } - public static XLColor FernGreen { get { return FromHtml("#FF4F7942"); } } - public static XLColor FerrariRed { get { return FromHtml("#FFFF2800"); } } - public static XLColor FieldDrab { get { return FromHtml("#FF6C541E"); } } - public static XLColor FireEngineRed { get { return FromHtml("#FFCE2029"); } } - public static XLColor Flame { get { return FromHtml("#FFE25822"); } } - public static XLColor FlamingoPink { get { return FromHtml("#FFFC8EAC"); } } - public static XLColor Flavescent { get { return FromHtml("#FFF7E98E"); } } - public static XLColor Flax { get { return FromHtml("#FFEEDC82"); } } - public static XLColor FluorescentOrange { get { return FromHtml("#FFFFBF00"); } } - public static XLColor FluorescentYellow { get { return FromHtml("#FFCCFF00"); } } - public static XLColor Folly { get { return FromHtml("#FFFF004F"); } } - public static XLColor ForestGreenTraditional { get { return FromHtml("#FF014421"); } } - public static XLColor FrenchBeige { get { return FromHtml("#FFA67B5B"); } } - public static XLColor FrenchBlue { get { return FromHtml("#FF0072BB"); } } - public static XLColor FrenchLilac { get { return FromHtml("#FF86608E"); } } - public static XLColor FrenchRose { get { return FromHtml("#FFF64A8A"); } } - public static XLColor FuchsiaPink { get { return FromHtml("#FFFF77FF"); } } - public static XLColor Fulvous { get { return FromHtml("#FFE48400"); } } - public static XLColor FuzzyWuzzy { get { return FromHtml("#FFCC6666"); } } - public static XLColor Gamboge { get { return FromHtml("#FFE49B0F"); } } - public static XLColor Ginger { get { return FromHtml("#FFF9F9FF"); } } - public static XLColor Glaucous { get { return FromHtml("#FF6082B6"); } } - public static XLColor GoldenBrown { get { return FromHtml("#FF996515"); } } - public static XLColor GoldenPoppy { get { return FromHtml("#FFFCC200"); } } - public static XLColor GoldenYellow { get { return FromHtml("#FFFFDF00"); } } - public static XLColor GoldMetallic { get { return FromHtml("#FFD4AF37"); } } - public static XLColor GrannySmithApple { get { return FromHtml("#FFA8E4A0"); } } - public static XLColor GrayAsparagus { get { return FromHtml("#FF465945"); } } - public static XLColor GreenPigment { get { return FromHtml("#FF00A550"); } } - public static XLColor GreenRyb { get { return FromHtml("#FF66B032"); } } - public static XLColor Grullo { get { return FromHtml("#FFA99A86"); } } - public static XLColor HalayaUbe { get { return FromHtml("#FF663854"); } } - public static XLColor HanBlue { get { return FromHtml("#FF446CCF"); } } - public static XLColor HanPurple { get { return FromHtml("#FF5218FA"); } } - public static XLColor HansaYellow { get { return FromHtml("#FFE9D66B"); } } - public static XLColor Harlequin { get { return FromHtml("#FF3FFF00"); } } - public static XLColor HarvardCrimson { get { return FromHtml("#FFC90016"); } } - public static XLColor HarvestGold { get { return FromHtml("#FFDA9100"); } } - public static XLColor Heliotrope { get { return FromHtml("#FFDF73FF"); } } - public static XLColor HollywoodCerise { get { return FromHtml("#FFF400A1"); } } - public static XLColor HookersGreen { get { return FromHtml("#FF007000"); } } - public static XLColor HotMagenta { get { return FromHtml("#FFFF1DCE"); } } - public static XLColor HunterGreen { get { return FromHtml("#FF355E3B"); } } - public static XLColor Iceberg { get { return FromHtml("#FF71A6D2"); } } - public static XLColor Icterine { get { return FromHtml("#FFFCF75E"); } } - public static XLColor Inchworm { get { return FromHtml("#FFB2EC5D"); } } - public static XLColor IndiaGreen { get { return FromHtml("#FF138808"); } } - public static XLColor IndianYellow { get { return FromHtml("#FFE3A857"); } } - public static XLColor IndigoDye { get { return FromHtml("#FF00416A"); } } - public static XLColor InternationalKleinBlue { get { return FromHtml("#FF002FA7"); } } - public static XLColor InternationalOrange { get { return FromHtml("#FFFF4F00"); } } - public static XLColor Iris { get { return FromHtml("#FF5A4FCF"); } } - public static XLColor Isabelline { get { return FromHtml("#FFF4F0EC"); } } - public static XLColor IslamicGreen { get { return FromHtml("#FF009000"); } } - public static XLColor Jade { get { return FromHtml("#FF00A86B"); } } - public static XLColor Jasper { get { return FromHtml("#FFD73B3E"); } } - public static XLColor JazzberryJam { get { return FromHtml("#FFA50B5E"); } } - public static XLColor Jonquil { get { return FromHtml("#FFFADA5E"); } } - public static XLColor JuneBud { get { return FromHtml("#FFBDDA57"); } } - public static XLColor JungleGreen { get { return FromHtml("#FF29AB87"); } } - public static XLColor KellyGreen { get { return FromHtml("#FF4CBB17"); } } - public static XLColor KhakiHtmlCssKhaki { get { return FromHtml("#FFC3B091"); } } - public static XLColor LanguidLavender { get { return FromHtml("#FFD6CADD"); } } - public static XLColor LapisLazuli { get { return FromHtml("#FF26619C"); } } - public static XLColor LaSalleGreen { get { return FromHtml("#FF087830"); } } - public static XLColor LaserLemon { get { return FromHtml("#FFFEFE22"); } } - public static XLColor Lava { get { return FromHtml("#FFCF1020"); } } - public static XLColor LavenderBlue { get { return FromHtml("#FFCCCCFF"); } } - public static XLColor LavenderFloral { get { return FromHtml("#FFB57EDC"); } } - public static XLColor LavenderGray { get { return FromHtml("#FFC4C3D0"); } } - public static XLColor LavenderIndigo { get { return FromHtml("#FF9457EB"); } } - public static XLColor LavenderPink { get { return FromHtml("#FFFBAED2"); } } - public static XLColor LavenderPurple { get { return FromHtml("#FF967BB6"); } } - public static XLColor LavenderRose { get { return FromHtml("#FFFBA0E3"); } } - public static XLColor Lemon { get { return FromHtml("#FFFFF700"); } } - public static XLColor LightApricot { get { return FromHtml("#FFFDD5B1"); } } - public static XLColor LightBrown { get { return FromHtml("#FFB5651D"); } } - public static XLColor LightCarminePink { get { return FromHtml("#FFE66771"); } } - public static XLColor LightCornflowerBlue { get { return FromHtml("#FF93CCEA"); } } - public static XLColor LightFuchsiaPink { get { return FromHtml("#FFF984EF"); } } - public static XLColor LightMauve { get { return FromHtml("#FFDCD0FF"); } } - public static XLColor LightPastelPurple { get { return FromHtml("#FFB19CD9"); } } - public static XLColor LightSalmonPink { get { return FromHtml("#FFFF9999"); } } - public static XLColor LightTaupe { get { return FromHtml("#FFB38B6D"); } } - public static XLColor LightThulianPink { get { return FromHtml("#FFE68FAC"); } } - public static XLColor LightYellow1 { get { return FromHtml("#FFFFFFED"); } } - public static XLColor Lilac { get { return FromHtml("#FFC8A2C8"); } } - public static XLColor LimeColorWheel { get { return FromHtml("#FFBFFF00"); } } - public static XLColor LincolnGreen { get { return FromHtml("#FF195905"); } } - public static XLColor Liver { get { return FromHtml("#FF534B4F"); } } - public static XLColor Lust { get { return FromHtml("#FFE62020"); } } - public static XLColor MacaroniAndCheese { get { return FromHtml("#FFFFBD88"); } } - public static XLColor MagentaDye { get { return FromHtml("#FFCA1F7B"); } } - public static XLColor MagentaProcess { get { return FromHtml("#FFFF0090"); } } - public static XLColor MagicMint { get { return FromHtml("#FFAAF0D1"); } } - public static XLColor Magnolia { get { return FromHtml("#FFF8F4FF"); } } - public static XLColor Mahogany { get { return FromHtml("#FFC04000"); } } - public static XLColor Maize { get { return FromHtml("#FFFBEC5D"); } } - public static XLColor MajorelleBlue { get { return FromHtml("#FF6050DC"); } } - public static XLColor Malachite { get { return FromHtml("#FF0BDA51"); } } - public static XLColor Manatee { get { return FromHtml("#FF979AAA"); } } - public static XLColor MangoTango { get { return FromHtml("#FFFF8243"); } } - public static XLColor MaroonX11 { get { return FromHtml("#FFB03060"); } } - public static XLColor Mauve { get { return FromHtml("#FFE0B0FF"); } } - public static XLColor Mauvelous { get { return FromHtml("#FFEF98AA"); } } - public static XLColor MauveTaupe { get { return FromHtml("#FF915F6D"); } } - public static XLColor MayaBlue { get { return FromHtml("#FF73C2FB"); } } - public static XLColor MeatBrown { get { return FromHtml("#FFE5B73B"); } } - public static XLColor MediumAquamarine1 { get { return FromHtml("#FF66DDAA"); } } - public static XLColor MediumCandyAppleRed { get { return FromHtml("#FFE2062C"); } } - public static XLColor MediumCarmine { get { return FromHtml("#FFAF4035"); } } - public static XLColor MediumChampagne { get { return FromHtml("#FFF3E5AB"); } } - public static XLColor MediumElectricBlue { get { return FromHtml("#FF035096"); } } - public static XLColor MediumJungleGreen { get { return FromHtml("#FF1C352D"); } } - public static XLColor MediumPersianBlue { get { return FromHtml("#FF0067A5"); } } - public static XLColor MediumRedViolet { get { return FromHtml("#FFBB3385"); } } - public static XLColor MediumSpringBud { get { return FromHtml("#FFC9DC87"); } } - public static XLColor MediumTaupe { get { return FromHtml("#FF674C47"); } } - public static XLColor Melon { get { return FromHtml("#FFFDBCB4"); } } - public static XLColor MidnightGreenEagleGreen { get { return FromHtml("#FF004953"); } } - public static XLColor MikadoYellow { get { return FromHtml("#FFFFC40C"); } } - public static XLColor Mint { get { return FromHtml("#FF3EB489"); } } - public static XLColor MintGreen { get { return FromHtml("#FF98FF98"); } } - public static XLColor ModeBeige { get { return FromHtml("#FF967117"); } } - public static XLColor MoonstoneBlue { get { return FromHtml("#FF73A9C2"); } } - public static XLColor MordantRed19 { get { return FromHtml("#FFAE0C00"); } } - public static XLColor MossGreen { get { return FromHtml("#FFADDFAD"); } } - public static XLColor MountainMeadow { get { return FromHtml("#FF30BA8F"); } } - public static XLColor MountbattenPink { get { return FromHtml("#FF997A8D"); } } - public static XLColor MsuGreen { get { return FromHtml("#FF18453B"); } } - public static XLColor Mulberry { get { return FromHtml("#FFC54B8C"); } } - public static XLColor Mustard { get { return FromHtml("#FFFFDB58"); } } - public static XLColor Myrtle { get { return FromHtml("#FF21421E"); } } - public static XLColor NadeshikoPink { get { return FromHtml("#FFF6ADC6"); } } - public static XLColor NapierGreen { get { return FromHtml("#FF2A8000"); } } - public static XLColor NaplesYellow { get { return FromHtml("#FFFADA5E"); } } - public static XLColor NeonCarrot { get { return FromHtml("#FFFFA343"); } } - public static XLColor NeonFuchsia { get { return FromHtml("#FFFE59C2"); } } - public static XLColor NeonGreen { get { return FromHtml("#FF39FF14"); } } - public static XLColor NonPhotoBlue { get { return FromHtml("#FFA4DDED"); } } - public static XLColor OceanBoatBlue { get { return FromHtml("#FFCC7422"); } } - public static XLColor Ochre { get { return FromHtml("#FFCC7722"); } } - public static XLColor OldGold { get { return FromHtml("#FFCFB53B"); } } - public static XLColor OldLavender { get { return FromHtml("#FF796878"); } } - public static XLColor OldMauve { get { return FromHtml("#FF673147"); } } - public static XLColor OldRose { get { return FromHtml("#FFC08081"); } } - public static XLColor OliveDrab7 { get { return FromHtml("#FF3C341F"); } } - public static XLColor Olivine { get { return FromHtml("#FF9AB973"); } } - public static XLColor Onyx { get { return FromHtml("#FF0F0F0F"); } } - public static XLColor OperaMauve { get { return FromHtml("#FFB784A7"); } } - public static XLColor OrangeColorWheel { get { return FromHtml("#FFFF7F00"); } } - public static XLColor OrangePeel { get { return FromHtml("#FFFF9F00"); } } - public static XLColor OrangeRyb { get { return FromHtml("#FFFB9902"); } } - public static XLColor OtterBrown { get { return FromHtml("#FF654321"); } } - public static XLColor OuCrimsonRed { get { return FromHtml("#FF990000"); } } - public static XLColor OuterSpace { get { return FromHtml("#FF414A4C"); } } - public static XLColor OutrageousOrange { get { return FromHtml("#FFFF6E4A"); } } - public static XLColor OxfordBlue { get { return FromHtml("#FF002147"); } } - public static XLColor PakistanGreen { get { return FromHtml("#FF00421B"); } } - public static XLColor PalatinateBlue { get { return FromHtml("#FF273BE2"); } } - public static XLColor PalatinatePurple { get { return FromHtml("#FF682860"); } } - public static XLColor PaleAqua { get { return FromHtml("#FFBCD4E6"); } } - public static XLColor PaleBrown { get { return FromHtml("#FF987654"); } } - public static XLColor PaleCarmine { get { return FromHtml("#FFAF4035"); } } - public static XLColor PaleCerulean { get { return FromHtml("#FF9BC4E2"); } } - public static XLColor PaleChestnut { get { return FromHtml("#FFDDADAF"); } } - public static XLColor PaleCopper { get { return FromHtml("#FFDA8A67"); } } - public static XLColor PaleCornflowerBlue { get { return FromHtml("#FFABCDEF"); } } - public static XLColor PaleGold { get { return FromHtml("#FFE6BE8A"); } } - public static XLColor PaleMagenta { get { return FromHtml("#FFF984E5"); } } - public static XLColor PalePink { get { return FromHtml("#FFFADADD"); } } - public static XLColor PaleRobinEggBlue { get { return FromHtml("#FF96DED1"); } } - public static XLColor PaleSilver { get { return FromHtml("#FFC9C0BB"); } } - public static XLColor PaleSpringBud { get { return FromHtml("#FFECEBBD"); } } - public static XLColor PaleTaupe { get { return FromHtml("#FFBC987E"); } } - public static XLColor PansyPurple { get { return FromHtml("#FF78184A"); } } - public static XLColor ParisGreen { get { return FromHtml("#FF50C878"); } } - public static XLColor PastelBlue { get { return FromHtml("#FFAEC6CF"); } } - public static XLColor PastelBrown { get { return FromHtml("#FF836953"); } } - public static XLColor PastelGray { get { return FromHtml("#FFCFCFC4"); } } - public static XLColor PastelGreen { get { return FromHtml("#FF77DD77"); } } - public static XLColor PastelMagenta { get { return FromHtml("#FFF49AC2"); } } - public static XLColor PastelOrange { get { return FromHtml("#FFFFB347"); } } - public static XLColor PastelPink { get { return FromHtml("#FFFFD1DC"); } } - public static XLColor PastelPurple { get { return FromHtml("#FFB39EB5"); } } - public static XLColor PastelRed { get { return FromHtml("#FFFF6961"); } } - public static XLColor PastelViolet { get { return FromHtml("#FFCB99C9"); } } - public static XLColor PastelYellow { get { return FromHtml("#FFFDFD96"); } } - public static XLColor PaynesGrey { get { return FromHtml("#FF40404F"); } } - public static XLColor Peach { get { return FromHtml("#FFFFE5B4"); } } - public static XLColor PeachOrange { get { return FromHtml("#FFFFCC99"); } } - public static XLColor PeachYellow { get { return FromHtml("#FFFADFAD"); } } - public static XLColor Pear { get { return FromHtml("#FFD1E231"); } } - public static XLColor Pearl { get { return FromHtml("#FFF0EAD6"); } } - public static XLColor Peridot { get { return FromHtml("#FFE6E200"); } } - public static XLColor Periwinkle { get { return FromHtml("#FFCCCCFF"); } } - public static XLColor PersianBlue { get { return FromHtml("#FF1C39BB"); } } - public static XLColor PersianGreen { get { return FromHtml("#FF00A693"); } } - public static XLColor PersianIndigo { get { return FromHtml("#FF32127A"); } } - public static XLColor PersianOrange { get { return FromHtml("#FFD99058"); } } - public static XLColor PersianPink { get { return FromHtml("#FFF77FBE"); } } - public static XLColor PersianPlum { get { return FromHtml("#FF701C1C"); } } - public static XLColor PersianRed { get { return FromHtml("#FFCC3333"); } } - public static XLColor PersianRose { get { return FromHtml("#FFFE28A2"); } } - public static XLColor Persimmon { get { return FromHtml("#FFEC5800"); } } - public static XLColor Phlox { get { return FromHtml("#FFDF00FF"); } } - public static XLColor PhthaloBlue { get { return FromHtml("#FF000F89"); } } - public static XLColor PhthaloGreen { get { return FromHtml("#FF123524"); } } - public static XLColor PiggyPink { get { return FromHtml("#FFFDDDE6"); } } - public static XLColor PineGreen { get { return FromHtml("#FF01796F"); } } - public static XLColor PinkOrange { get { return FromHtml("#FFFF9966"); } } - public static XLColor PinkPearl { get { return FromHtml("#FFE7ACCF"); } } - public static XLColor PinkSherbet { get { return FromHtml("#FFF78FA7"); } } - public static XLColor Pistachio { get { return FromHtml("#FF93C572"); } } - public static XLColor Platinum { get { return FromHtml("#FFE5E4E2"); } } - public static XLColor PlumTraditional { get { return FromHtml("#FF8E4585"); } } - public static XLColor PortlandOrange { get { return FromHtml("#FFFF5A36"); } } - public static XLColor PrincetonOrange { get { return FromHtml("#FFFF8F00"); } } - public static XLColor Prune { get { return FromHtml("#FF701C1C"); } } - public static XLColor PrussianBlue { get { return FromHtml("#FF003153"); } } - public static XLColor PsychedelicPurple { get { return FromHtml("#FFDF00FF"); } } - public static XLColor Puce { get { return FromHtml("#FFCC8899"); } } - public static XLColor Pumpkin { get { return FromHtml("#FFFF7518"); } } - public static XLColor PurpleHeart { get { return FromHtml("#FF69359C"); } } - public static XLColor PurpleMountainMajesty { get { return FromHtml("#FF9678B6"); } } - public static XLColor PurpleMunsell { get { return FromHtml("#FF9F00C5"); } } - public static XLColor PurplePizzazz { get { return FromHtml("#FFFE4EDA"); } } - public static XLColor PurpleTaupe { get { return FromHtml("#FF50404D"); } } - public static XLColor PurpleX11 { get { return FromHtml("#FFA020F0"); } } - public static XLColor RadicalRed { get { return FromHtml("#FFFF355E"); } } - public static XLColor Raspberry { get { return FromHtml("#FFE30B5D"); } } - public static XLColor RaspberryGlace { get { return FromHtml("#FF915F6D"); } } - public static XLColor RaspberryPink { get { return FromHtml("#FFE25098"); } } - public static XLColor RaspberryRose { get { return FromHtml("#FFB3446C"); } } - public static XLColor RawUmber { get { return FromHtml("#FF826644"); } } - public static XLColor RazzleDazzleRose { get { return FromHtml("#FFFF33CC"); } } - public static XLColor Razzmatazz { get { return FromHtml("#FFE3256B"); } } - public static XLColor RedMunsell { get { return FromHtml("#FFF2003C"); } } - public static XLColor RedNcs { get { return FromHtml("#FFC40233"); } } - public static XLColor RedPigment { get { return FromHtml("#FFED1C24"); } } - public static XLColor RedRyb { get { return FromHtml("#FFFE2712"); } } - public static XLColor Redwood { get { return FromHtml("#FFAB4E52"); } } - public static XLColor Regalia { get { return FromHtml("#FF522D80"); } } - public static XLColor RichBlack { get { return FromHtml("#FF004040"); } } - public static XLColor RichBrilliantLavender { get { return FromHtml("#FFF1A7FE"); } } - public static XLColor RichCarmine { get { return FromHtml("#FFD70040"); } } - public static XLColor RichElectricBlue { get { return FromHtml("#FF0892D0"); } } - public static XLColor RichLavender { get { return FromHtml("#FFA76BCF"); } } - public static XLColor RichLilac { get { return FromHtml("#FFB666D2"); } } - public static XLColor RichMaroon { get { return FromHtml("#FFB03060"); } } - public static XLColor RifleGreen { get { return FromHtml("#FF414833"); } } - public static XLColor RobinEggBlue { get { return FromHtml("#FF00CCCC"); } } - public static XLColor Rose { get { return FromHtml("#FFFF007F"); } } - public static XLColor RoseBonbon { get { return FromHtml("#FFF9429E"); } } - public static XLColor RoseEbony { get { return FromHtml("#FF674846"); } } - public static XLColor RoseGold { get { return FromHtml("#FFB76E79"); } } - public static XLColor RoseMadder { get { return FromHtml("#FFE32636"); } } - public static XLColor RosePink { get { return FromHtml("#FFFF66CC"); } } - public static XLColor RoseQuartz { get { return FromHtml("#FFAA98A9"); } } - public static XLColor RoseTaupe { get { return FromHtml("#FF905D5D"); } } - public static XLColor RoseVale { get { return FromHtml("#FFAB4E52"); } } - public static XLColor Rosewood { get { return FromHtml("#FF65000B"); } } - public static XLColor RossoCorsa { get { return FromHtml("#FFD40000"); } } - public static XLColor RoyalAzure { get { return FromHtml("#FF0038A8"); } } - public static XLColor RoyalBlueTraditional { get { return FromHtml("#FF002366"); } } - public static XLColor RoyalFuchsia { get { return FromHtml("#FFCA2C92"); } } - public static XLColor RoyalPurple { get { return FromHtml("#FF7851A9"); } } - public static XLColor Ruby { get { return FromHtml("#FFE0115F"); } } - public static XLColor Ruddy { get { return FromHtml("#FFFF0028"); } } - public static XLColor RuddyBrown { get { return FromHtml("#FFBB6528"); } } - public static XLColor RuddyPink { get { return FromHtml("#FFE18E96"); } } - public static XLColor Rufous { get { return FromHtml("#FFA81C07"); } } - public static XLColor Russet { get { return FromHtml("#FF80461B"); } } - public static XLColor Rust { get { return FromHtml("#FFB7410E"); } } - public static XLColor SacramentoStateGreen { get { return FromHtml("#FF00563F"); } } - public static XLColor SafetyOrangeBlazeOrange { get { return FromHtml("#FFFF6700"); } } - public static XLColor Saffron { get { return FromHtml("#FFF4C430"); } } - public static XLColor Salmon1 { get { return FromHtml("#FFFF8C69"); } } - public static XLColor SalmonPink { get { return FromHtml("#FFFF91A4"); } } - public static XLColor Sand { get { return FromHtml("#FFC2B280"); } } - public static XLColor SandDune { get { return FromHtml("#FF967117"); } } - public static XLColor Sandstorm { get { return FromHtml("#FFECD540"); } } - public static XLColor SandyTaupe { get { return FromHtml("#FF967117"); } } - public static XLColor Sangria { get { return FromHtml("#FF92000A"); } } - public static XLColor SapGreen { get { return FromHtml("#FF507D2A"); } } - public static XLColor Sapphire { get { return FromHtml("#FF082567"); } } - public static XLColor SatinSheenGold { get { return FromHtml("#FFCBA135"); } } - public static XLColor Scarlet { get { return FromHtml("#FFFF2000"); } } - public static XLColor SchoolBusYellow { get { return FromHtml("#FFFFD800"); } } - public static XLColor ScreaminGreen { get { return FromHtml("#FF76FF7A"); } } - public static XLColor SealBrown { get { return FromHtml("#FF321414"); } } - public static XLColor SelectiveYellow { get { return FromHtml("#FFFFBA00"); } } - public static XLColor Sepia { get { return FromHtml("#FF704214"); } } - public static XLColor Shadow { get { return FromHtml("#FF8A795D"); } } - public static XLColor ShamrockGreen { get { return FromHtml("#FF009E60"); } } - public static XLColor ShockingPink { get { return FromHtml("#FFFC0FC0"); } } - public static XLColor Sienna1 { get { return FromHtml("#FF882D17"); } } - public static XLColor Sinopia { get { return FromHtml("#FFCB410B"); } } - public static XLColor Skobeloff { get { return FromHtml("#FF007474"); } } - public static XLColor SkyMagenta { get { return FromHtml("#FFCF71AF"); } } - public static XLColor SmaltDarkPowderBlue { get { return FromHtml("#FF003399"); } } - public static XLColor SmokeyTopaz { get { return FromHtml("#FF933D41"); } } - public static XLColor SmokyBlack { get { return FromHtml("#FF100C08"); } } - public static XLColor SpiroDiscoBall { get { return FromHtml("#FF0FC0FC"); } } - public static XLColor SplashedWhite { get { return FromHtml("#FFFEFDFF"); } } - public static XLColor SpringBud { get { return FromHtml("#FFA7FC00"); } } - public static XLColor StPatricksBlue { get { return FromHtml("#FF23297A"); } } - public static XLColor StilDeGrainYellow { get { return FromHtml("#FFFADA5E"); } } - public static XLColor Straw { get { return FromHtml("#FFE4D96F"); } } - public static XLColor Sunglow { get { return FromHtml("#FFFFCC33"); } } - public static XLColor Sunset { get { return FromHtml("#FFFAD6A5"); } } - public static XLColor Tangelo { get { return FromHtml("#FFF94D00"); } } - public static XLColor Tangerine { get { return FromHtml("#FFF28500"); } } - public static XLColor TangerineYellow { get { return FromHtml("#FFFFCC00"); } } - public static XLColor Taupe { get { return FromHtml("#FF483C32"); } } - public static XLColor TaupeGray { get { return FromHtml("#FF8B8589"); } } - public static XLColor TeaGreen { get { return FromHtml("#FFD0F0C0"); } } - public static XLColor TealBlue { get { return FromHtml("#FF367588"); } } - public static XLColor TealGreen { get { return FromHtml("#FF006D5B"); } } - public static XLColor TeaRoseOrange { get { return FromHtml("#FFF88379"); } } - public static XLColor TeaRoseRose { get { return FromHtml("#FFF4C2C2"); } } - public static XLColor TennéTawny { get { return FromHtml("#FFCD5700"); } } - public static XLColor TerraCotta { get { return FromHtml("#FFE2725B"); } } - public static XLColor ThulianPink { get { return FromHtml("#FFDE6FA1"); } } - public static XLColor TickleMePink { get { return FromHtml("#FFFC89AC"); } } - public static XLColor TiffanyBlue { get { return FromHtml("#FF0ABAB5"); } } - public static XLColor TigersEye { get { return FromHtml("#FFE08D3C"); } } - public static XLColor Timberwolf { get { return FromHtml("#FFDBD7D2"); } } - public static XLColor TitaniumYellow { get { return FromHtml("#FFEEE600"); } } - public static XLColor Toolbox { get { return FromHtml("#FF746CC0"); } } - public static XLColor TractorRed { get { return FromHtml("#FFFD0E35"); } } - public static XLColor TropicalRainForest { get { return FromHtml("#FF00755E"); } } - public static XLColor TuftsBlue { get { return FromHtml("#FF417DC1"); } } - public static XLColor Tumbleweed { get { return FromHtml("#FFDEAA88"); } } - public static XLColor TurkishRose { get { return FromHtml("#FFB57281"); } } - public static XLColor Turquoise1 { get { return FromHtml("#FF30D5C8"); } } - public static XLColor TurquoiseBlue { get { return FromHtml("#FF00FFEF"); } } - public static XLColor TurquoiseGreen { get { return FromHtml("#FFA0D6B4"); } } - public static XLColor TuscanRed { get { return FromHtml("#FF823535"); } } - public static XLColor TwilightLavender { get { return FromHtml("#FF8A496B"); } } - public static XLColor TyrianPurple { get { return FromHtml("#FF66023C"); } } - public static XLColor UaBlue { get { return FromHtml("#FF0033AA"); } } - public static XLColor UaRed { get { return FromHtml("#FFD9004C"); } } - public static XLColor Ube { get { return FromHtml("#FF8878C3"); } } - public static XLColor UclaBlue { get { return FromHtml("#FF536895"); } } - public static XLColor UclaGold { get { return FromHtml("#FFFFB300"); } } - public static XLColor UfoGreen { get { return FromHtml("#FF3CD070"); } } - public static XLColor Ultramarine { get { return FromHtml("#FF120A8F"); } } - public static XLColor UltramarineBlue { get { return FromHtml("#FF4166F5"); } } - public static XLColor UltraPink { get { return FromHtml("#FFFF6FFF"); } } - public static XLColor Umber { get { return FromHtml("#FF635147"); } } - public static XLColor UnitedNationsBlue { get { return FromHtml("#FF5B92E5"); } } - public static XLColor UnmellowYellow { get { return FromHtml("#FFFFFF66"); } } - public static XLColor UpForestGreen { get { return FromHtml("#FF014421"); } } - public static XLColor UpMaroon { get { return FromHtml("#FF7B1113"); } } - public static XLColor UpsdellRed { get { return FromHtml("#FFAE2029"); } } - public static XLColor Urobilin { get { return FromHtml("#FFE1AD21"); } } - public static XLColor UscCardinal { get { return FromHtml("#FF990000"); } } - public static XLColor UscGold { get { return FromHtml("#FFFFCC00"); } } - public static XLColor UtahCrimson { get { return FromHtml("#FFD3003F"); } } - public static XLColor Vanilla { get { return FromHtml("#FFF3E5AB"); } } - public static XLColor VegasGold { get { return FromHtml("#FFC5B358"); } } - public static XLColor VenetianRed { get { return FromHtml("#FFC80815"); } } - public static XLColor Verdigris { get { return FromHtml("#FF43B3AE"); } } - public static XLColor Vermilion { get { return FromHtml("#FFE34234"); } } - public static XLColor Veronica { get { return FromHtml("#FFA020F0"); } } - public static XLColor Violet1 { get { return FromHtml("#FF8F00FF"); } } - public static XLColor VioletColorWheel { get { return FromHtml("#FF7F00FF"); } } - public static XLColor VioletRyb { get { return FromHtml("#FF8601AF"); } } - public static XLColor Viridian { get { return FromHtml("#FF40826D"); } } - public static XLColor VividAuburn { get { return FromHtml("#FF922724"); } } - public static XLColor VividBurgundy { get { return FromHtml("#FF9F1D35"); } } - public static XLColor VividCerise { get { return FromHtml("#FFDA1D81"); } } - public static XLColor VividTangerine { get { return FromHtml("#FFFFA089"); } } - public static XLColor VividViolet { get { return FromHtml("#FF9F00FF"); } } - public static XLColor WarmBlack { get { return FromHtml("#FF004242"); } } - public static XLColor Wenge { get { return FromHtml("#FF645452"); } } - public static XLColor WildBlueYonder { get { return FromHtml("#FFA2ADD0"); } } - public static XLColor WildStrawberry { get { return FromHtml("#FFFF43A4"); } } - public static XLColor WildWatermelon { get { return FromHtml("#FFFC6C85"); } } - public static XLColor Wisteria { get { return FromHtml("#FFC9A0DC"); } } - public static XLColor Xanadu { get { return FromHtml("#FF738678"); } } - public static XLColor YaleBlue { get { return FromHtml("#FF0F4D92"); } } - public static XLColor YellowMunsell { get { return FromHtml("#FFEFCC00"); } } - public static XLColor YellowNcs { get { return FromHtml("#FFFFD300"); } } - public static XLColor YellowProcess { get { return FromHtml("#FFFFEF00"); } } - public static XLColor YellowRyb { get { return FromHtml("#FFFEFE33"); } } - public static XLColor Zaffre { get { return FromHtml("#FF0014A8"); } } - public static XLColor ZinnwalditeBrown { get { return FromHtml("#FF2C1608"); } } - public static XLColor Transparent { get { return FromColor(Color.Transparent); } } - } -} +using System; +using System.Collections.Generic; +using System.Drawing; +using DocumentFormat.OpenXml.Presentation; + +namespace ClosedXML.Excel +{ + public partial class XLColor + { + private static readonly Dictionary ByColor = new Dictionary(); + private static readonly Object ByColorLock = new Object(); + + public static XLColor FromColor(Color color) + { + XLColor ret; + lock (ByColorLock) + { + if (!ByColor.TryGetValue(color, out ret)) + { + ret = new XLColor(color); + ByColor.Add(color, ret); + } + } + return ret; + } + + public static XLColor FromArgb(Int32 argb) + { + return FromColor(Color.FromArgb(argb)); + } + public static XLColor FromArgb(Int32 r, Int32 g, Int32 b) + { + return FromColor(Color.FromArgb(r, g, b)); + } + public static XLColor FromArgb(Int32 a, Int32 r, Int32 g, Int32 b) + { + return FromColor(Color.FromArgb(a, r, g, b)); + } + public static XLColor FromKnownColor(KnownColor color) + { + return FromColor(Color.FromKnownColor(color)); + } + public static XLColor FromName(String name) + { + return FromColor(Color.FromName(name)); + } + public static XLColor FromHtml(String htmlColor) + { + return FromColor(ColorTranslator.FromHtml(htmlColor)); + } + + private static readonly Dictionary ByIndex = new Dictionary(); + private static readonly Object ByIndexLock = new Object(); + + public static XLColor FromIndex(Int32 index) + { + XLColor ret; + lock (ByIndexLock) + { + if (!ByIndex.TryGetValue(index, out ret)) + { + ret = new XLColor(index); + ByIndex.Add(index, ret); + } + } + return ret; + } + + private static readonly Dictionary ByTheme = new Dictionary(); + private static readonly Object ByThemeLock = new Object(); + + public static XLColor FromTheme(XLThemeColor themeColor) + { + XLColor ret; + lock (ByThemeLock) + { + if (!ByTheme.TryGetValue(themeColor, out ret)) + { + ret = new XLColor(themeColor); + ByTheme.Add(themeColor, ret); + } + } + return ret; + } + + private static readonly Dictionary> ByThemeTint = new Dictionary>(); + private static readonly Object ByThemeTintLock = new Object(); + + public static XLColor FromTheme(XLThemeColor themeColor, Double themeTint) + { + XLColor ret; + lock (ByThemeTintLock) + { + Dictionary themeTints; + if (ByThemeTint.TryGetValue(themeColor, out themeTints)) + { + if (!themeTints.TryGetValue(themeTint, out ret)) + { + ret = new XLColor(themeColor, themeTint); + themeTints.Add(themeTint, ret); + } + } + else + { + themeTints = new Dictionary(); + ret = new XLColor(themeColor, themeTint); + themeTints.Add(themeTint, ret); + + ByThemeTint.Add(themeColor, themeTints); + } + } + return ret; + } + + private static Dictionary _indexedColors; + public static Dictionary IndexedColors + { + get + { + if (_indexedColors == null) + { + var retVal = new Dictionary + { + {0, FromHtml("#FF000000")}, + {1, FromHtml("#FFFFFFFF")}, + {2, FromHtml("#FFFF0000")}, + {3, FromHtml("#FF00FF00")}, + {4, FromHtml("#FF0000FF")}, + {5, FromHtml("#FFFFFF00")}, + {6, FromHtml("#FFFF00FF")}, + {7, FromHtml("#FF00FFFF")}, + {8, FromHtml("#FF000000")}, + {9, FromHtml("#FFFFFFFF")}, + {10, FromHtml("#FFFF0000")}, + {11, FromHtml("#FF00FF00")}, + {12, FromHtml("#FF0000FF")}, + {13, FromHtml("#FFFFFF00")}, + {14, FromHtml("#FFFF00FF")}, + {15, FromHtml("#FF00FFFF")}, + {16, FromHtml("#FF800000")}, + {17, FromHtml("#FF008000")}, + {18, FromHtml("#FF000080")}, + {19, FromHtml("#FF808000")}, + {20, FromHtml("#FF800080")}, + {21, FromHtml("#FF008080")}, + {22, FromHtml("#FFC0C0C0")}, + {23, FromHtml("#FF808080")}, + {24, FromHtml("#FF9999FF")}, + {25, FromHtml("#FF993366")}, + {26, FromHtml("#FFFFFFCC")}, + {27, FromHtml("#FFCCFFFF")}, + {28, FromHtml("#FF660066")}, + {29, FromHtml("#FFFF8080")}, + {30, FromHtml("#FF0066CC")}, + {31, FromHtml("#FFCCCCFF")}, + {32, FromHtml("#FF000080")}, + {33, FromHtml("#FFFF00FF")}, + {34, FromHtml("#FFFFFF00")}, + {35, FromHtml("#FF00FFFF")}, + {36, FromHtml("#FF800080")}, + {37, FromHtml("#FF800000")}, + {38, FromHtml("#FF008080")}, + {39, FromHtml("#FF0000FF")}, + {40, FromHtml("#FF00CCFF")}, + {41, FromHtml("#FFCCFFFF")}, + {42, FromHtml("#FFCCFFCC")}, + {43, FromHtml("#FFFFFF99")}, + {44, FromHtml("#FF99CCFF")}, + {45, FromHtml("#FFFF99CC")}, + {46, FromHtml("#FFCC99FF")}, + {47, FromHtml("#FFFFCC99")}, + {48, FromHtml("#FF3366FF")}, + {49, FromHtml("#FF33CCCC")}, + {50, FromHtml("#FF99CC00")}, + {51, FromHtml("#FFFFCC00")}, + {52, FromHtml("#FFFF9900")}, + {53, FromHtml("#FFFF6600")}, + {54, FromHtml("#FF666699")}, + {55, FromHtml("#FF969696")}, + {56, FromHtml("#FF003366")}, + {57, FromHtml("#FF339966")}, + {58, FromHtml("#FF003300")}, + {59, FromHtml("#FF333300")}, + {60, FromHtml("#FF993300")}, + {61, FromHtml("#FF993366")}, + {62, FromHtml("#FF333399")}, + {63, FromHtml("#FF333333")}, + {64, FromColor(Color.Transparent)} + }; + _indexedColors = retVal; + } + return _indexedColors; + } + } + + private static XLColor noColor = new XLColor(); + public static XLColor NoColor { get { return noColor; } } + + public static XLColor AliceBlue { get { return FromColor(Color.AliceBlue); } } + public static XLColor AntiqueWhite { get { return FromColor(Color.AntiqueWhite); } } + public static XLColor Aqua { get { return FromColor(Color.Aqua); } } + public static XLColor Aquamarine { get { return FromColor(Color.Aquamarine); } } + public static XLColor Azure { get { return FromColor(Color.Azure); } } + public static XLColor Beige { get { return FromColor(Color.Beige); } } + public static XLColor Bisque { get { return FromColor(Color.Bisque); } } + public static XLColor Black { get { return FromColor(Color.Black); } } + public static XLColor BlanchedAlmond { get { return FromColor(Color.BlanchedAlmond); } } + public static XLColor Blue { get { return FromColor(Color.Blue); } } + public static XLColor BlueViolet { get { return FromColor(Color.BlueViolet); } } + public static XLColor Brown { get { return FromColor(Color.Brown); } } + public static XLColor BurlyWood { get { return FromColor(Color.BurlyWood); } } + public static XLColor CadetBlue { get { return FromColor(Color.CadetBlue); } } + public static XLColor Chartreuse { get { return FromColor(Color.Chartreuse); } } + public static XLColor Chocolate { get { return FromColor(Color.Chocolate); } } + public static XLColor Coral { get { return FromColor(Color.Coral); } } + public static XLColor CornflowerBlue { get { return FromColor(Color.CornflowerBlue); } } + public static XLColor Cornsilk { get { return FromColor(Color.Cornsilk); } } + public static XLColor Crimson { get { return FromColor(Color.Crimson); } } + public static XLColor Cyan { get { return FromColor(Color.Cyan); } } + public static XLColor DarkBlue { get { return FromColor(Color.DarkBlue); } } + public static XLColor DarkCyan { get { return FromColor(Color.DarkCyan); } } + public static XLColor DarkGoldenrod { get { return FromColor(Color.DarkGoldenrod); } } + public static XLColor DarkGray { get { return FromColor(Color.DarkGray); } } + public static XLColor DarkGreen { get { return FromColor(Color.DarkGreen); } } + public static XLColor DarkKhaki { get { return FromColor(Color.DarkKhaki); } } + public static XLColor DarkMagenta { get { return FromColor(Color.DarkMagenta); } } + public static XLColor DarkOliveGreen { get { return FromColor(Color.DarkOliveGreen); } } + public static XLColor DarkOrange { get { return FromColor(Color.DarkOrange); } } + public static XLColor DarkOrchid { get { return FromColor(Color.DarkOrchid); } } + public static XLColor DarkRed { get { return FromColor(Color.DarkRed); } } + public static XLColor DarkSalmon { get { return FromColor(Color.DarkSalmon); } } + public static XLColor DarkSeaGreen { get { return FromColor(Color.DarkSeaGreen); } } + public static XLColor DarkSlateBlue { get { return FromColor(Color.DarkSlateBlue); } } + public static XLColor DarkSlateGray { get { return FromColor(Color.DarkSlateGray); } } + public static XLColor DarkTurquoise { get { return FromColor(Color.DarkTurquoise); } } + public static XLColor DarkViolet { get { return FromColor(Color.DarkViolet); } } + public static XLColor DeepPink { get { return FromColor(Color.DeepPink); } } + public static XLColor DeepSkyBlue { get { return FromColor(Color.DeepSkyBlue); } } + public static XLColor DimGray { get { return FromColor(Color.DimGray); } } + public static XLColor DodgerBlue { get { return FromColor(Color.DodgerBlue); } } + public static XLColor Firebrick { get { return FromColor(Color.Firebrick); } } + public static XLColor FloralWhite { get { return FromColor(Color.FloralWhite); } } + public static XLColor ForestGreen { get { return FromColor(Color.ForestGreen); } } + public static XLColor Fuchsia { get { return FromColor(Color.Fuchsia); } } + public static XLColor Gainsboro { get { return FromColor(Color.Gainsboro); } } + public static XLColor GhostWhite { get { return FromColor(Color.GhostWhite); } } + public static XLColor Gold { get { return FromColor(Color.Gold); } } + public static XLColor Goldenrod { get { return FromColor(Color.Goldenrod); } } + public static XLColor Gray { get { return FromColor(Color.Gray); } } + public static XLColor Green { get { return FromColor(Color.Green); } } + public static XLColor GreenYellow { get { return FromColor(Color.GreenYellow); } } + public static XLColor Honeydew { get { return FromColor(Color.Honeydew); } } + public static XLColor HotPink { get { return FromColor(Color.HotPink); } } + public static XLColor IndianRed { get { return FromColor(Color.IndianRed); } } + public static XLColor Indigo { get { return FromColor(Color.Indigo); } } + public static XLColor Ivory { get { return FromColor(Color.Ivory); } } + public static XLColor Khaki { get { return FromColor(Color.Khaki); } } + public static XLColor Lavender { get { return FromColor(Color.Lavender); } } + public static XLColor LavenderBlush { get { return FromColor(Color.LavenderBlush); } } + public static XLColor LawnGreen { get { return FromColor(Color.LawnGreen); } } + public static XLColor LemonChiffon { get { return FromColor(Color.LemonChiffon); } } + public static XLColor LightBlue { get { return FromColor(Color.LightBlue); } } + public static XLColor LightCoral { get { return FromColor(Color.LightCoral); } } + public static XLColor LightCyan { get { return FromColor(Color.LightCyan); } } + public static XLColor LightGoldenrodYellow { get { return FromColor(Color.LightGoldenrodYellow); } } + public static XLColor LightGray { get { return FromColor(Color.LightGray); } } + public static XLColor LightGreen { get { return FromColor(Color.LightGreen); } } + public static XLColor LightPink { get { return FromColor(Color.LightPink); } } + public static XLColor LightSalmon { get { return FromColor(Color.LightSalmon); } } + public static XLColor LightSeaGreen { get { return FromColor(Color.LightSeaGreen); } } + public static XLColor LightSkyBlue { get { return FromColor(Color.LightSkyBlue); } } + public static XLColor LightSlateGray { get { return FromColor(Color.LightSlateGray); } } + public static XLColor LightSteelBlue { get { return FromColor(Color.LightSteelBlue); } } + public static XLColor LightYellow { get { return FromColor(Color.LightYellow); } } + public static XLColor Lime { get { return FromColor(Color.Lime); } } + public static XLColor LimeGreen { get { return FromColor(Color.LimeGreen); } } + public static XLColor Linen { get { return FromColor(Color.Linen); } } + public static XLColor Magenta { get { return FromColor(Color.Magenta); } } + public static XLColor Maroon { get { return FromColor(Color.Maroon); } } + public static XLColor MediumAquamarine { get { return FromColor(Color.MediumAquamarine); } } + public static XLColor MediumBlue { get { return FromColor(Color.MediumBlue); } } + public static XLColor MediumOrchid { get { return FromColor(Color.MediumOrchid); } } + public static XLColor MediumPurple { get { return FromColor(Color.MediumPurple); } } + public static XLColor MediumSeaGreen { get { return FromColor(Color.MediumSeaGreen); } } + public static XLColor MediumSlateBlue { get { return FromColor(Color.MediumSlateBlue); } } + public static XLColor MediumSpringGreen { get { return FromColor(Color.MediumSpringGreen); } } + public static XLColor MediumTurquoise { get { return FromColor(Color.MediumTurquoise); } } + public static XLColor MediumVioletRed { get { return FromColor(Color.MediumVioletRed); } } + public static XLColor MidnightBlue { get { return FromColor(Color.MidnightBlue); } } + public static XLColor MintCream { get { return FromColor(Color.MintCream); } } + public static XLColor MistyRose { get { return FromColor(Color.MistyRose); } } + public static XLColor Moccasin { get { return FromColor(Color.Moccasin); } } + public static XLColor NavajoWhite { get { return FromColor(Color.NavajoWhite); } } + public static XLColor Navy { get { return FromColor(Color.Navy); } } + public static XLColor OldLace { get { return FromColor(Color.OldLace); } } + public static XLColor Olive { get { return FromColor(Color.Olive); } } + public static XLColor OliveDrab { get { return FromColor(Color.OliveDrab); } } + public static XLColor Orange { get { return FromColor(Color.Orange); } } + public static XLColor OrangeRed { get { return FromColor(Color.OrangeRed); } } + public static XLColor Orchid { get { return FromColor(Color.Orchid); } } + public static XLColor PaleGoldenrod { get { return FromColor(Color.PaleGoldenrod); } } + public static XLColor PaleGreen { get { return FromColor(Color.PaleGreen); } } + public static XLColor PaleTurquoise { get { return FromColor(Color.PaleTurquoise); } } + public static XLColor PaleVioletRed { get { return FromColor(Color.PaleVioletRed); } } + public static XLColor PapayaWhip { get { return FromColor(Color.PapayaWhip); } } + public static XLColor PeachPuff { get { return FromColor(Color.PeachPuff); } } + public static XLColor Peru { get { return FromColor(Color.Peru); } } + public static XLColor Pink { get { return FromColor(Color.Pink); } } + public static XLColor Plum { get { return FromColor(Color.Plum); } } + public static XLColor PowderBlue { get { return FromColor(Color.PowderBlue); } } + public static XLColor Purple { get { return FromColor(Color.Purple); } } + public static XLColor Red { get { return FromColor(Color.Red); } } + public static XLColor RosyBrown { get { return FromColor(Color.RosyBrown); } } + public static XLColor RoyalBlue { get { return FromColor(Color.RoyalBlue); } } + public static XLColor SaddleBrown { get { return FromColor(Color.SaddleBrown); } } + public static XLColor Salmon { get { return FromColor(Color.Salmon); } } + public static XLColor SandyBrown { get { return FromColor(Color.SandyBrown); } } + public static XLColor SeaGreen { get { return FromColor(Color.SeaGreen); } } + public static XLColor SeaShell { get { return FromColor(Color.SeaShell); } } + public static XLColor Sienna { get { return FromColor(Color.Sienna); } } + public static XLColor Silver { get { return FromColor(Color.Silver); } } + public static XLColor SkyBlue { get { return FromColor(Color.SkyBlue); } } + public static XLColor SlateBlue { get { return FromColor(Color.SlateBlue); } } + public static XLColor SlateGray { get { return FromColor(Color.SlateGray); } } + public static XLColor Snow { get { return FromColor(Color.Snow); } } + public static XLColor SpringGreen { get { return FromColor(Color.SpringGreen); } } + public static XLColor SteelBlue { get { return FromColor(Color.SteelBlue); } } + public static XLColor Tan { get { return FromColor(Color.Tan); } } + public static XLColor Teal { get { return FromColor(Color.Teal); } } + public static XLColor Thistle { get { return FromColor(Color.Thistle); } } + public static XLColor Tomato { get { return FromColor(Color.Tomato); } } + public static XLColor Turquoise { get { return FromColor(Color.Turquoise); } } + public static XLColor Violet { get { return FromColor(Color.Violet); } } + public static XLColor Wheat { get { return FromColor(Color.Wheat); } } + public static XLColor White { get { return FromColor(Color.White); } } + public static XLColor WhiteSmoke { get { return FromColor(Color.WhiteSmoke); } } + public static XLColor Yellow { get { return FromColor(Color.Yellow); } } + public static XLColor YellowGreen { get { return FromColor(Color.YellowGreen); } } + public static XLColor AirForceBlue { get { return FromHtml("#FF5D8AA8"); } } + public static XLColor Alizarin { get { return FromHtml("#FFE32636"); } } + public static XLColor Almond { get { return FromHtml("#FFEFDECD"); } } + public static XLColor Amaranth { get { return FromHtml("#FFE52B50"); } } + public static XLColor Amber { get { return FromHtml("#FFFFBF00"); } } + public static XLColor AmberSaeEce { get { return FromHtml("#FFFF7E00"); } } + public static XLColor AmericanRose { get { return FromHtml("#FFFF033E"); } } + public static XLColor Amethyst { get { return FromHtml("#FF9966CC"); } } + public static XLColor AntiFlashWhite { get { return FromHtml("#FFF2F3F4"); } } + public static XLColor AntiqueBrass { get { return FromHtml("#FFCD9575"); } } + public static XLColor AntiqueFuchsia { get { return FromHtml("#FF915C83"); } } + public static XLColor AppleGreen { get { return FromHtml("#FF8DB600"); } } + public static XLColor Apricot { get { return FromHtml("#FFFBCEB1"); } } + public static XLColor Aquamarine1 { get { return FromHtml("#FF7FFFD0"); } } + public static XLColor ArmyGreen { get { return FromHtml("#FF4B5320"); } } + public static XLColor Arsenic { get { return FromHtml("#FF3B444B"); } } + public static XLColor ArylideYellow { get { return FromHtml("#FFE9D66B"); } } + public static XLColor AshGrey { get { return FromHtml("#FFB2BEB5"); } } + public static XLColor Asparagus { get { return FromHtml("#FF87A96B"); } } + public static XLColor AtomicTangerine { get { return FromHtml("#FFFF9966"); } } + public static XLColor Auburn { get { return FromHtml("#FF6D351A"); } } + public static XLColor Aureolin { get { return FromHtml("#FFFDEE00"); } } + public static XLColor Aurometalsaurus { get { return FromHtml("#FF6E7F80"); } } + public static XLColor Awesome { get { return FromHtml("#FFFF2052"); } } + public static XLColor AzureColorWheel { get { return FromHtml("#FF007FFF"); } } + public static XLColor BabyBlue { get { return FromHtml("#FF89CFF0"); } } + public static XLColor BabyBlueEyes { get { return FromHtml("#FFA1CAF1"); } } + public static XLColor BabyPink { get { return FromHtml("#FFF4C2C2"); } } + public static XLColor BallBlue { get { return FromHtml("#FF21ABCD"); } } + public static XLColor BananaMania { get { return FromHtml("#FFFAE7B5"); } } + public static XLColor BattleshipGrey { get { return FromHtml("#FF848482"); } } + public static XLColor Bazaar { get { return FromHtml("#FF98777B"); } } + public static XLColor BeauBlue { get { return FromHtml("#FFBCD4E6"); } } + public static XLColor Beaver { get { return FromHtml("#FF9F8170"); } } + public static XLColor Bistre { get { return FromHtml("#FF3D2B1F"); } } + public static XLColor Bittersweet { get { return FromHtml("#FFFE6F5E"); } } + public static XLColor BleuDeFrance { get { return FromHtml("#FF318CE7"); } } + public static XLColor BlizzardBlue { get { return FromHtml("#FFACE5EE"); } } + public static XLColor Blond { get { return FromHtml("#FFFAF0BE"); } } + public static XLColor BlueBell { get { return FromHtml("#FFA2A2D0"); } } + public static XLColor BlueGray { get { return FromHtml("#FF6699CC"); } } + public static XLColor BlueGreen { get { return FromHtml("#FF00DDDD"); } } + public static XLColor BluePigment { get { return FromHtml("#FF333399"); } } + public static XLColor BlueRyb { get { return FromHtml("#FF0247FE"); } } + public static XLColor Blush { get { return FromHtml("#FFDE5D83"); } } + public static XLColor Bole { get { return FromHtml("#FF79443B"); } } + public static XLColor BondiBlue { get { return FromHtml("#FF0095B6"); } } + public static XLColor BostonUniversityRed { get { return FromHtml("#FFCC0000"); } } + public static XLColor BrandeisBlue { get { return FromHtml("#FF0070FF"); } } + public static XLColor Brass { get { return FromHtml("#FFB5A642"); } } + public static XLColor BrickRed { get { return FromHtml("#FFCB4154"); } } + public static XLColor BrightCerulean { get { return FromHtml("#FF1DACD6"); } } + public static XLColor BrightGreen { get { return FromHtml("#FF66FF00"); } } + public static XLColor BrightLavender { get { return FromHtml("#FFBF94E4"); } } + public static XLColor BrightMaroon { get { return FromHtml("#FFC32148"); } } + public static XLColor BrightPink { get { return FromHtml("#FFFF007F"); } } + public static XLColor BrightTurquoise { get { return FromHtml("#FF08E8DE"); } } + public static XLColor BrightUbe { get { return FromHtml("#FFD19FE8"); } } + public static XLColor BrilliantLavender { get { return FromHtml("#FFF4BBFF"); } } + public static XLColor BrilliantRose { get { return FromHtml("#FFFF55A3"); } } + public static XLColor BrinkPink { get { return FromHtml("#FFFB607F"); } } + public static XLColor BritishRacingGreen { get { return FromHtml("#FF004225"); } } + public static XLColor Bronze { get { return FromHtml("#FFCD7F32"); } } + public static XLColor BrownTraditional { get { return FromHtml("#FF964B00"); } } + public static XLColor BubbleGum { get { return FromHtml("#FFFFC1CC"); } } + public static XLColor Bubbles { get { return FromHtml("#FFE7FEFF"); } } + public static XLColor Buff { get { return FromHtml("#FFF0DC82"); } } + public static XLColor BulgarianRose { get { return FromHtml("#FF480607"); } } + public static XLColor Burgundy { get { return FromHtml("#FF800020"); } } + public static XLColor BurntOrange { get { return FromHtml("#FFCC5500"); } } + public static XLColor BurntSienna { get { return FromHtml("#FFE97451"); } } + public static XLColor BurntUmber { get { return FromHtml("#FF8A3324"); } } + public static XLColor Byzantine { get { return FromHtml("#FFBD33A4"); } } + public static XLColor Byzantium { get { return FromHtml("#FF702963"); } } + public static XLColor Cadet { get { return FromHtml("#FF536872"); } } + public static XLColor CadetGrey { get { return FromHtml("#FF91A3B0"); } } + public static XLColor CadmiumGreen { get { return FromHtml("#FF006B3C"); } } + public static XLColor CadmiumOrange { get { return FromHtml("#FFED872D"); } } + public static XLColor CadmiumRed { get { return FromHtml("#FFE30022"); } } + public static XLColor CadmiumYellow { get { return FromHtml("#FFFFF600"); } } + public static XLColor CalPolyPomonaGreen { get { return FromHtml("#FF1E4D2B"); } } + public static XLColor CambridgeBlue { get { return FromHtml("#FFA3C1AD"); } } + public static XLColor Camel { get { return FromHtml("#FFC19A6B"); } } + public static XLColor CamouflageGreen { get { return FromHtml("#FF78866B"); } } + public static XLColor CanaryYellow { get { return FromHtml("#FFFFEF00"); } } + public static XLColor CandyAppleRed { get { return FromHtml("#FFFF0800"); } } + public static XLColor CandyPink { get { return FromHtml("#FFE4717A"); } } + public static XLColor CaputMortuum { get { return FromHtml("#FF592720"); } } + public static XLColor Cardinal { get { return FromHtml("#FFC41E3A"); } } + public static XLColor CaribbeanGreen { get { return FromHtml("#FF00CC99"); } } + public static XLColor Carmine { get { return FromHtml("#FF960018"); } } + public static XLColor CarminePink { get { return FromHtml("#FFEB4C42"); } } + public static XLColor CarmineRed { get { return FromHtml("#FFFF0038"); } } + public static XLColor CarnationPink { get { return FromHtml("#FFFFA6C9"); } } + public static XLColor Carnelian { get { return FromHtml("#FFB31B1B"); } } + public static XLColor CarolinaBlue { get { return FromHtml("#FF99BADD"); } } + public static XLColor CarrotOrange { get { return FromHtml("#FFED9121"); } } + public static XLColor Ceil { get { return FromHtml("#FF92A1CF"); } } + public static XLColor Celadon { get { return FromHtml("#FFACE1AF"); } } + public static XLColor CelestialBlue { get { return FromHtml("#FF4997D0"); } } + public static XLColor Cerise { get { return FromHtml("#FFDE3163"); } } + public static XLColor CerisePink { get { return FromHtml("#FFEC3B83"); } } + public static XLColor Cerulean { get { return FromHtml("#FF007BA7"); } } + public static XLColor CeruleanBlue { get { return FromHtml("#FF2A52BE"); } } + public static XLColor Chamoisee { get { return FromHtml("#FFA0785A"); } } + public static XLColor Champagne { get { return FromHtml("#FFF7E7CE"); } } + public static XLColor Charcoal { get { return FromHtml("#FF36454F"); } } + public static XLColor ChartreuseTraditional { get { return FromHtml("#FFDFFF00"); } } + public static XLColor CherryBlossomPink { get { return FromHtml("#FFFFB7C5"); } } + public static XLColor Chocolate1 { get { return FromHtml("#FF7B3F00"); } } + public static XLColor ChromeYellow { get { return FromHtml("#FFFFA700"); } } + public static XLColor Cinereous { get { return FromHtml("#FF98817B"); } } + public static XLColor Cinnabar { get { return FromHtml("#FFE34234"); } } + public static XLColor Citrine { get { return FromHtml("#FFE4D00A"); } } + public static XLColor ClassicRose { get { return FromHtml("#FFFBCCE7"); } } + public static XLColor Cobalt { get { return FromHtml("#FF0047AB"); } } + public static XLColor ColumbiaBlue { get { return FromHtml("#FF9BDDFF"); } } + public static XLColor CoolBlack { get { return FromHtml("#FF002E63"); } } + public static XLColor CoolGrey { get { return FromHtml("#FF8C92AC"); } } + public static XLColor Copper { get { return FromHtml("#FFB87333"); } } + public static XLColor CopperRose { get { return FromHtml("#FF996666"); } } + public static XLColor Coquelicot { get { return FromHtml("#FFFF3800"); } } + public static XLColor CoralPink { get { return FromHtml("#FFF88379"); } } + public static XLColor CoralRed { get { return FromHtml("#FFFF4040"); } } + public static XLColor Cordovan { get { return FromHtml("#FF893F45"); } } + public static XLColor Corn { get { return FromHtml("#FFFBEC5D"); } } + public static XLColor CornellRed { get { return FromHtml("#FFB31B1B"); } } + public static XLColor CosmicLatte { get { return FromHtml("#FFFFF8E7"); } } + public static XLColor CottonCandy { get { return FromHtml("#FFFFBCD9"); } } + public static XLColor Cream { get { return FromHtml("#FFFFFDD0"); } } + public static XLColor CrimsonGlory { get { return FromHtml("#FFBE0032"); } } + public static XLColor CyanProcess { get { return FromHtml("#FF00B7EB"); } } + public static XLColor Daffodil { get { return FromHtml("#FFFFFF31"); } } + public static XLColor Dandelion { get { return FromHtml("#FFF0E130"); } } + public static XLColor DarkBrown { get { return FromHtml("#FF654321"); } } + public static XLColor DarkByzantium { get { return FromHtml("#FF5D3954"); } } + public static XLColor DarkCandyAppleRed { get { return FromHtml("#FFA40000"); } } + public static XLColor DarkCerulean { get { return FromHtml("#FF08457E"); } } + public static XLColor DarkChampagne { get { return FromHtml("#FFC2B280"); } } + public static XLColor DarkChestnut { get { return FromHtml("#FF986960"); } } + public static XLColor DarkCoral { get { return FromHtml("#FFCD5B45"); } } + public static XLColor DarkElectricBlue { get { return FromHtml("#FF536878"); } } + public static XLColor DarkGreen1 { get { return FromHtml("#FF013220"); } } + public static XLColor DarkJungleGreen { get { return FromHtml("#FF1A2421"); } } + public static XLColor DarkLava { get { return FromHtml("#FF483C32"); } } + public static XLColor DarkLavender { get { return FromHtml("#FF734F96"); } } + public static XLColor DarkMidnightBlue { get { return FromHtml("#FF003366"); } } + public static XLColor DarkPastelBlue { get { return FromHtml("#FF779ECB"); } } + public static XLColor DarkPastelGreen { get { return FromHtml("#FF03C03C"); } } + public static XLColor DarkPastelPurple { get { return FromHtml("#FF966FD6"); } } + public static XLColor DarkPastelRed { get { return FromHtml("#FFC23B22"); } } + public static XLColor DarkPink { get { return FromHtml("#FFE75480"); } } + public static XLColor DarkPowderBlue { get { return FromHtml("#FF003399"); } } + public static XLColor DarkRaspberry { get { return FromHtml("#FF872657"); } } + public static XLColor DarkScarlet { get { return FromHtml("#FF560319"); } } + public static XLColor DarkSienna { get { return FromHtml("#FF3C1414"); } } + public static XLColor DarkSpringGreen { get { return FromHtml("#FF177245"); } } + public static XLColor DarkTan { get { return FromHtml("#FF918151"); } } + public static XLColor DarkTangerine { get { return FromHtml("#FFFFA812"); } } + public static XLColor DarkTaupe { get { return FromHtml("#FF483C32"); } } + public static XLColor DarkTerraCotta { get { return FromHtml("#FFCC4E5C"); } } + public static XLColor DartmouthGreen { get { return FromHtml("#FF00693E"); } } + public static XLColor DavysGrey { get { return FromHtml("#FF555555"); } } + public static XLColor DebianRed { get { return FromHtml("#FFD70A53"); } } + public static XLColor DeepCarmine { get { return FromHtml("#FFA9203E"); } } + public static XLColor DeepCarminePink { get { return FromHtml("#FFEF3038"); } } + public static XLColor DeepCarrotOrange { get { return FromHtml("#FFE9692C"); } } + public static XLColor DeepCerise { get { return FromHtml("#FFDA3287"); } } + public static XLColor DeepChampagne { get { return FromHtml("#FFFAD6A5"); } } + public static XLColor DeepChestnut { get { return FromHtml("#FFB94E48"); } } + public static XLColor DeepFuchsia { get { return FromHtml("#FFC154C1"); } } + public static XLColor DeepJungleGreen { get { return FromHtml("#FF004B49"); } } + public static XLColor DeepLilac { get { return FromHtml("#FF9955BB"); } } + public static XLColor DeepMagenta { get { return FromHtml("#FFCC00CC"); } } + public static XLColor DeepPeach { get { return FromHtml("#FFFFCBA4"); } } + public static XLColor DeepSaffron { get { return FromHtml("#FFFF9933"); } } + public static XLColor Denim { get { return FromHtml("#FF1560BD"); } } + public static XLColor Desert { get { return FromHtml("#FFC19A6B"); } } + public static XLColor DesertSand { get { return FromHtml("#FFEDC9AF"); } } + public static XLColor DogwoodRose { get { return FromHtml("#FFD71868"); } } + public static XLColor DollarBill { get { return FromHtml("#FF85BB65"); } } + public static XLColor Drab { get { return FromHtml("#FF967117"); } } + public static XLColor DukeBlue { get { return FromHtml("#FF00009C"); } } + public static XLColor EarthYellow { get { return FromHtml("#FFE1A95F"); } } + public static XLColor Ecru { get { return FromHtml("#FFC2B280"); } } + public static XLColor Eggplant { get { return FromHtml("#FF614051"); } } + public static XLColor Eggshell { get { return FromHtml("#FFF0EAD6"); } } + public static XLColor EgyptianBlue { get { return FromHtml("#FF1034A6"); } } + public static XLColor ElectricBlue { get { return FromHtml("#FF7DF9FF"); } } + public static XLColor ElectricCrimson { get { return FromHtml("#FFFF003F"); } } + public static XLColor ElectricIndigo { get { return FromHtml("#FF6F00FF"); } } + public static XLColor ElectricLavender { get { return FromHtml("#FFF4BBFF"); } } + public static XLColor ElectricLime { get { return FromHtml("#FFCCFF00"); } } + public static XLColor ElectricPurple { get { return FromHtml("#FFBF00FF"); } } + public static XLColor ElectricUltramarine { get { return FromHtml("#FF3F00FF"); } } + public static XLColor ElectricViolet { get { return FromHtml("#FF8F00FF"); } } + public static XLColor Emerald { get { return FromHtml("#FF50C878"); } } + public static XLColor EtonBlue { get { return FromHtml("#FF96C8A2"); } } + public static XLColor Fallow { get { return FromHtml("#FFC19A6B"); } } + public static XLColor FaluRed { get { return FromHtml("#FF801818"); } } + public static XLColor Fandango { get { return FromHtml("#FFB53389"); } } + public static XLColor FashionFuchsia { get { return FromHtml("#FFF400A1"); } } + public static XLColor Fawn { get { return FromHtml("#FFE5AA70"); } } + public static XLColor Feldgrau { get { return FromHtml("#FF4D5D53"); } } + public static XLColor FernGreen { get { return FromHtml("#FF4F7942"); } } + public static XLColor FerrariRed { get { return FromHtml("#FFFF2800"); } } + public static XLColor FieldDrab { get { return FromHtml("#FF6C541E"); } } + public static XLColor FireEngineRed { get { return FromHtml("#FFCE2029"); } } + public static XLColor Flame { get { return FromHtml("#FFE25822"); } } + public static XLColor FlamingoPink { get { return FromHtml("#FFFC8EAC"); } } + public static XLColor Flavescent { get { return FromHtml("#FFF7E98E"); } } + public static XLColor Flax { get { return FromHtml("#FFEEDC82"); } } + public static XLColor FluorescentOrange { get { return FromHtml("#FFFFBF00"); } } + public static XLColor FluorescentYellow { get { return FromHtml("#FFCCFF00"); } } + public static XLColor Folly { get { return FromHtml("#FFFF004F"); } } + public static XLColor ForestGreenTraditional { get { return FromHtml("#FF014421"); } } + public static XLColor FrenchBeige { get { return FromHtml("#FFA67B5B"); } } + public static XLColor FrenchBlue { get { return FromHtml("#FF0072BB"); } } + public static XLColor FrenchLilac { get { return FromHtml("#FF86608E"); } } + public static XLColor FrenchRose { get { return FromHtml("#FFF64A8A"); } } + public static XLColor FuchsiaPink { get { return FromHtml("#FFFF77FF"); } } + public static XLColor Fulvous { get { return FromHtml("#FFE48400"); } } + public static XLColor FuzzyWuzzy { get { return FromHtml("#FFCC6666"); } } + public static XLColor Gamboge { get { return FromHtml("#FFE49B0F"); } } + public static XLColor Ginger { get { return FromHtml("#FFF9F9FF"); } } + public static XLColor Glaucous { get { return FromHtml("#FF6082B6"); } } + public static XLColor GoldenBrown { get { return FromHtml("#FF996515"); } } + public static XLColor GoldenPoppy { get { return FromHtml("#FFFCC200"); } } + public static XLColor GoldenYellow { get { return FromHtml("#FFFFDF00"); } } + public static XLColor GoldMetallic { get { return FromHtml("#FFD4AF37"); } } + public static XLColor GrannySmithApple { get { return FromHtml("#FFA8E4A0"); } } + public static XLColor GrayAsparagus { get { return FromHtml("#FF465945"); } } + public static XLColor GreenPigment { get { return FromHtml("#FF00A550"); } } + public static XLColor GreenRyb { get { return FromHtml("#FF66B032"); } } + public static XLColor Grullo { get { return FromHtml("#FFA99A86"); } } + public static XLColor HalayaUbe { get { return FromHtml("#FF663854"); } } + public static XLColor HanBlue { get { return FromHtml("#FF446CCF"); } } + public static XLColor HanPurple { get { return FromHtml("#FF5218FA"); } } + public static XLColor HansaYellow { get { return FromHtml("#FFE9D66B"); } } + public static XLColor Harlequin { get { return FromHtml("#FF3FFF00"); } } + public static XLColor HarvardCrimson { get { return FromHtml("#FFC90016"); } } + public static XLColor HarvestGold { get { return FromHtml("#FFDA9100"); } } + public static XLColor Heliotrope { get { return FromHtml("#FFDF73FF"); } } + public static XLColor HollywoodCerise { get { return FromHtml("#FFF400A1"); } } + public static XLColor HookersGreen { get { return FromHtml("#FF007000"); } } + public static XLColor HotMagenta { get { return FromHtml("#FFFF1DCE"); } } + public static XLColor HunterGreen { get { return FromHtml("#FF355E3B"); } } + public static XLColor Iceberg { get { return FromHtml("#FF71A6D2"); } } + public static XLColor Icterine { get { return FromHtml("#FFFCF75E"); } } + public static XLColor Inchworm { get { return FromHtml("#FFB2EC5D"); } } + public static XLColor IndiaGreen { get { return FromHtml("#FF138808"); } } + public static XLColor IndianYellow { get { return FromHtml("#FFE3A857"); } } + public static XLColor IndigoDye { get { return FromHtml("#FF00416A"); } } + public static XLColor InternationalKleinBlue { get { return FromHtml("#FF002FA7"); } } + public static XLColor InternationalOrange { get { return FromHtml("#FFFF4F00"); } } + public static XLColor Iris { get { return FromHtml("#FF5A4FCF"); } } + public static XLColor Isabelline { get { return FromHtml("#FFF4F0EC"); } } + public static XLColor IslamicGreen { get { return FromHtml("#FF009000"); } } + public static XLColor Jade { get { return FromHtml("#FF00A86B"); } } + public static XLColor Jasper { get { return FromHtml("#FFD73B3E"); } } + public static XLColor JazzberryJam { get { return FromHtml("#FFA50B5E"); } } + public static XLColor Jonquil { get { return FromHtml("#FFFADA5E"); } } + public static XLColor JuneBud { get { return FromHtml("#FFBDDA57"); } } + public static XLColor JungleGreen { get { return FromHtml("#FF29AB87"); } } + public static XLColor KellyGreen { get { return FromHtml("#FF4CBB17"); } } + public static XLColor KhakiHtmlCssKhaki { get { return FromHtml("#FFC3B091"); } } + public static XLColor LanguidLavender { get { return FromHtml("#FFD6CADD"); } } + public static XLColor LapisLazuli { get { return FromHtml("#FF26619C"); } } + public static XLColor LaSalleGreen { get { return FromHtml("#FF087830"); } } + public static XLColor LaserLemon { get { return FromHtml("#FFFEFE22"); } } + public static XLColor Lava { get { return FromHtml("#FFCF1020"); } } + public static XLColor LavenderBlue { get { return FromHtml("#FFCCCCFF"); } } + public static XLColor LavenderFloral { get { return FromHtml("#FFB57EDC"); } } + public static XLColor LavenderGray { get { return FromHtml("#FFC4C3D0"); } } + public static XLColor LavenderIndigo { get { return FromHtml("#FF9457EB"); } } + public static XLColor LavenderPink { get { return FromHtml("#FFFBAED2"); } } + public static XLColor LavenderPurple { get { return FromHtml("#FF967BB6"); } } + public static XLColor LavenderRose { get { return FromHtml("#FFFBA0E3"); } } + public static XLColor Lemon { get { return FromHtml("#FFFFF700"); } } + public static XLColor LightApricot { get { return FromHtml("#FFFDD5B1"); } } + public static XLColor LightBrown { get { return FromHtml("#FFB5651D"); } } + public static XLColor LightCarminePink { get { return FromHtml("#FFE66771"); } } + public static XLColor LightCornflowerBlue { get { return FromHtml("#FF93CCEA"); } } + public static XLColor LightFuchsiaPink { get { return FromHtml("#FFF984EF"); } } + public static XLColor LightMauve { get { return FromHtml("#FFDCD0FF"); } } + public static XLColor LightPastelPurple { get { return FromHtml("#FFB19CD9"); } } + public static XLColor LightSalmonPink { get { return FromHtml("#FFFF9999"); } } + public static XLColor LightTaupe { get { return FromHtml("#FFB38B6D"); } } + public static XLColor LightThulianPink { get { return FromHtml("#FFE68FAC"); } } + public static XLColor LightYellow1 { get { return FromHtml("#FFFFFFED"); } } + public static XLColor Lilac { get { return FromHtml("#FFC8A2C8"); } } + public static XLColor LimeColorWheel { get { return FromHtml("#FFBFFF00"); } } + public static XLColor LincolnGreen { get { return FromHtml("#FF195905"); } } + public static XLColor Liver { get { return FromHtml("#FF534B4F"); } } + public static XLColor Lust { get { return FromHtml("#FFE62020"); } } + public static XLColor MacaroniAndCheese { get { return FromHtml("#FFFFBD88"); } } + public static XLColor MagentaDye { get { return FromHtml("#FFCA1F7B"); } } + public static XLColor MagentaProcess { get { return FromHtml("#FFFF0090"); } } + public static XLColor MagicMint { get { return FromHtml("#FFAAF0D1"); } } + public static XLColor Magnolia { get { return FromHtml("#FFF8F4FF"); } } + public static XLColor Mahogany { get { return FromHtml("#FFC04000"); } } + public static XLColor Maize { get { return FromHtml("#FFFBEC5D"); } } + public static XLColor MajorelleBlue { get { return FromHtml("#FF6050DC"); } } + public static XLColor Malachite { get { return FromHtml("#FF0BDA51"); } } + public static XLColor Manatee { get { return FromHtml("#FF979AAA"); } } + public static XLColor MangoTango { get { return FromHtml("#FFFF8243"); } } + public static XLColor MaroonX11 { get { return FromHtml("#FFB03060"); } } + public static XLColor Mauve { get { return FromHtml("#FFE0B0FF"); } } + public static XLColor Mauvelous { get { return FromHtml("#FFEF98AA"); } } + public static XLColor MauveTaupe { get { return FromHtml("#FF915F6D"); } } + public static XLColor MayaBlue { get { return FromHtml("#FF73C2FB"); } } + public static XLColor MeatBrown { get { return FromHtml("#FFE5B73B"); } } + public static XLColor MediumAquamarine1 { get { return FromHtml("#FF66DDAA"); } } + public static XLColor MediumCandyAppleRed { get { return FromHtml("#FFE2062C"); } } + public static XLColor MediumCarmine { get { return FromHtml("#FFAF4035"); } } + public static XLColor MediumChampagne { get { return FromHtml("#FFF3E5AB"); } } + public static XLColor MediumElectricBlue { get { return FromHtml("#FF035096"); } } + public static XLColor MediumJungleGreen { get { return FromHtml("#FF1C352D"); } } + public static XLColor MediumPersianBlue { get { return FromHtml("#FF0067A5"); } } + public static XLColor MediumRedViolet { get { return FromHtml("#FFBB3385"); } } + public static XLColor MediumSpringBud { get { return FromHtml("#FFC9DC87"); } } + public static XLColor MediumTaupe { get { return FromHtml("#FF674C47"); } } + public static XLColor Melon { get { return FromHtml("#FFFDBCB4"); } } + public static XLColor MidnightGreenEagleGreen { get { return FromHtml("#FF004953"); } } + public static XLColor MikadoYellow { get { return FromHtml("#FFFFC40C"); } } + public static XLColor Mint { get { return FromHtml("#FF3EB489"); } } + public static XLColor MintGreen { get { return FromHtml("#FF98FF98"); } } + public static XLColor ModeBeige { get { return FromHtml("#FF967117"); } } + public static XLColor MoonstoneBlue { get { return FromHtml("#FF73A9C2"); } } + public static XLColor MordantRed19 { get { return FromHtml("#FFAE0C00"); } } + public static XLColor MossGreen { get { return FromHtml("#FFADDFAD"); } } + public static XLColor MountainMeadow { get { return FromHtml("#FF30BA8F"); } } + public static XLColor MountbattenPink { get { return FromHtml("#FF997A8D"); } } + public static XLColor MsuGreen { get { return FromHtml("#FF18453B"); } } + public static XLColor Mulberry { get { return FromHtml("#FFC54B8C"); } } + public static XLColor Mustard { get { return FromHtml("#FFFFDB58"); } } + public static XLColor Myrtle { get { return FromHtml("#FF21421E"); } } + public static XLColor NadeshikoPink { get { return FromHtml("#FFF6ADC6"); } } + public static XLColor NapierGreen { get { return FromHtml("#FF2A8000"); } } + public static XLColor NaplesYellow { get { return FromHtml("#FFFADA5E"); } } + public static XLColor NeonCarrot { get { return FromHtml("#FFFFA343"); } } + public static XLColor NeonFuchsia { get { return FromHtml("#FFFE59C2"); } } + public static XLColor NeonGreen { get { return FromHtml("#FF39FF14"); } } + public static XLColor NonPhotoBlue { get { return FromHtml("#FFA4DDED"); } } + public static XLColor OceanBoatBlue { get { return FromHtml("#FFCC7422"); } } + public static XLColor Ochre { get { return FromHtml("#FFCC7722"); } } + public static XLColor OldGold { get { return FromHtml("#FFCFB53B"); } } + public static XLColor OldLavender { get { return FromHtml("#FF796878"); } } + public static XLColor OldMauve { get { return FromHtml("#FF673147"); } } + public static XLColor OldRose { get { return FromHtml("#FFC08081"); } } + public static XLColor OliveDrab7 { get { return FromHtml("#FF3C341F"); } } + public static XLColor Olivine { get { return FromHtml("#FF9AB973"); } } + public static XLColor Onyx { get { return FromHtml("#FF0F0F0F"); } } + public static XLColor OperaMauve { get { return FromHtml("#FFB784A7"); } } + public static XLColor OrangeColorWheel { get { return FromHtml("#FFFF7F00"); } } + public static XLColor OrangePeel { get { return FromHtml("#FFFF9F00"); } } + public static XLColor OrangeRyb { get { return FromHtml("#FFFB9902"); } } + public static XLColor OtterBrown { get { return FromHtml("#FF654321"); } } + public static XLColor OuCrimsonRed { get { return FromHtml("#FF990000"); } } + public static XLColor OuterSpace { get { return FromHtml("#FF414A4C"); } } + public static XLColor OutrageousOrange { get { return FromHtml("#FFFF6E4A"); } } + public static XLColor OxfordBlue { get { return FromHtml("#FF002147"); } } + public static XLColor PakistanGreen { get { return FromHtml("#FF00421B"); } } + public static XLColor PalatinateBlue { get { return FromHtml("#FF273BE2"); } } + public static XLColor PalatinatePurple { get { return FromHtml("#FF682860"); } } + public static XLColor PaleAqua { get { return FromHtml("#FFBCD4E6"); } } + public static XLColor PaleBrown { get { return FromHtml("#FF987654"); } } + public static XLColor PaleCarmine { get { return FromHtml("#FFAF4035"); } } + public static XLColor PaleCerulean { get { return FromHtml("#FF9BC4E2"); } } + public static XLColor PaleChestnut { get { return FromHtml("#FFDDADAF"); } } + public static XLColor PaleCopper { get { return FromHtml("#FFDA8A67"); } } + public static XLColor PaleCornflowerBlue { get { return FromHtml("#FFABCDEF"); } } + public static XLColor PaleGold { get { return FromHtml("#FFE6BE8A"); } } + public static XLColor PaleMagenta { get { return FromHtml("#FFF984E5"); } } + public static XLColor PalePink { get { return FromHtml("#FFFADADD"); } } + public static XLColor PaleRobinEggBlue { get { return FromHtml("#FF96DED1"); } } + public static XLColor PaleSilver { get { return FromHtml("#FFC9C0BB"); } } + public static XLColor PaleSpringBud { get { return FromHtml("#FFECEBBD"); } } + public static XLColor PaleTaupe { get { return FromHtml("#FFBC987E"); } } + public static XLColor PansyPurple { get { return FromHtml("#FF78184A"); } } + public static XLColor ParisGreen { get { return FromHtml("#FF50C878"); } } + public static XLColor PastelBlue { get { return FromHtml("#FFAEC6CF"); } } + public static XLColor PastelBrown { get { return FromHtml("#FF836953"); } } + public static XLColor PastelGray { get { return FromHtml("#FFCFCFC4"); } } + public static XLColor PastelGreen { get { return FromHtml("#FF77DD77"); } } + public static XLColor PastelMagenta { get { return FromHtml("#FFF49AC2"); } } + public static XLColor PastelOrange { get { return FromHtml("#FFFFB347"); } } + public static XLColor PastelPink { get { return FromHtml("#FFFFD1DC"); } } + public static XLColor PastelPurple { get { return FromHtml("#FFB39EB5"); } } + public static XLColor PastelRed { get { return FromHtml("#FFFF6961"); } } + public static XLColor PastelViolet { get { return FromHtml("#FFCB99C9"); } } + public static XLColor PastelYellow { get { return FromHtml("#FFFDFD96"); } } + public static XLColor PaynesGrey { get { return FromHtml("#FF40404F"); } } + public static XLColor Peach { get { return FromHtml("#FFFFE5B4"); } } + public static XLColor PeachOrange { get { return FromHtml("#FFFFCC99"); } } + public static XLColor PeachYellow { get { return FromHtml("#FFFADFAD"); } } + public static XLColor Pear { get { return FromHtml("#FFD1E231"); } } + public static XLColor Pearl { get { return FromHtml("#FFF0EAD6"); } } + public static XLColor Peridot { get { return FromHtml("#FFE6E200"); } } + public static XLColor Periwinkle { get { return FromHtml("#FFCCCCFF"); } } + public static XLColor PersianBlue { get { return FromHtml("#FF1C39BB"); } } + public static XLColor PersianGreen { get { return FromHtml("#FF00A693"); } } + public static XLColor PersianIndigo { get { return FromHtml("#FF32127A"); } } + public static XLColor PersianOrange { get { return FromHtml("#FFD99058"); } } + public static XLColor PersianPink { get { return FromHtml("#FFF77FBE"); } } + public static XLColor PersianPlum { get { return FromHtml("#FF701C1C"); } } + public static XLColor PersianRed { get { return FromHtml("#FFCC3333"); } } + public static XLColor PersianRose { get { return FromHtml("#FFFE28A2"); } } + public static XLColor Persimmon { get { return FromHtml("#FFEC5800"); } } + public static XLColor Phlox { get { return FromHtml("#FFDF00FF"); } } + public static XLColor PhthaloBlue { get { return FromHtml("#FF000F89"); } } + public static XLColor PhthaloGreen { get { return FromHtml("#FF123524"); } } + public static XLColor PiggyPink { get { return FromHtml("#FFFDDDE6"); } } + public static XLColor PineGreen { get { return FromHtml("#FF01796F"); } } + public static XLColor PinkOrange { get { return FromHtml("#FFFF9966"); } } + public static XLColor PinkPearl { get { return FromHtml("#FFE7ACCF"); } } + public static XLColor PinkSherbet { get { return FromHtml("#FFF78FA7"); } } + public static XLColor Pistachio { get { return FromHtml("#FF93C572"); } } + public static XLColor Platinum { get { return FromHtml("#FFE5E4E2"); } } + public static XLColor PlumTraditional { get { return FromHtml("#FF8E4585"); } } + public static XLColor PortlandOrange { get { return FromHtml("#FFFF5A36"); } } + public static XLColor PrincetonOrange { get { return FromHtml("#FFFF8F00"); } } + public static XLColor Prune { get { return FromHtml("#FF701C1C"); } } + public static XLColor PrussianBlue { get { return FromHtml("#FF003153"); } } + public static XLColor PsychedelicPurple { get { return FromHtml("#FFDF00FF"); } } + public static XLColor Puce { get { return FromHtml("#FFCC8899"); } } + public static XLColor Pumpkin { get { return FromHtml("#FFFF7518"); } } + public static XLColor PurpleHeart { get { return FromHtml("#FF69359C"); } } + public static XLColor PurpleMountainMajesty { get { return FromHtml("#FF9678B6"); } } + public static XLColor PurpleMunsell { get { return FromHtml("#FF9F00C5"); } } + public static XLColor PurplePizzazz { get { return FromHtml("#FFFE4EDA"); } } + public static XLColor PurpleTaupe { get { return FromHtml("#FF50404D"); } } + public static XLColor PurpleX11 { get { return FromHtml("#FFA020F0"); } } + public static XLColor RadicalRed { get { return FromHtml("#FFFF355E"); } } + public static XLColor Raspberry { get { return FromHtml("#FFE30B5D"); } } + public static XLColor RaspberryGlace { get { return FromHtml("#FF915F6D"); } } + public static XLColor RaspberryPink { get { return FromHtml("#FFE25098"); } } + public static XLColor RaspberryRose { get { return FromHtml("#FFB3446C"); } } + public static XLColor RawUmber { get { return FromHtml("#FF826644"); } } + public static XLColor RazzleDazzleRose { get { return FromHtml("#FFFF33CC"); } } + public static XLColor Razzmatazz { get { return FromHtml("#FFE3256B"); } } + public static XLColor RedMunsell { get { return FromHtml("#FFF2003C"); } } + public static XLColor RedNcs { get { return FromHtml("#FFC40233"); } } + public static XLColor RedPigment { get { return FromHtml("#FFED1C24"); } } + public static XLColor RedRyb { get { return FromHtml("#FFFE2712"); } } + public static XLColor Redwood { get { return FromHtml("#FFAB4E52"); } } + public static XLColor Regalia { get { return FromHtml("#FF522D80"); } } + public static XLColor RichBlack { get { return FromHtml("#FF004040"); } } + public static XLColor RichBrilliantLavender { get { return FromHtml("#FFF1A7FE"); } } + public static XLColor RichCarmine { get { return FromHtml("#FFD70040"); } } + public static XLColor RichElectricBlue { get { return FromHtml("#FF0892D0"); } } + public static XLColor RichLavender { get { return FromHtml("#FFA76BCF"); } } + public static XLColor RichLilac { get { return FromHtml("#FFB666D2"); } } + public static XLColor RichMaroon { get { return FromHtml("#FFB03060"); } } + public static XLColor RifleGreen { get { return FromHtml("#FF414833"); } } + public static XLColor RobinEggBlue { get { return FromHtml("#FF00CCCC"); } } + public static XLColor Rose { get { return FromHtml("#FFFF007F"); } } + public static XLColor RoseBonbon { get { return FromHtml("#FFF9429E"); } } + public static XLColor RoseEbony { get { return FromHtml("#FF674846"); } } + public static XLColor RoseGold { get { return FromHtml("#FFB76E79"); } } + public static XLColor RoseMadder { get { return FromHtml("#FFE32636"); } } + public static XLColor RosePink { get { return FromHtml("#FFFF66CC"); } } + public static XLColor RoseQuartz { get { return FromHtml("#FFAA98A9"); } } + public static XLColor RoseTaupe { get { return FromHtml("#FF905D5D"); } } + public static XLColor RoseVale { get { return FromHtml("#FFAB4E52"); } } + public static XLColor Rosewood { get { return FromHtml("#FF65000B"); } } + public static XLColor RossoCorsa { get { return FromHtml("#FFD40000"); } } + public static XLColor RoyalAzure { get { return FromHtml("#FF0038A8"); } } + public static XLColor RoyalBlueTraditional { get { return FromHtml("#FF002366"); } } + public static XLColor RoyalFuchsia { get { return FromHtml("#FFCA2C92"); } } + public static XLColor RoyalPurple { get { return FromHtml("#FF7851A9"); } } + public static XLColor Ruby { get { return FromHtml("#FFE0115F"); } } + public static XLColor Ruddy { get { return FromHtml("#FFFF0028"); } } + public static XLColor RuddyBrown { get { return FromHtml("#FFBB6528"); } } + public static XLColor RuddyPink { get { return FromHtml("#FFE18E96"); } } + public static XLColor Rufous { get { return FromHtml("#FFA81C07"); } } + public static XLColor Russet { get { return FromHtml("#FF80461B"); } } + public static XLColor Rust { get { return FromHtml("#FFB7410E"); } } + public static XLColor SacramentoStateGreen { get { return FromHtml("#FF00563F"); } } + public static XLColor SafetyOrangeBlazeOrange { get { return FromHtml("#FFFF6700"); } } + public static XLColor Saffron { get { return FromHtml("#FFF4C430"); } } + public static XLColor Salmon1 { get { return FromHtml("#FFFF8C69"); } } + public static XLColor SalmonPink { get { return FromHtml("#FFFF91A4"); } } + public static XLColor Sand { get { return FromHtml("#FFC2B280"); } } + public static XLColor SandDune { get { return FromHtml("#FF967117"); } } + public static XLColor Sandstorm { get { return FromHtml("#FFECD540"); } } + public static XLColor SandyTaupe { get { return FromHtml("#FF967117"); } } + public static XLColor Sangria { get { return FromHtml("#FF92000A"); } } + public static XLColor SapGreen { get { return FromHtml("#FF507D2A"); } } + public static XLColor Sapphire { get { return FromHtml("#FF082567"); } } + public static XLColor SatinSheenGold { get { return FromHtml("#FFCBA135"); } } + public static XLColor Scarlet { get { return FromHtml("#FFFF2000"); } } + public static XLColor SchoolBusYellow { get { return FromHtml("#FFFFD800"); } } + public static XLColor ScreaminGreen { get { return FromHtml("#FF76FF7A"); } } + public static XLColor SealBrown { get { return FromHtml("#FF321414"); } } + public static XLColor SelectiveYellow { get { return FromHtml("#FFFFBA00"); } } + public static XLColor Sepia { get { return FromHtml("#FF704214"); } } + public static XLColor Shadow { get { return FromHtml("#FF8A795D"); } } + public static XLColor ShamrockGreen { get { return FromHtml("#FF009E60"); } } + public static XLColor ShockingPink { get { return FromHtml("#FFFC0FC0"); } } + public static XLColor Sienna1 { get { return FromHtml("#FF882D17"); } } + public static XLColor Sinopia { get { return FromHtml("#FFCB410B"); } } + public static XLColor Skobeloff { get { return FromHtml("#FF007474"); } } + public static XLColor SkyMagenta { get { return FromHtml("#FFCF71AF"); } } + public static XLColor SmaltDarkPowderBlue { get { return FromHtml("#FF003399"); } } + public static XLColor SmokeyTopaz { get { return FromHtml("#FF933D41"); } } + public static XLColor SmokyBlack { get { return FromHtml("#FF100C08"); } } + public static XLColor SpiroDiscoBall { get { return FromHtml("#FF0FC0FC"); } } + public static XLColor SplashedWhite { get { return FromHtml("#FFFEFDFF"); } } + public static XLColor SpringBud { get { return FromHtml("#FFA7FC00"); } } + public static XLColor StPatricksBlue { get { return FromHtml("#FF23297A"); } } + public static XLColor StilDeGrainYellow { get { return FromHtml("#FFFADA5E"); } } + public static XLColor Straw { get { return FromHtml("#FFE4D96F"); } } + public static XLColor Sunglow { get { return FromHtml("#FFFFCC33"); } } + public static XLColor Sunset { get { return FromHtml("#FFFAD6A5"); } } + public static XLColor Tangelo { get { return FromHtml("#FFF94D00"); } } + public static XLColor Tangerine { get { return FromHtml("#FFF28500"); } } + public static XLColor TangerineYellow { get { return FromHtml("#FFFFCC00"); } } + public static XLColor Taupe { get { return FromHtml("#FF483C32"); } } + public static XLColor TaupeGray { get { return FromHtml("#FF8B8589"); } } + public static XLColor TeaGreen { get { return FromHtml("#FFD0F0C0"); } } + public static XLColor TealBlue { get { return FromHtml("#FF367588"); } } + public static XLColor TealGreen { get { return FromHtml("#FF006D5B"); } } + public static XLColor TeaRoseOrange { get { return FromHtml("#FFF88379"); } } + public static XLColor TeaRoseRose { get { return FromHtml("#FFF4C2C2"); } } + public static XLColor TennéTawny { get { return FromHtml("#FFCD5700"); } } + public static XLColor TerraCotta { get { return FromHtml("#FFE2725B"); } } + public static XLColor ThulianPink { get { return FromHtml("#FFDE6FA1"); } } + public static XLColor TickleMePink { get { return FromHtml("#FFFC89AC"); } } + public static XLColor TiffanyBlue { get { return FromHtml("#FF0ABAB5"); } } + public static XLColor TigersEye { get { return FromHtml("#FFE08D3C"); } } + public static XLColor Timberwolf { get { return FromHtml("#FFDBD7D2"); } } + public static XLColor TitaniumYellow { get { return FromHtml("#FFEEE600"); } } + public static XLColor Toolbox { get { return FromHtml("#FF746CC0"); } } + public static XLColor TractorRed { get { return FromHtml("#FFFD0E35"); } } + public static XLColor TropicalRainForest { get { return FromHtml("#FF00755E"); } } + public static XLColor TuftsBlue { get { return FromHtml("#FF417DC1"); } } + public static XLColor Tumbleweed { get { return FromHtml("#FFDEAA88"); } } + public static XLColor TurkishRose { get { return FromHtml("#FFB57281"); } } + public static XLColor Turquoise1 { get { return FromHtml("#FF30D5C8"); } } + public static XLColor TurquoiseBlue { get { return FromHtml("#FF00FFEF"); } } + public static XLColor TurquoiseGreen { get { return FromHtml("#FFA0D6B4"); } } + public static XLColor TuscanRed { get { return FromHtml("#FF823535"); } } + public static XLColor TwilightLavender { get { return FromHtml("#FF8A496B"); } } + public static XLColor TyrianPurple { get { return FromHtml("#FF66023C"); } } + public static XLColor UaBlue { get { return FromHtml("#FF0033AA"); } } + public static XLColor UaRed { get { return FromHtml("#FFD9004C"); } } + public static XLColor Ube { get { return FromHtml("#FF8878C3"); } } + public static XLColor UclaBlue { get { return FromHtml("#FF536895"); } } + public static XLColor UclaGold { get { return FromHtml("#FFFFB300"); } } + public static XLColor UfoGreen { get { return FromHtml("#FF3CD070"); } } + public static XLColor Ultramarine { get { return FromHtml("#FF120A8F"); } } + public static XLColor UltramarineBlue { get { return FromHtml("#FF4166F5"); } } + public static XLColor UltraPink { get { return FromHtml("#FFFF6FFF"); } } + public static XLColor Umber { get { return FromHtml("#FF635147"); } } + public static XLColor UnitedNationsBlue { get { return FromHtml("#FF5B92E5"); } } + public static XLColor UnmellowYellow { get { return FromHtml("#FFFFFF66"); } } + public static XLColor UpForestGreen { get { return FromHtml("#FF014421"); } } + public static XLColor UpMaroon { get { return FromHtml("#FF7B1113"); } } + public static XLColor UpsdellRed { get { return FromHtml("#FFAE2029"); } } + public static XLColor Urobilin { get { return FromHtml("#FFE1AD21"); } } + public static XLColor UscCardinal { get { return FromHtml("#FF990000"); } } + public static XLColor UscGold { get { return FromHtml("#FFFFCC00"); } } + public static XLColor UtahCrimson { get { return FromHtml("#FFD3003F"); } } + public static XLColor Vanilla { get { return FromHtml("#FFF3E5AB"); } } + public static XLColor VegasGold { get { return FromHtml("#FFC5B358"); } } + public static XLColor VenetianRed { get { return FromHtml("#FFC80815"); } } + public static XLColor Verdigris { get { return FromHtml("#FF43B3AE"); } } + public static XLColor Vermilion { get { return FromHtml("#FFE34234"); } } + public static XLColor Veronica { get { return FromHtml("#FFA020F0"); } } + public static XLColor Violet1 { get { return FromHtml("#FF8F00FF"); } } + public static XLColor VioletColorWheel { get { return FromHtml("#FF7F00FF"); } } + public static XLColor VioletRyb { get { return FromHtml("#FF8601AF"); } } + public static XLColor Viridian { get { return FromHtml("#FF40826D"); } } + public static XLColor VividAuburn { get { return FromHtml("#FF922724"); } } + public static XLColor VividBurgundy { get { return FromHtml("#FF9F1D35"); } } + public static XLColor VividCerise { get { return FromHtml("#FFDA1D81"); } } + public static XLColor VividTangerine { get { return FromHtml("#FFFFA089"); } } + public static XLColor VividViolet { get { return FromHtml("#FF9F00FF"); } } + public static XLColor WarmBlack { get { return FromHtml("#FF004242"); } } + public static XLColor Wenge { get { return FromHtml("#FF645452"); } } + public static XLColor WildBlueYonder { get { return FromHtml("#FFA2ADD0"); } } + public static XLColor WildStrawberry { get { return FromHtml("#FFFF43A4"); } } + public static XLColor WildWatermelon { get { return FromHtml("#FFFC6C85"); } } + public static XLColor Wisteria { get { return FromHtml("#FFC9A0DC"); } } + public static XLColor Xanadu { get { return FromHtml("#FF738678"); } } + public static XLColor YaleBlue { get { return FromHtml("#FF0F4D92"); } } + public static XLColor YellowMunsell { get { return FromHtml("#FFEFCC00"); } } + public static XLColor YellowNcs { get { return FromHtml("#FFFFD300"); } } + public static XLColor YellowProcess { get { return FromHtml("#FFFFEF00"); } } + public static XLColor YellowRyb { get { return FromHtml("#FFFEFE33"); } } + public static XLColor Zaffre { get { return FromHtml("#FF0014A8"); } } + public static XLColor ZinnwalditeBrown { get { return FromHtml("#FF2C1608"); } } + public static XLColor Transparent { get { return FromColor(Color.Transparent); } } + } +} diff --git a/ClosedXML/Excel/Style/IXLAlignment.cs b/ClosedXML/Excel/Style/IXLAlignment.cs index 9298ada..f516558 100644 --- a/ClosedXML/Excel/Style/IXLAlignment.cs +++ b/ClosedXML/Excel/Style/IXLAlignment.cs @@ -1,91 +1,91 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLAlignmentReadingOrderValues - { - ContextDependent, - LeftToRight, - RightToLeft - } - - public enum XLAlignmentHorizontalValues - { - Center, - CenterContinuous, - Distributed, - Fill, - General, - Justify, - Left, - Right - } - - public enum XLAlignmentVerticalValues - { - Bottom, - Center, - Distributed, - Justify, - Top - } - - public interface IXLAlignment: IEquatable - { - /// - /// Gets or sets the cell's horizontal alignment. - /// - XLAlignmentHorizontalValues Horizontal { get; set; } - - /// - /// Gets or sets the cell's vertical alignment. - /// - XLAlignmentVerticalValues Vertical { get; set; } - - /// - /// Gets or sets the cell's text indentation. - /// - Int32 Indent { get; set; } - /// - /// Gets or sets whether the cell's last line is justified or not. - /// - Boolean JustifyLastLine { get; set; } - /// - /// Gets or sets the cell's reading order. - /// - XLAlignmentReadingOrderValues ReadingOrder { get; set; } - /// - /// Gets or sets the cell's relative indent. - /// - Int32 RelativeIndent { get; set; } - /// - /// Gets or sets whether the cell's font size should decrease to fit the contents. - /// - Boolean ShrinkToFit { get; set; } - /// - /// Gets or sets the cell's text rotation. - /// - Int32 TextRotation { get; set; } - /// - /// Gets or sets whether the cell's text should wrap if it doesn't fit. - /// - Boolean WrapText { get; set; } - /// - /// Gets or sets wheter the cell's text should be displayed from to to bottom - /// (as opposed to the normal left to right). - /// - Boolean TopToBottom { get; set; } - - IXLStyle SetHorizontal(XLAlignmentHorizontalValues value); - IXLStyle SetVertical(XLAlignmentVerticalValues value); - IXLStyle SetIndent(Int32 value); - IXLStyle SetJustifyLastLine(); IXLStyle SetJustifyLastLine(Boolean value); - IXLStyle SetReadingOrder(XLAlignmentReadingOrderValues value); - IXLStyle SetRelativeIndent(Int32 value); - IXLStyle SetShrinkToFit(); IXLStyle SetShrinkToFit(Boolean value); - IXLStyle SetTextRotation(Int32 value); - IXLStyle SetWrapText(); IXLStyle SetWrapText(Boolean value); - IXLStyle SetTopToBottom(); IXLStyle SetTopToBottom(Boolean value); - - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLAlignmentReadingOrderValues + { + ContextDependent, + LeftToRight, + RightToLeft + } + + public enum XLAlignmentHorizontalValues + { + Center, + CenterContinuous, + Distributed, + Fill, + General, + Justify, + Left, + Right + } + + public enum XLAlignmentVerticalValues + { + Bottom, + Center, + Distributed, + Justify, + Top + } + + public interface IXLAlignment: IEquatable + { + /// + /// Gets or sets the cell's horizontal alignment. + /// + XLAlignmentHorizontalValues Horizontal { get; set; } + + /// + /// Gets or sets the cell's vertical alignment. + /// + XLAlignmentVerticalValues Vertical { get; set; } + + /// + /// Gets or sets the cell's text indentation. + /// + Int32 Indent { get; set; } + /// + /// Gets or sets whether the cell's last line is justified or not. + /// + Boolean JustifyLastLine { get; set; } + /// + /// Gets or sets the cell's reading order. + /// + XLAlignmentReadingOrderValues ReadingOrder { get; set; } + /// + /// Gets or sets the cell's relative indent. + /// + Int32 RelativeIndent { get; set; } + /// + /// Gets or sets whether the cell's font size should decrease to fit the contents. + /// + Boolean ShrinkToFit { get; set; } + /// + /// Gets or sets the cell's text rotation. + /// + Int32 TextRotation { get; set; } + /// + /// Gets or sets whether the cell's text should wrap if it doesn't fit. + /// + Boolean WrapText { get; set; } + /// + /// Gets or sets wheter the cell's text should be displayed from to to bottom + /// (as opposed to the normal left to right). + /// + Boolean TopToBottom { get; set; } + + IXLStyle SetHorizontal(XLAlignmentHorizontalValues value); + IXLStyle SetVertical(XLAlignmentVerticalValues value); + IXLStyle SetIndent(Int32 value); + IXLStyle SetJustifyLastLine(); IXLStyle SetJustifyLastLine(Boolean value); + IXLStyle SetReadingOrder(XLAlignmentReadingOrderValues value); + IXLStyle SetRelativeIndent(Int32 value); + IXLStyle SetShrinkToFit(); IXLStyle SetShrinkToFit(Boolean value); + IXLStyle SetTextRotation(Int32 value); + IXLStyle SetWrapText(); IXLStyle SetWrapText(Boolean value); + IXLStyle SetTopToBottom(); IXLStyle SetTopToBottom(Boolean value); + + } +} diff --git a/ClosedXML/Excel/Style/IXLBorder.cs b/ClosedXML/Excel/Style/IXLBorder.cs index ed98ffe..e83c61c 100644 --- a/ClosedXML/Excel/Style/IXLBorder.cs +++ b/ClosedXML/Excel/Style/IXLBorder.cs @@ -1,61 +1,61 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLBorderStyleValues - { - DashDot, - DashDotDot, - Dashed, - Dotted, - Double, - Hair, - Medium, - MediumDashDot, - MediumDashDotDot, - MediumDashed, - None, - SlantDashDot, - Thick, - Thin - } - public interface IXLBorder: IEquatable - { - XLBorderStyleValues OutsideBorder { set; } - XLColor OutsideBorderColor { set; } - XLBorderStyleValues InsideBorder { set; } - XLColor InsideBorderColor { set; } - - XLBorderStyleValues LeftBorder { get; set; } - XLColor LeftBorderColor { get; set; } - XLBorderStyleValues RightBorder { get; set; } - XLColor RightBorderColor { get; set; } - XLBorderStyleValues TopBorder { get; set; } - XLColor TopBorderColor { get; set; } - XLBorderStyleValues BottomBorder { get; set; } - XLColor BottomBorderColor { get; set; } - Boolean DiagonalUp { get; set; } - Boolean DiagonalDown { get; set; } - XLBorderStyleValues DiagonalBorder { get; set; } - XLColor DiagonalBorderColor { get; set; } - - IXLStyle SetOutsideBorder(XLBorderStyleValues value); - IXLStyle SetOutsideBorderColor(XLColor value); - IXLStyle SetInsideBorder(XLBorderStyleValues value); - IXLStyle SetInsideBorderColor(XLColor value); - - IXLStyle SetLeftBorder(XLBorderStyleValues value); - IXLStyle SetLeftBorderColor(XLColor value); - IXLStyle SetRightBorder(XLBorderStyleValues value); - IXLStyle SetRightBorderColor(XLColor value); - IXLStyle SetTopBorder(XLBorderStyleValues value); - IXLStyle SetTopBorderColor(XLColor value); - IXLStyle SetBottomBorder(XLBorderStyleValues value); - IXLStyle SetBottomBorderColor(XLColor value); - IXLStyle SetDiagonalUp(); IXLStyle SetDiagonalUp(Boolean value); - IXLStyle SetDiagonalDown(); IXLStyle SetDiagonalDown(Boolean value); - IXLStyle SetDiagonalBorder(XLBorderStyleValues value); - IXLStyle SetDiagonalBorderColor(XLColor value); - - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLBorderStyleValues + { + DashDot, + DashDotDot, + Dashed, + Dotted, + Double, + Hair, + Medium, + MediumDashDot, + MediumDashDotDot, + MediumDashed, + None, + SlantDashDot, + Thick, + Thin + } + public interface IXLBorder: IEquatable + { + XLBorderStyleValues OutsideBorder { set; } + XLColor OutsideBorderColor { set; } + XLBorderStyleValues InsideBorder { set; } + XLColor InsideBorderColor { set; } + + XLBorderStyleValues LeftBorder { get; set; } + XLColor LeftBorderColor { get; set; } + XLBorderStyleValues RightBorder { get; set; } + XLColor RightBorderColor { get; set; } + XLBorderStyleValues TopBorder { get; set; } + XLColor TopBorderColor { get; set; } + XLBorderStyleValues BottomBorder { get; set; } + XLColor BottomBorderColor { get; set; } + Boolean DiagonalUp { get; set; } + Boolean DiagonalDown { get; set; } + XLBorderStyleValues DiagonalBorder { get; set; } + XLColor DiagonalBorderColor { get; set; } + + IXLStyle SetOutsideBorder(XLBorderStyleValues value); + IXLStyle SetOutsideBorderColor(XLColor value); + IXLStyle SetInsideBorder(XLBorderStyleValues value); + IXLStyle SetInsideBorderColor(XLColor value); + + IXLStyle SetLeftBorder(XLBorderStyleValues value); + IXLStyle SetLeftBorderColor(XLColor value); + IXLStyle SetRightBorder(XLBorderStyleValues value); + IXLStyle SetRightBorderColor(XLColor value); + IXLStyle SetTopBorder(XLBorderStyleValues value); + IXLStyle SetTopBorderColor(XLColor value); + IXLStyle SetBottomBorder(XLBorderStyleValues value); + IXLStyle SetBottomBorderColor(XLColor value); + IXLStyle SetDiagonalUp(); IXLStyle SetDiagonalUp(Boolean value); + IXLStyle SetDiagonalDown(); IXLStyle SetDiagonalDown(Boolean value); + IXLStyle SetDiagonalBorder(XLBorderStyleValues value); + IXLStyle SetDiagonalBorderColor(XLColor value); + + } +} diff --git a/ClosedXML/Excel/Style/IXLFill.cs b/ClosedXML/Excel/Style/IXLFill.cs index 79e495c..b39356e 100644 --- a/ClosedXML/Excel/Style/IXLFill.cs +++ b/ClosedXML/Excel/Style/IXLFill.cs @@ -1,41 +1,41 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLFillPatternValues - { - DarkDown, - DarkGray, - DarkGrid, - DarkHorizontal, - DarkTrellis, - DarkUp, - DarkVertical, - Gray0625, - Gray125, - LightDown, - LightGray, - LightGrid, - LightHorizontal, - LightTrellis, - LightUp, - LightVertical, - MediumGray, - None, - Solid - } - - public interface IXLFill:IEquatable - { - XLColor BackgroundColor { get; set; } - XLColor PatternColor { get; set; } - XLColor PatternBackgroundColor { get; set; } - XLFillPatternValues PatternType { get; set; } - - IXLStyle SetBackgroundColor(XLColor value); - IXLStyle SetPatternColor(XLColor value); - IXLStyle SetPatternBackgroundColor(XLColor value); - IXLStyle SetPatternType(XLFillPatternValues value); - - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLFillPatternValues + { + DarkDown, + DarkGray, + DarkGrid, + DarkHorizontal, + DarkTrellis, + DarkUp, + DarkVertical, + Gray0625, + Gray125, + LightDown, + LightGray, + LightGrid, + LightHorizontal, + LightTrellis, + LightUp, + LightVertical, + MediumGray, + None, + Solid + } + + public interface IXLFill:IEquatable + { + XLColor BackgroundColor { get; set; } + XLColor PatternColor { get; set; } + XLColor PatternBackgroundColor { get; set; } + XLFillPatternValues PatternType { get; set; } + + IXLStyle SetBackgroundColor(XLColor value); + IXLStyle SetPatternColor(XLColor value); + IXLStyle SetPatternBackgroundColor(XLColor value); + IXLStyle SetPatternType(XLFillPatternValues value); + + } +} diff --git a/ClosedXML/Excel/Style/IXLFont.cs b/ClosedXML/Excel/Style/IXLFont.cs index 3364a58..2262d35 100644 --- a/ClosedXML/Excel/Style/IXLFont.cs +++ b/ClosedXML/Excel/Style/IXLFont.cs @@ -1,45 +1,45 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLFontUnderlineValues - { - Double, - DoubleAccounting, - None, - Single, - SingleAccounting - } - - public enum XLFontVerticalTextAlignmentValues - { - Baseline, - Subscript, - Superscript - } - - public enum XLFontFamilyNumberingValues - { - NotApplicable = 0, - Roman = 1, - Swiss = 2, - Modern = 3, - Script = 4, - Decorative = 5 - } - - public interface IXLFont : IXLFontBase, IEquatable - { - IXLStyle SetBold(); IXLStyle SetBold(Boolean value); - IXLStyle SetItalic(); IXLStyle SetItalic(Boolean value); - IXLStyle SetUnderline(); IXLStyle SetUnderline(XLFontUnderlineValues value); - IXLStyle SetStrikethrough(); IXLStyle SetStrikethrough(Boolean value); - IXLStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); - IXLStyle SetShadow(); IXLStyle SetShadow(Boolean value); - IXLStyle SetFontSize(Double value); - IXLStyle SetFontColor(XLColor value); - IXLStyle SetFontName(String value); - IXLStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value); - - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLFontUnderlineValues + { + Double, + DoubleAccounting, + None, + Single, + SingleAccounting + } + + public enum XLFontVerticalTextAlignmentValues + { + Baseline, + Subscript, + Superscript + } + + public enum XLFontFamilyNumberingValues + { + NotApplicable = 0, + Roman = 1, + Swiss = 2, + Modern = 3, + Script = 4, + Decorative = 5 + } + + public interface IXLFont : IXLFontBase, IEquatable + { + IXLStyle SetBold(); IXLStyle SetBold(Boolean value); + IXLStyle SetItalic(); IXLStyle SetItalic(Boolean value); + IXLStyle SetUnderline(); IXLStyle SetUnderline(XLFontUnderlineValues value); + IXLStyle SetStrikethrough(); IXLStyle SetStrikethrough(Boolean value); + IXLStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value); + IXLStyle SetShadow(); IXLStyle SetShadow(Boolean value); + IXLStyle SetFontSize(Double value); + IXLStyle SetFontColor(XLColor value); + IXLStyle SetFontName(String value); + IXLStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value); + + } +} diff --git a/ClosedXML/Excel/Style/IXLFontBase.cs b/ClosedXML/Excel/Style/IXLFontBase.cs index 1e5b6cf..11d8a72 100644 --- a/ClosedXML/Excel/Style/IXLFontBase.cs +++ b/ClosedXML/Excel/Style/IXLFontBase.cs @@ -1,22 +1,22 @@ -using System; - -namespace ClosedXML.Excel -{ - - - public interface IXLFontBase - { - Boolean Bold { get; set; } - Boolean Italic { get; set; } - XLFontUnderlineValues Underline { get; set; } - Boolean Strikethrough { get; set; } - XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } - Boolean Shadow { get; set; } - Double FontSize { get; set; } - XLColor FontColor { get; set; } - String FontName { get; set; } - XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } - - - } -} +using System; + +namespace ClosedXML.Excel +{ + + + public interface IXLFontBase + { + Boolean Bold { get; set; } + Boolean Italic { get; set; } + XLFontUnderlineValues Underline { get; set; } + Boolean Strikethrough { get; set; } + XLFontVerticalTextAlignmentValues VerticalAlignment { get; set; } + Boolean Shadow { get; set; } + Double FontSize { get; set; } + XLColor FontColor { get; set; } + String FontName { get; set; } + XLFontFamilyNumberingValues FontFamilyNumbering { get; set; } + + + } +} diff --git a/ClosedXML/Excel/Style/IXLNumberFormat.cs b/ClosedXML/Excel/Style/IXLNumberFormat.cs index 2a8ef5e..cb55e51 100644 --- a/ClosedXML/Excel/Style/IXLNumberFormat.cs +++ b/ClosedXML/Excel/Style/IXLNumberFormat.cs @@ -1,11 +1,11 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLNumberFormat : IXLNumberFormatBase, IEquatable - { - IXLStyle SetNumberFormatId(Int32 value); - - IXLStyle SetFormat(String value); - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLNumberFormat : IXLNumberFormatBase, IEquatable + { + IXLStyle SetNumberFormatId(Int32 value); + + IXLStyle SetFormat(String value); + } +} diff --git a/ClosedXML/Excel/Style/IXLNumberFormatBase.cs b/ClosedXML/Excel/Style/IXLNumberFormatBase.cs index d162a90..ac0e5d8 100644 --- a/ClosedXML/Excel/Style/IXLNumberFormatBase.cs +++ b/ClosedXML/Excel/Style/IXLNumberFormatBase.cs @@ -1,13 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - public interface IXLNumberFormatBase - { - Int32 NumberFormatId { get; set; } - String Format { get; set; } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + public interface IXLNumberFormatBase + { + Int32 NumberFormatId { get; set; } + String Format { get; set; } + } +} diff --git a/ClosedXML/Excel/Style/IXLProtection.cs b/ClosedXML/Excel/Style/IXLProtection.cs index fd4578d..1a197e1 100644 --- a/ClosedXML/Excel/Style/IXLProtection.cs +++ b/ClosedXML/Excel/Style/IXLProtection.cs @@ -1,14 +1,14 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLProtection : IEquatable - { - Boolean Locked { get; set; } - Boolean Hidden { get; set; } - - IXLStyle SetLocked(); IXLStyle SetLocked(Boolean value); - IXLStyle SetHidden(); IXLStyle SetHidden(Boolean value); - - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLProtection : IEquatable + { + Boolean Locked { get; set; } + Boolean Hidden { get; set; } + + IXLStyle SetLocked(); IXLStyle SetLocked(Boolean value); + IXLStyle SetHidden(); IXLStyle SetHidden(Boolean value); + + } +} diff --git a/ClosedXML/Excel/Style/IXLStyle.cs b/ClosedXML/Excel/Style/IXLStyle.cs index 8472baf..0edd7a3 100644 --- a/ClosedXML/Excel/Style/IXLStyle.cs +++ b/ClosedXML/Excel/Style/IXLStyle.cs @@ -1,15 +1,15 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLStyle: IEquatable - { - IXLAlignment Alignment { get; set; } - IXLBorder Border { get; set; } - IXLFill Fill { get; set; } - IXLFont Font { get; set; } - IXLNumberFormat NumberFormat { get; set; } - IXLNumberFormat DateFormat { get; } - IXLProtection Protection { get; set; } - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLStyle: IEquatable + { + IXLAlignment Alignment { get; set; } + IXLBorder Border { get; set; } + IXLFill Fill { get; set; } + IXLFont Font { get; set; } + IXLNumberFormat NumberFormat { get; set; } + IXLNumberFormat DateFormat { get; } + IXLProtection Protection { get; set; } + } +} diff --git a/ClosedXML/Excel/Style/IXLStylized.cs b/ClosedXML/Excel/Style/IXLStylized.cs index 45d1287..6a03319 100644 --- a/ClosedXML/Excel/Style/IXLStylized.cs +++ b/ClosedXML/Excel/Style/IXLStylized.cs @@ -1,16 +1,16 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - internal interface IXLStylized - { - IXLStyle Style { get; set; } - IEnumerable Styles { get; } - Boolean UpdatingStyle { get; set; } - IXLStyle InnerStyle { get; set; } - IXLRanges RangesUsed { get; } - Boolean StyleChanged { get; set; } - //Boolean IsDefault { get; set; } - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + internal interface IXLStylized + { + IXLStyle Style { get; set; } + IEnumerable Styles { get; } + Boolean UpdatingStyle { get; set; } + IXLStyle InnerStyle { get; set; } + IXLRanges RangesUsed { get; } + Boolean StyleChanged { get; set; } + //Boolean IsDefault { get; set; } + } +} diff --git a/ClosedXML/Excel/Style/XLAlignment.cs b/ClosedXML/Excel/Style/XLAlignment.cs index 2efb995..5f0a399 100644 --- a/ClosedXML/Excel/Style/XLAlignment.cs +++ b/ClosedXML/Excel/Style/XLAlignment.cs @@ -1,373 +1,373 @@ -#region - -using System; -using System.Text; - -#endregion - -namespace ClosedXML.Excel -{ - internal class XLAlignment : IXLAlignment - { - private readonly IXLStylized _container; - private XLAlignmentHorizontalValues _horizontal; - private Int32 _indent; - private Boolean _justifyLastLine; - private XLAlignmentReadingOrderValues _readingOrder; - private Int32 _relativeIndent; - private Boolean _shrinkToFit; - private Int32 _textRotation; - private XLAlignmentVerticalValues _vertical; - private Boolean _wrapText; - - public XLAlignment() : this(null, XLWorkbook.DefaultStyle.Alignment) - { - } - - public XLAlignment(IXLStylized container, IXLAlignment d = null) - { - _container = container; - if (d == null) return; - - _horizontal = d.Horizontal; - _vertical = d.Vertical; - _indent = d.Indent; - _justifyLastLine = d.JustifyLastLine; - _readingOrder = d.ReadingOrder; - _relativeIndent = d.RelativeIndent; - _shrinkToFit = d.ShrinkToFit; - _textRotation = d.TextRotation; - _wrapText = d.WrapText; - } - - #region IXLAlignment Members - - public XLAlignmentHorizontalValues Horizontal - { - get { return _horizontal; } - set - { - SetStyleChanged(); - Boolean updateIndent = !( - value == XLAlignmentHorizontalValues.Left - || value == XLAlignmentHorizontalValues.Right - || value == XLAlignmentHorizontalValues.Distributed - ); - - if (_container != null && !_container.UpdatingStyle) - { - _container.Styles.ForEach(s => - { - s.Alignment.Horizontal = value; - if (updateIndent) s.Alignment.Indent = 0; - }); - } - else - { - _horizontal = value; - if (updateIndent) - _indent = 0; - } - } - } - - public XLAlignmentVerticalValues Vertical - { - get { return _vertical; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Alignment.Vertical = value); - else - _vertical = value; - } - } - - public Int32 Indent - { - get { return _indent; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Alignment.Indent = value); - else - { - if (_indent != value) - { - if (_horizontal == XLAlignmentHorizontalValues.General) - _horizontal = XLAlignmentHorizontalValues.Left; - - if (value > 0 && !( - _horizontal == XLAlignmentHorizontalValues.Left - || _horizontal == XLAlignmentHorizontalValues.Right - || _horizontal == XLAlignmentHorizontalValues.Distributed - )) - { - throw new ArgumentException( - "For indents, only left, right, and distributed horizontal alignments are supported."); - } - - _indent = value; - } - } - } - } - - public Boolean JustifyLastLine - { - get { return _justifyLastLine; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Alignment.JustifyLastLine = value); - else - _justifyLastLine = value; - } - } - - public XLAlignmentReadingOrderValues ReadingOrder - { - get { return _readingOrder; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Alignment.ReadingOrder = value); - else - _readingOrder = value; - } - } - - public Int32 RelativeIndent - { - get { return _relativeIndent; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Alignment.RelativeIndent = value); - else - _relativeIndent = value; - } - } - - public Boolean ShrinkToFit - { - get { return _shrinkToFit; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Alignment.ShrinkToFit = value); - else - _shrinkToFit = value; - } - } - - public Int32 TextRotation - { - get { return _textRotation; } - set - { - SetStyleChanged(); - Int32 rotation = value; - - if (rotation != 255 && (rotation < -90 || rotation > 180)) - throw new ArgumentException("TextRotation must be between -90 and 180 degrees, or 255."); - - if (rotation < 0) - rotation = 90 + (rotation * -1); - - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Alignment.TextRotation = rotation); - else - _textRotation = rotation; - } - } - - public Boolean WrapText - { - get { return _wrapText; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Alignment.WrapText = value); - else - _wrapText = value; - } - } - - public Boolean TopToBottom - { - get { return _textRotation == 255; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Alignment.TextRotation = value ? 255 : 0); - else - _textRotation = value ? 255 : 0; - } - } - - - public bool Equals(IXLAlignment other) - { - if (other == null) - return false; - - var otherA = other as XLAlignment; - if (otherA == null) - return false; - - return - _horizontal == otherA._horizontal - && _vertical == otherA._vertical - && _indent == otherA._indent - && _justifyLastLine == otherA._justifyLastLine - && _readingOrder == otherA._readingOrder - && _relativeIndent == otherA._relativeIndent - && _shrinkToFit == otherA._shrinkToFit - && _textRotation == otherA._textRotation - && _wrapText == otherA._wrapText - ; - } - - public IXLStyle SetHorizontal(XLAlignmentHorizontalValues value) - { - Horizontal = value; - return _container.Style; - } - - public IXLStyle SetVertical(XLAlignmentVerticalValues value) - { - Vertical = value; - return _container.Style; - } - - public IXLStyle SetIndent(Int32 value) - { - Indent = value; - return _container.Style; - } - - public IXLStyle SetJustifyLastLine() - { - JustifyLastLine = true; - return _container.Style; - } - - public IXLStyle SetJustifyLastLine(Boolean value) - { - JustifyLastLine = value; - return _container.Style; - } - - public IXLStyle SetReadingOrder(XLAlignmentReadingOrderValues value) - { - ReadingOrder = value; - return _container.Style; - } - - public IXLStyle SetRelativeIndent(Int32 value) - { - RelativeIndent = value; - return _container.Style; - } - - public IXLStyle SetShrinkToFit() - { - ShrinkToFit = true; - return _container.Style; - } - - public IXLStyle SetShrinkToFit(Boolean value) - { - ShrinkToFit = value; - return _container.Style; - } - - public IXLStyle SetTextRotation(Int32 value) - { - TextRotation = value; - return _container.Style; - } - - public IXLStyle SetWrapText() - { - WrapText = true; - return _container.Style; - } - - public IXLStyle SetWrapText(Boolean value) - { - WrapText = value; - return _container.Style; - } - - public IXLStyle SetTopToBottom() - { - TopToBottom = true; - return _container.Style; - } - - public IXLStyle SetTopToBottom(Boolean value) - { - TopToBottom = value; - return _container.Style; - } - - #endregion - - private void SetStyleChanged() - { - if (_container != null) _container.StyleChanged = true; - } - - public override string ToString() - { - var sb = new StringBuilder(); - sb.Append(Horizontal); - sb.Append("-"); - sb.Append(Vertical); - sb.Append("-"); - sb.Append(Indent); - sb.Append("-"); - sb.Append(JustifyLastLine); - sb.Append("-"); - sb.Append(ReadingOrder); - sb.Append("-"); - sb.Append(RelativeIndent); - sb.Append("-"); - sb.Append(ShrinkToFit); - sb.Append("-"); - sb.Append(TextRotation); - sb.Append("-"); - sb.Append(WrapText); - sb.Append("-"); - return sb.ToString(); - } - - public override bool Equals(object obj) - { - return Equals((XLAlignment)obj); - } - - public override int GetHashCode() - { - return (Int32)Horizontal - ^ (Int32)Vertical - ^ Indent - ^ JustifyLastLine.GetHashCode() - ^ (Int32)ReadingOrder - ^ RelativeIndent - ^ ShrinkToFit.GetHashCode() - ^ TextRotation - ^ WrapText.GetHashCode(); - } - } +#region + +using System; +using System.Text; + +#endregion + +namespace ClosedXML.Excel +{ + internal class XLAlignment : IXLAlignment + { + private readonly IXLStylized _container; + private XLAlignmentHorizontalValues _horizontal; + private Int32 _indent; + private Boolean _justifyLastLine; + private XLAlignmentReadingOrderValues _readingOrder; + private Int32 _relativeIndent; + private Boolean _shrinkToFit; + private Int32 _textRotation; + private XLAlignmentVerticalValues _vertical; + private Boolean _wrapText; + + public XLAlignment() : this(null, XLWorkbook.DefaultStyle.Alignment) + { + } + + public XLAlignment(IXLStylized container, IXLAlignment d = null) + { + _container = container; + if (d == null) return; + + _horizontal = d.Horizontal; + _vertical = d.Vertical; + _indent = d.Indent; + _justifyLastLine = d.JustifyLastLine; + _readingOrder = d.ReadingOrder; + _relativeIndent = d.RelativeIndent; + _shrinkToFit = d.ShrinkToFit; + _textRotation = d.TextRotation; + _wrapText = d.WrapText; + } + + #region IXLAlignment Members + + public XLAlignmentHorizontalValues Horizontal + { + get { return _horizontal; } + set + { + SetStyleChanged(); + Boolean updateIndent = !( + value == XLAlignmentHorizontalValues.Left + || value == XLAlignmentHorizontalValues.Right + || value == XLAlignmentHorizontalValues.Distributed + ); + + if (_container != null && !_container.UpdatingStyle) + { + _container.Styles.ForEach(s => + { + s.Alignment.Horizontal = value; + if (updateIndent) s.Alignment.Indent = 0; + }); + } + else + { + _horizontal = value; + if (updateIndent) + _indent = 0; + } + } + } + + public XLAlignmentVerticalValues Vertical + { + get { return _vertical; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Alignment.Vertical = value); + else + _vertical = value; + } + } + + public Int32 Indent + { + get { return _indent; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Alignment.Indent = value); + else + { + if (_indent != value) + { + if (_horizontal == XLAlignmentHorizontalValues.General) + _horizontal = XLAlignmentHorizontalValues.Left; + + if (value > 0 && !( + _horizontal == XLAlignmentHorizontalValues.Left + || _horizontal == XLAlignmentHorizontalValues.Right + || _horizontal == XLAlignmentHorizontalValues.Distributed + )) + { + throw new ArgumentException( + "For indents, only left, right, and distributed horizontal alignments are supported."); + } + + _indent = value; + } + } + } + } + + public Boolean JustifyLastLine + { + get { return _justifyLastLine; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Alignment.JustifyLastLine = value); + else + _justifyLastLine = value; + } + } + + public XLAlignmentReadingOrderValues ReadingOrder + { + get { return _readingOrder; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Alignment.ReadingOrder = value); + else + _readingOrder = value; + } + } + + public Int32 RelativeIndent + { + get { return _relativeIndent; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Alignment.RelativeIndent = value); + else + _relativeIndent = value; + } + } + + public Boolean ShrinkToFit + { + get { return _shrinkToFit; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Alignment.ShrinkToFit = value); + else + _shrinkToFit = value; + } + } + + public Int32 TextRotation + { + get { return _textRotation; } + set + { + SetStyleChanged(); + Int32 rotation = value; + + if (rotation != 255 && (rotation < -90 || rotation > 180)) + throw new ArgumentException("TextRotation must be between -90 and 180 degrees, or 255."); + + if (rotation < 0) + rotation = 90 + (rotation * -1); + + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Alignment.TextRotation = rotation); + else + _textRotation = rotation; + } + } + + public Boolean WrapText + { + get { return _wrapText; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Alignment.WrapText = value); + else + _wrapText = value; + } + } + + public Boolean TopToBottom + { + get { return _textRotation == 255; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Alignment.TextRotation = value ? 255 : 0); + else + _textRotation = value ? 255 : 0; + } + } + + + public bool Equals(IXLAlignment other) + { + if (other == null) + return false; + + var otherA = other as XLAlignment; + if (otherA == null) + return false; + + return + _horizontal == otherA._horizontal + && _vertical == otherA._vertical + && _indent == otherA._indent + && _justifyLastLine == otherA._justifyLastLine + && _readingOrder == otherA._readingOrder + && _relativeIndent == otherA._relativeIndent + && _shrinkToFit == otherA._shrinkToFit + && _textRotation == otherA._textRotation + && _wrapText == otherA._wrapText + ; + } + + public IXLStyle SetHorizontal(XLAlignmentHorizontalValues value) + { + Horizontal = value; + return _container.Style; + } + + public IXLStyle SetVertical(XLAlignmentVerticalValues value) + { + Vertical = value; + return _container.Style; + } + + public IXLStyle SetIndent(Int32 value) + { + Indent = value; + return _container.Style; + } + + public IXLStyle SetJustifyLastLine() + { + JustifyLastLine = true; + return _container.Style; + } + + public IXLStyle SetJustifyLastLine(Boolean value) + { + JustifyLastLine = value; + return _container.Style; + } + + public IXLStyle SetReadingOrder(XLAlignmentReadingOrderValues value) + { + ReadingOrder = value; + return _container.Style; + } + + public IXLStyle SetRelativeIndent(Int32 value) + { + RelativeIndent = value; + return _container.Style; + } + + public IXLStyle SetShrinkToFit() + { + ShrinkToFit = true; + return _container.Style; + } + + public IXLStyle SetShrinkToFit(Boolean value) + { + ShrinkToFit = value; + return _container.Style; + } + + public IXLStyle SetTextRotation(Int32 value) + { + TextRotation = value; + return _container.Style; + } + + public IXLStyle SetWrapText() + { + WrapText = true; + return _container.Style; + } + + public IXLStyle SetWrapText(Boolean value) + { + WrapText = value; + return _container.Style; + } + + public IXLStyle SetTopToBottom() + { + TopToBottom = true; + return _container.Style; + } + + public IXLStyle SetTopToBottom(Boolean value) + { + TopToBottom = value; + return _container.Style; + } + + #endregion + + private void SetStyleChanged() + { + if (_container != null) _container.StyleChanged = true; + } + + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append(Horizontal); + sb.Append("-"); + sb.Append(Vertical); + sb.Append("-"); + sb.Append(Indent); + sb.Append("-"); + sb.Append(JustifyLastLine); + sb.Append("-"); + sb.Append(ReadingOrder); + sb.Append("-"); + sb.Append(RelativeIndent); + sb.Append("-"); + sb.Append(ShrinkToFit); + sb.Append("-"); + sb.Append(TextRotation); + sb.Append("-"); + sb.Append(WrapText); + sb.Append("-"); + return sb.ToString(); + } + + public override bool Equals(object obj) + { + return Equals((XLAlignment)obj); + } + + public override int GetHashCode() + { + return (Int32)Horizontal + ^ (Int32)Vertical + ^ Indent + ^ JustifyLastLine.GetHashCode() + ^ (Int32)ReadingOrder + ^ RelativeIndent + ^ ShrinkToFit.GetHashCode() + ^ TextRotation + ^ WrapText.GetHashCode(); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Style/XLBorder.cs b/ClosedXML/Excel/Style/XLBorder.cs index 387e431..afc1ccb 100644 --- a/ClosedXML/Excel/Style/XLBorder.cs +++ b/ClosedXML/Excel/Style/XLBorder.cs @@ -1,628 +1,628 @@ -using System; -using System.Text; - -namespace ClosedXML.Excel -{ - using System.Collections.Generic; - - internal class XLBorder : IXLBorder - { - private readonly IXLStylized _container; - private XLBorderStyleValues _bottomBorder; - private XLColor _bottomBorderColor; - private XLBorderStyleValues _diagonalBorder; - private XLColor _diagonalBorderColor; - private Boolean _diagonalDown; - private Boolean _diagonalUp; - private XLBorderStyleValues _leftBorder; - private XLColor _leftBorderColor; - private XLBorderStyleValues _rightBorder; - private XLColor _rightBorderColor; - private XLBorderStyleValues _topBorder; - private XLColor _topBorderColor; - - public XLBorder() : this(null, XLWorkbook.DefaultStyle.Border) - { - } - - public XLBorder(IXLStylized container, IXLBorder defaultBorder, Boolean useDefaultModify = true) - { - _container = container; - if (defaultBorder == null) return; - - _leftBorder = defaultBorder.LeftBorder; - _leftBorderColor = defaultBorder.LeftBorderColor; - _rightBorder = defaultBorder.RightBorder; - _rightBorderColor = defaultBorder.RightBorderColor; - _topBorder = defaultBorder.TopBorder; - _topBorderColor = defaultBorder.TopBorderColor; - _bottomBorder = defaultBorder.BottomBorder; - _bottomBorderColor = defaultBorder.BottomBorderColor; - _diagonalBorder = defaultBorder.DiagonalBorder; - _diagonalBorderColor = defaultBorder.DiagonalBorderColor; - _diagonalUp = defaultBorder.DiagonalUp; - _diagonalDown = defaultBorder.DiagonalDown; - - if (useDefaultModify) - { - var d = defaultBorder as XLBorder; - BottomBorderColorModified = d.BottomBorderColorModified; - BottomBorderModified = d.BottomBorderModified; - DiagonalBorderColorModified = d.DiagonalBorderColorModified; - DiagonalBorderModified = d.DiagonalBorderModified; - DiagonalDownModified = d.DiagonalDownModified; - DiagonalUpModified = d.DiagonalUpModified; - LeftBorderColorModified = d.LeftBorderColorModified; - LeftBorderModified = d.LeftBorderModified; - RightBorderColorModified = d.RightBorderColorModified; - RightBorderModified = d.RightBorderModified; - TopBorderColorModified = d.TopBorderColorModified; - TopBorderModified = d.TopBorderModified; - } - } - - #region IXLBorder Members - - public XLBorderStyleValues OutsideBorder - { - set - { - if (_container == null || _container.UpdatingStyle) return; - - if (_container is XLWorksheet || _container is XLConditionalFormat) - { - _container.Style.Border.SetTopBorder(value); - _container.Style.Border.SetBottomBorder(value); - _container.Style.Border.SetLeftBorder(value); - _container.Style.Border.SetRightBorder(value); - } - else - { - foreach (IXLRange r in _container.RangesUsed) - { - r.FirstColumn().Style.Border.LeftBorder = value; - r.LastColumn().Style.Border.RightBorder = value; - r.FirstRow().Style.Border.TopBorder = value; - r.LastRow().Style.Border.BottomBorder = value; - } - } - } - } - - - public XLColor OutsideBorderColor - { - set - { - if (_container == null || _container.UpdatingStyle) return; - - if (_container is XLWorksheet || _container is XLConditionalFormat) - { - _container.Style.Border.SetTopBorderColor(value); - _container.Style.Border.SetBottomBorderColor(value); - _container.Style.Border.SetLeftBorderColor(value); - _container.Style.Border.SetRightBorderColor(value); - } - else - { - foreach (IXLRange r in _container.RangesUsed) - { - r.FirstColumn().Style.Border.LeftBorderColor = value; - r.LastColumn().Style.Border.RightBorderColor = value; - r.FirstRow().Style.Border.TopBorderColor = value; - r.LastRow().Style.Border.BottomBorderColor = value; - } - } - } - } - - public XLBorderStyleValues InsideBorder - { - set - { - if (_container == null || _container.UpdatingStyle) return; - - var wsContainer = _container as XLWorksheet; - if (wsContainer != null) - { - //wsContainer.CellsUsed().Style.Border.SetOutsideBorder(value); - //wsContainer.UpdatingStyle = true; - wsContainer.Style.Border.SetTopBorder(value); - wsContainer.Style.Border.SetBottomBorder(value); - wsContainer.Style.Border.SetLeftBorder(value); - wsContainer.Style.Border.SetRightBorder(value); - //wsContainer.UpdatingStyle = false; - } - else - { - foreach (IXLRange r in _container.RangesUsed) - { - Dictionary topBorders = new Dictionary(); - r.FirstRow().Cells().ForEach( - c => - topBorders.Add(c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, - c.Style.Border.TopBorder)); - - Dictionary bottomBorders = - new Dictionary(); - r.LastRow().Cells().ForEach( - c => - bottomBorders.Add(c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, - c.Style.Border.BottomBorder)); - - Dictionary leftBorders = new Dictionary(); - r.FirstColumn().Cells().ForEach( - c => - leftBorders.Add(c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, - c.Style.Border.LeftBorder)); - - Dictionary rightBorders = new Dictionary(); - r.LastColumn().Cells().ForEach( - c => - rightBorders.Add(c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, - c.Style.Border.RightBorder)); - - r.Cells().Style.Border.OutsideBorder = value; - - topBorders.ForEach(kp => r.FirstRow().Cell(kp.Key).Style.Border.TopBorder = kp.Value); - bottomBorders.ForEach(kp => r.LastRow().Cell(kp.Key).Style.Border.BottomBorder = kp.Value); - leftBorders.ForEach(kp => r.FirstColumn().Cell(kp.Key).Style.Border.LeftBorder = kp.Value); - rightBorders.ForEach(kp => r.LastColumn().Cell(kp.Key).Style.Border.RightBorder = kp.Value); - } - } - } - } - - public XLColor InsideBorderColor - { - set - { - if (_container == null || _container.UpdatingStyle) return; - - var wsContainer = _container as XLWorksheet; - if (wsContainer != null) - { - //wsContainer.CellsUsed().Style.Border.SetOutsideBorderColor(value); - //wsContainer.UpdatingStyle = true; - wsContainer.Style.Border.SetTopBorderColor(value); - wsContainer.Style.Border.SetBottomBorderColor(value); - wsContainer.Style.Border.SetLeftBorderColor(value); - wsContainer.Style.Border.SetRightBorderColor(value); - //wsContainer.UpdatingStyle = false; - } - else - { - foreach (IXLRange r in _container.RangesUsed) - { - Dictionary topBorders = new Dictionary(); - r.FirstRow().Cells().ForEach( - c => - topBorders.Add( - c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, - c.Style.Border.TopBorderColor)); - - Dictionary bottomBorders = new Dictionary(); - r.LastRow().Cells().ForEach( - c => - bottomBorders.Add( - c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, - c.Style.Border.BottomBorderColor)); - - Dictionary leftBorders = new Dictionary(); - r.FirstColumn().Cells().ForEach( - c => - leftBorders.Add( - c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, - c.Style.Border.LeftBorderColor)); - - Dictionary rightBorders = new Dictionary(); - r.LastColumn().Cells().ForEach( - c => - rightBorders.Add( - c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, - c.Style.Border.RightBorderColor)); - - r.Cells().Style.Border.OutsideBorderColor = value; - - topBorders.ForEach( - kp => r.FirstRow().Cell(kp.Key).Style.Border.TopBorderColor = kp.Value); - bottomBorders.ForEach( - kp => r.LastRow().Cell(kp.Key).Style.Border.BottomBorderColor = kp.Value); - leftBorders.ForEach( - kp => r.FirstColumn().Cell(kp.Key).Style.Border.LeftBorderColor = kp.Value); - rightBorders.ForEach( - kp => r.LastColumn().Cell(kp.Key).Style.Border.RightBorderColor = kp.Value); - } - } - } - } - - public Boolean LeftBorderModified; - public XLBorderStyleValues LeftBorder - { - get { return _leftBorder; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.LeftBorder = value); - else - { - _leftBorder = value; - LeftBorderModified = true; - } - } - } - - public Boolean LeftBorderColorModified; - public XLColor LeftBorderColor - { - get { return _leftBorderColor; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.LeftBorderColor = value); - else - { - _leftBorderColor = value; - LeftBorderColorModified = true; - } - } - } - - public Boolean RightBorderModified; - public XLBorderStyleValues RightBorder - { - get { return _rightBorder; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.RightBorder = value); - else - { - _rightBorder = value; - RightBorderModified = true; - } - } - } - - public Boolean RightBorderColorModified; - public XLColor RightBorderColor - { - get { return _rightBorderColor; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.RightBorderColor = value); - else - { - _rightBorderColor = value; - RightBorderColorModified = true; - } - } - } - - public Boolean TopBorderModified; - public XLBorderStyleValues TopBorder - { - get { return _topBorder; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.TopBorder = value); - else - { - _topBorder = value; - TopBorderModified = true; - } - } - } - - public Boolean TopBorderColorModified; - public XLColor TopBorderColor - { - get { return _topBorderColor; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.TopBorderColor = value); - else - { - _topBorderColor = value; - TopBorderColorModified = true; - } - } - } - - public Boolean BottomBorderModified; - public XLBorderStyleValues BottomBorder - { - get { return _bottomBorder; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.BottomBorder = value); - else - { - _bottomBorder = value; - BottomBorderModified = true; - } - } - } - - public Boolean BottomBorderColorModified; - public XLColor BottomBorderColor - { - get { return _bottomBorderColor; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.BottomBorderColor = value); - else - { - _bottomBorderColor = value; - BottomBorderColorModified = true; - } - } - } - - public Boolean DiagonalBorderModified; - public XLBorderStyleValues DiagonalBorder - { - get { return _diagonalBorder; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.DiagonalBorder = value); - else - { - _diagonalBorder = value; - DiagonalBorderModified = true; - } - } - } - - public Boolean DiagonalBorderColorModified; - public XLColor DiagonalBorderColor - { - get { return _diagonalBorderColor; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.DiagonalBorderColor = value); - else - { - _diagonalBorderColor = value; - DiagonalBorderColorModified = true; - } - } - } - - public Boolean DiagonalUpModified; - public Boolean DiagonalUp - { - get { return _diagonalUp; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.DiagonalUp = value); - else - { - _diagonalUp = value; - DiagonalUpModified = true; - } - } - } - - public Boolean DiagonalDownModified; - public Boolean DiagonalDown - { - get { return _diagonalDown; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Border.DiagonalDown = value); - else - { - _diagonalDown = value; - DiagonalDownModified = true; - } - } - } - - public bool Equals(IXLBorder other) - { - var otherB = other as XLBorder; - return - _leftBorder == otherB._leftBorder - && _leftBorderColor.Equals(otherB._leftBorderColor) - && _rightBorder == otherB._rightBorder - && _rightBorderColor.Equals(otherB._rightBorderColor) - && _topBorder == otherB._topBorder - && _topBorderColor.Equals(otherB._topBorderColor) - && _bottomBorder == otherB._bottomBorder - && _bottomBorderColor.Equals(otherB._bottomBorderColor) - && _diagonalBorder == otherB._diagonalBorder - && _diagonalBorderColor.Equals(otherB._diagonalBorderColor) - && _diagonalUp == otherB._diagonalUp - && _diagonalDown == otherB._diagonalDown - ; - } - - public IXLStyle SetOutsideBorder(XLBorderStyleValues value) - { - OutsideBorder = value; - return _container.Style; - } - - public IXLStyle SetOutsideBorderColor(XLColor value) - { - OutsideBorderColor = value; - return _container.Style; - } - - public IXLStyle SetInsideBorder(XLBorderStyleValues value) - { - InsideBorder = value; - return _container.Style; - } - - public IXLStyle SetInsideBorderColor(XLColor value) - { - InsideBorderColor = value; - return _container.Style; - } - - public IXLStyle SetLeftBorder(XLBorderStyleValues value) - { - LeftBorder = value; - return _container.Style; - } - - public IXLStyle SetLeftBorderColor(XLColor value) - { - LeftBorderColor = value; - return _container.Style; - } - - public IXLStyle SetRightBorder(XLBorderStyleValues value) - { - RightBorder = value; - return _container.Style; - } - - public IXLStyle SetRightBorderColor(XLColor value) - { - RightBorderColor = value; - return _container.Style; - } - - public IXLStyle SetTopBorder(XLBorderStyleValues value) - { - TopBorder = value; - return _container.Style; - } - - public IXLStyle SetTopBorderColor(XLColor value) - { - TopBorderColor = value; - return _container.Style; - } - - public IXLStyle SetBottomBorder(XLBorderStyleValues value) - { - BottomBorder = value; - return _container.Style; - } - - public IXLStyle SetBottomBorderColor(XLColor value) - { - BottomBorderColor = value; - return _container.Style; - } - - public IXLStyle SetDiagonalUp() - { - DiagonalUp = true; - return _container.Style; - } - - public IXLStyle SetDiagonalUp(Boolean value) - { - DiagonalUp = value; - return _container.Style; - } - - public IXLStyle SetDiagonalDown() - { - DiagonalDown = true; - return _container.Style; - } - - public IXLStyle SetDiagonalDown(Boolean value) - { - DiagonalDown = value; - return _container.Style; - } - - public IXLStyle SetDiagonalBorder(XLBorderStyleValues value) - { - DiagonalBorder = value; - return _container.Style; - } - - public IXLStyle SetDiagonalBorderColor(XLColor value) - { - DiagonalBorderColor = value; - return _container.Style; - } - - #endregion - - private void SetStyleChanged() - { - if (_container != null) _container.StyleChanged = true; - } - - public override string ToString() - { - var sb = new StringBuilder(); - sb.Append(LeftBorder.ToString()); - sb.Append("-"); - sb.Append(LeftBorderColor); - sb.Append("-"); - sb.Append(RightBorder.ToString()); - sb.Append("-"); - sb.Append(RightBorderColor); - sb.Append("-"); - sb.Append(TopBorder.ToString()); - sb.Append("-"); - sb.Append(TopBorderColor); - sb.Append("-"); - sb.Append(BottomBorder.ToString()); - sb.Append("-"); - sb.Append(BottomBorderColor); - sb.Append("-"); - sb.Append(DiagonalBorder.ToString()); - sb.Append("-"); - sb.Append(DiagonalBorderColor); - sb.Append("-"); - sb.Append(DiagonalUp.ToString()); - sb.Append("-"); - sb.Append(DiagonalDown.ToString()); - return sb.ToString(); - } - - public override bool Equals(object obj) - { - return Equals((XLBorder)obj); - } - - public override int GetHashCode() - { - return (Int32)LeftBorder - ^ LeftBorderColor.GetHashCode() - ^ (Int32)RightBorder - ^ RightBorderColor.GetHashCode() - ^ (Int32)TopBorder - ^ TopBorderColor.GetHashCode() - ^ (Int32)BottomBorder - ^ BottomBorderColor.GetHashCode() - ^ (Int32)DiagonalBorder - ^ DiagonalBorderColor.GetHashCode() - ^ DiagonalUp.GetHashCode() - ^ DiagonalDown.GetHashCode(); - } - } +using System; +using System.Text; + +namespace ClosedXML.Excel +{ + using System.Collections.Generic; + + internal class XLBorder : IXLBorder + { + private readonly IXLStylized _container; + private XLBorderStyleValues _bottomBorder; + private XLColor _bottomBorderColor; + private XLBorderStyleValues _diagonalBorder; + private XLColor _diagonalBorderColor; + private Boolean _diagonalDown; + private Boolean _diagonalUp; + private XLBorderStyleValues _leftBorder; + private XLColor _leftBorderColor; + private XLBorderStyleValues _rightBorder; + private XLColor _rightBorderColor; + private XLBorderStyleValues _topBorder; + private XLColor _topBorderColor; + + public XLBorder() : this(null, XLWorkbook.DefaultStyle.Border) + { + } + + public XLBorder(IXLStylized container, IXLBorder defaultBorder, Boolean useDefaultModify = true) + { + _container = container; + if (defaultBorder == null) return; + + _leftBorder = defaultBorder.LeftBorder; + _leftBorderColor = defaultBorder.LeftBorderColor; + _rightBorder = defaultBorder.RightBorder; + _rightBorderColor = defaultBorder.RightBorderColor; + _topBorder = defaultBorder.TopBorder; + _topBorderColor = defaultBorder.TopBorderColor; + _bottomBorder = defaultBorder.BottomBorder; + _bottomBorderColor = defaultBorder.BottomBorderColor; + _diagonalBorder = defaultBorder.DiagonalBorder; + _diagonalBorderColor = defaultBorder.DiagonalBorderColor; + _diagonalUp = defaultBorder.DiagonalUp; + _diagonalDown = defaultBorder.DiagonalDown; + + if (useDefaultModify) + { + var d = defaultBorder as XLBorder; + BottomBorderColorModified = d.BottomBorderColorModified; + BottomBorderModified = d.BottomBorderModified; + DiagonalBorderColorModified = d.DiagonalBorderColorModified; + DiagonalBorderModified = d.DiagonalBorderModified; + DiagonalDownModified = d.DiagonalDownModified; + DiagonalUpModified = d.DiagonalUpModified; + LeftBorderColorModified = d.LeftBorderColorModified; + LeftBorderModified = d.LeftBorderModified; + RightBorderColorModified = d.RightBorderColorModified; + RightBorderModified = d.RightBorderModified; + TopBorderColorModified = d.TopBorderColorModified; + TopBorderModified = d.TopBorderModified; + } + } + + #region IXLBorder Members + + public XLBorderStyleValues OutsideBorder + { + set + { + if (_container == null || _container.UpdatingStyle) return; + + if (_container is XLWorksheet || _container is XLConditionalFormat) + { + _container.Style.Border.SetTopBorder(value); + _container.Style.Border.SetBottomBorder(value); + _container.Style.Border.SetLeftBorder(value); + _container.Style.Border.SetRightBorder(value); + } + else + { + foreach (IXLRange r in _container.RangesUsed) + { + r.FirstColumn().Style.Border.LeftBorder = value; + r.LastColumn().Style.Border.RightBorder = value; + r.FirstRow().Style.Border.TopBorder = value; + r.LastRow().Style.Border.BottomBorder = value; + } + } + } + } + + + public XLColor OutsideBorderColor + { + set + { + if (_container == null || _container.UpdatingStyle) return; + + if (_container is XLWorksheet || _container is XLConditionalFormat) + { + _container.Style.Border.SetTopBorderColor(value); + _container.Style.Border.SetBottomBorderColor(value); + _container.Style.Border.SetLeftBorderColor(value); + _container.Style.Border.SetRightBorderColor(value); + } + else + { + foreach (IXLRange r in _container.RangesUsed) + { + r.FirstColumn().Style.Border.LeftBorderColor = value; + r.LastColumn().Style.Border.RightBorderColor = value; + r.FirstRow().Style.Border.TopBorderColor = value; + r.LastRow().Style.Border.BottomBorderColor = value; + } + } + } + } + + public XLBorderStyleValues InsideBorder + { + set + { + if (_container == null || _container.UpdatingStyle) return; + + var wsContainer = _container as XLWorksheet; + if (wsContainer != null) + { + //wsContainer.CellsUsed().Style.Border.SetOutsideBorder(value); + //wsContainer.UpdatingStyle = true; + wsContainer.Style.Border.SetTopBorder(value); + wsContainer.Style.Border.SetBottomBorder(value); + wsContainer.Style.Border.SetLeftBorder(value); + wsContainer.Style.Border.SetRightBorder(value); + //wsContainer.UpdatingStyle = false; + } + else + { + foreach (IXLRange r in _container.RangesUsed) + { + Dictionary topBorders = new Dictionary(); + r.FirstRow().Cells().ForEach( + c => + topBorders.Add(c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, + c.Style.Border.TopBorder)); + + Dictionary bottomBorders = + new Dictionary(); + r.LastRow().Cells().ForEach( + c => + bottomBorders.Add(c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, + c.Style.Border.BottomBorder)); + + Dictionary leftBorders = new Dictionary(); + r.FirstColumn().Cells().ForEach( + c => + leftBorders.Add(c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, + c.Style.Border.LeftBorder)); + + Dictionary rightBorders = new Dictionary(); + r.LastColumn().Cells().ForEach( + c => + rightBorders.Add(c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, + c.Style.Border.RightBorder)); + + r.Cells().Style.Border.OutsideBorder = value; + + topBorders.ForEach(kp => r.FirstRow().Cell(kp.Key).Style.Border.TopBorder = kp.Value); + bottomBorders.ForEach(kp => r.LastRow().Cell(kp.Key).Style.Border.BottomBorder = kp.Value); + leftBorders.ForEach(kp => r.FirstColumn().Cell(kp.Key).Style.Border.LeftBorder = kp.Value); + rightBorders.ForEach(kp => r.LastColumn().Cell(kp.Key).Style.Border.RightBorder = kp.Value); + } + } + } + } + + public XLColor InsideBorderColor + { + set + { + if (_container == null || _container.UpdatingStyle) return; + + var wsContainer = _container as XLWorksheet; + if (wsContainer != null) + { + //wsContainer.CellsUsed().Style.Border.SetOutsideBorderColor(value); + //wsContainer.UpdatingStyle = true; + wsContainer.Style.Border.SetTopBorderColor(value); + wsContainer.Style.Border.SetBottomBorderColor(value); + wsContainer.Style.Border.SetLeftBorderColor(value); + wsContainer.Style.Border.SetRightBorderColor(value); + //wsContainer.UpdatingStyle = false; + } + else + { + foreach (IXLRange r in _container.RangesUsed) + { + Dictionary topBorders = new Dictionary(); + r.FirstRow().Cells().ForEach( + c => + topBorders.Add( + c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, + c.Style.Border.TopBorderColor)); + + Dictionary bottomBorders = new Dictionary(); + r.LastRow().Cells().ForEach( + c => + bottomBorders.Add( + c.Address.ColumnNumber - r.RangeAddress.FirstAddress.ColumnNumber + 1, + c.Style.Border.BottomBorderColor)); + + Dictionary leftBorders = new Dictionary(); + r.FirstColumn().Cells().ForEach( + c => + leftBorders.Add( + c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, + c.Style.Border.LeftBorderColor)); + + Dictionary rightBorders = new Dictionary(); + r.LastColumn().Cells().ForEach( + c => + rightBorders.Add( + c.Address.RowNumber - r.RangeAddress.FirstAddress.RowNumber + 1, + c.Style.Border.RightBorderColor)); + + r.Cells().Style.Border.OutsideBorderColor = value; + + topBorders.ForEach( + kp => r.FirstRow().Cell(kp.Key).Style.Border.TopBorderColor = kp.Value); + bottomBorders.ForEach( + kp => r.LastRow().Cell(kp.Key).Style.Border.BottomBorderColor = kp.Value); + leftBorders.ForEach( + kp => r.FirstColumn().Cell(kp.Key).Style.Border.LeftBorderColor = kp.Value); + rightBorders.ForEach( + kp => r.LastColumn().Cell(kp.Key).Style.Border.RightBorderColor = kp.Value); + } + } + } + } + + public Boolean LeftBorderModified; + public XLBorderStyleValues LeftBorder + { + get { return _leftBorder; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.LeftBorder = value); + else + { + _leftBorder = value; + LeftBorderModified = true; + } + } + } + + public Boolean LeftBorderColorModified; + public XLColor LeftBorderColor + { + get { return _leftBorderColor; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.LeftBorderColor = value); + else + { + _leftBorderColor = value; + LeftBorderColorModified = true; + } + } + } + + public Boolean RightBorderModified; + public XLBorderStyleValues RightBorder + { + get { return _rightBorder; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.RightBorder = value); + else + { + _rightBorder = value; + RightBorderModified = true; + } + } + } + + public Boolean RightBorderColorModified; + public XLColor RightBorderColor + { + get { return _rightBorderColor; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.RightBorderColor = value); + else + { + _rightBorderColor = value; + RightBorderColorModified = true; + } + } + } + + public Boolean TopBorderModified; + public XLBorderStyleValues TopBorder + { + get { return _topBorder; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.TopBorder = value); + else + { + _topBorder = value; + TopBorderModified = true; + } + } + } + + public Boolean TopBorderColorModified; + public XLColor TopBorderColor + { + get { return _topBorderColor; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.TopBorderColor = value); + else + { + _topBorderColor = value; + TopBorderColorModified = true; + } + } + } + + public Boolean BottomBorderModified; + public XLBorderStyleValues BottomBorder + { + get { return _bottomBorder; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.BottomBorder = value); + else + { + _bottomBorder = value; + BottomBorderModified = true; + } + } + } + + public Boolean BottomBorderColorModified; + public XLColor BottomBorderColor + { + get { return _bottomBorderColor; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.BottomBorderColor = value); + else + { + _bottomBorderColor = value; + BottomBorderColorModified = true; + } + } + } + + public Boolean DiagonalBorderModified; + public XLBorderStyleValues DiagonalBorder + { + get { return _diagonalBorder; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.DiagonalBorder = value); + else + { + _diagonalBorder = value; + DiagonalBorderModified = true; + } + } + } + + public Boolean DiagonalBorderColorModified; + public XLColor DiagonalBorderColor + { + get { return _diagonalBorderColor; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.DiagonalBorderColor = value); + else + { + _diagonalBorderColor = value; + DiagonalBorderColorModified = true; + } + } + } + + public Boolean DiagonalUpModified; + public Boolean DiagonalUp + { + get { return _diagonalUp; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.DiagonalUp = value); + else + { + _diagonalUp = value; + DiagonalUpModified = true; + } + } + } + + public Boolean DiagonalDownModified; + public Boolean DiagonalDown + { + get { return _diagonalDown; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Border.DiagonalDown = value); + else + { + _diagonalDown = value; + DiagonalDownModified = true; + } + } + } + + public bool Equals(IXLBorder other) + { + var otherB = other as XLBorder; + return + _leftBorder == otherB._leftBorder + && _leftBorderColor.Equals(otherB._leftBorderColor) + && _rightBorder == otherB._rightBorder + && _rightBorderColor.Equals(otherB._rightBorderColor) + && _topBorder == otherB._topBorder + && _topBorderColor.Equals(otherB._topBorderColor) + && _bottomBorder == otherB._bottomBorder + && _bottomBorderColor.Equals(otherB._bottomBorderColor) + && _diagonalBorder == otherB._diagonalBorder + && _diagonalBorderColor.Equals(otherB._diagonalBorderColor) + && _diagonalUp == otherB._diagonalUp + && _diagonalDown == otherB._diagonalDown + ; + } + + public IXLStyle SetOutsideBorder(XLBorderStyleValues value) + { + OutsideBorder = value; + return _container.Style; + } + + public IXLStyle SetOutsideBorderColor(XLColor value) + { + OutsideBorderColor = value; + return _container.Style; + } + + public IXLStyle SetInsideBorder(XLBorderStyleValues value) + { + InsideBorder = value; + return _container.Style; + } + + public IXLStyle SetInsideBorderColor(XLColor value) + { + InsideBorderColor = value; + return _container.Style; + } + + public IXLStyle SetLeftBorder(XLBorderStyleValues value) + { + LeftBorder = value; + return _container.Style; + } + + public IXLStyle SetLeftBorderColor(XLColor value) + { + LeftBorderColor = value; + return _container.Style; + } + + public IXLStyle SetRightBorder(XLBorderStyleValues value) + { + RightBorder = value; + return _container.Style; + } + + public IXLStyle SetRightBorderColor(XLColor value) + { + RightBorderColor = value; + return _container.Style; + } + + public IXLStyle SetTopBorder(XLBorderStyleValues value) + { + TopBorder = value; + return _container.Style; + } + + public IXLStyle SetTopBorderColor(XLColor value) + { + TopBorderColor = value; + return _container.Style; + } + + public IXLStyle SetBottomBorder(XLBorderStyleValues value) + { + BottomBorder = value; + return _container.Style; + } + + public IXLStyle SetBottomBorderColor(XLColor value) + { + BottomBorderColor = value; + return _container.Style; + } + + public IXLStyle SetDiagonalUp() + { + DiagonalUp = true; + return _container.Style; + } + + public IXLStyle SetDiagonalUp(Boolean value) + { + DiagonalUp = value; + return _container.Style; + } + + public IXLStyle SetDiagonalDown() + { + DiagonalDown = true; + return _container.Style; + } + + public IXLStyle SetDiagonalDown(Boolean value) + { + DiagonalDown = value; + return _container.Style; + } + + public IXLStyle SetDiagonalBorder(XLBorderStyleValues value) + { + DiagonalBorder = value; + return _container.Style; + } + + public IXLStyle SetDiagonalBorderColor(XLColor value) + { + DiagonalBorderColor = value; + return _container.Style; + } + + #endregion + + private void SetStyleChanged() + { + if (_container != null) _container.StyleChanged = true; + } + + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append(LeftBorder.ToString()); + sb.Append("-"); + sb.Append(LeftBorderColor); + sb.Append("-"); + sb.Append(RightBorder.ToString()); + sb.Append("-"); + sb.Append(RightBorderColor); + sb.Append("-"); + sb.Append(TopBorder.ToString()); + sb.Append("-"); + sb.Append(TopBorderColor); + sb.Append("-"); + sb.Append(BottomBorder.ToString()); + sb.Append("-"); + sb.Append(BottomBorderColor); + sb.Append("-"); + sb.Append(DiagonalBorder.ToString()); + sb.Append("-"); + sb.Append(DiagonalBorderColor); + sb.Append("-"); + sb.Append(DiagonalUp.ToString()); + sb.Append("-"); + sb.Append(DiagonalDown.ToString()); + return sb.ToString(); + } + + public override bool Equals(object obj) + { + return Equals((XLBorder)obj); + } + + public override int GetHashCode() + { + return (Int32)LeftBorder + ^ LeftBorderColor.GetHashCode() + ^ (Int32)RightBorder + ^ RightBorderColor.GetHashCode() + ^ (Int32)TopBorder + ^ TopBorderColor.GetHashCode() + ^ (Int32)BottomBorder + ^ BottomBorderColor.GetHashCode() + ^ (Int32)DiagonalBorder + ^ DiagonalBorderColor.GetHashCode() + ^ DiagonalUp.GetHashCode() + ^ DiagonalDown.GetHashCode(); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Style/XLFill.cs b/ClosedXML/Excel/Style/XLFill.cs index 0a1c0d7..c4e02b9 100644 --- a/ClosedXML/Excel/Style/XLFill.cs +++ b/ClosedXML/Excel/Style/XLFill.cs @@ -1,184 +1,184 @@ -using System; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLFill : IXLFill - { - #region IXLFill Members - - public bool Equals(IXLFill other) - { - return - _patternType == other.PatternType - && _patternColor.Equals(other.PatternColor) - && _patternBackgroundColor.Equals(other.PatternBackgroundColor) - ; - } - - #endregion - - private void SetStyleChanged() - { - if (_container != null) _container.StyleChanged = true; - } - - public override bool Equals(object obj) - { - return Equals((XLFill)obj); - } - - public override int GetHashCode() - { - return BackgroundColor.GetHashCode() - ^ (Int32)PatternType - ^ PatternColor.GetHashCode(); - } - - #region Properties - - private XLColor _patternBackgroundColor; - private XLColor _patternColor; - private XLFillPatternValues _patternType; - - public XLColor BackgroundColor - { - get { return _patternColor; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Fill.BackgroundColor = value); - else - { - _patternType = value.HasValue ? XLFillPatternValues.Solid : XLFillPatternValues.None; - _patternColor = value; - _patternBackgroundColor = value; - - PatternTypeModified = true; - PatternColorModified = true; - PatternBackgroundColorModified = true; - } - } - } - - public Boolean PatternColorModified; - public XLColor PatternColor - { - get { return _patternColor; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Fill.PatternColor = value); - else - { - _patternColor = value; - PatternColorModified = true; - } - } - } - - public Boolean PatternBackgroundColorModified; - public XLColor PatternBackgroundColor - { - get { return _patternBackgroundColor; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Fill.PatternBackgroundColor = value); - else - { - _patternBackgroundColor = value; - PatternBackgroundColorModified = true; - } - } - } - - public Boolean PatternTypeModified; - public XLFillPatternValues PatternType - { - get { return _patternType; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Fill.PatternType = value); - else - { - _patternType = value; - PatternTypeModified = true; - } - } - } - - public IXLStyle SetBackgroundColor(XLColor value) - { - BackgroundColor = value; - return _container.Style; - } - - public IXLStyle SetPatternColor(XLColor value) - { - PatternColor = value; - return _container.Style; - } - - public IXLStyle SetPatternBackgroundColor(XLColor value) - { - PatternBackgroundColor = value; - return _container.Style; - } - - public IXLStyle SetPatternType(XLFillPatternValues value) - { - PatternType = value; - return _container.Style; - } - - #endregion - - #region Constructors - - private readonly IXLStylized _container; - - public XLFill() : this(null, XLWorkbook.DefaultStyle.Fill) - { - } - - public XLFill(IXLStylized container, IXLFill defaultFill = null, Boolean useDefaultModify = true) - { - _container = container; - if (defaultFill == null) return; - _patternType = defaultFill.PatternType; - _patternColor = defaultFill.PatternColor; - _patternBackgroundColor = defaultFill.PatternBackgroundColor; - - if (useDefaultModify) - { - var d = defaultFill as XLFill; - PatternBackgroundColorModified = d.PatternBackgroundColorModified; - PatternColorModified = d.PatternColorModified; - PatternTypeModified = d.PatternTypeModified; - } - } - - #endregion - - #region Overridden - - public override string ToString() - { - var sb = new StringBuilder(); - sb.Append(BackgroundColor); - sb.Append("-"); - sb.Append(PatternType.ToString()); - sb.Append("-"); - sb.Append(PatternColor); - return sb.ToString(); - } - - #endregion - } +using System; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLFill : IXLFill + { + #region IXLFill Members + + public bool Equals(IXLFill other) + { + return + _patternType == other.PatternType + && _patternColor.Equals(other.PatternColor) + && _patternBackgroundColor.Equals(other.PatternBackgroundColor) + ; + } + + #endregion + + private void SetStyleChanged() + { + if (_container != null) _container.StyleChanged = true; + } + + public override bool Equals(object obj) + { + return Equals((XLFill)obj); + } + + public override int GetHashCode() + { + return BackgroundColor.GetHashCode() + ^ (Int32)PatternType + ^ PatternColor.GetHashCode(); + } + + #region Properties + + private XLColor _patternBackgroundColor; + private XLColor _patternColor; + private XLFillPatternValues _patternType; + + public XLColor BackgroundColor + { + get { return _patternColor; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Fill.BackgroundColor = value); + else + { + _patternType = value.HasValue ? XLFillPatternValues.Solid : XLFillPatternValues.None; + _patternColor = value; + _patternBackgroundColor = value; + + PatternTypeModified = true; + PatternColorModified = true; + PatternBackgroundColorModified = true; + } + } + } + + public Boolean PatternColorModified; + public XLColor PatternColor + { + get { return _patternColor; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Fill.PatternColor = value); + else + { + _patternColor = value; + PatternColorModified = true; + } + } + } + + public Boolean PatternBackgroundColorModified; + public XLColor PatternBackgroundColor + { + get { return _patternBackgroundColor; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Fill.PatternBackgroundColor = value); + else + { + _patternBackgroundColor = value; + PatternBackgroundColorModified = true; + } + } + } + + public Boolean PatternTypeModified; + public XLFillPatternValues PatternType + { + get { return _patternType; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Fill.PatternType = value); + else + { + _patternType = value; + PatternTypeModified = true; + } + } + } + + public IXLStyle SetBackgroundColor(XLColor value) + { + BackgroundColor = value; + return _container.Style; + } + + public IXLStyle SetPatternColor(XLColor value) + { + PatternColor = value; + return _container.Style; + } + + public IXLStyle SetPatternBackgroundColor(XLColor value) + { + PatternBackgroundColor = value; + return _container.Style; + } + + public IXLStyle SetPatternType(XLFillPatternValues value) + { + PatternType = value; + return _container.Style; + } + + #endregion + + #region Constructors + + private readonly IXLStylized _container; + + public XLFill() : this(null, XLWorkbook.DefaultStyle.Fill) + { + } + + public XLFill(IXLStylized container, IXLFill defaultFill = null, Boolean useDefaultModify = true) + { + _container = container; + if (defaultFill == null) return; + _patternType = defaultFill.PatternType; + _patternColor = defaultFill.PatternColor; + _patternBackgroundColor = defaultFill.PatternBackgroundColor; + + if (useDefaultModify) + { + var d = defaultFill as XLFill; + PatternBackgroundColorModified = d.PatternBackgroundColorModified; + PatternColorModified = d.PatternColorModified; + PatternTypeModified = d.PatternTypeModified; + } + } + + #endregion + + #region Overridden + + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append(BackgroundColor); + sb.Append("-"); + sb.Append(PatternType.ToString()); + sb.Append("-"); + sb.Append(PatternColor); + return sb.ToString(); + } + + #endregion + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Style/XLFont.cs b/ClosedXML/Excel/Style/XLFont.cs index 8338ceb..3c52c20 100644 --- a/ClosedXML/Excel/Style/XLFont.cs +++ b/ClosedXML/Excel/Style/XLFont.cs @@ -1,400 +1,400 @@ -using System; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLFont : IXLFont - { - private readonly IXLStylized _container; - private Boolean _bold; - private XLColor _fontColor; - private XLFontFamilyNumberingValues _fontFamilyNumbering; - private String _fontName; - private Double _fontSize; - private Boolean _italic; - private Boolean _shadow; - private Boolean _strikethrough; - private XLFontUnderlineValues _underline; - private XLFontVerticalTextAlignmentValues _verticalAlignment; - - public XLFont() - : this(null, XLWorkbook.DefaultStyle.Font) - { - } - - public XLFont(IXLStylized container, IXLFontBase defaultFont, Boolean useDefaultModify = true) - { - _container = container; - if (defaultFont == null) return; - - _bold = defaultFont.Bold; - _italic = defaultFont.Italic; - _underline = defaultFont.Underline; - _strikethrough = defaultFont.Strikethrough; - _verticalAlignment = defaultFont.VerticalAlignment; - _shadow = defaultFont.Shadow; - _fontSize = defaultFont.FontSize; - _fontColor = defaultFont.FontColor; - _fontName = defaultFont.FontName; - _fontFamilyNumbering = defaultFont.FontFamilyNumbering; - - if (useDefaultModify) - { - var d = defaultFont as XLFont; - if (d == null) return; - BoldModified = d.BoldModified; - ItalicModified = d.ItalicModified; - UnderlineModified = d.UnderlineModified; - StrikethroughModified = d.StrikethroughModified; - VerticalAlignmentModified = d.VerticalAlignmentModified; - ShadowModified = d.ShadowModified; - FontSizeModified = d.FontSizeModified; - FontColorModified = d.FontColorModified; - FontNameModified = d.FontNameModified; - FontFamilyNumberingModified = d.FontFamilyNumberingModified; - } - } - - #region IXLFont Members - - public Boolean BoldModified { get; set; } - public Boolean Bold - { - get { return _bold; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Font.Bold = value); - else - { - _bold = value; - BoldModified = true; - } - } - } - - public Boolean ItalicModified { get; set; } - public Boolean Italic - { - get { return _italic; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Font.Italic = value); - else - { - _italic = value; - ItalicModified = true; - } - } - } - - public Boolean UnderlineModified { get; set; } - public XLFontUnderlineValues Underline - { - get { return _underline; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Font.Underline = value); - else - { - _underline = value; - UnderlineModified = true; - } - - } - } - - public Boolean StrikethroughModified { get; set; } - public Boolean Strikethrough - { - get { return _strikethrough; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Font.Strikethrough = value); - else - { - _strikethrough = value; - StrikethroughModified = true; - } - } - } - - public Boolean VerticalAlignmentModified { get; set; } - public XLFontVerticalTextAlignmentValues VerticalAlignment - { - get { return _verticalAlignment; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Font.VerticalAlignment = value); - else - { - _verticalAlignment = value; - VerticalAlignmentModified = true; - } - } - } - - public Boolean ShadowModified { get; set; } - public Boolean Shadow - { - get { return _shadow; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Font.Shadow = value); - else - { - _shadow = value; - ShadowModified = true; - } - } - } - - public Boolean FontSizeModified { get; set; } - public Double FontSize - { - get { return _fontSize; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Font.FontSize = value); - else - { - _fontSize = value; - FontSizeModified = true; - } - } - } - - private Boolean _fontColorModified; - public Boolean FontColorModified - { - get { return _fontColorModified; } - set - { - _fontColorModified = value; - } - } - public XLColor FontColor - { - get { return _fontColor; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Font.FontColor = value); - else - { - _fontColor = value; - FontColorModified = true; - } - } - } - - public Boolean FontNameModified { get; set; } - public String FontName - { - get { return _fontName; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Font.FontName = value); - else - { - _fontName = value; - FontNameModified = true; - } - } - } - - public Boolean FontFamilyNumberingModified { get; set; } - public XLFontFamilyNumberingValues FontFamilyNumbering - { - get { return _fontFamilyNumbering; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Font.FontFamilyNumbering = value); - else - { - _fontFamilyNumbering = value; - FontFamilyNumberingModified = true; - } - } - } - - public IXLStyle SetBold() - { - Bold = true; - return _container.Style; - } - - public IXLStyle SetBold(Boolean value) - { - Bold = value; - return _container.Style; - } - - public IXLStyle SetItalic() - { - Italic = true; - return _container.Style; - } - - public IXLStyle SetItalic(Boolean value) - { - Italic = value; - return _container.Style; - } - - public IXLStyle SetUnderline() - { - Underline = XLFontUnderlineValues.Single; - return _container.Style; - } - - public IXLStyle SetUnderline(XLFontUnderlineValues value) - { - Underline = value; - return _container.Style; - } - - public IXLStyle SetStrikethrough() - { - Strikethrough = true; - return _container.Style; - } - - public IXLStyle SetStrikethrough(Boolean value) - { - Strikethrough = value; - return _container.Style; - } - - public IXLStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) - { - VerticalAlignment = value; - return _container.Style; - } - - public IXLStyle SetShadow() - { - Shadow = true; - return _container.Style; - } - - public IXLStyle SetShadow(Boolean value) - { - Shadow = value; - return _container.Style; - } - - public IXLStyle SetFontSize(Double value) - { - FontSize = value; - return _container.Style; - } - - public IXLStyle SetFontColor(XLColor value) - { - FontColor = value; - return _container.Style; - } - - public IXLStyle SetFontName(String value) - { - FontName = value; - return _container.Style; - } - - public IXLStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value) - { - FontFamilyNumbering = value; - return _container.Style; - } - - public Boolean Equals(IXLFont other) - { - var otherF = other as XLFont; - if (otherF == null) - return false; - - return - _bold == otherF._bold - && _italic == otherF._italic - && _underline == otherF._underline - && _strikethrough == otherF._strikethrough - && _verticalAlignment == otherF._verticalAlignment - && _shadow == otherF._shadow - && _fontSize == otherF._fontSize - && _fontColor.Equals(otherF._fontColor) - && _fontName == otherF._fontName - && _fontFamilyNumbering == otherF._fontFamilyNumbering - ; - } - - #endregion - - private void SetStyleChanged() - { - if (_container != null) _container.StyleChanged = true; - } - - public override string ToString() - { - var sb = new StringBuilder(); - sb.Append(Bold.ToString()); - sb.Append("-"); - sb.Append(Italic.ToString()); - sb.Append("-"); - sb.Append(Underline.ToString()); - sb.Append("-"); - sb.Append(Strikethrough.ToString()); - sb.Append("-"); - sb.Append(VerticalAlignment.ToString()); - sb.Append("-"); - sb.Append(Shadow.ToString()); - sb.Append("-"); - sb.Append(FontSize.ToString()); - sb.Append("-"); - sb.Append(FontColor); - sb.Append("-"); - sb.Append(FontName); - sb.Append("-"); - sb.Append(FontFamilyNumbering.ToString()); - return sb.ToString(); - } - - public override bool Equals(object obj) - { - return Equals((XLFont)obj); - } - - public override int GetHashCode() - { - return Bold.GetHashCode() - ^ Italic.GetHashCode() - ^ (Int32)Underline - ^ Strikethrough.GetHashCode() - ^ (Int32)VerticalAlignment - ^ Shadow.GetHashCode() - ^ FontSize.GetHashCode() - ^ FontColor.GetHashCode() - ^ FontName.GetHashCode() - ^ (Int32)FontFamilyNumbering; - } - } +using System; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLFont : IXLFont + { + private readonly IXLStylized _container; + private Boolean _bold; + private XLColor _fontColor; + private XLFontFamilyNumberingValues _fontFamilyNumbering; + private String _fontName; + private Double _fontSize; + private Boolean _italic; + private Boolean _shadow; + private Boolean _strikethrough; + private XLFontUnderlineValues _underline; + private XLFontVerticalTextAlignmentValues _verticalAlignment; + + public XLFont() + : this(null, XLWorkbook.DefaultStyle.Font) + { + } + + public XLFont(IXLStylized container, IXLFontBase defaultFont, Boolean useDefaultModify = true) + { + _container = container; + if (defaultFont == null) return; + + _bold = defaultFont.Bold; + _italic = defaultFont.Italic; + _underline = defaultFont.Underline; + _strikethrough = defaultFont.Strikethrough; + _verticalAlignment = defaultFont.VerticalAlignment; + _shadow = defaultFont.Shadow; + _fontSize = defaultFont.FontSize; + _fontColor = defaultFont.FontColor; + _fontName = defaultFont.FontName; + _fontFamilyNumbering = defaultFont.FontFamilyNumbering; + + if (useDefaultModify) + { + var d = defaultFont as XLFont; + if (d == null) return; + BoldModified = d.BoldModified; + ItalicModified = d.ItalicModified; + UnderlineModified = d.UnderlineModified; + StrikethroughModified = d.StrikethroughModified; + VerticalAlignmentModified = d.VerticalAlignmentModified; + ShadowModified = d.ShadowModified; + FontSizeModified = d.FontSizeModified; + FontColorModified = d.FontColorModified; + FontNameModified = d.FontNameModified; + FontFamilyNumberingModified = d.FontFamilyNumberingModified; + } + } + + #region IXLFont Members + + public Boolean BoldModified { get; set; } + public Boolean Bold + { + get { return _bold; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Font.Bold = value); + else + { + _bold = value; + BoldModified = true; + } + } + } + + public Boolean ItalicModified { get; set; } + public Boolean Italic + { + get { return _italic; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Font.Italic = value); + else + { + _italic = value; + ItalicModified = true; + } + } + } + + public Boolean UnderlineModified { get; set; } + public XLFontUnderlineValues Underline + { + get { return _underline; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Font.Underline = value); + else + { + _underline = value; + UnderlineModified = true; + } + + } + } + + public Boolean StrikethroughModified { get; set; } + public Boolean Strikethrough + { + get { return _strikethrough; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Font.Strikethrough = value); + else + { + _strikethrough = value; + StrikethroughModified = true; + } + } + } + + public Boolean VerticalAlignmentModified { get; set; } + public XLFontVerticalTextAlignmentValues VerticalAlignment + { + get { return _verticalAlignment; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Font.VerticalAlignment = value); + else + { + _verticalAlignment = value; + VerticalAlignmentModified = true; + } + } + } + + public Boolean ShadowModified { get; set; } + public Boolean Shadow + { + get { return _shadow; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Font.Shadow = value); + else + { + _shadow = value; + ShadowModified = true; + } + } + } + + public Boolean FontSizeModified { get; set; } + public Double FontSize + { + get { return _fontSize; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Font.FontSize = value); + else + { + _fontSize = value; + FontSizeModified = true; + } + } + } + + private Boolean _fontColorModified; + public Boolean FontColorModified + { + get { return _fontColorModified; } + set + { + _fontColorModified = value; + } + } + public XLColor FontColor + { + get { return _fontColor; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Font.FontColor = value); + else + { + _fontColor = value; + FontColorModified = true; + } + } + } + + public Boolean FontNameModified { get; set; } + public String FontName + { + get { return _fontName; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Font.FontName = value); + else + { + _fontName = value; + FontNameModified = true; + } + } + } + + public Boolean FontFamilyNumberingModified { get; set; } + public XLFontFamilyNumberingValues FontFamilyNumbering + { + get { return _fontFamilyNumbering; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Font.FontFamilyNumbering = value); + else + { + _fontFamilyNumbering = value; + FontFamilyNumberingModified = true; + } + } + } + + public IXLStyle SetBold() + { + Bold = true; + return _container.Style; + } + + public IXLStyle SetBold(Boolean value) + { + Bold = value; + return _container.Style; + } + + public IXLStyle SetItalic() + { + Italic = true; + return _container.Style; + } + + public IXLStyle SetItalic(Boolean value) + { + Italic = value; + return _container.Style; + } + + public IXLStyle SetUnderline() + { + Underline = XLFontUnderlineValues.Single; + return _container.Style; + } + + public IXLStyle SetUnderline(XLFontUnderlineValues value) + { + Underline = value; + return _container.Style; + } + + public IXLStyle SetStrikethrough() + { + Strikethrough = true; + return _container.Style; + } + + public IXLStyle SetStrikethrough(Boolean value) + { + Strikethrough = value; + return _container.Style; + } + + public IXLStyle SetVerticalAlignment(XLFontVerticalTextAlignmentValues value) + { + VerticalAlignment = value; + return _container.Style; + } + + public IXLStyle SetShadow() + { + Shadow = true; + return _container.Style; + } + + public IXLStyle SetShadow(Boolean value) + { + Shadow = value; + return _container.Style; + } + + public IXLStyle SetFontSize(Double value) + { + FontSize = value; + return _container.Style; + } + + public IXLStyle SetFontColor(XLColor value) + { + FontColor = value; + return _container.Style; + } + + public IXLStyle SetFontName(String value) + { + FontName = value; + return _container.Style; + } + + public IXLStyle SetFontFamilyNumbering(XLFontFamilyNumberingValues value) + { + FontFamilyNumbering = value; + return _container.Style; + } + + public Boolean Equals(IXLFont other) + { + var otherF = other as XLFont; + if (otherF == null) + return false; + + return + _bold == otherF._bold + && _italic == otherF._italic + && _underline == otherF._underline + && _strikethrough == otherF._strikethrough + && _verticalAlignment == otherF._verticalAlignment + && _shadow == otherF._shadow + && _fontSize == otherF._fontSize + && _fontColor.Equals(otherF._fontColor) + && _fontName == otherF._fontName + && _fontFamilyNumbering == otherF._fontFamilyNumbering + ; + } + + #endregion + + private void SetStyleChanged() + { + if (_container != null) _container.StyleChanged = true; + } + + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append(Bold.ToString()); + sb.Append("-"); + sb.Append(Italic.ToString()); + sb.Append("-"); + sb.Append(Underline.ToString()); + sb.Append("-"); + sb.Append(Strikethrough.ToString()); + sb.Append("-"); + sb.Append(VerticalAlignment.ToString()); + sb.Append("-"); + sb.Append(Shadow.ToString()); + sb.Append("-"); + sb.Append(FontSize.ToString()); + sb.Append("-"); + sb.Append(FontColor); + sb.Append("-"); + sb.Append(FontName); + sb.Append("-"); + sb.Append(FontFamilyNumbering.ToString()); + return sb.ToString(); + } + + public override bool Equals(object obj) + { + return Equals((XLFont)obj); + } + + public override int GetHashCode() + { + return Bold.GetHashCode() + ^ Italic.GetHashCode() + ^ (Int32)Underline + ^ Strikethrough.GetHashCode() + ^ (Int32)VerticalAlignment + ^ Shadow.GetHashCode() + ^ FontSize.GetHashCode() + ^ FontColor.GetHashCode() + ^ FontName.GetHashCode() + ^ (Int32)FontFamilyNumbering; + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Style/XLNumberFormat.cs b/ClosedXML/Excel/Style/XLNumberFormat.cs index 7a15cc7..0fc2f4a 100644 --- a/ClosedXML/Excel/Style/XLNumberFormat.cs +++ b/ClosedXML/Excel/Style/XLNumberFormat.cs @@ -1,115 +1,115 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLNumberFormat : IXLNumberFormat - { - #region IXLNumberFormat Members - - public bool Equals(IXLNumberFormatBase other) - { - return - _numberFormatId == other.NumberFormatId - && _format == other.Format - ; - } - - #endregion - - private void SetStyleChanged() - { - if (_container != null) _container.StyleChanged = true; - } - - public override bool Equals(object obj) - { - return Equals((IXLNumberFormatBase)obj); - } - - public override int GetHashCode() - { - return NumberFormatId - ^ Format.GetHashCode(); - } - - #region Properties - - private readonly IXLStylized _container; - private String _format = String.Empty; - - private Int32 _numberFormatId; - - public Int32 NumberFormatId - { - get { return _numberFormatId; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.NumberFormat.NumberFormatId = value); - else - { - _numberFormatId = value; - _format = String.Empty; - } - } - } - - public String Format - { - get { return _format; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.NumberFormat.Format = value); - else - { - _format = value; - _numberFormatId = -1; - } - } - } - - public IXLStyle SetNumberFormatId(Int32 value) - { - NumberFormatId = value; - return _container.Style; - } - - public IXLStyle SetFormat(String value) - { - Format = value; - return _container.Style; - } - - #endregion - - #region Constructors - - public XLNumberFormat() - : this(null, XLWorkbook.DefaultStyle.NumberFormat) - { - } - - - public XLNumberFormat(IXLStylized container, IXLNumberFormat defaultNumberFormat) - { - _container = container; - if (defaultNumberFormat == null) return; - _numberFormatId = defaultNumberFormat.NumberFormatId; - _format = defaultNumberFormat.Format; - } - - #endregion - - #region Overridden - - public override string ToString() - { - return _numberFormatId + "-" + _format; - } - - #endregion - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLNumberFormat : IXLNumberFormat + { + #region IXLNumberFormat Members + + public bool Equals(IXLNumberFormatBase other) + { + return + _numberFormatId == other.NumberFormatId + && _format == other.Format + ; + } + + #endregion + + private void SetStyleChanged() + { + if (_container != null) _container.StyleChanged = true; + } + + public override bool Equals(object obj) + { + return Equals((IXLNumberFormatBase)obj); + } + + public override int GetHashCode() + { + return NumberFormatId + ^ Format.GetHashCode(); + } + + #region Properties + + private readonly IXLStylized _container; + private String _format = String.Empty; + + private Int32 _numberFormatId; + + public Int32 NumberFormatId + { + get { return _numberFormatId; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.NumberFormat.NumberFormatId = value); + else + { + _numberFormatId = value; + _format = String.Empty; + } + } + } + + public String Format + { + get { return _format; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.NumberFormat.Format = value); + else + { + _format = value; + _numberFormatId = -1; + } + } + } + + public IXLStyle SetNumberFormatId(Int32 value) + { + NumberFormatId = value; + return _container.Style; + } + + public IXLStyle SetFormat(String value) + { + Format = value; + return _container.Style; + } + + #endregion + + #region Constructors + + public XLNumberFormat() + : this(null, XLWorkbook.DefaultStyle.NumberFormat) + { + } + + + public XLNumberFormat(IXLStylized container, IXLNumberFormat defaultNumberFormat) + { + _container = container; + if (defaultNumberFormat == null) return; + _numberFormatId = defaultNumberFormat.NumberFormatId; + _format = defaultNumberFormat.Format; + } + + #endregion + + #region Overridden + + public override string ToString() + { + return _numberFormatId + "-" + _format; + } + + #endregion + } +} diff --git a/ClosedXML/Excel/Style/XLProtection.cs b/ClosedXML/Excel/Style/XLProtection.cs index 7d0c2ef..51ba453 100644 --- a/ClosedXML/Excel/Style/XLProtection.cs +++ b/ClosedXML/Excel/Style/XLProtection.cs @@ -1,120 +1,120 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLProtection : IXLProtection - { - private readonly IXLStylized _container; - private Boolean _hidden; - - private Boolean _locked; - - #region IXLProtection Members - - public Boolean Locked - { - get { return _locked; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Protection.Locked = value); - else - _locked = value; - } - } - - public Boolean Hidden - { - get { return _hidden; } - set - { - SetStyleChanged(); - if (_container != null && !_container.UpdatingStyle) - _container.Styles.ForEach(s => s.Protection.Hidden = value); - else - _hidden = value; - } - } - - public bool Equals(IXLProtection other) - { - var otherP = other as XLProtection; - if (otherP == null) - return false; - - return _locked == otherP._locked - && _hidden == otherP._hidden; - } - - public IXLStyle SetLocked() - { - Locked = true; - return _container.Style; - } - - public IXLStyle SetLocked(Boolean value) - { - Locked = value; - return _container.Style; - } - - public IXLStyle SetHidden() - { - Hidden = true; - return _container.Style; - } - - public IXLStyle SetHidden(Boolean value) - { - Hidden = value; - return _container.Style; - } - - #endregion - - #region Constructors - - public XLProtection() - : this(null, XLWorkbook.DefaultStyle.Protection) - { - } - - public XLProtection(IXLStylized container, IXLProtection defaultProtection = null) - { - _container = container; - if (defaultProtection == null) return; - - _locked = defaultProtection.Locked; - _hidden = defaultProtection.Hidden; - } - - #endregion - - private void SetStyleChanged() - { - if (_container != null) _container.StyleChanged = true; - } - - public override bool Equals(object obj) - { - return Equals((IXLProtection)obj); - } - - public override int GetHashCode() - { - if (Locked) - return Hidden ? 11 : 10; - - return Hidden ? 1 : 0; - } - - public override string ToString() - { - if (Locked) - return Hidden ? "Locked-Hidden" : "Locked"; - - return Hidden ? "Hidden" : "None"; - } - } +using System; + +namespace ClosedXML.Excel +{ + internal class XLProtection : IXLProtection + { + private readonly IXLStylized _container; + private Boolean _hidden; + + private Boolean _locked; + + #region IXLProtection Members + + public Boolean Locked + { + get { return _locked; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Protection.Locked = value); + else + _locked = value; + } + } + + public Boolean Hidden + { + get { return _hidden; } + set + { + SetStyleChanged(); + if (_container != null && !_container.UpdatingStyle) + _container.Styles.ForEach(s => s.Protection.Hidden = value); + else + _hidden = value; + } + } + + public bool Equals(IXLProtection other) + { + var otherP = other as XLProtection; + if (otherP == null) + return false; + + return _locked == otherP._locked + && _hidden == otherP._hidden; + } + + public IXLStyle SetLocked() + { + Locked = true; + return _container.Style; + } + + public IXLStyle SetLocked(Boolean value) + { + Locked = value; + return _container.Style; + } + + public IXLStyle SetHidden() + { + Hidden = true; + return _container.Style; + } + + public IXLStyle SetHidden(Boolean value) + { + Hidden = value; + return _container.Style; + } + + #endregion + + #region Constructors + + public XLProtection() + : this(null, XLWorkbook.DefaultStyle.Protection) + { + } + + public XLProtection(IXLStylized container, IXLProtection defaultProtection = null) + { + _container = container; + if (defaultProtection == null) return; + + _locked = defaultProtection.Locked; + _hidden = defaultProtection.Hidden; + } + + #endregion + + private void SetStyleChanged() + { + if (_container != null) _container.StyleChanged = true; + } + + public override bool Equals(object obj) + { + return Equals((IXLProtection)obj); + } + + public override int GetHashCode() + { + if (Locked) + return Hidden ? 11 : 10; + + return Hidden ? 1 : 0; + } + + public override string ToString() + { + if (Locked) + return Hidden ? "Locked-Hidden" : "Locked"; + + return Hidden ? "Hidden" : "None"; + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Style/XLStyle.cs b/ClosedXML/Excel/Style/XLStyle.cs index 5f67dd7..b392a84 100644 --- a/ClosedXML/Excel/Style/XLStyle.cs +++ b/ClosedXML/Excel/Style/XLStyle.cs @@ -1,103 +1,103 @@ -using System; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLStyle : IXLStyle - { - public XLStyle(IXLStylized container, IXLStyle initialStyle = null, Boolean useDefaultModify = true) - { - if (initialStyle != null) - { - Font = new XLFont(container, initialStyle.Font, useDefaultModify); - Alignment = new XLAlignment(container, initialStyle.Alignment); - Border = new XLBorder(container, initialStyle.Border, useDefaultModify); - Fill = new XLFill(container, initialStyle.Fill, useDefaultModify); - NumberFormat = new XLNumberFormat(container, initialStyle.NumberFormat); - Protection = new XLProtection(container, initialStyle.Protection); - } - else - { - Font = new XLFont(container, null); - Alignment = new XLAlignment(container); - Border = new XLBorder(container, null); - Fill = new XLFill(container); - NumberFormat = new XLNumberFormat(container, null); - Protection = new XLProtection(container); - } - - DateFormat = NumberFormat; - } - - public IXLFont Font { get; set; } - - public IXLAlignment Alignment { get; set; } - - public IXLBorder Border { get; set; } - - public IXLFill Fill { get; set; } - - private IXLNumberFormat numberFormat; - public IXLNumberFormat NumberFormat - { - get - { - return numberFormat; - } - set - { - numberFormat = value; - DateFormat = numberFormat; - } - } - - public IXLProtection Protection { get; set; } - - public IXLNumberFormat DateFormat { get; private set; } - - public override string ToString() - { - var sb = new StringBuilder(); - sb.Append("Font:"); - sb.Append(Font); - sb.Append(" Fill:"); - sb.Append(Fill); - sb.Append(" Border:"); - sb.Append(Border); - sb.Append(" NumberFormat: "); - sb.Append(NumberFormat); - sb.Append(" Alignment: "); - sb.Append(Alignment); - sb.Append(" Protection: "); - sb.Append(Protection); - return sb.ToString(); - } - - public bool Equals(IXLStyle other) - { - return - Font.Equals(other.Font) - && Fill.Equals(other.Fill) - && Border.Equals(other.Border) - && NumberFormat.Equals(other.NumberFormat) - && Alignment.Equals(other.Alignment) - && Protection.Equals(other.Protection) - ; - } - - public override bool Equals(object obj) - { - return Equals((XLStyle)obj); - } - - public override int GetHashCode() - { - return Font.GetHashCode() - ^ Fill.GetHashCode() - ^ Border.GetHashCode() - ^ NumberFormat.GetHashCode() - ^ Alignment.GetHashCode() - ^ Protection.GetHashCode(); - } - } -} +using System; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLStyle : IXLStyle + { + public XLStyle(IXLStylized container, IXLStyle initialStyle = null, Boolean useDefaultModify = true) + { + if (initialStyle != null) + { + Font = new XLFont(container, initialStyle.Font, useDefaultModify); + Alignment = new XLAlignment(container, initialStyle.Alignment); + Border = new XLBorder(container, initialStyle.Border, useDefaultModify); + Fill = new XLFill(container, initialStyle.Fill, useDefaultModify); + NumberFormat = new XLNumberFormat(container, initialStyle.NumberFormat); + Protection = new XLProtection(container, initialStyle.Protection); + } + else + { + Font = new XLFont(container, null); + Alignment = new XLAlignment(container); + Border = new XLBorder(container, null); + Fill = new XLFill(container); + NumberFormat = new XLNumberFormat(container, null); + Protection = new XLProtection(container); + } + + DateFormat = NumberFormat; + } + + public IXLFont Font { get; set; } + + public IXLAlignment Alignment { get; set; } + + public IXLBorder Border { get; set; } + + public IXLFill Fill { get; set; } + + private IXLNumberFormat numberFormat; + public IXLNumberFormat NumberFormat + { + get + { + return numberFormat; + } + set + { + numberFormat = value; + DateFormat = numberFormat; + } + } + + public IXLProtection Protection { get; set; } + + public IXLNumberFormat DateFormat { get; private set; } + + public override string ToString() + { + var sb = new StringBuilder(); + sb.Append("Font:"); + sb.Append(Font); + sb.Append(" Fill:"); + sb.Append(Fill); + sb.Append(" Border:"); + sb.Append(Border); + sb.Append(" NumberFormat: "); + sb.Append(NumberFormat); + sb.Append(" Alignment: "); + sb.Append(Alignment); + sb.Append(" Protection: "); + sb.Append(Protection); + return sb.ToString(); + } + + public bool Equals(IXLStyle other) + { + return + Font.Equals(other.Font) + && Fill.Equals(other.Fill) + && Border.Equals(other.Border) + && NumberFormat.Equals(other.NumberFormat) + && Alignment.Equals(other.Alignment) + && Protection.Equals(other.Protection) + ; + } + + public override bool Equals(object obj) + { + return Equals((XLStyle)obj); + } + + public override int GetHashCode() + { + return Font.GetHashCode() + ^ Fill.GetHashCode() + ^ Border.GetHashCode() + ^ NumberFormat.GetHashCode() + ^ Alignment.GetHashCode() + ^ Protection.GetHashCode(); + } + } +} diff --git a/ClosedXML/Excel/Style/XLStylizedContainer.cs b/ClosedXML/Excel/Style/XLStylizedContainer.cs index a404485..bc2e5ec 100644 --- a/ClosedXML/Excel/Style/XLStylizedContainer.cs +++ b/ClosedXML/Excel/Style/XLStylizedContainer.cs @@ -1,36 +1,36 @@ -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - using System; - - internal class XLStylizedContainer: IXLStylized - { - public Boolean StyleChanged { get; set; } - readonly IXLStylized _container; - public XLStylizedContainer(IXLStyle style, IXLStylized container) - { - Style = style; - _container = container; - RangesUsed = container.RangesUsed; - } - - public IXLStyle Style { get; set; } - - public IEnumerable Styles - { - get - { - _container.UpdatingStyle = true; - yield return Style; - _container.UpdatingStyle = false; - } - } - - public bool UpdatingStyle { get; set; } - - public IXLStyle InnerStyle { get; set; } - - public IXLRanges RangesUsed { get; set; } - } -} +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + using System; + + internal class XLStylizedContainer: IXLStylized + { + public Boolean StyleChanged { get; set; } + readonly IXLStylized _container; + public XLStylizedContainer(IXLStyle style, IXLStylized container) + { + Style = style; + _container = container; + RangesUsed = container.RangesUsed; + } + + public IXLStyle Style { get; set; } + + public IEnumerable Styles + { + get + { + _container.UpdatingStyle = true; + yield return Style; + _container.UpdatingStyle = false; + } + } + + public bool UpdatingStyle { get; set; } + + public IXLStyle InnerStyle { get; set; } + + public IXLRanges RangesUsed { get; set; } + } +} diff --git a/ClosedXML/Excel/Style/XLStylizedEmpty.cs b/ClosedXML/Excel/Style/XLStylizedEmpty.cs index 10aff35..161f15f 100644 --- a/ClosedXML/Excel/Style/XLStylizedEmpty.cs +++ b/ClosedXML/Excel/Style/XLStylizedEmpty.cs @@ -1,37 +1,37 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLStylizedEmpty: IXLStylized - { - public XLStylizedEmpty(IXLStyle defaultStyle) - { - Style = new XLStyle(this, defaultStyle); - } - public IXLStyle Style { get; set; } - - public IEnumerable Styles - { - get - { - UpdatingStyle = true; - yield return Style; - UpdatingStyle = false; - } - } - - public bool UpdatingStyle { get; set; } - - public IXLStyle InnerStyle { get; set; } - - public IXLRanges RangesUsed - { - get { return new XLRanges(); } - } - - public bool StyleChanged { get; set; } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLStylizedEmpty: IXLStylized + { + public XLStylizedEmpty(IXLStyle defaultStyle) + { + Style = new XLStyle(this, defaultStyle); + } + public IXLStyle Style { get; set; } + + public IEnumerable Styles + { + get + { + UpdatingStyle = true; + yield return Style; + UpdatingStyle = false; + } + } + + public bool UpdatingStyle { get; set; } + + public IXLStyle InnerStyle { get; set; } + + public IXLRanges RangesUsed + { + get { return new XLRanges(); } + } + + public bool StyleChanged { get; set; } + } +} diff --git a/ClosedXML/Excel/Tables/IXLTable.cs b/ClosedXML/Excel/Tables/IXLTable.cs index e109f6d..386c669 100644 --- a/ClosedXML/Excel/Tables/IXLTable.cs +++ b/ClosedXML/Excel/Tables/IXLTable.cs @@ -1,45 +1,45 @@ -using System; -using System.Collections.Generic; -namespace ClosedXML.Excel -{ - public interface IXLTable : IXLRange - { - string Name { get; set; } - Boolean EmphasizeFirstColumn { get; set; } - Boolean EmphasizeLastColumn { get; set; } - Boolean ShowRowStripes { get; set; } - Boolean ShowColumnStripes { get; set; } - Boolean ShowTotalsRow { get; set; } - Boolean ShowAutoFilter { get; set; } - XLTableTheme Theme { get; set; } - IXLRangeRow HeadersRow(); - IXLRangeRow TotalsRow(); - IXLTableField Field(string fieldName); - IXLTableField Field(int fieldIndex); - IEnumerable Fields { get; } - - - - IXLTable SetEmphasizeFirstColumn(); IXLTable SetEmphasizeFirstColumn(Boolean value); - IXLTable SetEmphasizeLastColumn(); IXLTable SetEmphasizeLastColumn(Boolean value); - IXLTable SetShowRowStripes(); IXLTable SetShowRowStripes(Boolean value); - IXLTable SetShowColumnStripes(); IXLTable SetShowColumnStripes(Boolean value); - IXLTable SetShowTotalsRow(); IXLTable SetShowTotalsRow(Boolean value); - IXLTable SetShowAutoFilter(); IXLTable SetShowAutoFilter(Boolean value); - - /// - /// Clears the contents of this table. - /// - /// Specify what you want to clear. - new IXLTable Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - IXLBaseAutoFilter AutoFilter { get; } - - new IXLBaseAutoFilter SetAutoFilter(); - - Boolean ShowHeaderRow { get; set; } - IXLTable SetShowHeaderRow(); IXLTable SetShowHeaderRow(Boolean value); - - IXLTableRange DataRange { get; } - } +using System; +using System.Collections.Generic; +namespace ClosedXML.Excel +{ + public interface IXLTable : IXLRange + { + string Name { get; set; } + Boolean EmphasizeFirstColumn { get; set; } + Boolean EmphasizeLastColumn { get; set; } + Boolean ShowRowStripes { get; set; } + Boolean ShowColumnStripes { get; set; } + Boolean ShowTotalsRow { get; set; } + Boolean ShowAutoFilter { get; set; } + XLTableTheme Theme { get; set; } + IXLRangeRow HeadersRow(); + IXLRangeRow TotalsRow(); + IXLTableField Field(string fieldName); + IXLTableField Field(int fieldIndex); + IEnumerable Fields { get; } + + + + IXLTable SetEmphasizeFirstColumn(); IXLTable SetEmphasizeFirstColumn(Boolean value); + IXLTable SetEmphasizeLastColumn(); IXLTable SetEmphasizeLastColumn(Boolean value); + IXLTable SetShowRowStripes(); IXLTable SetShowRowStripes(Boolean value); + IXLTable SetShowColumnStripes(); IXLTable SetShowColumnStripes(Boolean value); + IXLTable SetShowTotalsRow(); IXLTable SetShowTotalsRow(Boolean value); + IXLTable SetShowAutoFilter(); IXLTable SetShowAutoFilter(Boolean value); + + /// + /// Clears the contents of this table. + /// + /// Specify what you want to clear. + new IXLTable Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + IXLBaseAutoFilter AutoFilter { get; } + + new IXLBaseAutoFilter SetAutoFilter(); + + Boolean ShowHeaderRow { get; set; } + IXLTable SetShowHeaderRow(); IXLTable SetShowHeaderRow(Boolean value); + + IXLTableRange DataRange { get; } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Tables/IXLTableField.cs b/ClosedXML/Excel/Tables/IXLTableField.cs index 5898961..5bc695c 100644 --- a/ClosedXML/Excel/Tables/IXLTableField.cs +++ b/ClosedXML/Excel/Tables/IXLTableField.cs @@ -1,28 +1,28 @@ -using System; - -namespace ClosedXML.Excel -{ - public enum XLTotalsRowFunction - { - None, - Sum, - Minimum, - Maximum, - Average, - Count, - CountNumbers, - StandardDeviation, - Variance, - Custom - } - - public interface IXLTableField - { - Int32 Index { get; } - String Name { get; set; } - String TotalsRowLabel { get; set; } - String TotalsRowFormulaA1 { get; set; } - String TotalsRowFormulaR1C1 { get; set; } - XLTotalsRowFunction TotalsRowFunction { get; set; } - } -} +using System; + +namespace ClosedXML.Excel +{ + public enum XLTotalsRowFunction + { + None, + Sum, + Minimum, + Maximum, + Average, + Count, + CountNumbers, + StandardDeviation, + Variance, + Custom + } + + public interface IXLTableField + { + Int32 Index { get; } + String Name { get; set; } + String TotalsRowLabel { get; set; } + String TotalsRowFormulaA1 { get; set; } + String TotalsRowFormulaR1C1 { get; set; } + XLTotalsRowFunction TotalsRowFunction { get; set; } + } +} diff --git a/ClosedXML/Excel/Tables/IXLTableRange.cs b/ClosedXML/Excel/Tables/IXLTableRange.cs index 4c21627..3e6f3f9 100644 --- a/ClosedXML/Excel/Tables/IXLTableRange.cs +++ b/ClosedXML/Excel/Tables/IXLTableRange.cs @@ -1,27 +1,27 @@ -using System; -using System.Collections.Generic; -namespace ClosedXML.Excel -{ - - public interface IXLTableRange : IXLRange - { - IXLTableRow FirstRow(Func predicate = null); - IXLTableRow FirstRowUsed(Boolean includeFormats, Func predicate = null); - IXLTableRow FirstRowUsed(Func predicate = null); - IXLTableRow LastRow(Func predicate = null); - IXLTableRow LastRowUsed(Boolean includeFormats, Func predicate = null); - IXLTableRow LastRowUsed(Func predicate = null); - - new IXLTableRow Row(int row); - IXLTableRows Rows(Func predicate = null); - new IXLTableRows Rows(int firstRow, int lastRow); - new IXLTableRows Rows(string rows); - IXLTableRows RowsUsed(Boolean includeFormats, Func predicate = null); - IXLTableRows RowsUsed(Func predicate = null); - - IXLTable Table { get; } - - new IXLTableRows InsertRowsAbove(int numberOfRows); - new IXLTableRows InsertRowsBelow(int numberOfRows); - } +using System; +using System.Collections.Generic; +namespace ClosedXML.Excel +{ + + public interface IXLTableRange : IXLRange + { + IXLTableRow FirstRow(Func predicate = null); + IXLTableRow FirstRowUsed(Boolean includeFormats, Func predicate = null); + IXLTableRow FirstRowUsed(Func predicate = null); + IXLTableRow LastRow(Func predicate = null); + IXLTableRow LastRowUsed(Boolean includeFormats, Func predicate = null); + IXLTableRow LastRowUsed(Func predicate = null); + + new IXLTableRow Row(int row); + IXLTableRows Rows(Func predicate = null); + new IXLTableRows Rows(int firstRow, int lastRow); + new IXLTableRows Rows(string rows); + IXLTableRows RowsUsed(Boolean includeFormats, Func predicate = null); + IXLTableRows RowsUsed(Func predicate = null); + + IXLTable Table { get; } + + new IXLTableRows InsertRowsAbove(int numberOfRows); + new IXLTableRows InsertRowsBelow(int numberOfRows); + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Tables/IXLTableRow.cs b/ClosedXML/Excel/Tables/IXLTableRow.cs index ac3ce9c..9f467c5 100644 --- a/ClosedXML/Excel/Tables/IXLTableRow.cs +++ b/ClosedXML/Excel/Tables/IXLTableRow.cs @@ -1,27 +1,27 @@ -using System; - -namespace ClosedXML.Excel -{ - public interface IXLTableRow: IXLRangeRow - { - IXLCell Field(Int32 index); - IXLCell Field(String name); - - new IXLTableRow Sort(); - new IXLTableRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); - - new IXLTableRow RowAbove(); - new IXLTableRow RowAbove(Int32 step); - new IXLTableRow RowBelow(); - new IXLTableRow RowBelow(Int32 step); - - /// - /// Clears the contents of this row. - /// - /// Specify what you want to clear. - new IXLTableRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - new IXLTableRows InsertRowsAbove(int numberOfRows); - new IXLTableRows InsertRowsBelow(int numberOfRows); - } -} +using System; + +namespace ClosedXML.Excel +{ + public interface IXLTableRow: IXLRangeRow + { + IXLCell Field(Int32 index); + IXLCell Field(String name); + + new IXLTableRow Sort(); + new IXLTableRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true); + + new IXLTableRow RowAbove(); + new IXLTableRow RowAbove(Int32 step); + new IXLTableRow RowBelow(); + new IXLTableRow RowBelow(Int32 step); + + /// + /// Clears the contents of this row. + /// + /// Specify what you want to clear. + new IXLTableRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + new IXLTableRows InsertRowsAbove(int numberOfRows); + new IXLTableRows InsertRowsBelow(int numberOfRows); + } +} diff --git a/ClosedXML/Excel/Tables/IXLTableRows.cs b/ClosedXML/Excel/Tables/IXLTableRows.cs index fea7075..fef29b6 100644 --- a/ClosedXML/Excel/Tables/IXLTableRows.cs +++ b/ClosedXML/Excel/Tables/IXLTableRows.cs @@ -1,40 +1,40 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLTableRows: IEnumerable - { - /// - /// Adds a table row to this group. - /// - /// The row table to add. - void Add(IXLTableRow tableRow); - - /// - /// Returns the collection of cells. - /// - IXLCells Cells(); - - /// - /// Returns the collection of cells that have a value. - /// - IXLCells CellsUsed(); - - /// - /// Returns the collection of cells that have a value. - /// - /// if set to true will return all cells with a value or a style different than the default. - IXLCells CellsUsed(Boolean includeFormats); - - IXLStyle Style { get; set; } - - /// - /// Clears the contents of these rows. - /// - /// Specify what you want to clear. - IXLTableRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - void Select(); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLTableRows: IEnumerable + { + /// + /// Adds a table row to this group. + /// + /// The row table to add. + void Add(IXLTableRow tableRow); + + /// + /// Returns the collection of cells. + /// + IXLCells Cells(); + + /// + /// Returns the collection of cells that have a value. + /// + IXLCells CellsUsed(); + + /// + /// Returns the collection of cells that have a value. + /// + /// if set to true will return all cells with a value or a style different than the default. + IXLCells CellsUsed(Boolean includeFormats); + + IXLStyle Style { get; set; } + + /// + /// Clears the contents of these rows. + /// + /// Specify what you want to clear. + IXLTableRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + void Select(); + } +} diff --git a/ClosedXML/Excel/Tables/IXLTables.cs b/ClosedXML/Excel/Tables/IXLTables.cs index 8411ce1..299ec51 100644 --- a/ClosedXML/Excel/Tables/IXLTables.cs +++ b/ClosedXML/Excel/Tables/IXLTables.cs @@ -1,21 +1,21 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - public interface IXLTables: IEnumerable - { - void Add(IXLTable table); - IXLTable Table(Int32 index); - IXLTable Table(String name); - - /// - /// Clears the contents of these tables. - /// - /// Specify what you want to clear. - IXLTables Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); - - void Remove(Int32 index); - void Remove(String name); - } -} +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + public interface IXLTables: IEnumerable + { + void Add(IXLTable table); + IXLTable Table(Int32 index); + IXLTable Table(String name); + + /// + /// Clears the contents of these tables. + /// + /// Specify what you want to clear. + IXLTables Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats); + + void Remove(Int32 index); + void Remove(String name); + } +} diff --git a/ClosedXML/Excel/Tables/XLTable.cs b/ClosedXML/Excel/Tables/XLTable.cs index 4e193cf..51bfac7 100644 --- a/ClosedXML/Excel/Tables/XLTable.cs +++ b/ClosedXML/Excel/Tables/XLTable.cs @@ -1,532 +1,532 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal class XLTable : XLRange, IXLTable - { - #region Private fields - - private string _name; - internal bool _showTotalsRow; - internal HashSet _uniqueNames; - - #endregion - - #region Constructor - - public XLTable(XLRange range, Boolean addToTables, Boolean setAutofilter = true) - : base(new XLRangeParameters(range.RangeAddress, range.Style )) - { - InitializeValues(setAutofilter); - - Int32 id = 1; - while (true) - { - string tableName = String.Format("Table{0}", id); - if (!Worksheet.Tables.Any(t => t.Name == tableName)) - { - Name = tableName; - AddToTables(range, addToTables); - break; - } - id++; - } - } - - public XLTable(XLRange range, String name, Boolean addToTables, Boolean setAutofilter = true) - : base(new XLRangeParameters(range.RangeAddress, range.Style)) - { - InitializeValues(setAutofilter); - - Name = name; - AddToTables(range, addToTables); - } - - #endregion - - private IXLRangeAddress _lastRangeAddress; - private Dictionary _fieldNames = null; - public Dictionary FieldNames - { - get - { - if (_fieldNames != null && _lastRangeAddress != null && _lastRangeAddress.Equals(RangeAddress)) return _fieldNames; - - _fieldNames = new Dictionary(); - _lastRangeAddress = RangeAddress; - - if (ShowHeaderRow) - { - var headersRow = HeadersRow(); - Int32 cellPos = 0; - foreach (var cell in headersRow.Cells()) - { - var name = cell.GetString(); - if (XLHelper.IsNullOrWhiteSpace(name)) - { - name = "Column" + (cellPos + 1); - cell.SetValue(name); - } - if (_fieldNames.ContainsKey(name)) - throw new ArgumentException("The header row contains more than one field name '" + name + "'."); - - _fieldNames.Add(name, new XLTableField(this, name) {Index = cellPos++ }); - } - } - else - { - if (_fieldNames == null) _fieldNames = new Dictionary(); - - Int32 colCount = ColumnCount(); - for (Int32 i = 1; i <= colCount; i++) - { - if (!_fieldNames.Values.Any(f => f.Index == i - 1)) - { - var name = "Column" + i; - - _fieldNames.Add(name, new XLTableField(this, name) {Index = i - 1 }); - } - } - } - return _fieldNames; - } - } - - internal void AddFields(IEnumerable fieldNames) - { - _fieldNames = new Dictionary(); - - Int32 cellPos = 0; - foreach(var name in fieldNames) - { - _fieldNames.Add(name, new XLTableField(this, name) { Index = cellPos++ }); - } - } - - - internal String RelId { get; set; } - - public IXLTableRange DataRange - { - get - { - XLRange range; - //var ws = Worksheet; - //var tracking = ws.EventTrackingEnabled; - //ws.EventTrackingEnabled = false; - - if (_showHeaderRow) - { - range = _showTotalsRow - ? Range(2, 1,RowCount() - 1,ColumnCount()) - : Range(2, 1, RowCount(), ColumnCount()); - } - else - { - range = _showTotalsRow - ? Range(1, 1, RowCount() - 1, ColumnCount()) - : Range(1, 1, RowCount(), ColumnCount()); - } - //ws.EventTrackingEnabled = tracking; - return new XLTableRange(range, this); - } - } - - private XLAutoFilter _autoFilter; - public XLAutoFilter AutoFilter - { - get - { - using (var asRange = ShowTotalsRow ? Range(1, 1, RowCount() - 1, ColumnCount()) : AsRange()) - { - if (_autoFilter == null) - _autoFilter = new XLAutoFilter(); - - _autoFilter.Range = asRange; - } - return _autoFilter; - } - } - - public new IXLBaseAutoFilter SetAutoFilter() - { - return AutoFilter; - } - - #region IXLTable Members - - public Boolean EmphasizeFirstColumn { get; set; } - public Boolean EmphasizeLastColumn { get; set; } - public Boolean ShowRowStripes { get; set; } - public Boolean ShowColumnStripes { get; set; } - - private Boolean _showAutoFilter; - public Boolean ShowAutoFilter { - get { return _showHeaderRow && _showAutoFilter; } - set { _showAutoFilter = value; } - } - public XLTableTheme Theme { get; set; } - - public String Name - { - get { return _name; } - set - { - if (Worksheet.Tables.Any(t => t.Name == value)) - { - throw new ArgumentException(String.Format("This worksheet already contains a table named '{0}'", - value)); - } - - _name = value; - } - } - - public Boolean ShowTotalsRow - { - get { return _showTotalsRow; } - set - { - if (value && !_showTotalsRow) - InsertRowsBelow(1); - else if (!value && _showTotalsRow) - TotalsRow().Delete(); - - _showTotalsRow = value; - - if (_showTotalsRow) - { - AutoFilter.Range = Worksheet.Range( - RangeAddress.FirstAddress.RowNumber, RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.LastAddress.RowNumber - 1, RangeAddress.LastAddress.ColumnNumber); - } - else - AutoFilter.Range = Worksheet.Range(RangeAddress); - } - } - - public IXLRangeRow HeadersRow() - { - if (!ShowHeaderRow) return null; - - var m = FieldNames; - return FirstRow(); - } - - public IXLRangeRow TotalsRow() - { - return ShowTotalsRow ? LastRow() : null; - } - - public IXLTableField Field(String fieldName) - { - return Field(GetFieldIndex(fieldName)); - } - - public IXLTableField Field(Int32 fieldIndex) - { - return FieldNames.Values.First(f => f.Index == fieldIndex); - } - - public IEnumerable Fields - { - get - { - Int32 columnCount = ColumnCount(); - for (int co = 0; co < columnCount; co++) - yield return Field(co); - } - } - - public IXLTable SetEmphasizeFirstColumn() - { - EmphasizeFirstColumn = true; - return this; - } - - public IXLTable SetEmphasizeFirstColumn(Boolean value) - { - EmphasizeFirstColumn = value; - return this; - } - - public IXLTable SetEmphasizeLastColumn() - { - EmphasizeLastColumn = true; - return this; - } - - public IXLTable SetEmphasizeLastColumn(Boolean value) - { - EmphasizeLastColumn = value; - return this; - } - - public IXLTable SetShowRowStripes() - { - ShowRowStripes = true; - return this; - } - - public IXLTable SetShowRowStripes(Boolean value) - { - ShowRowStripes = value; - return this; - } - - public IXLTable SetShowColumnStripes() - { - ShowColumnStripes = true; - return this; - } - - public IXLTable SetShowColumnStripes(Boolean value) - { - ShowColumnStripes = value; - return this; - } - - public IXLTable SetShowTotalsRow() - { - ShowTotalsRow = true; - return this; - } - - public IXLTable SetShowTotalsRow(Boolean value) - { - ShowTotalsRow = value; - return this; - } - - public IXLTable SetShowAutoFilter() - { - ShowAutoFilter = true; - return this; - } - - public IXLTable SetShowAutoFilter(Boolean value) - { - ShowAutoFilter = value; - return this; - } - - public new IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, - Boolean matchCase = false, Boolean ignoreBlanks = true) - { - var toSortBy = new StringBuilder(); - foreach (string coPairTrimmed in columnsToSortBy.Split(',').Select(coPair => coPair.Trim())) - { - String coString; - String order; - if (coPairTrimmed.Contains(' ')) - { - var pair = coPairTrimmed.Split(' '); - coString = pair[0]; - order = pair[1]; - } - else - { - coString = coPairTrimmed; - order = "ASC"; - } - - Int32 co; - if (!Int32.TryParse(coString, out co)) - co = Field(coString).Index + 1; - - toSortBy.Append(co); - toSortBy.Append(" "); - toSortBy.Append(order); - toSortBy.Append(","); - } - return DataRange.Sort(toSortBy.ToString(0, toSortBy.Length - 1), sortOrder, matchCase, ignoreBlanks); - } - - public new IXLTable Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - base.Clear(clearOptions); - return this; - } - - IXLBaseAutoFilter IXLTable.AutoFilter - { - get { return AutoFilter; } - } - - public new void Dispose() - { - if (AutoFilter != null) - AutoFilter.Dispose(); - - base.Dispose(); - } - - #endregion - - - - private void InitializeValues(Boolean setAutofilter) - { - ShowRowStripes = true; - _showHeaderRow = true; - Theme = XLTableTheme.TableStyleLight9; - if (setAutofilter) - InitializeAutoFilter(); - - HeadersRow().DataType = XLCellValues.Text; - - if (RowCount() == 1) - InsertRowsBelow(1); - } - - public void InitializeAutoFilter() - { - ShowAutoFilter = true; - } - - private void AddToTables(XLRange range, Boolean addToTables) - { - if (!addToTables) return; - - _uniqueNames = new HashSet(); - Int32 co = 1; - foreach (IXLCell c in range.Row(1).Cells()) - { - if (XLHelper.IsNullOrWhiteSpace(((XLCell)c).InnerText)) - c.Value = GetUniqueName("Column" + co.ToInvariantString()); - _uniqueNames.Add(c.GetString()); - co++; - } - Worksheet.Tables.Add(this); - } - - - private String GetUniqueName(String originalName) - { - String name = originalName; - if (_uniqueNames.Contains(name)) - { - Int32 i = 1; - name = originalName + i.ToInvariantString(); - while (_uniqueNames.Contains(name)) - { - i++; - name = originalName + i.ToInvariantString(); - } - } - - _uniqueNames.Add(name); - return name; - } - - public Int32 GetFieldIndex(String name) - { - if (FieldNames.ContainsKey(name)) - return FieldNames[name].Index; - - throw new ArgumentOutOfRangeException("The header row doesn't contain field name '" + name + "'."); - } - - internal Boolean _showHeaderRow; - public Boolean ShowHeaderRow - { - get { return _showHeaderRow; } - set - { - if (_showHeaderRow == value) return; - - if (_showHeaderRow) - { - var headersRow = HeadersRow(); - _uniqueNames = new HashSet(); - Int32 co = 1; - foreach (IXLCell c in headersRow.Cells()) - { - if (XLHelper.IsNullOrWhiteSpace(((XLCell)c).InnerText)) - c.Value = GetUniqueName("Column" + co.ToInvariantString()); - _uniqueNames.Add(c.GetString()); - co++; - } - - headersRow.Clear(); - RangeAddress.FirstAddress = new XLAddress(Worksheet, RangeAddress.FirstAddress.RowNumber + 1, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.FirstAddress.FixedRow, - RangeAddress.FirstAddress.FixedColumn); - - HeadersRow().DataType = XLCellValues.Text; - } - else - { - using(var asRange = Worksheet.Range( - RangeAddress.FirstAddress.RowNumber - 1 , - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.LastAddress.RowNumber, - RangeAddress.LastAddress.ColumnNumber - )) - using (var firstRow = asRange.FirstRow()) - { - IXLRangeRow rangeRow; - if (firstRow.IsEmpty(true)) - { - rangeRow = firstRow; - RangeAddress.FirstAddress = new XLAddress(Worksheet, - RangeAddress.FirstAddress.RowNumber - 1, - RangeAddress.FirstAddress.ColumnNumber, - RangeAddress.FirstAddress.FixedRow, - RangeAddress.FirstAddress.FixedColumn); - } - else - { - var fAddress = RangeAddress.FirstAddress; - var lAddress = RangeAddress.LastAddress; - - rangeRow = firstRow.InsertRowsBelow(1, false).First(); - - - RangeAddress.FirstAddress = new XLAddress(Worksheet, fAddress.RowNumber, - fAddress.ColumnNumber, - fAddress.FixedRow, - fAddress.FixedColumn); - - RangeAddress.LastAddress = new XLAddress(Worksheet, lAddress.RowNumber + 1, - lAddress.ColumnNumber, - lAddress.FixedRow, - lAddress.FixedColumn); - } - - Int32 co = 1; - foreach (var name in FieldNames.Values.Select(f => f.Name)) - { - rangeRow.Cell(co).SetValue(name); - co++; - } - - } - } - _showHeaderRow = value; - } - } - public IXLTable SetShowHeaderRow() - { - return SetShowHeaderRow(true); - } - public IXLTable SetShowHeaderRow(Boolean value) - { - ShowHeaderRow = value; - return this; - } - - public void ExpandTableRows(Int32 rows) - { - RangeAddress.LastAddress = new XLAddress(Worksheet, RangeAddress.LastAddress.RowNumber + rows, - RangeAddress.LastAddress.ColumnNumber, - RangeAddress.LastAddress.FixedRow, - RangeAddress.LastAddress.FixedColumn); - } - - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLTable : XLRange, IXLTable + { + #region Private fields + + private string _name; + internal bool _showTotalsRow; + internal HashSet _uniqueNames; + + #endregion + + #region Constructor + + public XLTable(XLRange range, Boolean addToTables, Boolean setAutofilter = true) + : base(new XLRangeParameters(range.RangeAddress, range.Style )) + { + InitializeValues(setAutofilter); + + Int32 id = 1; + while (true) + { + string tableName = String.Format("Table{0}", id); + if (!Worksheet.Tables.Any(t => t.Name == tableName)) + { + Name = tableName; + AddToTables(range, addToTables); + break; + } + id++; + } + } + + public XLTable(XLRange range, String name, Boolean addToTables, Boolean setAutofilter = true) + : base(new XLRangeParameters(range.RangeAddress, range.Style)) + { + InitializeValues(setAutofilter); + + Name = name; + AddToTables(range, addToTables); + } + + #endregion + + private IXLRangeAddress _lastRangeAddress; + private Dictionary _fieldNames = null; + public Dictionary FieldNames + { + get + { + if (_fieldNames != null && _lastRangeAddress != null && _lastRangeAddress.Equals(RangeAddress)) return _fieldNames; + + _fieldNames = new Dictionary(); + _lastRangeAddress = RangeAddress; + + if (ShowHeaderRow) + { + var headersRow = HeadersRow(); + Int32 cellPos = 0; + foreach (var cell in headersRow.Cells()) + { + var name = cell.GetString(); + if (XLHelper.IsNullOrWhiteSpace(name)) + { + name = "Column" + (cellPos + 1); + cell.SetValue(name); + } + if (_fieldNames.ContainsKey(name)) + throw new ArgumentException("The header row contains more than one field name '" + name + "'."); + + _fieldNames.Add(name, new XLTableField(this, name) {Index = cellPos++ }); + } + } + else + { + if (_fieldNames == null) _fieldNames = new Dictionary(); + + Int32 colCount = ColumnCount(); + for (Int32 i = 1; i <= colCount; i++) + { + if (!_fieldNames.Values.Any(f => f.Index == i - 1)) + { + var name = "Column" + i; + + _fieldNames.Add(name, new XLTableField(this, name) {Index = i - 1 }); + } + } + } + return _fieldNames; + } + } + + internal void AddFields(IEnumerable fieldNames) + { + _fieldNames = new Dictionary(); + + Int32 cellPos = 0; + foreach(var name in fieldNames) + { + _fieldNames.Add(name, new XLTableField(this, name) { Index = cellPos++ }); + } + } + + + internal String RelId { get; set; } + + public IXLTableRange DataRange + { + get + { + XLRange range; + //var ws = Worksheet; + //var tracking = ws.EventTrackingEnabled; + //ws.EventTrackingEnabled = false; + + if (_showHeaderRow) + { + range = _showTotalsRow + ? Range(2, 1,RowCount() - 1,ColumnCount()) + : Range(2, 1, RowCount(), ColumnCount()); + } + else + { + range = _showTotalsRow + ? Range(1, 1, RowCount() - 1, ColumnCount()) + : Range(1, 1, RowCount(), ColumnCount()); + } + //ws.EventTrackingEnabled = tracking; + return new XLTableRange(range, this); + } + } + + private XLAutoFilter _autoFilter; + public XLAutoFilter AutoFilter + { + get + { + using (var asRange = ShowTotalsRow ? Range(1, 1, RowCount() - 1, ColumnCount()) : AsRange()) + { + if (_autoFilter == null) + _autoFilter = new XLAutoFilter(); + + _autoFilter.Range = asRange; + } + return _autoFilter; + } + } + + public new IXLBaseAutoFilter SetAutoFilter() + { + return AutoFilter; + } + + #region IXLTable Members + + public Boolean EmphasizeFirstColumn { get; set; } + public Boolean EmphasizeLastColumn { get; set; } + public Boolean ShowRowStripes { get; set; } + public Boolean ShowColumnStripes { get; set; } + + private Boolean _showAutoFilter; + public Boolean ShowAutoFilter { + get { return _showHeaderRow && _showAutoFilter; } + set { _showAutoFilter = value; } + } + public XLTableTheme Theme { get; set; } + + public String Name + { + get { return _name; } + set + { + if (Worksheet.Tables.Any(t => t.Name == value)) + { + throw new ArgumentException(String.Format("This worksheet already contains a table named '{0}'", + value)); + } + + _name = value; + } + } + + public Boolean ShowTotalsRow + { + get { return _showTotalsRow; } + set + { + if (value && !_showTotalsRow) + InsertRowsBelow(1); + else if (!value && _showTotalsRow) + TotalsRow().Delete(); + + _showTotalsRow = value; + + if (_showTotalsRow) + { + AutoFilter.Range = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber, RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber - 1, RangeAddress.LastAddress.ColumnNumber); + } + else + AutoFilter.Range = Worksheet.Range(RangeAddress); + } + } + + public IXLRangeRow HeadersRow() + { + if (!ShowHeaderRow) return null; + + var m = FieldNames; + return FirstRow(); + } + + public IXLRangeRow TotalsRow() + { + return ShowTotalsRow ? LastRow() : null; + } + + public IXLTableField Field(String fieldName) + { + return Field(GetFieldIndex(fieldName)); + } + + public IXLTableField Field(Int32 fieldIndex) + { + return FieldNames.Values.First(f => f.Index == fieldIndex); + } + + public IEnumerable Fields + { + get + { + Int32 columnCount = ColumnCount(); + for (int co = 0; co < columnCount; co++) + yield return Field(co); + } + } + + public IXLTable SetEmphasizeFirstColumn() + { + EmphasizeFirstColumn = true; + return this; + } + + public IXLTable SetEmphasizeFirstColumn(Boolean value) + { + EmphasizeFirstColumn = value; + return this; + } + + public IXLTable SetEmphasizeLastColumn() + { + EmphasizeLastColumn = true; + return this; + } + + public IXLTable SetEmphasizeLastColumn(Boolean value) + { + EmphasizeLastColumn = value; + return this; + } + + public IXLTable SetShowRowStripes() + { + ShowRowStripes = true; + return this; + } + + public IXLTable SetShowRowStripes(Boolean value) + { + ShowRowStripes = value; + return this; + } + + public IXLTable SetShowColumnStripes() + { + ShowColumnStripes = true; + return this; + } + + public IXLTable SetShowColumnStripes(Boolean value) + { + ShowColumnStripes = value; + return this; + } + + public IXLTable SetShowTotalsRow() + { + ShowTotalsRow = true; + return this; + } + + public IXLTable SetShowTotalsRow(Boolean value) + { + ShowTotalsRow = value; + return this; + } + + public IXLTable SetShowAutoFilter() + { + ShowAutoFilter = true; + return this; + } + + public IXLTable SetShowAutoFilter(Boolean value) + { + ShowAutoFilter = value; + return this; + } + + public new IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, + Boolean matchCase = false, Boolean ignoreBlanks = true) + { + var toSortBy = new StringBuilder(); + foreach (string coPairTrimmed in columnsToSortBy.Split(',').Select(coPair => coPair.Trim())) + { + String coString; + String order; + if (coPairTrimmed.Contains(' ')) + { + var pair = coPairTrimmed.Split(' '); + coString = pair[0]; + order = pair[1]; + } + else + { + coString = coPairTrimmed; + order = "ASC"; + } + + Int32 co; + if (!Int32.TryParse(coString, out co)) + co = Field(coString).Index + 1; + + toSortBy.Append(co); + toSortBy.Append(" "); + toSortBy.Append(order); + toSortBy.Append(","); + } + return DataRange.Sort(toSortBy.ToString(0, toSortBy.Length - 1), sortOrder, matchCase, ignoreBlanks); + } + + public new IXLTable Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + base.Clear(clearOptions); + return this; + } + + IXLBaseAutoFilter IXLTable.AutoFilter + { + get { return AutoFilter; } + } + + public new void Dispose() + { + if (AutoFilter != null) + AutoFilter.Dispose(); + + base.Dispose(); + } + + #endregion + + + + private void InitializeValues(Boolean setAutofilter) + { + ShowRowStripes = true; + _showHeaderRow = true; + Theme = XLTableTheme.TableStyleLight9; + if (setAutofilter) + InitializeAutoFilter(); + + HeadersRow().DataType = XLCellValues.Text; + + if (RowCount() == 1) + InsertRowsBelow(1); + } + + public void InitializeAutoFilter() + { + ShowAutoFilter = true; + } + + private void AddToTables(XLRange range, Boolean addToTables) + { + if (!addToTables) return; + + _uniqueNames = new HashSet(); + Int32 co = 1; + foreach (IXLCell c in range.Row(1).Cells()) + { + if (XLHelper.IsNullOrWhiteSpace(((XLCell)c).InnerText)) + c.Value = GetUniqueName("Column" + co.ToInvariantString()); + _uniqueNames.Add(c.GetString()); + co++; + } + Worksheet.Tables.Add(this); + } + + + private String GetUniqueName(String originalName) + { + String name = originalName; + if (_uniqueNames.Contains(name)) + { + Int32 i = 1; + name = originalName + i.ToInvariantString(); + while (_uniqueNames.Contains(name)) + { + i++; + name = originalName + i.ToInvariantString(); + } + } + + _uniqueNames.Add(name); + return name; + } + + public Int32 GetFieldIndex(String name) + { + if (FieldNames.ContainsKey(name)) + return FieldNames[name].Index; + + throw new ArgumentOutOfRangeException("The header row doesn't contain field name '" + name + "'."); + } + + internal Boolean _showHeaderRow; + public Boolean ShowHeaderRow + { + get { return _showHeaderRow; } + set + { + if (_showHeaderRow == value) return; + + if (_showHeaderRow) + { + var headersRow = HeadersRow(); + _uniqueNames = new HashSet(); + Int32 co = 1; + foreach (IXLCell c in headersRow.Cells()) + { + if (XLHelper.IsNullOrWhiteSpace(((XLCell)c).InnerText)) + c.Value = GetUniqueName("Column" + co.ToInvariantString()); + _uniqueNames.Add(c.GetString()); + co++; + } + + headersRow.Clear(); + RangeAddress.FirstAddress = new XLAddress(Worksheet, RangeAddress.FirstAddress.RowNumber + 1, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn); + + HeadersRow().DataType = XLCellValues.Text; + } + else + { + using(var asRange = Worksheet.Range( + RangeAddress.FirstAddress.RowNumber - 1 , + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.LastAddress.RowNumber, + RangeAddress.LastAddress.ColumnNumber + )) + using (var firstRow = asRange.FirstRow()) + { + IXLRangeRow rangeRow; + if (firstRow.IsEmpty(true)) + { + rangeRow = firstRow; + RangeAddress.FirstAddress = new XLAddress(Worksheet, + RangeAddress.FirstAddress.RowNumber - 1, + RangeAddress.FirstAddress.ColumnNumber, + RangeAddress.FirstAddress.FixedRow, + RangeAddress.FirstAddress.FixedColumn); + } + else + { + var fAddress = RangeAddress.FirstAddress; + var lAddress = RangeAddress.LastAddress; + + rangeRow = firstRow.InsertRowsBelow(1, false).First(); + + + RangeAddress.FirstAddress = new XLAddress(Worksheet, fAddress.RowNumber, + fAddress.ColumnNumber, + fAddress.FixedRow, + fAddress.FixedColumn); + + RangeAddress.LastAddress = new XLAddress(Worksheet, lAddress.RowNumber + 1, + lAddress.ColumnNumber, + lAddress.FixedRow, + lAddress.FixedColumn); + } + + Int32 co = 1; + foreach (var name in FieldNames.Values.Select(f => f.Name)) + { + rangeRow.Cell(co).SetValue(name); + co++; + } + + } + } + _showHeaderRow = value; + } + } + public IXLTable SetShowHeaderRow() + { + return SetShowHeaderRow(true); + } + public IXLTable SetShowHeaderRow(Boolean value) + { + ShowHeaderRow = value; + return this; + } + + public void ExpandTableRows(Int32 rows) + { + RangeAddress.LastAddress = new XLAddress(Worksheet, RangeAddress.LastAddress.RowNumber + rows, + RangeAddress.LastAddress.ColumnNumber, + RangeAddress.LastAddress.FixedRow, + RangeAddress.LastAddress.FixedColumn); + } + + } +} diff --git a/ClosedXML/Excel/Tables/XLTableField.cs b/ClosedXML/Excel/Tables/XLTableField.cs index 19e9655..744700f 100644 --- a/ClosedXML/Excel/Tables/XLTableField.cs +++ b/ClosedXML/Excel/Tables/XLTableField.cs @@ -1,98 +1,98 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLTableField: IXLTableField - { - private XLTable table; - public XLTableField(XLTable table, String name) - { - this.table = table; - this.name = name; - } - - public Int32 Index { get; internal set; } - - private String name; - - public String Name - { - get - { - return name; - } - set - { - if (table.ShowHeaderRow) - table.HeadersRow().Cell(Index + 1).SetValue(value); - - name = value; - } - } - - internal String totalsRowLabel; - public String TotalsRowLabel - { - get { return totalsRowLabel; } - set - { - totalsRowFunction = XLTotalsRowFunction.None; - table.TotalsRow().Cell(Index + 1).SetValue(value); - totalsRowLabel = value; - } - } - - public String TotalsRowFormulaA1 - { - get { return table.TotalsRow().Cell(Index + 1).FormulaA1; } - set - { - totalsRowFunction = XLTotalsRowFunction.Custom; - table.TotalsRow().Cell(Index + 1).FormulaA1 = value; - } - } - public String TotalsRowFormulaR1C1 - { - get { return table.TotalsRow().Cell(Index + 1).FormulaR1C1; } - set - { - totalsRowFunction = XLTotalsRowFunction.Custom; - table.TotalsRow().Cell(Index + 1).FormulaR1C1 = value; - } - } - - internal XLTotalsRowFunction totalsRowFunction; - public XLTotalsRowFunction TotalsRowFunction - { - get { return totalsRowFunction; } - set - { - if (value != XLTotalsRowFunction.None && value != XLTotalsRowFunction.Custom) - { - var cell = table.TotalsRow().Cell(Index + 1); - String formula = String.Empty; - switch (value) - { - case XLTotalsRowFunction.Sum: formula = "109"; break; - case XLTotalsRowFunction.Minimum: formula = "105"; break; - case XLTotalsRowFunction.Maximum: formula = "104"; break; - case XLTotalsRowFunction.Average: formula = "101"; break; - case XLTotalsRowFunction.Count: formula = "103"; break; - case XLTotalsRowFunction.CountNumbers: formula = "102"; break; - case XLTotalsRowFunction.StandardDeviation: formula = "107"; break; - case XLTotalsRowFunction.Variance: formula = "110"; break; - } - - cell.FormulaA1 = "SUBTOTAL(" + formula + ",[" + Name + "])"; - var lastCell = table.LastRow().Cell(Index + 1); - if (lastCell.DataType != XLCellValues.Text) - { - cell.DataType = lastCell.DataType; - cell.Style.NumberFormat = lastCell.Style.NumberFormat; - } - } - totalsRowFunction = value; - } - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLTableField: IXLTableField + { + private XLTable table; + public XLTableField(XLTable table, String name) + { + this.table = table; + this.name = name; + } + + public Int32 Index { get; internal set; } + + private String name; + + public String Name + { + get + { + return name; + } + set + { + if (table.ShowHeaderRow) + table.HeadersRow().Cell(Index + 1).SetValue(value); + + name = value; + } + } + + internal String totalsRowLabel; + public String TotalsRowLabel + { + get { return totalsRowLabel; } + set + { + totalsRowFunction = XLTotalsRowFunction.None; + table.TotalsRow().Cell(Index + 1).SetValue(value); + totalsRowLabel = value; + } + } + + public String TotalsRowFormulaA1 + { + get { return table.TotalsRow().Cell(Index + 1).FormulaA1; } + set + { + totalsRowFunction = XLTotalsRowFunction.Custom; + table.TotalsRow().Cell(Index + 1).FormulaA1 = value; + } + } + public String TotalsRowFormulaR1C1 + { + get { return table.TotalsRow().Cell(Index + 1).FormulaR1C1; } + set + { + totalsRowFunction = XLTotalsRowFunction.Custom; + table.TotalsRow().Cell(Index + 1).FormulaR1C1 = value; + } + } + + internal XLTotalsRowFunction totalsRowFunction; + public XLTotalsRowFunction TotalsRowFunction + { + get { return totalsRowFunction; } + set + { + if (value != XLTotalsRowFunction.None && value != XLTotalsRowFunction.Custom) + { + var cell = table.TotalsRow().Cell(Index + 1); + String formula = String.Empty; + switch (value) + { + case XLTotalsRowFunction.Sum: formula = "109"; break; + case XLTotalsRowFunction.Minimum: formula = "105"; break; + case XLTotalsRowFunction.Maximum: formula = "104"; break; + case XLTotalsRowFunction.Average: formula = "101"; break; + case XLTotalsRowFunction.Count: formula = "103"; break; + case XLTotalsRowFunction.CountNumbers: formula = "102"; break; + case XLTotalsRowFunction.StandardDeviation: formula = "107"; break; + case XLTotalsRowFunction.Variance: formula = "110"; break; + } + + cell.FormulaA1 = "SUBTOTAL(" + formula + ",[" + Name + "])"; + var lastCell = table.LastRow().Cell(Index + 1); + if (lastCell.DataType != XLCellValues.Text) + { + cell.DataType = lastCell.DataType; + cell.Style.NumberFormat = lastCell.Style.NumberFormat; + } + } + totalsRowFunction = value; + } + } + } +} diff --git a/ClosedXML/Excel/Tables/XLTableRange.cs b/ClosedXML/Excel/Tables/XLTableRange.cs index 39d5289..13e7ef3 100644 --- a/ClosedXML/Excel/Tables/XLTableRange.cs +++ b/ClosedXML/Excel/Tables/XLTableRange.cs @@ -1,245 +1,245 @@ -using System; - -namespace ClosedXML.Excel -{ - using System.Linq; - - internal class XLTableRange : XLRange, IXLTableRange - { - private readonly XLTable _table; - private readonly XLRange _range; - public XLTableRange(XLRange range, XLTable table):base(range.RangeParameters) - { - _table = table; - _range = range; - } - - IXLTableRow IXLTableRange.FirstRow(Func predicate) - { - return FirstRow(predicate); - } - public XLTableRow FirstRow(Func predicate = null) - { - if (predicate == null) - return new XLTableRow(this, (_range.FirstRow())); - - Int32 rowCount = _range.RowCount(); - - for (Int32 ro = 1; ro <= rowCount; ro++) - { - var row = new XLTableRow(this, (_range.Row(ro))); - if (predicate(row)) return row; - - row.Dispose(); - } - - return null; - } - - IXLTableRow IXLTableRange.FirstRowUsed(Func predicate) - { - return FirstRowUsed(false, predicate); - } - public XLTableRow FirstRowUsed(Func predicate = null) - { - return FirstRowUsed(false, predicate); - } - - IXLTableRow IXLTableRange.FirstRowUsed(Boolean includeFormats, Func predicate) - { - return FirstRowUsed(includeFormats, predicate); - } - public XLTableRow FirstRowUsed(Boolean includeFormats, Func predicate = null) - { - if (predicate == null) - return new XLTableRow(this, (_range.FirstRowUsed(includeFormats))); - - Int32 rowCount = _range.RowCount(); - - for (Int32 ro = 1; ro <= rowCount; ro++) - { - var row = new XLTableRow(this, (_range.Row(ro))); - - if (!row.IsEmpty(includeFormats) && predicate(row)) - return row; - row.Dispose(); - } - - return null; - } - - - IXLTableRow IXLTableRange.LastRow(Func predicate) - { - return LastRow(predicate); - } - public XLTableRow LastRow(Func predicate = null) - { - if (predicate == null) - return new XLTableRow(this, (_range.LastRow())); - - Int32 rowCount = _range.RowCount(); - - for (Int32 ro = rowCount; ro >= 1; ro--) - { - var row = new XLTableRow(this, (_range.Row(ro))); - if (predicate(row)) return row; - - row.Dispose(); - } - return null; - } - - IXLTableRow IXLTableRange.LastRowUsed(Func predicate) - { - return LastRowUsed(false, predicate); - } - public XLTableRow LastRowUsed(Func predicate = null) - { - return LastRowUsed(false, predicate); - } - - IXLTableRow IXLTableRange.LastRowUsed(Boolean includeFormats, Func predicate) - { - return LastRowUsed(includeFormats, predicate); - } - public XLTableRow LastRowUsed(Boolean includeFormats, Func predicate = null) - { - if (predicate == null) - return new XLTableRow(this, (_range.LastRowUsed(includeFormats))); - - Int32 rowCount = _range.RowCount(); - - for (Int32 ro = rowCount; ro >= 1; ro--) - { - var row = new XLTableRow(this, (_range.Row(ro))); - - if (!row.IsEmpty(includeFormats) && predicate(row)) - return row; - row.Dispose(); - } - - return null; - } - - IXLTableRow IXLTableRange.Row(int row) - { - return Row(row); - } - public new XLTableRow Row(int row) - { - if (row <= 0 || row > XLHelper.MaxRowNumber) - { - throw new IndexOutOfRangeException(String.Format("Row number must be between 1 and {0}", - XLHelper.MaxRowNumber)); - } - - return new XLTableRow(this, base.Row(row)); - } - - public IXLTableRows Rows(Func predicate = null) - { - var retVal = new XLTableRows(Worksheet.Style); - Int32 rowCount = _range.RowCount(); - - for (int r = 1; r <= rowCount; r++) - { - var row = Row(r); - if (predicate == null || predicate(row)) - retVal.Add(row); - else - row.Dispose(); - } - return retVal; - } - - public new IXLTableRows Rows(int firstRow, int lastRow) - { - var retVal = new XLTableRows(Worksheet.Style); - - for (int ro = firstRow; ro <= lastRow; ro++) - retVal.Add(Row(ro)); - return retVal; - } - - public new IXLTableRows Rows(string rows) - { - var retVal = new XLTableRows(Worksheet.Style); - var rowPairs = rows.Split(','); - foreach (string tPair in rowPairs.Select(pair => pair.Trim())) - { - String firstRow; - String lastRow; - if (tPair.Contains(':') || tPair.Contains('-')) - { - var rowRange = XLHelper.SplitRange(tPair); - - firstRow = rowRange[0]; - lastRow = rowRange[1]; - } - else - { - firstRow = tPair; - lastRow = tPair; - } - foreach (IXLTableRow row in Rows(Int32.Parse(firstRow), Int32.Parse(lastRow))) - retVal.Add(row); - } - return retVal; - } - - IXLTableRows IXLTableRange.RowsUsed(Boolean includeFormats, Func predicate) - { - return RowsUsed(includeFormats, predicate); - } - public IXLTableRows RowsUsed(Boolean includeFormats, Func predicate = null) - { - var rows = new XLTableRows(Worksheet.Style); - Int32 rowCount = RowCount(); - - for (Int32 ro = 1; ro <= rowCount; ro++) - { - var row = Row(ro); - - if (!row.IsEmpty(includeFormats) && (predicate == null || predicate(row))) - rows.Add(row); - else - row.Dispose(); - } - return rows; - } - - IXLTableRows IXLTableRange.RowsUsed(Func predicate) - { - return RowsUsed(predicate); - } - public IXLTableRows RowsUsed(Func predicate = null) - { - return RowsUsed(false, predicate); - } - - IXLTable IXLTableRange.Table { get { return _table; } } - public XLTable Table { get { return _table; } } - - public new IXLTableRows InsertRowsAbove(int numberOfRows) - { - return XLHelper.InsertRowsWithoutEvents(base.InsertRowsAbove, this, numberOfRows, !Table.ShowTotalsRow ); - } - public new IXLTableRows InsertRowsBelow(int numberOfRows) - { - return XLHelper.InsertRowsWithoutEvents(base.InsertRowsBelow, this, numberOfRows, !Table.ShowTotalsRow); - } - - - public new IXLRangeColumn Column(String column) - { - if (XLHelper.IsValidColumn(column)) - { - Int32 coNum = XLHelper.GetColumnNumberFromLetter(column); - return coNum > ColumnCount() ? Column(_table.GetFieldIndex(column) + 1) : Column(coNum); - } - - return Column(_table.GetFieldIndex(column) + 1); - } - } +using System; + +namespace ClosedXML.Excel +{ + using System.Linq; + + internal class XLTableRange : XLRange, IXLTableRange + { + private readonly XLTable _table; + private readonly XLRange _range; + public XLTableRange(XLRange range, XLTable table):base(range.RangeParameters) + { + _table = table; + _range = range; + } + + IXLTableRow IXLTableRange.FirstRow(Func predicate) + { + return FirstRow(predicate); + } + public XLTableRow FirstRow(Func predicate = null) + { + if (predicate == null) + return new XLTableRow(this, (_range.FirstRow())); + + Int32 rowCount = _range.RowCount(); + + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = new XLTableRow(this, (_range.Row(ro))); + if (predicate(row)) return row; + + row.Dispose(); + } + + return null; + } + + IXLTableRow IXLTableRange.FirstRowUsed(Func predicate) + { + return FirstRowUsed(false, predicate); + } + public XLTableRow FirstRowUsed(Func predicate = null) + { + return FirstRowUsed(false, predicate); + } + + IXLTableRow IXLTableRange.FirstRowUsed(Boolean includeFormats, Func predicate) + { + return FirstRowUsed(includeFormats, predicate); + } + public XLTableRow FirstRowUsed(Boolean includeFormats, Func predicate = null) + { + if (predicate == null) + return new XLTableRow(this, (_range.FirstRowUsed(includeFormats))); + + Int32 rowCount = _range.RowCount(); + + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = new XLTableRow(this, (_range.Row(ro))); + + if (!row.IsEmpty(includeFormats) && predicate(row)) + return row; + row.Dispose(); + } + + return null; + } + + + IXLTableRow IXLTableRange.LastRow(Func predicate) + { + return LastRow(predicate); + } + public XLTableRow LastRow(Func predicate = null) + { + if (predicate == null) + return new XLTableRow(this, (_range.LastRow())); + + Int32 rowCount = _range.RowCount(); + + for (Int32 ro = rowCount; ro >= 1; ro--) + { + var row = new XLTableRow(this, (_range.Row(ro))); + if (predicate(row)) return row; + + row.Dispose(); + } + return null; + } + + IXLTableRow IXLTableRange.LastRowUsed(Func predicate) + { + return LastRowUsed(false, predicate); + } + public XLTableRow LastRowUsed(Func predicate = null) + { + return LastRowUsed(false, predicate); + } + + IXLTableRow IXLTableRange.LastRowUsed(Boolean includeFormats, Func predicate) + { + return LastRowUsed(includeFormats, predicate); + } + public XLTableRow LastRowUsed(Boolean includeFormats, Func predicate = null) + { + if (predicate == null) + return new XLTableRow(this, (_range.LastRowUsed(includeFormats))); + + Int32 rowCount = _range.RowCount(); + + for (Int32 ro = rowCount; ro >= 1; ro--) + { + var row = new XLTableRow(this, (_range.Row(ro))); + + if (!row.IsEmpty(includeFormats) && predicate(row)) + return row; + row.Dispose(); + } + + return null; + } + + IXLTableRow IXLTableRange.Row(int row) + { + return Row(row); + } + public new XLTableRow Row(int row) + { + if (row <= 0 || row > XLHelper.MaxRowNumber) + { + throw new IndexOutOfRangeException(String.Format("Row number must be between 1 and {0}", + XLHelper.MaxRowNumber)); + } + + return new XLTableRow(this, base.Row(row)); + } + + public IXLTableRows Rows(Func predicate = null) + { + var retVal = new XLTableRows(Worksheet.Style); + Int32 rowCount = _range.RowCount(); + + for (int r = 1; r <= rowCount; r++) + { + var row = Row(r); + if (predicate == null || predicate(row)) + retVal.Add(row); + else + row.Dispose(); + } + return retVal; + } + + public new IXLTableRows Rows(int firstRow, int lastRow) + { + var retVal = new XLTableRows(Worksheet.Style); + + for (int ro = firstRow; ro <= lastRow; ro++) + retVal.Add(Row(ro)); + return retVal; + } + + public new IXLTableRows Rows(string rows) + { + var retVal = new XLTableRows(Worksheet.Style); + var rowPairs = rows.Split(','); + foreach (string tPair in rowPairs.Select(pair => pair.Trim())) + { + String firstRow; + String lastRow; + if (tPair.Contains(':') || tPair.Contains('-')) + { + var rowRange = XLHelper.SplitRange(tPair); + + firstRow = rowRange[0]; + lastRow = rowRange[1]; + } + else + { + firstRow = tPair; + lastRow = tPair; + } + foreach (IXLTableRow row in Rows(Int32.Parse(firstRow), Int32.Parse(lastRow))) + retVal.Add(row); + } + return retVal; + } + + IXLTableRows IXLTableRange.RowsUsed(Boolean includeFormats, Func predicate) + { + return RowsUsed(includeFormats, predicate); + } + public IXLTableRows RowsUsed(Boolean includeFormats, Func predicate = null) + { + var rows = new XLTableRows(Worksheet.Style); + Int32 rowCount = RowCount(); + + for (Int32 ro = 1; ro <= rowCount; ro++) + { + var row = Row(ro); + + if (!row.IsEmpty(includeFormats) && (predicate == null || predicate(row))) + rows.Add(row); + else + row.Dispose(); + } + return rows; + } + + IXLTableRows IXLTableRange.RowsUsed(Func predicate) + { + return RowsUsed(predicate); + } + public IXLTableRows RowsUsed(Func predicate = null) + { + return RowsUsed(false, predicate); + } + + IXLTable IXLTableRange.Table { get { return _table; } } + public XLTable Table { get { return _table; } } + + public new IXLTableRows InsertRowsAbove(int numberOfRows) + { + return XLHelper.InsertRowsWithoutEvents(base.InsertRowsAbove, this, numberOfRows, !Table.ShowTotalsRow ); + } + public new IXLTableRows InsertRowsBelow(int numberOfRows) + { + return XLHelper.InsertRowsWithoutEvents(base.InsertRowsBelow, this, numberOfRows, !Table.ShowTotalsRow); + } + + + public new IXLRangeColumn Column(String column) + { + if (XLHelper.IsValidColumn(column)) + { + Int32 coNum = XLHelper.GetColumnNumberFromLetter(column); + return coNum > ColumnCount() ? Column(_table.GetFieldIndex(column) + 1) : Column(coNum); + } + + return Column(_table.GetFieldIndex(column) + 1); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Tables/XLTableRow.cs b/ClosedXML/Excel/Tables/XLTableRow.cs index 9fbd73c..2420477 100644 --- a/ClosedXML/Excel/Tables/XLTableRow.cs +++ b/ClosedXML/Excel/Tables/XLTableRow.cs @@ -1,115 +1,115 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLTableRow : XLRangeRow, IXLTableRow - { - private readonly XLTableRange _tableRange; - - public XLTableRow(XLTableRange tableRange, XLRangeRow rangeRow) - : base(rangeRow.RangeParameters, false) - { - _tableRange = tableRange; - } - - #region IXLTableRow Members - - public IXLCell Field(Int32 index) - { - return Cell(index + 1); - } - - public IXLCell Field(String name) - { - Int32 fieldIndex = _tableRange.Table.GetFieldIndex(name); - return Cell(fieldIndex + 1); - } - - public new IXLTableRow Sort() - { - return SortLeftToRight(); - } - - public new IXLTableRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) - { - base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks); - return this; - } - - #endregion - - private XLTableRow RowShift(Int32 rowsToShift) - { - return _tableRange.Row(RowNumber() + rowsToShift); - } - - #region XLTableRow Above - - IXLTableRow IXLTableRow.RowAbove() - { - return RowAbove(); - } - - IXLTableRow IXLTableRow.RowAbove(Int32 step) - { - return RowAbove(step); - } - - public new XLTableRow RowAbove() - { - return RowAbove(1); - } - - public new XLTableRow RowAbove(Int32 step) - { - return RowShift(step * -1); - } - - #endregion - - #region XLTableRow Below - - IXLTableRow IXLTableRow.RowBelow() - { - return RowBelow(); - } - - IXLTableRow IXLTableRow.RowBelow(Int32 step) - { - return RowBelow(step); - } - - public new XLTableRow RowBelow() - { - return RowBelow(1); - } - - public new XLTableRow RowBelow(Int32 step) - { - return RowShift(step); - } - - #endregion - - public new IXLTableRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - base.Clear(clearOptions); - return this; - } - - public new IXLTableRows InsertRowsAbove(int numberOfRows) - { - return XLHelper.InsertRowsWithoutEvents(base.InsertRowsAbove, _tableRange, numberOfRows, !_tableRange.Table.ShowTotalsRow); - } - public new IXLTableRows InsertRowsBelow(int numberOfRows) - { - return XLHelper.InsertRowsWithoutEvents(base.InsertRowsBelow, _tableRange, numberOfRows, !_tableRange.Table.ShowTotalsRow); - } - - public new void Delete() - { - Delete(XLShiftDeletedCells.ShiftCellsUp); - _tableRange.Table.ExpandTableRows(-1); - } - } +using System; + +namespace ClosedXML.Excel +{ + internal class XLTableRow : XLRangeRow, IXLTableRow + { + private readonly XLTableRange _tableRange; + + public XLTableRow(XLTableRange tableRange, XLRangeRow rangeRow) + : base(rangeRow.RangeParameters, false) + { + _tableRange = tableRange; + } + + #region IXLTableRow Members + + public IXLCell Field(Int32 index) + { + return Cell(index + 1); + } + + public IXLCell Field(String name) + { + Int32 fieldIndex = _tableRange.Table.GetFieldIndex(name); + return Cell(fieldIndex + 1); + } + + public new IXLTableRow Sort() + { + return SortLeftToRight(); + } + + public new IXLTableRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true) + { + base.SortLeftToRight(sortOrder, matchCase, ignoreBlanks); + return this; + } + + #endregion + + private XLTableRow RowShift(Int32 rowsToShift) + { + return _tableRange.Row(RowNumber() + rowsToShift); + } + + #region XLTableRow Above + + IXLTableRow IXLTableRow.RowAbove() + { + return RowAbove(); + } + + IXLTableRow IXLTableRow.RowAbove(Int32 step) + { + return RowAbove(step); + } + + public new XLTableRow RowAbove() + { + return RowAbove(1); + } + + public new XLTableRow RowAbove(Int32 step) + { + return RowShift(step * -1); + } + + #endregion + + #region XLTableRow Below + + IXLTableRow IXLTableRow.RowBelow() + { + return RowBelow(); + } + + IXLTableRow IXLTableRow.RowBelow(Int32 step) + { + return RowBelow(step); + } + + public new XLTableRow RowBelow() + { + return RowBelow(1); + } + + public new XLTableRow RowBelow(Int32 step) + { + return RowShift(step); + } + + #endregion + + public new IXLTableRow Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + base.Clear(clearOptions); + return this; + } + + public new IXLTableRows InsertRowsAbove(int numberOfRows) + { + return XLHelper.InsertRowsWithoutEvents(base.InsertRowsAbove, _tableRange, numberOfRows, !_tableRange.Table.ShowTotalsRow); + } + public new IXLTableRows InsertRowsBelow(int numberOfRows) + { + return XLHelper.InsertRowsWithoutEvents(base.InsertRowsBelow, _tableRange, numberOfRows, !_tableRange.Table.ShowTotalsRow); + } + + public new void Delete() + { + Delete(XLShiftDeletedCells.ShiftCellsUp); + _tableRange.Table.ExpandTableRows(-1); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Tables/XLTableRows.cs b/ClosedXML/Excel/Tables/XLTableRows.cs index e5905c4..71cc081 100644 --- a/ClosedXML/Excel/Tables/XLTableRows.cs +++ b/ClosedXML/Excel/Tables/XLTableRows.cs @@ -1,129 +1,129 @@ -using System; -using System.Collections.Generic; - -namespace ClosedXML.Excel -{ - using System.Collections; - - internal class XLTableRows : IXLTableRows, IXLStylized - { - public Boolean StyleChanged { get; set; } - private readonly List _ranges = new List(); - private IXLStyle _style; - - - public XLTableRows(IXLStyle defaultStyle) - { - _style = new XLStyle(this, defaultStyle); - } - - #region IXLStylized Members - - public IEnumerable Styles - { - get - { - UpdatingStyle = true; - yield return _style; - foreach (XLTableRow rng in _ranges) - { - yield return rng.Style; - foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( - rng.RangeAddress.FirstAddress.RowNumber, - rng.RangeAddress.FirstAddress.ColumnNumber, - rng.RangeAddress.LastAddress.RowNumber, - rng.RangeAddress.LastAddress.ColumnNumber)) - yield return r.Style; - } - UpdatingStyle = false; - } - } - - public Boolean UpdatingStyle { get; set; } - - public IXLStyle InnerStyle - { - get { return _style; } - set { _style = new XLStyle(this, value); } - } - - public IXLRanges RangesUsed - { - get - { - var retVal = new XLRanges(); - this.ForEach(c => retVal.Add(c.AsRange())); - return retVal; - } - } - - #endregion - - #region IXLTableRows Members - - public IXLTableRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - _ranges.ForEach(r => r.Clear(clearOptions)); - return this; - } - - public void Add(IXLTableRow range) - { - _ranges.Add((XLTableRow)range); - } - - public IEnumerator GetEnumerator() - { - var retList = new List(); - _ranges.ForEach(retList.Add); - return retList.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IXLStyle Style - { - get { return _style; } - set - { - _style = new XLStyle(this, value); - _ranges.ForEach(r => r.Style = value); - } - } - - public IXLCells Cells() - { - var cells = new XLCells(false, false); - foreach (XLTableRow container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed() - { - var cells = new XLCells(true, false); - foreach (XLTableRow container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - public IXLCells CellsUsed(Boolean includeFormats) - { - var cells = new XLCells(false, includeFormats); - foreach (XLTableRow container in _ranges) - cells.Add(container.RangeAddress); - return cells; - } - - #endregion - - public void Select() - { - foreach (var range in this) - range.Select(); - } - } +using System; +using System.Collections.Generic; + +namespace ClosedXML.Excel +{ + using System.Collections; + + internal class XLTableRows : IXLTableRows, IXLStylized + { + public Boolean StyleChanged { get; set; } + private readonly List _ranges = new List(); + private IXLStyle _style; + + + public XLTableRows(IXLStyle defaultStyle) + { + _style = new XLStyle(this, defaultStyle); + } + + #region IXLStylized Members + + public IEnumerable Styles + { + get + { + UpdatingStyle = true; + yield return _style; + foreach (XLTableRow rng in _ranges) + { + yield return rng.Style; + foreach (XLCell r in rng.Worksheet.Internals.CellsCollection.GetCells( + rng.RangeAddress.FirstAddress.RowNumber, + rng.RangeAddress.FirstAddress.ColumnNumber, + rng.RangeAddress.LastAddress.RowNumber, + rng.RangeAddress.LastAddress.ColumnNumber)) + yield return r.Style; + } + UpdatingStyle = false; + } + } + + public Boolean UpdatingStyle { get; set; } + + public IXLStyle InnerStyle + { + get { return _style; } + set { _style = new XLStyle(this, value); } + } + + public IXLRanges RangesUsed + { + get + { + var retVal = new XLRanges(); + this.ForEach(c => retVal.Add(c.AsRange())); + return retVal; + } + } + + #endregion + + #region IXLTableRows Members + + public IXLTableRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + _ranges.ForEach(r => r.Clear(clearOptions)); + return this; + } + + public void Add(IXLTableRow range) + { + _ranges.Add((XLTableRow)range); + } + + public IEnumerator GetEnumerator() + { + var retList = new List(); + _ranges.ForEach(retList.Add); + return retList.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLStyle Style + { + get { return _style; } + set + { + _style = new XLStyle(this, value); + _ranges.ForEach(r => r.Style = value); + } + } + + public IXLCells Cells() + { + var cells = new XLCells(false, false); + foreach (XLTableRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed() + { + var cells = new XLCells(true, false); + foreach (XLTableRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + public IXLCells CellsUsed(Boolean includeFormats) + { + var cells = new XLCells(false, includeFormats); + foreach (XLTableRow container in _ranges) + cells.Add(container.RangeAddress); + return cells; + } + + #endregion + + public void Select() + { + foreach (var range in this) + range.Select(); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Tables/XLTableTheme.cs b/ClosedXML/Excel/Tables/XLTableTheme.cs index a0a86eb..ca70d17 100644 --- a/ClosedXML/Excel/Tables/XLTableTheme.cs +++ b/ClosedXML/Excel/Tables/XLTableTheme.cs @@ -1,121 +1,121 @@ -using System.Collections.Generic; -using System.Linq; -using System.Reflection; - -namespace ClosedXML.Excel -{ - public sealed class XLTableTheme - { - public static readonly XLTableTheme None = new XLTableTheme("None"); - public static readonly XLTableTheme TableStyleMedium28 = new XLTableTheme("TableStyleMedium28"); - public static readonly XLTableTheme TableStyleMedium27 = new XLTableTheme("TableStyleMedium27"); - public static readonly XLTableTheme TableStyleMedium26 = new XLTableTheme("TableStyleMedium26"); - public static readonly XLTableTheme TableStyleMedium25 = new XLTableTheme("TableStyleMedium25"); - public static readonly XLTableTheme TableStyleMedium24 = new XLTableTheme("TableStyleMedium24"); - public static readonly XLTableTheme TableStyleMedium23 = new XLTableTheme("TableStyleMedium23"); - public static readonly XLTableTheme TableStyleMedium22 = new XLTableTheme("TableStyleMedium22"); - public static readonly XLTableTheme TableStyleMedium21 = new XLTableTheme("TableStyleMedium21"); - public static readonly XLTableTheme TableStyleMedium20 = new XLTableTheme("TableStyleMedium20"); - public static readonly XLTableTheme TableStyleMedium19 = new XLTableTheme("TableStyleMedium19"); - public static readonly XLTableTheme TableStyleMedium18 = new XLTableTheme("TableStyleMedium18"); - public static readonly XLTableTheme TableStyleMedium17 = new XLTableTheme("TableStyleMedium17"); - public static readonly XLTableTheme TableStyleMedium16 = new XLTableTheme("TableStyleMedium16"); - public static readonly XLTableTheme TableStyleMedium15 = new XLTableTheme("TableStyleMedium15"); - public static readonly XLTableTheme TableStyleMedium14 = new XLTableTheme("TableStyleMedium14"); - public static readonly XLTableTheme TableStyleMedium13 = new XLTableTheme("TableStyleMedium13"); - public static readonly XLTableTheme TableStyleMedium12 = new XLTableTheme("TableStyleMedium12"); - public static readonly XLTableTheme TableStyleMedium11 = new XLTableTheme("TableStyleMedium11"); - public static readonly XLTableTheme TableStyleMedium10 = new XLTableTheme("TableStyleMedium10"); - public static readonly XLTableTheme TableStyleMedium9 = new XLTableTheme("TableStyleMedium9"); - public static readonly XLTableTheme TableStyleMedium8 = new XLTableTheme("TableStyleMedium8"); - public static readonly XLTableTheme TableStyleMedium7 = new XLTableTheme("TableStyleMedium7"); - public static readonly XLTableTheme TableStyleMedium6 = new XLTableTheme("TableStyleMedium6"); - public static readonly XLTableTheme TableStyleMedium5 = new XLTableTheme("TableStyleMedium5"); - public static readonly XLTableTheme TableStyleMedium4 = new XLTableTheme("TableStyleMedium4"); - public static readonly XLTableTheme TableStyleMedium3 = new XLTableTheme("TableStyleMedium3"); - public static readonly XLTableTheme TableStyleMedium2 = new XLTableTheme("TableStyleMedium2"); - public static readonly XLTableTheme TableStyleMedium1 = new XLTableTheme("TableStyleMedium1"); - public static readonly XLTableTheme TableStyleLight21 = new XLTableTheme("TableStyleLight21"); - public static readonly XLTableTheme TableStyleLight20 = new XLTableTheme("TableStyleLight20"); - public static readonly XLTableTheme TableStyleLight19 = new XLTableTheme("TableStyleLight19"); - public static readonly XLTableTheme TableStyleLight18 = new XLTableTheme("TableStyleLight18"); - public static readonly XLTableTheme TableStyleLight17 = new XLTableTheme("TableStyleLight17"); - public static readonly XLTableTheme TableStyleLight16 = new XLTableTheme("TableStyleLight16"); - public static readonly XLTableTheme TableStyleLight15 = new XLTableTheme("TableStyleLight15"); - public static readonly XLTableTheme TableStyleLight14 = new XLTableTheme("TableStyleLight14"); - public static readonly XLTableTheme TableStyleLight13 = new XLTableTheme("TableStyleLight13"); - public static readonly XLTableTheme TableStyleLight12 = new XLTableTheme("TableStyleLight12"); - public static readonly XLTableTheme TableStyleLight11 = new XLTableTheme("TableStyleLight11"); - public static readonly XLTableTheme TableStyleLight10 = new XLTableTheme("TableStyleLight10"); - public static readonly XLTableTheme TableStyleLight9 = new XLTableTheme("TableStyleLight9"); - public static readonly XLTableTheme TableStyleLight8 = new XLTableTheme("TableStyleLight8"); - public static readonly XLTableTheme TableStyleLight7 = new XLTableTheme("TableStyleLight7"); - public static readonly XLTableTheme TableStyleLight6 = new XLTableTheme("TableStyleLight6"); - public static readonly XLTableTheme TableStyleLight5 = new XLTableTheme("TableStyleLight5"); - public static readonly XLTableTheme TableStyleLight4 = new XLTableTheme("TableStyleLight4"); - public static readonly XLTableTheme TableStyleLight3 = new XLTableTheme("TableStyleLight3"); - public static readonly XLTableTheme TableStyleLight2 = new XLTableTheme("TableStyleLight2"); - public static readonly XLTableTheme TableStyleLight1 = new XLTableTheme("TableStyleLight1"); - public static readonly XLTableTheme TableStyleDark11 = new XLTableTheme("TableStyleDark11"); - public static readonly XLTableTheme TableStyleDark10 = new XLTableTheme("TableStyleDark10"); - public static readonly XLTableTheme TableStyleDark9 = new XLTableTheme("TableStyleDark9"); - public static readonly XLTableTheme TableStyleDark8 = new XLTableTheme("TableStyleDark8"); - public static readonly XLTableTheme TableStyleDark7 = new XLTableTheme("TableStyleDark7"); - public static readonly XLTableTheme TableStyleDark6 = new XLTableTheme("TableStyleDark6"); - public static readonly XLTableTheme TableStyleDark5 = new XLTableTheme("TableStyleDark5"); - public static readonly XLTableTheme TableStyleDark4 = new XLTableTheme("TableStyleDark4"); - public static readonly XLTableTheme TableStyleDark3 = new XLTableTheme("TableStyleDark3"); - public static readonly XLTableTheme TableStyleDark2 = new XLTableTheme("TableStyleDark2"); - public static readonly XLTableTheme TableStyleDark1 = new XLTableTheme("TableStyleDark1"); - - public string Name { get; private set; } - - public XLTableTheme(string name) - { - this.Name = name; - } - - private static IEnumerable allThemes; - - public static IEnumerable GetAllThemes() - { - return (allThemes ?? (allThemes = typeof(XLTableTheme).GetFields(BindingFlags.Static | BindingFlags.Public) - .Where(fi => fi.FieldType.Equals(typeof(XLTableTheme))) - .Select(fi => (XLTableTheme)fi.GetValue(null)) - .ToArray())); - } - - public static XLTableTheme FromName(string name) - { - return GetAllThemes().FirstOrDefault(s => s.Name == name); - } - - #region Overrides - - public override bool Equals(object obj) - { - if (obj == null) - { - return false; - } - XLTableTheme theme = obj as XLTableTheme; - if (theme == null) - { - return false; - } - return this.Name.Equals(theme.Name); - } - - public override int GetHashCode() - { - return this.Name.GetHashCode(); - } - - public override string ToString() - { - return this.Name; - } - - #endregion Overrides - } +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace ClosedXML.Excel +{ + public sealed class XLTableTheme + { + public static readonly XLTableTheme None = new XLTableTheme("None"); + public static readonly XLTableTheme TableStyleMedium28 = new XLTableTheme("TableStyleMedium28"); + public static readonly XLTableTheme TableStyleMedium27 = new XLTableTheme("TableStyleMedium27"); + public static readonly XLTableTheme TableStyleMedium26 = new XLTableTheme("TableStyleMedium26"); + public static readonly XLTableTheme TableStyleMedium25 = new XLTableTheme("TableStyleMedium25"); + public static readonly XLTableTheme TableStyleMedium24 = new XLTableTheme("TableStyleMedium24"); + public static readonly XLTableTheme TableStyleMedium23 = new XLTableTheme("TableStyleMedium23"); + public static readonly XLTableTheme TableStyleMedium22 = new XLTableTheme("TableStyleMedium22"); + public static readonly XLTableTheme TableStyleMedium21 = new XLTableTheme("TableStyleMedium21"); + public static readonly XLTableTheme TableStyleMedium20 = new XLTableTheme("TableStyleMedium20"); + public static readonly XLTableTheme TableStyleMedium19 = new XLTableTheme("TableStyleMedium19"); + public static readonly XLTableTheme TableStyleMedium18 = new XLTableTheme("TableStyleMedium18"); + public static readonly XLTableTheme TableStyleMedium17 = new XLTableTheme("TableStyleMedium17"); + public static readonly XLTableTheme TableStyleMedium16 = new XLTableTheme("TableStyleMedium16"); + public static readonly XLTableTheme TableStyleMedium15 = new XLTableTheme("TableStyleMedium15"); + public static readonly XLTableTheme TableStyleMedium14 = new XLTableTheme("TableStyleMedium14"); + public static readonly XLTableTheme TableStyleMedium13 = new XLTableTheme("TableStyleMedium13"); + public static readonly XLTableTheme TableStyleMedium12 = new XLTableTheme("TableStyleMedium12"); + public static readonly XLTableTheme TableStyleMedium11 = new XLTableTheme("TableStyleMedium11"); + public static readonly XLTableTheme TableStyleMedium10 = new XLTableTheme("TableStyleMedium10"); + public static readonly XLTableTheme TableStyleMedium9 = new XLTableTheme("TableStyleMedium9"); + public static readonly XLTableTheme TableStyleMedium8 = new XLTableTheme("TableStyleMedium8"); + public static readonly XLTableTheme TableStyleMedium7 = new XLTableTheme("TableStyleMedium7"); + public static readonly XLTableTheme TableStyleMedium6 = new XLTableTheme("TableStyleMedium6"); + public static readonly XLTableTheme TableStyleMedium5 = new XLTableTheme("TableStyleMedium5"); + public static readonly XLTableTheme TableStyleMedium4 = new XLTableTheme("TableStyleMedium4"); + public static readonly XLTableTheme TableStyleMedium3 = new XLTableTheme("TableStyleMedium3"); + public static readonly XLTableTheme TableStyleMedium2 = new XLTableTheme("TableStyleMedium2"); + public static readonly XLTableTheme TableStyleMedium1 = new XLTableTheme("TableStyleMedium1"); + public static readonly XLTableTheme TableStyleLight21 = new XLTableTheme("TableStyleLight21"); + public static readonly XLTableTheme TableStyleLight20 = new XLTableTheme("TableStyleLight20"); + public static readonly XLTableTheme TableStyleLight19 = new XLTableTheme("TableStyleLight19"); + public static readonly XLTableTheme TableStyleLight18 = new XLTableTheme("TableStyleLight18"); + public static readonly XLTableTheme TableStyleLight17 = new XLTableTheme("TableStyleLight17"); + public static readonly XLTableTheme TableStyleLight16 = new XLTableTheme("TableStyleLight16"); + public static readonly XLTableTheme TableStyleLight15 = new XLTableTheme("TableStyleLight15"); + public static readonly XLTableTheme TableStyleLight14 = new XLTableTheme("TableStyleLight14"); + public static readonly XLTableTheme TableStyleLight13 = new XLTableTheme("TableStyleLight13"); + public static readonly XLTableTheme TableStyleLight12 = new XLTableTheme("TableStyleLight12"); + public static readonly XLTableTheme TableStyleLight11 = new XLTableTheme("TableStyleLight11"); + public static readonly XLTableTheme TableStyleLight10 = new XLTableTheme("TableStyleLight10"); + public static readonly XLTableTheme TableStyleLight9 = new XLTableTheme("TableStyleLight9"); + public static readonly XLTableTheme TableStyleLight8 = new XLTableTheme("TableStyleLight8"); + public static readonly XLTableTheme TableStyleLight7 = new XLTableTheme("TableStyleLight7"); + public static readonly XLTableTheme TableStyleLight6 = new XLTableTheme("TableStyleLight6"); + public static readonly XLTableTheme TableStyleLight5 = new XLTableTheme("TableStyleLight5"); + public static readonly XLTableTheme TableStyleLight4 = new XLTableTheme("TableStyleLight4"); + public static readonly XLTableTheme TableStyleLight3 = new XLTableTheme("TableStyleLight3"); + public static readonly XLTableTheme TableStyleLight2 = new XLTableTheme("TableStyleLight2"); + public static readonly XLTableTheme TableStyleLight1 = new XLTableTheme("TableStyleLight1"); + public static readonly XLTableTheme TableStyleDark11 = new XLTableTheme("TableStyleDark11"); + public static readonly XLTableTheme TableStyleDark10 = new XLTableTheme("TableStyleDark10"); + public static readonly XLTableTheme TableStyleDark9 = new XLTableTheme("TableStyleDark9"); + public static readonly XLTableTheme TableStyleDark8 = new XLTableTheme("TableStyleDark8"); + public static readonly XLTableTheme TableStyleDark7 = new XLTableTheme("TableStyleDark7"); + public static readonly XLTableTheme TableStyleDark6 = new XLTableTheme("TableStyleDark6"); + public static readonly XLTableTheme TableStyleDark5 = new XLTableTheme("TableStyleDark5"); + public static readonly XLTableTheme TableStyleDark4 = new XLTableTheme("TableStyleDark4"); + public static readonly XLTableTheme TableStyleDark3 = new XLTableTheme("TableStyleDark3"); + public static readonly XLTableTheme TableStyleDark2 = new XLTableTheme("TableStyleDark2"); + public static readonly XLTableTheme TableStyleDark1 = new XLTableTheme("TableStyleDark1"); + + public string Name { get; private set; } + + public XLTableTheme(string name) + { + this.Name = name; + } + + private static IEnumerable allThemes; + + public static IEnumerable GetAllThemes() + { + return (allThemes ?? (allThemes = typeof(XLTableTheme).GetFields(BindingFlags.Static | BindingFlags.Public) + .Where(fi => fi.FieldType.Equals(typeof(XLTableTheme))) + .Select(fi => (XLTableTheme)fi.GetValue(null)) + .ToArray())); + } + + public static XLTableTheme FromName(string name) + { + return GetAllThemes().FirstOrDefault(s => s.Name == name); + } + + #region Overrides + + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + XLTableTheme theme = obj as XLTableTheme; + if (theme == null) + { + return false; + } + return this.Name.Equals(theme.Name); + } + + public override int GetHashCode() + { + return this.Name.GetHashCode(); + } + + public override string ToString() + { + return this.Name; + } + + #endregion Overrides + } } \ No newline at end of file diff --git a/ClosedXML/Excel/Tables/XLTables.cs b/ClosedXML/Excel/Tables/XLTables.cs index e301539..485bb7c 100644 --- a/ClosedXML/Excel/Tables/XLTables.cs +++ b/ClosedXML/Excel/Tables/XLTables.cs @@ -1,57 +1,57 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace ClosedXML.Excel -{ - using System.Collections; - - public class XLTables : IXLTables - { - private readonly Dictionary _tables = new Dictionary(); - - #region IXLTables Members - - public IEnumerator GetEnumerator() - { - return _tables.Values.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void Add(IXLTable table) - { - _tables.Add(table.Name, table); - } - - public IXLTable Table(Int32 index) - { - return _tables.ElementAt(index).Value; - } - - public IXLTable Table(String name) - { - return _tables[name]; - } - - #endregion - - public IXLTables Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) - { - _tables.Values.ForEach(t => t.Clear(clearOptions)); - return this; - } - - public void Remove(Int32 index) - { - _tables.Remove(_tables.ElementAt(index).Key); - } - public void Remove(String name) - { - _tables.Remove(name); - } - } +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ClosedXML.Excel +{ + using System.Collections; + + public class XLTables : IXLTables + { + private readonly Dictionary _tables = new Dictionary(); + + #region IXLTables Members + + public IEnumerator GetEnumerator() + { + return _tables.Values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(IXLTable table) + { + _tables.Add(table.Name, table); + } + + public IXLTable Table(Int32 index) + { + return _tables.ElementAt(index).Value; + } + + public IXLTable Table(String name) + { + return _tables[name]; + } + + #endregion + + public IXLTables Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats) + { + _tables.Values.ForEach(t => t.Clear(clearOptions)); + return this; + } + + public void Remove(Int32 index) + { + _tables.Remove(_tables.ElementAt(index).Key); + } + public void Remove(String name) + { + _tables.Remove(name); + } + } } \ No newline at end of file diff --git a/ClosedXML/Excel/XLAddressLight.cs b/ClosedXML/Excel/XLAddressLight.cs index 68c2fd0..730e475 100644 --- a/ClosedXML/Excel/XLAddressLight.cs +++ b/ClosedXML/Excel/XLAddressLight.cs @@ -1,18 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace ClosedXML.Excel -{ - internal struct XLAddressLight - { - public XLAddressLight(Int32 rowNumber, Int32 columnNumber) - { - RowNumber = rowNumber; - ColumnNumber = columnNumber; - } - public Int32 RowNumber; - public Int32 ColumnNumber; - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal struct XLAddressLight + { + public XLAddressLight(Int32 rowNumber, Int32 columnNumber) + { + RowNumber = rowNumber; + ColumnNumber = columnNumber; + } + public Int32 RowNumber; + public Int32 ColumnNumber; + } +} diff --git a/ClosedXML/Excel/XLConstants.cs b/ClosedXML/Excel/XLConstants.cs index bf4a2a8..4948bb2 100644 --- a/ClosedXML/Excel/XLConstants.cs +++ b/ClosedXML/Excel/XLConstants.cs @@ -1,4 +1,4 @@ -namespace ClosedXML.Excel +namespace ClosedXML.Excel { //Use the class to store magic strings or variables. public static class XLConstants diff --git a/ClosedXML/Excel/XLOutline.cs b/ClosedXML/Excel/XLOutline.cs index f86e0b5..1e296b7 100644 --- a/ClosedXML/Excel/XLOutline.cs +++ b/ClosedXML/Excel/XLOutline.cs @@ -1,17 +1,17 @@ - -namespace ClosedXML.Excel -{ - internal class XLOutline:IXLOutline - { - public XLOutline(IXLOutline outline) - { - if (outline != null) - { - SummaryHLocation = outline.SummaryHLocation; - SummaryVLocation = outline.SummaryVLocation; - } - } - public XLOutlineSummaryVLocation SummaryVLocation { get; set; } - public XLOutlineSummaryHLocation SummaryHLocation { get; set; } - } -} + +namespace ClosedXML.Excel +{ + internal class XLOutline:IXLOutline + { + public XLOutline(IXLOutline outline) + { + if (outline != null) + { + SummaryHLocation = outline.SummaryHLocation; + SummaryVLocation = outline.SummaryVLocation; + } + } + public XLOutlineSummaryVLocation SummaryVLocation { get; set; } + public XLOutlineSummaryHLocation SummaryHLocation { get; set; } + } +} diff --git a/ClosedXML/Excel/XLSheetProtection.cs b/ClosedXML/Excel/XLSheetProtection.cs index a9cfc61..9166280 100644 --- a/ClosedXML/Excel/XLSheetProtection.cs +++ b/ClosedXML/Excel/XLSheetProtection.cs @@ -1,112 +1,112 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLSheetProtection: IXLSheetProtection - { - public XLSheetProtection() - { - SelectLockedCells = true; - SelectUnlockedCells = true; - } - - public Boolean Protected { get; set; } - internal String PasswordHash { get; set; } - public String Password - { - set - { - PasswordHash = GetPasswordHash(value); - } - } - - public Boolean AutoFilter { get; set; } - public Boolean DeleteColumns { get; set; } - public Boolean DeleteRows { get; set; } - public Boolean FormatCells { get; set; } - public Boolean FormatColumns { get; set; } - public Boolean FormatRows { get; set; } - public Boolean InsertColumns { get; set; } - public Boolean InsertHyperlinks { get; set; } - public Boolean InsertRows { get; set; } - public Boolean Objects { get; set; } - public Boolean PivotTables { get; set; } - public Boolean Scenarios { get; set; } - public Boolean SelectLockedCells { get; set; } - public Boolean SelectUnlockedCells { get; set; } - public Boolean Sort { get; set; } - - public IXLSheetProtection SetAutoFilter() { AutoFilter = true; return this; } public IXLSheetProtection SetAutoFilter(Boolean value) { AutoFilter = value; return this; } - public IXLSheetProtection SetDeleteColumns() { DeleteColumns = true; return this; } public IXLSheetProtection SetDeleteColumns(Boolean value) { DeleteColumns = value; return this; } - public IXLSheetProtection SetDeleteRows() { DeleteRows = true; return this; } public IXLSheetProtection SetDeleteRows(Boolean value) { DeleteRows = value; return this; } - public IXLSheetProtection SetFormatCells() { FormatCells = true; return this; } public IXLSheetProtection SetFormatCells(Boolean value) { FormatCells = value; return this; } - public IXLSheetProtection SetFormatColumns() { FormatColumns = true; return this; } public IXLSheetProtection SetFormatColumns(Boolean value) { FormatColumns = value; return this; } - public IXLSheetProtection SetFormatRows() { FormatRows = true; return this; } public IXLSheetProtection SetFormatRows(Boolean value) { FormatRows = value; return this; } - public IXLSheetProtection SetInsertColumns() { InsertColumns = true; return this; } public IXLSheetProtection SetInsertColumns(Boolean value) { InsertColumns = value; return this; } - public IXLSheetProtection SetInsertHyperlinks() { InsertHyperlinks = true; return this; } public IXLSheetProtection SetInsertHyperlinks(Boolean value) { InsertHyperlinks = value; return this; } - public IXLSheetProtection SetInsertRows() { InsertRows = true; return this; } public IXLSheetProtection SetInsertRows(Boolean value) { InsertRows = value; return this; } - public IXLSheetProtection SetObjects() { Objects = true; return this; } public IXLSheetProtection SetObjects(Boolean value) { Objects = value; return this; } - public IXLSheetProtection SetPivotTables() { PivotTables = true; return this; } public IXLSheetProtection SetPivotTables(Boolean value) { PivotTables = value; return this; } - public IXLSheetProtection SetScenarios() { Scenarios = true; return this; } public IXLSheetProtection SetScenarios(Boolean value) { Scenarios = value; return this; } - public IXLSheetProtection SetSelectLockedCells() { SelectLockedCells = true; return this; } public IXLSheetProtection SetSelectLockedCells(Boolean value) { SelectLockedCells = value; return this; } - public IXLSheetProtection SetSelectUnlockedCells() { SelectUnlockedCells = true; return this; } public IXLSheetProtection SetSelectUnlockedCells(Boolean value) { SelectUnlockedCells = value; return this; } - public IXLSheetProtection SetSort() { Sort = true; return this; } public IXLSheetProtection SetSort(Boolean value) { Sort = value; return this; } - - public IXLSheetProtection Protect() - { - return Protect(String.Empty); - } - - public IXLSheetProtection Protect(String password) - { - if (Protected) - { - throw new InvalidOperationException("The worksheet is already protected"); - } - else - { - Protected = true; - PasswordHash = GetPasswordHash(password); - } - return this; - } - - public IXLSheetProtection Unprotect() - { - return Unprotect(String.Empty); - } - - public IXLSheetProtection Unprotect(String password) - { - if (Protected) - { - String hash = GetPasswordHash(password); - if (hash != PasswordHash) - throw new ArgumentException("Invalid password"); - else - { - Protected = false; - PasswordHash = String.Empty; - } - } - - return this; - } - - private String GetPasswordHash(String password) - { - Int32 pLength = password.Length; - Int32 hash = 0; - if (pLength == 0) return String.Empty; - - for (Int32 i = pLength - 1; i >= 0; i--) - { - hash ^= password[i]; - hash = hash >> 14 & 0x01 | hash << 1 & 0x7fff; - } - hash ^= 0x8000 | 'N' << 8 | 'K'; - hash ^= pLength; - return hash.ToString("X"); - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLSheetProtection: IXLSheetProtection + { + public XLSheetProtection() + { + SelectLockedCells = true; + SelectUnlockedCells = true; + } + + public Boolean Protected { get; set; } + internal String PasswordHash { get; set; } + public String Password + { + set + { + PasswordHash = GetPasswordHash(value); + } + } + + public Boolean AutoFilter { get; set; } + public Boolean DeleteColumns { get; set; } + public Boolean DeleteRows { get; set; } + public Boolean FormatCells { get; set; } + public Boolean FormatColumns { get; set; } + public Boolean FormatRows { get; set; } + public Boolean InsertColumns { get; set; } + public Boolean InsertHyperlinks { get; set; } + public Boolean InsertRows { get; set; } + public Boolean Objects { get; set; } + public Boolean PivotTables { get; set; } + public Boolean Scenarios { get; set; } + public Boolean SelectLockedCells { get; set; } + public Boolean SelectUnlockedCells { get; set; } + public Boolean Sort { get; set; } + + public IXLSheetProtection SetAutoFilter() { AutoFilter = true; return this; } public IXLSheetProtection SetAutoFilter(Boolean value) { AutoFilter = value; return this; } + public IXLSheetProtection SetDeleteColumns() { DeleteColumns = true; return this; } public IXLSheetProtection SetDeleteColumns(Boolean value) { DeleteColumns = value; return this; } + public IXLSheetProtection SetDeleteRows() { DeleteRows = true; return this; } public IXLSheetProtection SetDeleteRows(Boolean value) { DeleteRows = value; return this; } + public IXLSheetProtection SetFormatCells() { FormatCells = true; return this; } public IXLSheetProtection SetFormatCells(Boolean value) { FormatCells = value; return this; } + public IXLSheetProtection SetFormatColumns() { FormatColumns = true; return this; } public IXLSheetProtection SetFormatColumns(Boolean value) { FormatColumns = value; return this; } + public IXLSheetProtection SetFormatRows() { FormatRows = true; return this; } public IXLSheetProtection SetFormatRows(Boolean value) { FormatRows = value; return this; } + public IXLSheetProtection SetInsertColumns() { InsertColumns = true; return this; } public IXLSheetProtection SetInsertColumns(Boolean value) { InsertColumns = value; return this; } + public IXLSheetProtection SetInsertHyperlinks() { InsertHyperlinks = true; return this; } public IXLSheetProtection SetInsertHyperlinks(Boolean value) { InsertHyperlinks = value; return this; } + public IXLSheetProtection SetInsertRows() { InsertRows = true; return this; } public IXLSheetProtection SetInsertRows(Boolean value) { InsertRows = value; return this; } + public IXLSheetProtection SetObjects() { Objects = true; return this; } public IXLSheetProtection SetObjects(Boolean value) { Objects = value; return this; } + public IXLSheetProtection SetPivotTables() { PivotTables = true; return this; } public IXLSheetProtection SetPivotTables(Boolean value) { PivotTables = value; return this; } + public IXLSheetProtection SetScenarios() { Scenarios = true; return this; } public IXLSheetProtection SetScenarios(Boolean value) { Scenarios = value; return this; } + public IXLSheetProtection SetSelectLockedCells() { SelectLockedCells = true; return this; } public IXLSheetProtection SetSelectLockedCells(Boolean value) { SelectLockedCells = value; return this; } + public IXLSheetProtection SetSelectUnlockedCells() { SelectUnlockedCells = true; return this; } public IXLSheetProtection SetSelectUnlockedCells(Boolean value) { SelectUnlockedCells = value; return this; } + public IXLSheetProtection SetSort() { Sort = true; return this; } public IXLSheetProtection SetSort(Boolean value) { Sort = value; return this; } + + public IXLSheetProtection Protect() + { + return Protect(String.Empty); + } + + public IXLSheetProtection Protect(String password) + { + if (Protected) + { + throw new InvalidOperationException("The worksheet is already protected"); + } + else + { + Protected = true; + PasswordHash = GetPasswordHash(password); + } + return this; + } + + public IXLSheetProtection Unprotect() + { + return Unprotect(String.Empty); + } + + public IXLSheetProtection Unprotect(String password) + { + if (Protected) + { + String hash = GetPasswordHash(password); + if (hash != PasswordHash) + throw new ArgumentException("Invalid password"); + else + { + Protected = false; + PasswordHash = String.Empty; + } + } + + return this; + } + + private String GetPasswordHash(String password) + { + Int32 pLength = password.Length; + Int32 hash = 0; + if (pLength == 0) return String.Empty; + + for (Int32 i = pLength - 1; i >= 0; i--) + { + hash ^= password[i]; + hash = hash >> 14 & 0x01 | hash << 1 & 0x7fff; + } + hash ^= 0x8000 | 'N' << 8 | 'K'; + hash ^= pLength; + return hash.ToString("X"); + } + } +} diff --git a/ClosedXML/Excel/XLSheetView.cs b/ClosedXML/Excel/XLSheetView.cs index 169bb67..b0a99ef 100644 --- a/ClosedXML/Excel/XLSheetView.cs +++ b/ClosedXML/Excel/XLSheetView.cs @@ -1,86 +1,86 @@ -using System; - -namespace ClosedXML.Excel -{ - internal class XLSheetView : IXLSheetView - { - public XLSheetView() - { - View = XLSheetViewOptions.Normal; - - ZoomScale = 100; - ZoomScaleNormal = 100; - ZoomScalePageLayoutView = 100; - ZoomScaleSheetLayoutView = 100; - } - - public XLSheetView(IXLSheetView sheetView) - : this() - { - this.SplitRow = sheetView.SplitRow; - this.SplitColumn = sheetView.SplitColumn; - this.FreezePanes = ((XLSheetView)sheetView).FreezePanes; - } - - public Boolean FreezePanes { get; set; } - public Int32 SplitColumn { get; set; } - public Int32 SplitRow { get; set; } - public XLSheetViewOptions View { get; set; } - - public int ZoomScale - { - get { return _zoomScale; } - set - { - _zoomScale = value; - switch (View) - { - case XLSheetViewOptions.Normal: - ZoomScaleNormal = value; - break; - - case XLSheetViewOptions.PageBreakPreview: - ZoomScalePageLayoutView = value; - break; - - case XLSheetViewOptions.PageLayout: - ZoomScaleSheetLayoutView = value; - break; - } - } - } - - public int ZoomScaleNormal { get; set; } - - public int ZoomScalePageLayoutView { get; set; } - - public int ZoomScaleSheetLayoutView { get; set; } - - private int _zoomScale { get; set; } - - public void Freeze(Int32 rows, Int32 columns) - { - SplitRow = rows; - SplitColumn = columns; - FreezePanes = true; - } - - public void FreezeColumns(Int32 columns) - { - SplitColumn = columns; - FreezePanes = true; - } - - public void FreezeRows(Int32 rows) - { - SplitRow = rows; - FreezePanes = true; - } - - public IXLSheetView SetView(XLSheetViewOptions value) - { - View = value; - return this; - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLSheetView : IXLSheetView + { + public XLSheetView() + { + View = XLSheetViewOptions.Normal; + + ZoomScale = 100; + ZoomScaleNormal = 100; + ZoomScalePageLayoutView = 100; + ZoomScaleSheetLayoutView = 100; + } + + public XLSheetView(IXLSheetView sheetView) + : this() + { + this.SplitRow = sheetView.SplitRow; + this.SplitColumn = sheetView.SplitColumn; + this.FreezePanes = ((XLSheetView)sheetView).FreezePanes; + } + + public Boolean FreezePanes { get; set; } + public Int32 SplitColumn { get; set; } + public Int32 SplitRow { get; set; } + public XLSheetViewOptions View { get; set; } + + public int ZoomScale + { + get { return _zoomScale; } + set + { + _zoomScale = value; + switch (View) + { + case XLSheetViewOptions.Normal: + ZoomScaleNormal = value; + break; + + case XLSheetViewOptions.PageBreakPreview: + ZoomScalePageLayoutView = value; + break; + + case XLSheetViewOptions.PageLayout: + ZoomScaleSheetLayoutView = value; + break; + } + } + } + + public int ZoomScaleNormal { get; set; } + + public int ZoomScalePageLayoutView { get; set; } + + public int ZoomScaleSheetLayoutView { get; set; } + + private int _zoomScale { get; set; } + + public void Freeze(Int32 rows, Int32 columns) + { + SplitRow = rows; + SplitColumn = columns; + FreezePanes = true; + } + + public void FreezeColumns(Int32 columns) + { + SplitColumn = columns; + FreezePanes = true; + } + + public void FreezeRows(Int32 rows) + { + SplitRow = rows; + FreezePanes = true; + } + + public IXLSheetView SetView(XLSheetViewOptions value) + { + View = value; + return this; + } + } +} diff --git a/ClosedXML/Excel/XLTheme.cs b/ClosedXML/Excel/XLTheme.cs index 3c5e839..738563c 100644 --- a/ClosedXML/Excel/XLTheme.cs +++ b/ClosedXML/Excel/XLTheme.cs @@ -1,33 +1,33 @@ -using FastMember; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLTheme : IXLTheme - { - public XLColor Background1 { get; set; } - public XLColor Text1 { get; set; } - public XLColor Background2 { get; set; } - public XLColor Text2 { get; set; } - public XLColor Accent1 { get; set; } - public XLColor Accent2 { get; set; } - public XLColor Accent3 { get; set; } - public XLColor Accent4 { get; set; } - public XLColor Accent5 { get; set; } - public XLColor Accent6 { get; set; } - public XLColor Hyperlink { get; set; } - public XLColor FollowedHyperlink { get; set; } - - private TypeAccessor accessor = TypeAccessor.Create(typeof(XLTheme)); - - public XLColor ResolveThemeColor(XLThemeColor themeColor) - { - var tc = themeColor.ToString(); - var members = accessor.GetMembers(); - if (members.Any(m => m.Name.Equals(tc))) - return accessor[this, tc] as XLColor; - else - return null; - } - } -} +using FastMember; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLTheme : IXLTheme + { + public XLColor Background1 { get; set; } + public XLColor Text1 { get; set; } + public XLColor Background2 { get; set; } + public XLColor Text2 { get; set; } + public XLColor Accent1 { get; set; } + public XLColor Accent2 { get; set; } + public XLColor Accent3 { get; set; } + public XLColor Accent4 { get; set; } + public XLColor Accent5 { get; set; } + public XLColor Accent6 { get; set; } + public XLColor Hyperlink { get; set; } + public XLColor FollowedHyperlink { get; set; } + + private TypeAccessor accessor = TypeAccessor.Create(typeof(XLTheme)); + + public XLColor ResolveThemeColor(XLThemeColor themeColor) + { + var tc = themeColor.ToString(); + var members = accessor.GetMembers(); + if (members.Any(m => m.Name.Equals(tc))) + return accessor[this, tc] as XLColor; + else + return null; + } + } +} diff --git a/ClosedXML/Excel/XLWSContentManager.cs b/ClosedXML/Excel/XLWSContentManager.cs index 9b2f7ee..f871a62 100644 --- a/ClosedXML/Excel/XLWSContentManager.cs +++ b/ClosedXML/Excel/XLWSContentManager.cs @@ -1,111 +1,111 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using DocumentFormat.OpenXml; -using DocumentFormat.OpenXml.Spreadsheet; - -namespace ClosedXML.Excel -{ - internal class XLWSContentManager - { - public enum XLWSContents - { - SheetProperties = 1, - SheetDimension = 2, - SheetViews = 3, - SheetFormatProperties = 4, - Columns = 5, - SheetData = 6, - SheetCalculationProperties = 7, - SheetProtection = 8, - ProtectedRanges = 9, - Scenarios = 10, - AutoFilter = 11, - SortState = 12, - DataConsolidate = 13, - CustomSheetViews = 14, - MergeCells = 15, - PhoneticProperties = 16, - ConditionalFormatting = 17, - DataValidations = 18, - Hyperlinks = 19, - PrintOptions = 20, - PageMargins = 21, - PageSetup = 22, - HeaderFooter = 23, - RowBreaks = 24, - ColumnBreaks = 25, - CustomProperties = 26, - CellWatches = 27, - IgnoredErrors = 28, - SmartTags = 29, - Drawing = 30, - LegacyDrawing = 31, - LegacyDrawingHeaderFooter = 32, - DrawingHeaderFooter = 33, - Picture = 34, - OleObjects = 35, - Controls = 36, - AlternateContent = 37, - WebPublishItems = 38, - TableParts = 39, - WorksheetExtensionList = 40 - } - private Dictionary contents = new Dictionary(); - - public XLWSContentManager(Worksheet opWorksheet) - { - contents.Add(XLWSContents.SheetProperties, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.SheetDimension, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.SheetViews, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.SheetFormatProperties, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.Columns, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.SheetData, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.SheetCalculationProperties, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.SheetProtection, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.ProtectedRanges, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.Scenarios, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.AutoFilter, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.SortState, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.DataConsolidate, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.CustomSheetViews, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.MergeCells, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.PhoneticProperties, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.ConditionalFormatting, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.DataValidations, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.Hyperlinks, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.PrintOptions, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.PageMargins, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.PageSetup, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.HeaderFooter, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.RowBreaks, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.ColumnBreaks, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.CustomProperties, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.CellWatches, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.IgnoredErrors, opWorksheet.Elements().LastOrDefault()); - //contents.Add(XLWSContents.SmartTags, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.Drawing, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.LegacyDrawing, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.LegacyDrawingHeaderFooter, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.DrawingHeaderFooter, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.Picture, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.OleObjects, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.Controls, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.AlternateContent, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.WebPublishItems, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.TableParts, opWorksheet.Elements().LastOrDefault()); - contents.Add(XLWSContents.WorksheetExtensionList, opWorksheet.Elements().LastOrDefault()); - } - - public void SetElement(XLWSContents content, OpenXmlElement element) - { - contents[content] = element; - } - - public OpenXmlElement GetPreviousElementFor(XLWSContents content) - { - var max = contents.Where(kp => (Int32)kp.Key < (Int32)content && kp.Value != null).Max(kp => kp.Key); - return contents[max]; - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Spreadsheet; + +namespace ClosedXML.Excel +{ + internal class XLWSContentManager + { + public enum XLWSContents + { + SheetProperties = 1, + SheetDimension = 2, + SheetViews = 3, + SheetFormatProperties = 4, + Columns = 5, + SheetData = 6, + SheetCalculationProperties = 7, + SheetProtection = 8, + ProtectedRanges = 9, + Scenarios = 10, + AutoFilter = 11, + SortState = 12, + DataConsolidate = 13, + CustomSheetViews = 14, + MergeCells = 15, + PhoneticProperties = 16, + ConditionalFormatting = 17, + DataValidations = 18, + Hyperlinks = 19, + PrintOptions = 20, + PageMargins = 21, + PageSetup = 22, + HeaderFooter = 23, + RowBreaks = 24, + ColumnBreaks = 25, + CustomProperties = 26, + CellWatches = 27, + IgnoredErrors = 28, + SmartTags = 29, + Drawing = 30, + LegacyDrawing = 31, + LegacyDrawingHeaderFooter = 32, + DrawingHeaderFooter = 33, + Picture = 34, + OleObjects = 35, + Controls = 36, + AlternateContent = 37, + WebPublishItems = 38, + TableParts = 39, + WorksheetExtensionList = 40 + } + private Dictionary contents = new Dictionary(); + + public XLWSContentManager(Worksheet opWorksheet) + { + contents.Add(XLWSContents.SheetProperties, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.SheetDimension, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.SheetViews, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.SheetFormatProperties, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.Columns, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.SheetData, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.SheetCalculationProperties, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.SheetProtection, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.ProtectedRanges, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.Scenarios, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.AutoFilter, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.SortState, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.DataConsolidate, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.CustomSheetViews, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.MergeCells, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.PhoneticProperties, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.ConditionalFormatting, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.DataValidations, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.Hyperlinks, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.PrintOptions, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.PageMargins, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.PageSetup, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.HeaderFooter, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.RowBreaks, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.ColumnBreaks, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.CustomProperties, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.CellWatches, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.IgnoredErrors, opWorksheet.Elements().LastOrDefault()); + //contents.Add(XLWSContents.SmartTags, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.Drawing, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.LegacyDrawing, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.LegacyDrawingHeaderFooter, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.DrawingHeaderFooter, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.Picture, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.OleObjects, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.Controls, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.AlternateContent, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.WebPublishItems, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.TableParts, opWorksheet.Elements().LastOrDefault()); + contents.Add(XLWSContents.WorksheetExtensionList, opWorksheet.Elements().LastOrDefault()); + } + + public void SetElement(XLWSContents content, OpenXmlElement element) + { + contents[content] = element; + } + + public OpenXmlElement GetPreviousElementFor(XLWSContents content) + { + var max = contents.Where(kp => (Int32)kp.Key < (Int32)content && kp.Value != null).Max(kp => kp.Key); + return contents[max]; + } + } +} diff --git a/ClosedXML/Excel/XLWorkbook.cs b/ClosedXML/Excel/XLWorkbook.cs index 645d536..40b0e2e 100644 --- a/ClosedXML/Excel/XLWorkbook.cs +++ b/ClosedXML/Excel/XLWorkbook.cs @@ -1,884 +1,884 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Security.AccessControl; -using ClosedXML.Excel.CalcEngine; -using DocumentFormat.OpenXml; - -namespace ClosedXML.Excel -{ - using System.Linq; - using System.Data; - - public enum XLEventTracking { Enabled, Disabled } - public enum XLCalculateMode - { - Auto, - AutoNoTable, - Manual, - Default - }; - - public enum XLReferenceStyle - { - R1C1, - A1, - Default - }; - - public enum XLCellSetValueBehavior - { - /// - /// Analyze input string and convert value. For avoid analyzing use escape symbol ' - /// - Smart = 0, - - /// - /// Direct set value. If value has unsupported type - value will be stored as string returned by - /// - Simple = 1, - } - - public partial class XLWorkbook: IDisposable - { - #region Static - - private static IXLStyle _defaultStyle; - - public static IXLStyle DefaultStyle - { - get - { - return _defaultStyle ?? (_defaultStyle = new XLStyle(null) - { - Font = new XLFont(null, null) - { - Bold = false, - Italic = false, - Underline = XLFontUnderlineValues.None, - Strikethrough = false, - VerticalAlignment = - XLFontVerticalTextAlignmentValues. - Baseline, - FontSize = 11, - FontColor = XLColor.FromArgb(0, 0, 0), - FontName = "Calibri", - FontFamilyNumbering = - XLFontFamilyNumberingValues.Swiss - }, - Fill = new XLFill(null) - { - BackgroundColor = XLColor.FromIndex(64), - PatternType = XLFillPatternValues.None, - PatternColor = XLColor.FromIndex(64) - }, - Border = new XLBorder(null, null) - { - BottomBorder = - XLBorderStyleValues.None, - DiagonalBorder = - XLBorderStyleValues.None, - DiagonalDown = false, - DiagonalUp = false, - LeftBorder = XLBorderStyleValues.None, - RightBorder = XLBorderStyleValues.None, - TopBorder = XLBorderStyleValues.None, - BottomBorderColor = XLColor.Black, - DiagonalBorderColor = XLColor.Black, - LeftBorderColor = XLColor.Black, - RightBorderColor = XLColor.Black, - TopBorderColor = XLColor.Black - }, - NumberFormat = - new XLNumberFormat(null, null) {NumberFormatId = 0}, - Alignment = new XLAlignment(null) - { - Indent = 0, - Horizontal = - XLAlignmentHorizontalValues. - General, - JustifyLastLine = false, - ReadingOrder = - XLAlignmentReadingOrderValues. - ContextDependent, - RelativeIndent = 0, - ShrinkToFit = false, - TextRotation = 0, - Vertical = - XLAlignmentVerticalValues. - Bottom, - WrapText = false - }, - Protection = new XLProtection(null) - { - Locked = true, - Hidden = false - } - }); - } - } - - public static Double DefaultRowHeight { get; private set; } - public static Double DefaultColumnWidth { get; private set; } - - public static IXLPageSetup DefaultPageOptions - { - get - { - var defaultPageOptions = new XLPageSetup(null, null) - { - PageOrientation = XLPageOrientation.Default, - Scale = 100, - PaperSize = XLPaperSize.LetterPaper, - Margins = new XLMargins - { - Top = 0.75, - Bottom = 0.5, - Left = 0.75, - Right = 0.75, - Header = 0.5, - Footer = 0.75 - }, - ScaleHFWithDocument = true, - AlignHFWithMargins = true, - PrintErrorValue = XLPrintErrorValues.Displayed, - ShowComments = XLShowCommentsValues.None - }; - return defaultPageOptions; - } - } - - public static IXLOutline DefaultOutline - { - get - { - return new XLOutline(null) - { - SummaryHLocation = XLOutlineSummaryHLocation.Right, - SummaryVLocation = XLOutlineSummaryVLocation.Bottom - }; - } - } - - /// - /// Behavior for - /// - public static XLCellSetValueBehavior CellSetValueBehavior { get; set; } - - #endregion - - internal readonly List UnsupportedSheets = - new List(); - - private readonly Dictionary _stylesById = new Dictionary(); - private readonly Dictionary _stylesByStyle = new Dictionary(); - - public XLEventTracking EventTracking { get; set; } - - internal Int32 GetStyleId(IXLStyle style) - { - Int32 cached; - if (_stylesByStyle.TryGetValue(style, out cached)) - return cached; - - var count = _stylesByStyle.Count; - var styleToUse = new XLStyle(null, style); - _stylesByStyle.Add(styleToUse, count); - _stylesById.Add(count, styleToUse); - return count; - } - - internal IXLStyle GetStyleById(Int32 id) - { - return _stylesById[id]; - } - - #region Nested Type: XLLoadSource - - private enum XLLoadSource - { - New, - File, - Stream - }; - - #endregion - - internal XLWorksheets WorksheetsInternal { get; private set; } - - /// - /// Gets an object to manipulate the worksheets. - /// - public IXLWorksheets Worksheets - { - get { return WorksheetsInternal; } - } - - /// - /// Gets an object to manipulate this workbook's named ranges. - /// - public IXLNamedRanges NamedRanges { get; private set; } - - /// - /// Gets an object to manipulate this workbook's theme. - /// - public IXLTheme Theme { get; private set; } - - /// - /// Gets or sets the default style for the workbook. - /// All new worksheets will use this style. - /// - public IXLStyle Style { get; set; } - - /// - /// Gets or sets the default row height for the workbook. - /// All new worksheets will use this row height. - /// - public Double RowHeight { get; set; } - - /// - /// Gets or sets the default column width for the workbook. - /// All new worksheets will use this column width. - /// - public Double ColumnWidth { get; set; } - - /// - /// Gets or sets the default page options for the workbook. - /// All new worksheets will use these page options. - /// - public IXLPageSetup PageOptions { get; set; } - - /// - /// Gets or sets the default outline options for the workbook. - /// All new worksheets will use these outline options. - /// - public IXLOutline Outline { get; set; } - - /// - /// Gets or sets the workbook's properties. - /// - public XLWorkbookProperties Properties { get; set; } - - /// - /// Gets or sets the workbook's calculation mode. - /// - public XLCalculateMode CalculateMode { get; set; } - - - public Boolean CalculationOnSave { get; set; } - public Boolean ForceFullCalculation { get; set; } - public Boolean FullCalculationOnLoad { get; set; } - public Boolean FullPrecision { get; set; } - - /// - /// Gets or sets the workbook's reference style. - /// - public XLReferenceStyle ReferenceStyle { get; set; } - - public IXLCustomProperties CustomProperties { get; private set; } - - public Boolean ShowFormulas { get; set; } - public Boolean ShowGridLines { get; set; } - public Boolean ShowOutlineSymbols { get; set; } - public Boolean ShowRowColHeaders { get; set; } - public Boolean ShowRuler { get; set; } - public Boolean ShowWhiteSpace { get; set; } - public Boolean ShowZeros { get; set; } - public Boolean RightToLeft { get; set; } - - public Boolean DefaultShowFormulas - { - get { return false; } - } - - public Boolean DefaultShowGridLines - { - get { return true; } - } - - public Boolean DefaultShowOutlineSymbols - { - get { return true; } - } - - public Boolean DefaultShowRowColHeaders - { - get { return true; } - } - - public Boolean DefaultShowRuler - { - get { return true; } - } - - public Boolean DefaultShowWhiteSpace - { - get { return true; } - } - - public Boolean DefaultShowZeros - { - get { return true; } - } - - public Boolean DefaultRightToLeft - { - get { return false; } - } - - private void InitializeTheme() - { - Theme = new XLTheme - { - Text1 = XLColor.FromHtml("#FF000000"), - Background1 = XLColor.FromHtml("#FFFFFFFF"), - Text2 = XLColor.FromHtml("#FF1F497D"), - Background2 = XLColor.FromHtml("#FFEEECE1"), - Accent1 = XLColor.FromHtml("#FF4F81BD"), - Accent2 = XLColor.FromHtml("#FFC0504D"), - Accent3 = XLColor.FromHtml("#FF9BBB59"), - Accent4 = XLColor.FromHtml("#FF8064A2"), - Accent5 = XLColor.FromHtml("#FF4BACC6"), - Accent6 = XLColor.FromHtml("#FFF79646"), - Hyperlink = XLColor.FromHtml("#FF0000FF"), - FollowedHyperlink = XLColor.FromHtml("#FF800080") - }; - } - - internal XLColor GetXLColor(XLThemeColor themeColor) - { - switch (themeColor) - { - case XLThemeColor.Text1: - return Theme.Text1; - case XLThemeColor.Background1: - return Theme.Background1; - case XLThemeColor.Text2: - return Theme.Text2; - case XLThemeColor.Background2: - return Theme.Background2; - case XLThemeColor.Accent1: - return Theme.Accent1; - case XLThemeColor.Accent2: - return Theme.Accent2; - case XLThemeColor.Accent3: - return Theme.Accent3; - case XLThemeColor.Accent4: - return Theme.Accent4; - case XLThemeColor.Accent5: - return Theme.Accent5; - case XLThemeColor.Accent6: - return Theme.Accent6; - default: - throw new ArgumentException("Invalid theme color"); - } - } - - public IXLNamedRange NamedRange(String rangeName) - { - if (rangeName.Contains("!")) - { - var split = rangeName.Split('!'); - var first = split[0]; - var wsName = first.StartsWith("'") ? first.Substring(1, first.Length - 2) : first; - var name = split[1]; - IXLWorksheet ws; - if (TryGetWorksheet(wsName, out ws)) - { - var range = ws.NamedRange(name); - return range ?? NamedRange(name); - } - return null; - } - return NamedRanges.NamedRange(rangeName); - } - - public Boolean TryGetWorksheet(String name, out IXLWorksheet worksheet) - { - if (Worksheets.Any(w => string.Equals(w.Name, XLWorksheets.TrimSheetName(name), StringComparison.OrdinalIgnoreCase))) - { - worksheet = Worksheet(name); - return true; - } - - worksheet = null; - return false; - } - - public IXLRange RangeFromFullAddress(String rangeAddress, out IXLWorksheet ws) - { - ws = null; - if (!rangeAddress.Contains('!')) return null; - - var split = rangeAddress.Split('!'); - var first = split[0]; - var wsName = first.StartsWith("'") ? first.Substring(1, first.Length - 2) : first; - var localRange = split[1]; - if (TryGetWorksheet(wsName, out ws)) - { - return ws.Range(localRange); - } - return null; - } - - - /// - /// Saves the current workbook. - /// - public void Save() - { -#if DEBUG - Save(true); -#else - Save(false); -#endif - } - - /// - /// Saves the current workbook and optionally performs validation - /// - public void Save(bool validate) - { - checkForWorksheetsPresent(); - if (_loadSource == XLLoadSource.New) - throw new Exception("This is a new file, please use one of the SaveAs methods."); - - if (_loadSource == XLLoadSource.Stream) - { - CreatePackage(_originalStream, false, _spreadsheetDocumentType, validate); - } - else - CreatePackage(_originalFile, _spreadsheetDocumentType, validate); - } - - /// - /// Saves the current workbook to a file. - /// - public void SaveAs(String file) - { -#if DEBUG - SaveAs(file, true); -#else - SaveAs(file, false); -#endif - } - - /// - /// Saves the current workbook to a file and optionally validates it. - /// - public void SaveAs(String file, Boolean validate) - { - checkForWorksheetsPresent(); - PathHelper.CreateDirectory(Path.GetDirectoryName(file)); - if (_loadSource == XLLoadSource.New) - { - if (File.Exists(file)) - File.Delete(file); - - CreatePackage(file, GetSpreadsheetDocumentType(file), validate); - } - else if (_loadSource == XLLoadSource.File) - { - if (String.Compare(_originalFile.Trim(), file.Trim(), true) != 0) - File.Copy(_originalFile, file, true); - - CreatePackage(file, GetSpreadsheetDocumentType(file), validate); - } - else if (_loadSource == XLLoadSource.Stream) - { - _originalStream.Position = 0; - - using (var fileStream = File.Create(file)) - { - CopyStream(_originalStream, fileStream); - //fileStream.Position = 0; - CreatePackage(fileStream, false, _spreadsheetDocumentType, validate); - fileStream.Close(); - } - } - } - - private static SpreadsheetDocumentType GetSpreadsheetDocumentType(string filePath) - { - var extension = Path.GetExtension(filePath); - if (extension == null) throw new Exception("Empty extension is not supported."); - extension = extension.Substring(1).ToLowerInvariant(); - - switch (extension) - { - case "xlsm": - case "xltm": - return SpreadsheetDocumentType.MacroEnabledWorkbook; - case "xlsx": - case "xltx": - return SpreadsheetDocumentType.Workbook; - default: - throw new ArgumentException(String.Format("Extension '{0}' is not supported. Supported extensions are '.xlsx', '.xslm', '.xltx' and '.xltm'.", extension)); - - } - } - - private void checkForWorksheetsPresent() - { - if (Worksheets.Count() == 0) - throw new Exception("Workbooks need at least one worksheet."); - } - - /// - /// Saves the current workbook to a stream. - /// - public void SaveAs(Stream stream) - { -#if DEBUG - SaveAs(stream, true); -#else - SaveAs(stream, false); -#endif - } - - /// - /// Saves the current workbook to a stream and optionally validates it. - /// - public void SaveAs(Stream stream, Boolean validate) - { - checkForWorksheetsPresent(); - if (_loadSource == XLLoadSource.New) - { - // dm 20130422, this method or better the method SpreadsheetDocument.Create which is called - // inside of 'CreatePackage' need a stream which CanSeek & CanRead - // and an ordinary Response stream of a webserver can't do this - // so we have to ask and provide a way around this - if (stream.CanRead && stream.CanSeek && stream.CanWrite) - { - // all is fine the package can be created in a direct way - CreatePackage(stream, true, _spreadsheetDocumentType, validate); - } - else - { - // the harder way - MemoryStream ms = new MemoryStream(); - CreatePackage(ms, true, _spreadsheetDocumentType, validate); - // not really nessesary, because I changed CopyStream too. - // but for better understanding and if somebody in the future - // provide an changed version of CopyStream - ms.Position = 0; - CopyStream(ms, stream); - } - } - else if (_loadSource == XLLoadSource.File) - { - using (var fileStream = new FileStream(_originalFile, FileMode.Open, FileAccess.Read)) - { - CopyStream(fileStream, stream); - fileStream.Close(); - } - CreatePackage(stream, false, _spreadsheetDocumentType, validate); - } - else if (_loadSource == XLLoadSource.Stream) - { - _originalStream.Position = 0; - if (_originalStream != stream) - CopyStream(_originalStream, stream); - - CreatePackage(stream, false, _spreadsheetDocumentType, validate); - } - } - - internal static void CopyStream(Stream input, Stream output) - { - var buffer = new byte[8 * 1024]; - int len; - // dm 20130422, it is always a good idea to rewind the input stream, or not? - if (input.CanSeek) - input.Seek(0, SeekOrigin.Begin); - while ((len = input.Read(buffer, 0, buffer.Length)) > 0) - output.Write(buffer, 0, len); - // dm 20130422, and flushing the output after write - output.Flush(); - - } - - public IXLWorksheet Worksheet(String name) - { - return WorksheetsInternal.Worksheet(name); - } - - public IXLWorksheet Worksheet(Int32 position) - { - return WorksheetsInternal.Worksheet(position); - } - - public IXLCustomProperty CustomProperty(String name) - { - return CustomProperties.CustomProperty(name); - } - - public IXLCells FindCells(Func predicate) - { - var cells = new XLCells(false, false); - foreach (XLWorksheet ws in WorksheetsInternal) - { - foreach (XLCell cell in ws.CellsUsed(true)) - { - if (predicate(cell)) - cells.Add(cell); - } - } - return cells; - } - - public IXLRows FindRows(Func predicate) - { - var rows = new XLRows(null); - foreach (XLWorksheet ws in WorksheetsInternal) - { - foreach (IXLRow row in ws.Rows().Where(predicate)) - rows.Add(row as XLRow); - } - return rows; - } - - public IXLColumns FindColumns(Func predicate) - { - var columns = new XLColumns(null); - foreach (XLWorksheet ws in WorksheetsInternal) - { - foreach (IXLColumn column in ws.Columns().Where(predicate)) - columns.Add(column as XLColumn); - } - return columns; - } - -#region Fields - - private readonly XLLoadSource _loadSource = XLLoadSource.New; - private readonly String _originalFile; - private readonly Stream _originalStream; - -#endregion - -#region Constructor - - - /// - /// Creates a new Excel workbook. - /// - public XLWorkbook() - :this(XLEventTracking.Enabled) - { - - } - - public XLWorkbook(XLEventTracking eventTracking) - { - EventTracking = eventTracking; - DefaultRowHeight = 15; - DefaultColumnWidth = 8.43; - Style = new XLStyle(null, DefaultStyle); - RowHeight = DefaultRowHeight; - ColumnWidth = DefaultColumnWidth; - PageOptions = DefaultPageOptions; - Outline = DefaultOutline; - Properties = new XLWorkbookProperties(); - CalculateMode = XLCalculateMode.Default; - ReferenceStyle = XLReferenceStyle.Default; - InitializeTheme(); - ShowFormulas = DefaultShowFormulas; - ShowGridLines = DefaultShowGridLines; - ShowOutlineSymbols = DefaultShowOutlineSymbols; - ShowRowColHeaders = DefaultShowRowColHeaders; - ShowRuler = DefaultShowRuler; - ShowWhiteSpace = DefaultShowWhiteSpace; - ShowZeros = DefaultShowZeros; - RightToLeft = DefaultRightToLeft; - WorksheetsInternal = new XLWorksheets(this); - NamedRanges = new XLNamedRanges(this); - CustomProperties = new XLCustomProperties(this); - ShapeIdManager = new XLIdManager(); - Author = Environment.UserName; - } - - /// - /// Opens an existing workbook from a file. - /// - /// The file to open. - public XLWorkbook(String file) - : this(file, XLEventTracking.Enabled) - { - - } - - public XLWorkbook(String file, XLEventTracking eventTracking) - : this(eventTracking) - { - _loadSource = XLLoadSource.File; - _originalFile = file; - _spreadsheetDocumentType = GetSpreadsheetDocumentType(_originalFile); - Load(file); - } - - - - /// - /// Opens an existing workbook from a stream. - /// - /// The stream to open. - public XLWorkbook(Stream stream):this(stream, XLEventTracking.Enabled) - { - - } - - public XLWorkbook(Stream stream, XLEventTracking eventTracking) - : this(eventTracking) - { - _loadSource = XLLoadSource.Stream; - _originalStream = stream; - Load(stream); - } - -#endregion - -#region Nested type: UnsupportedSheet - - internal sealed class UnsupportedSheet - { - public Boolean IsActive; - public UInt32 SheetId; - public Int32 Position; - } - -#endregion - - public IXLCell Cell(String namedCell) - { - var namedRange = NamedRange(namedCell); - if (namedRange == null) return null; - var range = namedRange.Ranges.FirstOrDefault(); - if (range == null) return null; - return range.FirstCell(); - } - - public IXLCells Cells(String namedCells) - { - return Ranges(namedCells).Cells(); - } - - public IXLRange Range(String range) - { - var namedRange = NamedRange(range); - if (namedRange != null) - return namedRange.Ranges.FirstOrDefault(); - else - { - IXLWorksheet ws; - var r = RangeFromFullAddress(range, out ws); - return r; - } - } - - public IXLRanges Ranges(String ranges) - { - var retVal = new XLRanges(); - var rangePairs = ranges.Split(','); - foreach (var range in rangePairs.Select(r => Range(r.Trim())).Where(range => range != null)) - { - retVal.Add(range); - } - return retVal; - } - - internal XLIdManager ShapeIdManager { get; private set; } - - - public void Dispose() - { - Worksheets.ForEach(w => w.Dispose()); - } - - public Boolean Use1904DateSystem { get; set; } - public XLWorkbook SetUse1904DateSystem() - { - return SetUse1904DateSystem(true); - } - - public XLWorkbook SetUse1904DateSystem(Boolean value) - { - Use1904DateSystem = value; - return this; - } - - public IXLWorksheet AddWorksheet(String sheetName) - { - return Worksheets.Add(sheetName); - } - - public IXLWorksheet AddWorksheet(String sheetName, Int32 position) - { - return Worksheets.Add(sheetName, position); - } - public IXLWorksheet AddWorksheet(DataTable dataTable) - { - return Worksheets.Add(dataTable); - } - public void AddWorksheet(DataSet dataSet) - { - Worksheets.Add(dataSet); - } - - public void AddWorksheet(IXLWorksheet worksheet) - { - worksheet.CopyTo(this, worksheet.Name); - } - - public IXLWorksheet AddWorksheet(DataTable dataTable, String sheetName) - { - return Worksheets.Add(dataTable, sheetName); - } - - private XLCalcEngine _calcEngine; - private XLCalcEngine CalcEngine - { - get { return _calcEngine ?? (_calcEngine = new XLCalcEngine(this)); } - } - public Object Evaluate(String expression) - { - return CalcEngine.Evaluate(expression); - } - - private static XLCalcEngine _calcEngineExpr; - private SpreadsheetDocumentType _spreadsheetDocumentType; - - private static XLCalcEngine CalcEngineExpr - { - get { return _calcEngineExpr ?? (_calcEngineExpr = new XLCalcEngine()); } - } - public static Object EvaluateExpr(String expression) - { - return CalcEngineExpr.Evaluate(expression); - } - - public String Author { get; set; } - - public Boolean LockStructure { get; set; } - public XLWorkbook SetLockStructure(Boolean value) { LockStructure = value; return this; } - public Boolean LockWindows { get; set; } - public XLWorkbook SetLockWindows(Boolean value) { LockWindows = value; return this; } - - public void Protect() - { - Protect(true); - } - - public void Protect(Boolean lockStructure) - { - Protect(lockStructure, false); - } - - public void Protect(Boolean lockStructure, Boolean lockWindows) - { - LockStructure = lockStructure; - LockWindows = LockWindows; - } - } -} +using System; +using System.Collections.Generic; +using System.IO; +using System.Security.AccessControl; +using ClosedXML.Excel.CalcEngine; +using DocumentFormat.OpenXml; + +namespace ClosedXML.Excel +{ + using System.Linq; + using System.Data; + + public enum XLEventTracking { Enabled, Disabled } + public enum XLCalculateMode + { + Auto, + AutoNoTable, + Manual, + Default + }; + + public enum XLReferenceStyle + { + R1C1, + A1, + Default + }; + + public enum XLCellSetValueBehavior + { + /// + /// Analyze input string and convert value. For avoid analyzing use escape symbol ' + /// + Smart = 0, + + /// + /// Direct set value. If value has unsupported type - value will be stored as string returned by + /// + Simple = 1, + } + + public partial class XLWorkbook: IDisposable + { + #region Static + + private static IXLStyle _defaultStyle; + + public static IXLStyle DefaultStyle + { + get + { + return _defaultStyle ?? (_defaultStyle = new XLStyle(null) + { + Font = new XLFont(null, null) + { + Bold = false, + Italic = false, + Underline = XLFontUnderlineValues.None, + Strikethrough = false, + VerticalAlignment = + XLFontVerticalTextAlignmentValues. + Baseline, + FontSize = 11, + FontColor = XLColor.FromArgb(0, 0, 0), + FontName = "Calibri", + FontFamilyNumbering = + XLFontFamilyNumberingValues.Swiss + }, + Fill = new XLFill(null) + { + BackgroundColor = XLColor.FromIndex(64), + PatternType = XLFillPatternValues.None, + PatternColor = XLColor.FromIndex(64) + }, + Border = new XLBorder(null, null) + { + BottomBorder = + XLBorderStyleValues.None, + DiagonalBorder = + XLBorderStyleValues.None, + DiagonalDown = false, + DiagonalUp = false, + LeftBorder = XLBorderStyleValues.None, + RightBorder = XLBorderStyleValues.None, + TopBorder = XLBorderStyleValues.None, + BottomBorderColor = XLColor.Black, + DiagonalBorderColor = XLColor.Black, + LeftBorderColor = XLColor.Black, + RightBorderColor = XLColor.Black, + TopBorderColor = XLColor.Black + }, + NumberFormat = + new XLNumberFormat(null, null) {NumberFormatId = 0}, + Alignment = new XLAlignment(null) + { + Indent = 0, + Horizontal = + XLAlignmentHorizontalValues. + General, + JustifyLastLine = false, + ReadingOrder = + XLAlignmentReadingOrderValues. + ContextDependent, + RelativeIndent = 0, + ShrinkToFit = false, + TextRotation = 0, + Vertical = + XLAlignmentVerticalValues. + Bottom, + WrapText = false + }, + Protection = new XLProtection(null) + { + Locked = true, + Hidden = false + } + }); + } + } + + public static Double DefaultRowHeight { get; private set; } + public static Double DefaultColumnWidth { get; private set; } + + public static IXLPageSetup DefaultPageOptions + { + get + { + var defaultPageOptions = new XLPageSetup(null, null) + { + PageOrientation = XLPageOrientation.Default, + Scale = 100, + PaperSize = XLPaperSize.LetterPaper, + Margins = new XLMargins + { + Top = 0.75, + Bottom = 0.5, + Left = 0.75, + Right = 0.75, + Header = 0.5, + Footer = 0.75 + }, + ScaleHFWithDocument = true, + AlignHFWithMargins = true, + PrintErrorValue = XLPrintErrorValues.Displayed, + ShowComments = XLShowCommentsValues.None + }; + return defaultPageOptions; + } + } + + public static IXLOutline DefaultOutline + { + get + { + return new XLOutline(null) + { + SummaryHLocation = XLOutlineSummaryHLocation.Right, + SummaryVLocation = XLOutlineSummaryVLocation.Bottom + }; + } + } + + /// + /// Behavior for + /// + public static XLCellSetValueBehavior CellSetValueBehavior { get; set; } + + #endregion + + internal readonly List UnsupportedSheets = + new List(); + + private readonly Dictionary _stylesById = new Dictionary(); + private readonly Dictionary _stylesByStyle = new Dictionary(); + + public XLEventTracking EventTracking { get; set; } + + internal Int32 GetStyleId(IXLStyle style) + { + Int32 cached; + if (_stylesByStyle.TryGetValue(style, out cached)) + return cached; + + var count = _stylesByStyle.Count; + var styleToUse = new XLStyle(null, style); + _stylesByStyle.Add(styleToUse, count); + _stylesById.Add(count, styleToUse); + return count; + } + + internal IXLStyle GetStyleById(Int32 id) + { + return _stylesById[id]; + } + + #region Nested Type: XLLoadSource + + private enum XLLoadSource + { + New, + File, + Stream + }; + + #endregion + + internal XLWorksheets WorksheetsInternal { get; private set; } + + /// + /// Gets an object to manipulate the worksheets. + /// + public IXLWorksheets Worksheets + { + get { return WorksheetsInternal; } + } + + /// + /// Gets an object to manipulate this workbook's named ranges. + /// + public IXLNamedRanges NamedRanges { get; private set; } + + /// + /// Gets an object to manipulate this workbook's theme. + /// + public IXLTheme Theme { get; private set; } + + /// + /// Gets or sets the default style for the workbook. + /// All new worksheets will use this style. + /// + public IXLStyle Style { get; set; } + + /// + /// Gets or sets the default row height for the workbook. + /// All new worksheets will use this row height. + /// + public Double RowHeight { get; set; } + + /// + /// Gets or sets the default column width for the workbook. + /// All new worksheets will use this column width. + /// + public Double ColumnWidth { get; set; } + + /// + /// Gets or sets the default page options for the workbook. + /// All new worksheets will use these page options. + /// + public IXLPageSetup PageOptions { get; set; } + + /// + /// Gets or sets the default outline options for the workbook. + /// All new worksheets will use these outline options. + /// + public IXLOutline Outline { get; set; } + + /// + /// Gets or sets the workbook's properties. + /// + public XLWorkbookProperties Properties { get; set; } + + /// + /// Gets or sets the workbook's calculation mode. + /// + public XLCalculateMode CalculateMode { get; set; } + + + public Boolean CalculationOnSave { get; set; } + public Boolean ForceFullCalculation { get; set; } + public Boolean FullCalculationOnLoad { get; set; } + public Boolean FullPrecision { get; set; } + + /// + /// Gets or sets the workbook's reference style. + /// + public XLReferenceStyle ReferenceStyle { get; set; } + + public IXLCustomProperties CustomProperties { get; private set; } + + public Boolean ShowFormulas { get; set; } + public Boolean ShowGridLines { get; set; } + public Boolean ShowOutlineSymbols { get; set; } + public Boolean ShowRowColHeaders { get; set; } + public Boolean ShowRuler { get; set; } + public Boolean ShowWhiteSpace { get; set; } + public Boolean ShowZeros { get; set; } + public Boolean RightToLeft { get; set; } + + public Boolean DefaultShowFormulas + { + get { return false; } + } + + public Boolean DefaultShowGridLines + { + get { return true; } + } + + public Boolean DefaultShowOutlineSymbols + { + get { return true; } + } + + public Boolean DefaultShowRowColHeaders + { + get { return true; } + } + + public Boolean DefaultShowRuler + { + get { return true; } + } + + public Boolean DefaultShowWhiteSpace + { + get { return true; } + } + + public Boolean DefaultShowZeros + { + get { return true; } + } + + public Boolean DefaultRightToLeft + { + get { return false; } + } + + private void InitializeTheme() + { + Theme = new XLTheme + { + Text1 = XLColor.FromHtml("#FF000000"), + Background1 = XLColor.FromHtml("#FFFFFFFF"), + Text2 = XLColor.FromHtml("#FF1F497D"), + Background2 = XLColor.FromHtml("#FFEEECE1"), + Accent1 = XLColor.FromHtml("#FF4F81BD"), + Accent2 = XLColor.FromHtml("#FFC0504D"), + Accent3 = XLColor.FromHtml("#FF9BBB59"), + Accent4 = XLColor.FromHtml("#FF8064A2"), + Accent5 = XLColor.FromHtml("#FF4BACC6"), + Accent6 = XLColor.FromHtml("#FFF79646"), + Hyperlink = XLColor.FromHtml("#FF0000FF"), + FollowedHyperlink = XLColor.FromHtml("#FF800080") + }; + } + + internal XLColor GetXLColor(XLThemeColor themeColor) + { + switch (themeColor) + { + case XLThemeColor.Text1: + return Theme.Text1; + case XLThemeColor.Background1: + return Theme.Background1; + case XLThemeColor.Text2: + return Theme.Text2; + case XLThemeColor.Background2: + return Theme.Background2; + case XLThemeColor.Accent1: + return Theme.Accent1; + case XLThemeColor.Accent2: + return Theme.Accent2; + case XLThemeColor.Accent3: + return Theme.Accent3; + case XLThemeColor.Accent4: + return Theme.Accent4; + case XLThemeColor.Accent5: + return Theme.Accent5; + case XLThemeColor.Accent6: + return Theme.Accent6; + default: + throw new ArgumentException("Invalid theme color"); + } + } + + public IXLNamedRange NamedRange(String rangeName) + { + if (rangeName.Contains("!")) + { + var split = rangeName.Split('!'); + var first = split[0]; + var wsName = first.StartsWith("'") ? first.Substring(1, first.Length - 2) : first; + var name = split[1]; + IXLWorksheet ws; + if (TryGetWorksheet(wsName, out ws)) + { + var range = ws.NamedRange(name); + return range ?? NamedRange(name); + } + return null; + } + return NamedRanges.NamedRange(rangeName); + } + + public Boolean TryGetWorksheet(String name, out IXLWorksheet worksheet) + { + if (Worksheets.Any(w => string.Equals(w.Name, XLWorksheets.TrimSheetName(name), StringComparison.OrdinalIgnoreCase))) + { + worksheet = Worksheet(name); + return true; + } + + worksheet = null; + return false; + } + + public IXLRange RangeFromFullAddress(String rangeAddress, out IXLWorksheet ws) + { + ws = null; + if (!rangeAddress.Contains('!')) return null; + + var split = rangeAddress.Split('!'); + var first = split[0]; + var wsName = first.StartsWith("'") ? first.Substring(1, first.Length - 2) : first; + var localRange = split[1]; + if (TryGetWorksheet(wsName, out ws)) + { + return ws.Range(localRange); + } + return null; + } + + + /// + /// Saves the current workbook. + /// + public void Save() + { +#if DEBUG + Save(true); +#else + Save(false); +#endif + } + + /// + /// Saves the current workbook and optionally performs validation + /// + public void Save(bool validate) + { + checkForWorksheetsPresent(); + if (_loadSource == XLLoadSource.New) + throw new Exception("This is a new file, please use one of the SaveAs methods."); + + if (_loadSource == XLLoadSource.Stream) + { + CreatePackage(_originalStream, false, _spreadsheetDocumentType, validate); + } + else + CreatePackage(_originalFile, _spreadsheetDocumentType, validate); + } + + /// + /// Saves the current workbook to a file. + /// + public void SaveAs(String file) + { +#if DEBUG + SaveAs(file, true); +#else + SaveAs(file, false); +#endif + } + + /// + /// Saves the current workbook to a file and optionally validates it. + /// + public void SaveAs(String file, Boolean validate) + { + checkForWorksheetsPresent(); + PathHelper.CreateDirectory(Path.GetDirectoryName(file)); + if (_loadSource == XLLoadSource.New) + { + if (File.Exists(file)) + File.Delete(file); + + CreatePackage(file, GetSpreadsheetDocumentType(file), validate); + } + else if (_loadSource == XLLoadSource.File) + { + if (String.Compare(_originalFile.Trim(), file.Trim(), true) != 0) + File.Copy(_originalFile, file, true); + + CreatePackage(file, GetSpreadsheetDocumentType(file), validate); + } + else if (_loadSource == XLLoadSource.Stream) + { + _originalStream.Position = 0; + + using (var fileStream = File.Create(file)) + { + CopyStream(_originalStream, fileStream); + //fileStream.Position = 0; + CreatePackage(fileStream, false, _spreadsheetDocumentType, validate); + fileStream.Close(); + } + } + } + + private static SpreadsheetDocumentType GetSpreadsheetDocumentType(string filePath) + { + var extension = Path.GetExtension(filePath); + if (extension == null) throw new Exception("Empty extension is not supported."); + extension = extension.Substring(1).ToLowerInvariant(); + + switch (extension) + { + case "xlsm": + case "xltm": + return SpreadsheetDocumentType.MacroEnabledWorkbook; + case "xlsx": + case "xltx": + return SpreadsheetDocumentType.Workbook; + default: + throw new ArgumentException(String.Format("Extension '{0}' is not supported. Supported extensions are '.xlsx', '.xslm', '.xltx' and '.xltm'.", extension)); + + } + } + + private void checkForWorksheetsPresent() + { + if (Worksheets.Count() == 0) + throw new Exception("Workbooks need at least one worksheet."); + } + + /// + /// Saves the current workbook to a stream. + /// + public void SaveAs(Stream stream) + { +#if DEBUG + SaveAs(stream, true); +#else + SaveAs(stream, false); +#endif + } + + /// + /// Saves the current workbook to a stream and optionally validates it. + /// + public void SaveAs(Stream stream, Boolean validate) + { + checkForWorksheetsPresent(); + if (_loadSource == XLLoadSource.New) + { + // dm 20130422, this method or better the method SpreadsheetDocument.Create which is called + // inside of 'CreatePackage' need a stream which CanSeek & CanRead + // and an ordinary Response stream of a webserver can't do this + // so we have to ask and provide a way around this + if (stream.CanRead && stream.CanSeek && stream.CanWrite) + { + // all is fine the package can be created in a direct way + CreatePackage(stream, true, _spreadsheetDocumentType, validate); + } + else + { + // the harder way + MemoryStream ms = new MemoryStream(); + CreatePackage(ms, true, _spreadsheetDocumentType, validate); + // not really nessesary, because I changed CopyStream too. + // but for better understanding and if somebody in the future + // provide an changed version of CopyStream + ms.Position = 0; + CopyStream(ms, stream); + } + } + else if (_loadSource == XLLoadSource.File) + { + using (var fileStream = new FileStream(_originalFile, FileMode.Open, FileAccess.Read)) + { + CopyStream(fileStream, stream); + fileStream.Close(); + } + CreatePackage(stream, false, _spreadsheetDocumentType, validate); + } + else if (_loadSource == XLLoadSource.Stream) + { + _originalStream.Position = 0; + if (_originalStream != stream) + CopyStream(_originalStream, stream); + + CreatePackage(stream, false, _spreadsheetDocumentType, validate); + } + } + + internal static void CopyStream(Stream input, Stream output) + { + var buffer = new byte[8 * 1024]; + int len; + // dm 20130422, it is always a good idea to rewind the input stream, or not? + if (input.CanSeek) + input.Seek(0, SeekOrigin.Begin); + while ((len = input.Read(buffer, 0, buffer.Length)) > 0) + output.Write(buffer, 0, len); + // dm 20130422, and flushing the output after write + output.Flush(); + + } + + public IXLWorksheet Worksheet(String name) + { + return WorksheetsInternal.Worksheet(name); + } + + public IXLWorksheet Worksheet(Int32 position) + { + return WorksheetsInternal.Worksheet(position); + } + + public IXLCustomProperty CustomProperty(String name) + { + return CustomProperties.CustomProperty(name); + } + + public IXLCells FindCells(Func predicate) + { + var cells = new XLCells(false, false); + foreach (XLWorksheet ws in WorksheetsInternal) + { + foreach (XLCell cell in ws.CellsUsed(true)) + { + if (predicate(cell)) + cells.Add(cell); + } + } + return cells; + } + + public IXLRows FindRows(Func predicate) + { + var rows = new XLRows(null); + foreach (XLWorksheet ws in WorksheetsInternal) + { + foreach (IXLRow row in ws.Rows().Where(predicate)) + rows.Add(row as XLRow); + } + return rows; + } + + public IXLColumns FindColumns(Func predicate) + { + var columns = new XLColumns(null); + foreach (XLWorksheet ws in WorksheetsInternal) + { + foreach (IXLColumn column in ws.Columns().Where(predicate)) + columns.Add(column as XLColumn); + } + return columns; + } + +#region Fields + + private readonly XLLoadSource _loadSource = XLLoadSource.New; + private readonly String _originalFile; + private readonly Stream _originalStream; + +#endregion + +#region Constructor + + + /// + /// Creates a new Excel workbook. + /// + public XLWorkbook() + :this(XLEventTracking.Enabled) + { + + } + + public XLWorkbook(XLEventTracking eventTracking) + { + EventTracking = eventTracking; + DefaultRowHeight = 15; + DefaultColumnWidth = 8.43; + Style = new XLStyle(null, DefaultStyle); + RowHeight = DefaultRowHeight; + ColumnWidth = DefaultColumnWidth; + PageOptions = DefaultPageOptions; + Outline = DefaultOutline; + Properties = new XLWorkbookProperties(); + CalculateMode = XLCalculateMode.Default; + ReferenceStyle = XLReferenceStyle.Default; + InitializeTheme(); + ShowFormulas = DefaultShowFormulas; + ShowGridLines = DefaultShowGridLines; + ShowOutlineSymbols = DefaultShowOutlineSymbols; + ShowRowColHeaders = DefaultShowRowColHeaders; + ShowRuler = DefaultShowRuler; + ShowWhiteSpace = DefaultShowWhiteSpace; + ShowZeros = DefaultShowZeros; + RightToLeft = DefaultRightToLeft; + WorksheetsInternal = new XLWorksheets(this); + NamedRanges = new XLNamedRanges(this); + CustomProperties = new XLCustomProperties(this); + ShapeIdManager = new XLIdManager(); + Author = Environment.UserName; + } + + /// + /// Opens an existing workbook from a file. + /// + /// The file to open. + public XLWorkbook(String file) + : this(file, XLEventTracking.Enabled) + { + + } + + public XLWorkbook(String file, XLEventTracking eventTracking) + : this(eventTracking) + { + _loadSource = XLLoadSource.File; + _originalFile = file; + _spreadsheetDocumentType = GetSpreadsheetDocumentType(_originalFile); + Load(file); + } + + + + /// + /// Opens an existing workbook from a stream. + /// + /// The stream to open. + public XLWorkbook(Stream stream):this(stream, XLEventTracking.Enabled) + { + + } + + public XLWorkbook(Stream stream, XLEventTracking eventTracking) + : this(eventTracking) + { + _loadSource = XLLoadSource.Stream; + _originalStream = stream; + Load(stream); + } + +#endregion + +#region Nested type: UnsupportedSheet + + internal sealed class UnsupportedSheet + { + public Boolean IsActive; + public UInt32 SheetId; + public Int32 Position; + } + +#endregion + + public IXLCell Cell(String namedCell) + { + var namedRange = NamedRange(namedCell); + if (namedRange == null) return null; + var range = namedRange.Ranges.FirstOrDefault(); + if (range == null) return null; + return range.FirstCell(); + } + + public IXLCells Cells(String namedCells) + { + return Ranges(namedCells).Cells(); + } + + public IXLRange Range(String range) + { + var namedRange = NamedRange(range); + if (namedRange != null) + return namedRange.Ranges.FirstOrDefault(); + else + { + IXLWorksheet ws; + var r = RangeFromFullAddress(range, out ws); + return r; + } + } + + public IXLRanges Ranges(String ranges) + { + var retVal = new XLRanges(); + var rangePairs = ranges.Split(','); + foreach (var range in rangePairs.Select(r => Range(r.Trim())).Where(range => range != null)) + { + retVal.Add(range); + } + return retVal; + } + + internal XLIdManager ShapeIdManager { get; private set; } + + + public void Dispose() + { + Worksheets.ForEach(w => w.Dispose()); + } + + public Boolean Use1904DateSystem { get; set; } + public XLWorkbook SetUse1904DateSystem() + { + return SetUse1904DateSystem(true); + } + + public XLWorkbook SetUse1904DateSystem(Boolean value) + { + Use1904DateSystem = value; + return this; + } + + public IXLWorksheet AddWorksheet(String sheetName) + { + return Worksheets.Add(sheetName); + } + + public IXLWorksheet AddWorksheet(String sheetName, Int32 position) + { + return Worksheets.Add(sheetName, position); + } + public IXLWorksheet AddWorksheet(DataTable dataTable) + { + return Worksheets.Add(dataTable); + } + public void AddWorksheet(DataSet dataSet) + { + Worksheets.Add(dataSet); + } + + public void AddWorksheet(IXLWorksheet worksheet) + { + worksheet.CopyTo(this, worksheet.Name); + } + + public IXLWorksheet AddWorksheet(DataTable dataTable, String sheetName) + { + return Worksheets.Add(dataTable, sheetName); + } + + private XLCalcEngine _calcEngine; + private XLCalcEngine CalcEngine + { + get { return _calcEngine ?? (_calcEngine = new XLCalcEngine(this)); } + } + public Object Evaluate(String expression) + { + return CalcEngine.Evaluate(expression); + } + + private static XLCalcEngine _calcEngineExpr; + private SpreadsheetDocumentType _spreadsheetDocumentType; + + private static XLCalcEngine CalcEngineExpr + { + get { return _calcEngineExpr ?? (_calcEngineExpr = new XLCalcEngine()); } + } + public static Object EvaluateExpr(String expression) + { + return CalcEngineExpr.Evaluate(expression); + } + + public String Author { get; set; } + + public Boolean LockStructure { get; set; } + public XLWorkbook SetLockStructure(Boolean value) { LockStructure = value; return this; } + public Boolean LockWindows { get; set; } + public XLWorkbook SetLockWindows(Boolean value) { LockWindows = value; return this; } + + public void Protect() + { + Protect(true); + } + + public void Protect(Boolean lockStructure) + { + Protect(lockStructure, false); + } + + public void Protect(Boolean lockStructure, Boolean lockWindows) + { + LockStructure = lockStructure; + LockWindows = LockWindows; + } + } +} diff --git a/ClosedXML/Excel/XLWorkbookProperties.cs b/ClosedXML/Excel/XLWorkbookProperties.cs index b35f4b6..e9d2bcb 100644 --- a/ClosedXML/Excel/XLWorkbookProperties.cs +++ b/ClosedXML/Excel/XLWorkbookProperties.cs @@ -1,25 +1,25 @@ -using System; - -namespace ClosedXML.Excel -{ - public class XLWorkbookProperties - { - public XLWorkbookProperties() - { - Company = null; - Manager = null; - } - public String Author { get; set; } - public String Title { get; set; } - public String Subject { get; set; } - public String Category { get; set; } - public String Keywords { get; set; } - public String Comments { get; set; } - public String Status { get; set; } - public DateTime Created { get; set; } - public DateTime Modified { get; set; } - public String LastModifiedBy { get; set; } - public String Company { get; set; } - public String Manager { get; set; } - } -} +using System; + +namespace ClosedXML.Excel +{ + public class XLWorkbookProperties + { + public XLWorkbookProperties() + { + Company = null; + Manager = null; + } + public String Author { get; set; } + public String Title { get; set; } + public String Subject { get; set; } + public String Category { get; set; } + public String Keywords { get; set; } + public String Comments { get; set; } + public String Status { get; set; } + public DateTime Created { get; set; } + public DateTime Modified { get; set; } + public String LastModifiedBy { get; set; } + public String Company { get; set; } + public String Manager { get; set; } + } +} diff --git a/ClosedXML/Excel/XLWorkbook_ImageHandling.cs b/ClosedXML/Excel/XLWorkbook_ImageHandling.cs new file mode 100644 index 0000000..37e85da --- /dev/null +++ b/ClosedXML/Excel/XLWorkbook_ImageHandling.cs @@ -0,0 +1,66 @@ +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Drawing.Spreadsheet; +using DocumentFormat.OpenXml.Packaging; +using System; +using System.Linq; + +using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet; + +namespace ClosedXML.Excel +{ + public partial class XLWorkbook + { + public static OpenXmlElement GetAnchorFromImageId(WorksheetPart worksheetPart, string relId) + { + var drawingsPart = worksheetPart.DrawingsPart; + var matchingAnchor = drawingsPart.WorksheetDrawing + .Where(wsdr => wsdr.Descendants() + .Any(x => x?.Blip?.Embed?.Value.Equals(relId) ?? false) + ); + + if (!matchingAnchor.Any()) + return null; + else + return matchingAnchor.First(); + } + + public static OpenXmlElement GetAnchorFromImageIndex(WorksheetPart worksheetPart, Int32 index) + { + var drawingsPart = worksheetPart.DrawingsPart; + var matchingAnchor = drawingsPart.WorksheetDrawing + .Where(wsdr => wsdr.Descendants() + .Any(x => x.Id.Value.Equals(Convert.ToUInt32(index + 1))) + ); + + if (!matchingAnchor.Any()) + return null; + else + return matchingAnchor.First(); + } + + public static NonVisualDrawingProperties GetPropertiesFromAnchor(OpenXmlElement anchor) + { + if (!IsAllowedAnchor(anchor)) + return null; + + return anchor + .Descendants() + .FirstOrDefault(); + } + + public static String GetImageRelIdFromAnchor(OpenXmlElement anchor) + { + if (!IsAllowedAnchor(anchor)) + return null; + + var blipFill = anchor.Descendants().FirstOrDefault(); + return blipFill?.Blip?.Embed?.Value; + } + + private static bool IsAllowedAnchor(OpenXmlElement anchor) + { + var allowedAnchorTypes = new Type[] { typeof(AbsoluteAnchor), typeof(OneCellAnchor), typeof(TwoCellAnchor) }; + return (allowedAnchorTypes.Any(t => t == anchor.GetType())); + } + } +} diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs index 22dc280..15de636 100644 --- a/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -1,2300 +1,2387 @@ -#region - -using ClosedXML.Utils; -using DocumentFormat.OpenXml; -using DocumentFormat.OpenXml.Packaging; -using DocumentFormat.OpenXml.Spreadsheet; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml.Linq; -using Ap = DocumentFormat.OpenXml.ExtendedProperties; -using Op = DocumentFormat.OpenXml.CustomProperties; - -#endregion - -namespace ClosedXML.Excel -{ - #region - - using Ap; - using Op; - using System.Drawing; - - #endregion - - public partial class XLWorkbook - { - private readonly Dictionary _colorList = new Dictionary(); - - private void Load(String file) - { - LoadSheets(file); - } - - private void Load(Stream stream) - { - LoadSheets(stream); - } - - private void LoadSheets(String fileName) - { - using (var dSpreadsheet = SpreadsheetDocument.Open(fileName, false)) - LoadSpreadsheetDocument(dSpreadsheet); - } - - private void LoadSheets(Stream stream) - { - using (var dSpreadsheet = SpreadsheetDocument.Open(stream, false)) - LoadSpreadsheetDocument(dSpreadsheet); - } - - private void LoadSpreadsheetDocument(SpreadsheetDocument dSpreadsheet) - { - ShapeIdManager = new XLIdManager(); - SetProperties(dSpreadsheet); - //var sharedStrings = dSpreadsheet.WorkbookPart.SharedStringTablePart.SharedStringTable.Elements(); - SharedStringItem[] sharedStrings = null; - if (dSpreadsheet.WorkbookPart.GetPartsOfType().Count() > 0) - { - var shareStringPart = dSpreadsheet.WorkbookPart.GetPartsOfType().First(); - sharedStrings = shareStringPart.SharedStringTable.Elements().ToArray(); - } - - if (dSpreadsheet.CustomFilePropertiesPart != null) - { - foreach (var m in dSpreadsheet.CustomFilePropertiesPart.Properties.Elements()) - { - String name = m.Name.Value; - if (m.VTLPWSTR != null) - CustomProperties.Add(name, m.VTLPWSTR.Text); - else if (m.VTFileTime != null) - { - CustomProperties.Add(name, - DateTime.ParseExact(m.VTFileTime.Text, "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", - CultureInfo.InvariantCulture)); - } - else if (m.VTDouble != null) - CustomProperties.Add(name, Double.Parse(m.VTDouble.Text, CultureInfo.InvariantCulture)); - else if (m.VTBool != null) - CustomProperties.Add(name, m.VTBool.Text == "true"); - } - } - - var wbProps = dSpreadsheet.WorkbookPart.Workbook.WorkbookProperties; - Use1904DateSystem = wbProps != null && wbProps.Date1904 != null && wbProps.Date1904.Value; - - var wbProtection = dSpreadsheet.WorkbookPart.Workbook.WorkbookProtection; - if (wbProtection != null) - { - if (wbProtection.LockStructure != null) - LockStructure = wbProtection.LockStructure.Value; - if (wbProtection.LockWindows != null) - LockWindows = wbProtection.LockWindows.Value; - } - - var calculationProperties = dSpreadsheet.WorkbookPart.Workbook.CalculationProperties; - if (calculationProperties != null) - { - var calculateMode = calculationProperties.CalculationMode; - if (calculateMode != null) - CalculateMode = calculateMode.Value.ToClosedXml(); - - var calculationOnSave = calculationProperties.CalculationOnSave; - if (calculationOnSave != null) - CalculationOnSave = calculationOnSave.Value; - - var forceFullCalculation = calculationProperties.ForceFullCalculation; - if (forceFullCalculation != null) - ForceFullCalculation = forceFullCalculation.Value; - - var fullCalculationOnLoad = calculationProperties.FullCalculationOnLoad; - if (fullCalculationOnLoad != null) - FullCalculationOnLoad = fullCalculationOnLoad.Value; - - var fullPrecision = calculationProperties.FullPrecision; - if (fullPrecision != null) - FullPrecision = fullPrecision.Value; - - var referenceMode = calculationProperties.ReferenceMode; - if (referenceMode != null) - ReferenceStyle = referenceMode.Value.ToClosedXml(); - } - - var efp = dSpreadsheet.ExtendedFilePropertiesPart; - if (efp != null && efp.Properties != null) - { - if (efp.Properties.Elements().Any()) - Properties.Company = efp.Properties.GetFirstChild().Text; - - if (efp.Properties.Elements().Any()) - Properties.Manager = efp.Properties.GetFirstChild().Text; - } - - Stylesheet s = null; - if (dSpreadsheet.WorkbookPart.WorkbookStylesPart != null && - dSpreadsheet.WorkbookPart.WorkbookStylesPart.Stylesheet != null) - { - s = dSpreadsheet.WorkbookPart.WorkbookStylesPart.Stylesheet; - } - - NumberingFormats numberingFormats = s == null ? null : s.NumberingFormats; - Fills fills = s == null ? null : s.Fills; - Borders borders = s == null ? null : s.Borders; - Fonts fonts = s == null ? null : s.Fonts; - Int32 dfCount = 0; - Dictionary differentialFormats; - if (s != null && s.DifferentialFormats != null) - differentialFormats = s.DifferentialFormats.Elements().ToDictionary(k => dfCount++); - else - differentialFormats = new Dictionary(); - - var sheets = dSpreadsheet.WorkbookPart.Workbook.Sheets; - Int32 position = 0; - foreach (Sheet dSheet in sheets.OfType()) - { - position++; - var sharedFormulasR1C1 = new Dictionary(); - - var wsPart = dSpreadsheet.WorkbookPart.GetPartById(dSheet.Id) as WorksheetPart; - - if (wsPart == null) - { - UnsupportedSheets.Add(new UnsupportedSheet { SheetId = dSheet.SheetId.Value, Position = position }); - continue; - } - - var sheetName = dSheet.Name; - - var ws = (XLWorksheet)WorksheetsInternal.Add(sheetName, position); - ws.RelId = dSheet.Id; - ws.SheetId = (Int32)dSheet.SheetId.Value; - - if (dSheet.State != null) - ws.Visibility = dSheet.State.Value.ToClosedXml(); - - var styleList = new Dictionary();// {{0, ws.Style}}; - PageSetupProperties pageSetupProperties = null; - - using (var reader = OpenXmlReader.Create(wsPart)) - { - Type[] ignoredElements = new Type[] - { - typeof(CustomSheetViews) // Custom sheet views contain its own auto filter data, and more, which should be ignored for now - }; - - while (reader.Read()) - { - while (ignoredElements.Contains(reader.ElementType)) - reader.ReadNextSibling(); - - if (reader.ElementType == typeof(SheetFormatProperties)) - { - var sheetFormatProperties = (SheetFormatProperties)reader.LoadCurrentElement(); - if (sheetFormatProperties != null) - { - if (sheetFormatProperties.DefaultRowHeight != null) - ws.RowHeight = sheetFormatProperties.DefaultRowHeight; - - ws.RowHeightChanged = (sheetFormatProperties.CustomHeight != null && - sheetFormatProperties.CustomHeight.Value); - - if (sheetFormatProperties.DefaultColumnWidth != null) - { - ws.ColumnWidth = sheetFormatProperties.DefaultColumnWidth; - } - } - } - else if (reader.ElementType == typeof(SheetViews)) - LoadSheetViews((SheetViews)reader.LoadCurrentElement(), ws); - else if (reader.ElementType == typeof(MergeCells)) - { - var mergedCells = (MergeCells)reader.LoadCurrentElement(); - if (mergedCells != null) - { - foreach (MergeCell mergeCell in mergedCells.Elements()) - ws.Range(mergeCell.Reference).Merge(false); - } - } - else if (reader.ElementType == typeof(Columns)) - LoadColumns(s, numberingFormats, fills, borders, fonts, ws, - (Columns)reader.LoadCurrentElement()); - else if (reader.ElementType == typeof(Row)) - { - lastRow = 0; - LoadRows(s, numberingFormats, fills, borders, fonts, ws, sharedStrings, sharedFormulasR1C1, - styleList, (Row)reader.LoadCurrentElement()); - } - else if (reader.ElementType == typeof(AutoFilter)) - LoadAutoFilter((AutoFilter)reader.LoadCurrentElement(), ws); - else if (reader.ElementType == typeof(SheetProtection)) - LoadSheetProtection((SheetProtection)reader.LoadCurrentElement(), ws); - else if (reader.ElementType == typeof(DataValidations)) - LoadDataValidations((DataValidations)reader.LoadCurrentElement(), ws); - else if (reader.ElementType == typeof(ConditionalFormatting)) - LoadConditionalFormatting((ConditionalFormatting)reader.LoadCurrentElement(), ws, differentialFormats); - else if (reader.ElementType == typeof(Hyperlinks)) - LoadHyperlinks((Hyperlinks)reader.LoadCurrentElement(), wsPart, ws); - else if (reader.ElementType == typeof(PrintOptions)) - LoadPrintOptions((PrintOptions)reader.LoadCurrentElement(), ws); - else if (reader.ElementType == typeof(PageMargins)) - LoadPageMargins((PageMargins)reader.LoadCurrentElement(), ws); - else if (reader.ElementType == typeof(PageSetup)) - LoadPageSetup((PageSetup)reader.LoadCurrentElement(), ws, pageSetupProperties); - else if (reader.ElementType == typeof(HeaderFooter)) - LoadHeaderFooter((HeaderFooter)reader.LoadCurrentElement(), ws); - else if (reader.ElementType == typeof(SheetProperties)) - LoadSheetProperties((SheetProperties)reader.LoadCurrentElement(), ws, out pageSetupProperties); - else if (reader.ElementType == typeof(RowBreaks)) - LoadRowBreaks((RowBreaks)reader.LoadCurrentElement(), ws); - else if (reader.ElementType == typeof(ColumnBreaks)) - LoadColumnBreaks((ColumnBreaks)reader.LoadCurrentElement(), ws); - else if (reader.ElementType == typeof(LegacyDrawing)) - ws.LegacyDrawingId = (reader.LoadCurrentElement() as LegacyDrawing).Id.Value; - } - reader.Close(); - } - - #region LoadTables - - foreach (TableDefinitionPart tablePart in wsPart.TableDefinitionParts) - { - var dTable = tablePart.Table; - string reference = dTable.Reference.Value; - XLTable xlTable = ws.Range(reference).CreateTable(dTable.Name, false) as XLTable; - if (dTable.HeaderRowCount != null && dTable.HeaderRowCount == 0) - { - xlTable._showHeaderRow = false; - //foreach (var tableColumn in dTable.TableColumns.Cast()) - xlTable.AddFields(dTable.TableColumns.Cast().Select(t => GetTableColumnName(t.Name.Value))); - } - else - { - xlTable.InitializeAutoFilter(); - } - - if (dTable.TotalsRowCount != null && dTable.TotalsRowCount.Value > 0) - ((XLTable)xlTable)._showTotalsRow = true; - - if (dTable.TableStyleInfo != null) - { - if (dTable.TableStyleInfo.ShowFirstColumn != null) - xlTable.EmphasizeFirstColumn = dTable.TableStyleInfo.ShowFirstColumn.Value; - if (dTable.TableStyleInfo.ShowLastColumn != null) - xlTable.EmphasizeLastColumn = dTable.TableStyleInfo.ShowLastColumn.Value; - if (dTable.TableStyleInfo.ShowRowStripes != null) - xlTable.ShowRowStripes = dTable.TableStyleInfo.ShowRowStripes.Value; - if (dTable.TableStyleInfo.ShowColumnStripes != null) - xlTable.ShowColumnStripes = dTable.TableStyleInfo.ShowColumnStripes.Value; - if (dTable.TableStyleInfo.Name != null) - { - var theme = XLTableTheme.FromName(dTable.TableStyleInfo.Name.Value); - if (theme != null) - xlTable.Theme = theme; - else - xlTable.Theme = new XLTableTheme(dTable.TableStyleInfo.Name.Value); - } - else - xlTable.Theme = XLTableTheme.None; - } - - if (dTable.AutoFilter != null) - { - xlTable.ShowAutoFilter = true; - LoadAutoFilterColumns(dTable.AutoFilter, (xlTable as XLTable).AutoFilter); - } - else - xlTable.ShowAutoFilter = false; - - if (xlTable.ShowTotalsRow) - { - foreach (var tableColumn in dTable.TableColumns.Cast()) - { - var tableColumnName = GetTableColumnName(tableColumn.Name.Value); - if (tableColumn.TotalsRowFunction != null) - xlTable.Field(tableColumnName).TotalsRowFunction = - tableColumn.TotalsRowFunction.Value.ToClosedXml(); - - if (tableColumn.TotalsRowFormula != null) - xlTable.Field(tableColumnName).TotalsRowFormulaA1 = - tableColumn.TotalsRowFormula.Text; - - if (tableColumn.TotalsRowLabel != null) - xlTable.Field(tableColumnName).TotalsRowLabel = tableColumn.TotalsRowLabel.Value; - } - if (xlTable.AutoFilter != null) - xlTable.AutoFilter.Range = xlTable.Worksheet.Range( - xlTable.RangeAddress.FirstAddress.RowNumber, xlTable.RangeAddress.FirstAddress.ColumnNumber, - xlTable.RangeAddress.LastAddress.RowNumber - 1, xlTable.RangeAddress.LastAddress.ColumnNumber); - } - else if (xlTable.AutoFilter != null) - xlTable.AutoFilter.Range = xlTable.Worksheet.Range(xlTable.RangeAddress); - } - - #endregion - - #region LoadComments - - if (wsPart.WorksheetCommentsPart != null) - { - var root = wsPart.WorksheetCommentsPart.Comments; - var authors = root.GetFirstChild().ChildElements; - var comments = root.GetFirstChild().ChildElements; - - // **** MAYBE FUTURE SHAPE SIZE SUPPORT - XDocument xdoc = GetCommentVmlFile(wsPart); - - foreach (Comment c in comments) - { - // find cell by reference - var cell = ws.Cell(c.Reference); - - XLComment xlComment = cell.Comment as XLComment; - xlComment.Author = authors[(int)c.AuthorId.Value].InnerText; - //xlComment.ShapeId = (Int32)c.ShapeId.Value; - //ShapeIdManager.Add(xlComment.ShapeId); - - var runs = c.GetFirstChild().Elements(); - foreach (Run run in runs) - { - var runProperties = run.RunProperties; - String text = run.Text.InnerText.FixNewLines(); - var rt = cell.Comment.AddText(text); - LoadFont(runProperties, rt); - } - - XElement shape = GetCommentShape(xdoc); - - LoadShapeProperties(xlComment, shape); - - var clientData = shape.Elements().First(e => e.Name.LocalName == "ClientData"); - LoadClientData(xlComment, clientData); - - var textBox = shape.Elements().First(e => e.Name.LocalName == "textbox"); - LoadTextBox(xlComment, textBox); - - var alt = shape.Attribute("alt"); - if (alt != null) xlComment.Style.Web.SetAlternateText(alt.Value); - - LoadColorsAndLines(xlComment, shape); - - //var insetmode = (string)shape.Attributes().First(a=> a.Name.LocalName == "insetmode"); - //xlComment.Style.Margins.Automatic = insetmode != null && insetmode.Equals("auto"); - - shape.Remove(); - } - } - - #endregion - } - - var workbook = dSpreadsheet.WorkbookPart.Workbook; - - var bookViews = workbook.BookViews; - if (bookViews != null && bookViews.Any()) - { - var workbookView = bookViews.First() as WorkbookView; - if (workbookView != null && workbookView.ActiveTab != null) - { - UnsupportedSheet unsupportedSheet = - UnsupportedSheets.FirstOrDefault(us => us.Position == (Int32)(workbookView.ActiveTab.Value + 1)); - if (unsupportedSheet != null) - unsupportedSheet.IsActive = true; - else - { - Worksheet((Int32)(workbookView.ActiveTab.Value + 1)).SetTabActive(); - } - } - } - LoadDefinedNames(workbook); - - #region Pivot tables - - // Delay loading of pivot tables until all sheets have been loaded - foreach (Sheet dSheet in sheets.OfType()) - { - var wsPart = dSpreadsheet.WorkbookPart.GetPartById(dSheet.Id) as WorksheetPart; - - if (wsPart != null) - { - var ws = (XLWorksheet)WorksheetsInternal.Worksheet(dSheet.Name); - - foreach (var pivotTablePart in wsPart.PivotTableParts) - { - var pivotTableCacheDefinitionPart = pivotTablePart.PivotTableCacheDefinitionPart; - var pivotTableDefinition = pivotTablePart.PivotTableDefinition; - - var target = ws.FirstCell(); - if (pivotTableDefinition.Location != null && pivotTableDefinition.Location.Reference != null && pivotTableDefinition.Location.Reference.HasValue) - { - target = ws.Range(pivotTableDefinition.Location.Reference.Value).FirstCell(); - } - - IXLRange source = null; - if (pivotTableCacheDefinitionPart.PivotCacheDefinition != null - && pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheSource != null - && pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheSource.WorksheetSource != null) - { - // TODO: Implement other sources besides worksheetSource (e.g. Table source?) - // But for now assume names and references point directly to a range - var wss = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheSource.WorksheetSource; - string rangeAddress = string.Empty; - if (wss.Name != null) - rangeAddress = wss.Name.Value; - else - { - var sourceSheet = wss.Sheet == null ? ws : this.Worksheet(wss.Sheet.Value); - rangeAddress = sourceSheet.Range(wss.Reference.Value).RangeAddress.ToStringRelative(true); - } - - source = this.Range(rangeAddress); - if (source == null) - continue; - } - - if (target != null && source != null) - { - var pt = ws.PivotTables.AddNew(pivotTableDefinition.Name, target, source) as XLPivotTable; - pt.RelId = wsPart.GetIdOfPart(pivotTablePart); - pt.CacheDefinitionRelId = pivotTablePart.GetIdOfPart(pivotTableCacheDefinitionPart); - pt.WorkbookCacheRelId = dSpreadsheet.WorkbookPart.GetIdOfPart(pivotTableCacheDefinitionPart); - - if (pivotTableDefinition.MergeItem != null) pt.MergeAndCenterWithLabels = pivotTableDefinition.MergeItem.Value; - if (pivotTableDefinition.Indent != null) pt.RowLabelIndent = (int)pivotTableDefinition.Indent.Value; - if (pivotTableDefinition.PageOverThenDown != null) pt.FilterAreaOrder = pivotTableDefinition.PageOverThenDown.Value ? XLFilterAreaOrder.OverThenDown : XLFilterAreaOrder.DownThenOver; - if (pivotTableDefinition.PageWrap != null) pt.FilterFieldsPageWrap = (int)pivotTableDefinition.PageWrap.Value; - if (pivotTableDefinition.UseAutoFormatting != null) pt.AutofitColumns = pivotTableDefinition.UseAutoFormatting.Value; - if (pivotTableDefinition.PreserveFormatting != null) pt.PreserveCellFormatting = pivotTableDefinition.PreserveFormatting.Value; - if (pivotTableDefinition.RowGrandTotals != null) pt.ShowGrandTotalsRows = pivotTableDefinition.RowGrandTotals.Value; - if (pivotTableDefinition.ColumnGrandTotals != null) pt.ShowGrandTotalsColumns = pivotTableDefinition.ColumnGrandTotals.Value; - if (pivotTableDefinition.SubtotalHiddenItems != null) pt.FilteredItemsInSubtotals = pivotTableDefinition.SubtotalHiddenItems.Value; - if (pivotTableDefinition.MultipleFieldFilters != null) pt.AllowMultipleFilters = pivotTableDefinition.MultipleFieldFilters.Value; - if (pivotTableDefinition.CustomListSort != null) pt.UseCustomListsForSorting = pivotTableDefinition.CustomListSort.Value; - if (pivotTableDefinition.ShowDrill != null) pt.ShowExpandCollapseButtons = pivotTableDefinition.ShowDrill.Value; - if (pivotTableDefinition.ShowDataTips != null) pt.ShowContextualTooltips = pivotTableDefinition.ShowDataTips.Value; - if (pivotTableDefinition.ShowMemberPropertyTips != null) pt.ShowPropertiesInTooltips = pivotTableDefinition.ShowMemberPropertyTips.Value; - if (pivotTableDefinition.ShowHeaders != null) pt.DisplayCaptionsAndDropdowns = pivotTableDefinition.ShowHeaders.Value; - if (pivotTableDefinition.GridDropZones != null) pt.ClassicPivotTableLayout = pivotTableDefinition.GridDropZones.Value; - if (pivotTableDefinition.ShowEmptyRow != null) pt.ShowEmptyItemsOnRows = pivotTableDefinition.ShowEmptyRow.Value; - if (pivotTableDefinition.ShowEmptyColumn != null) pt.ShowEmptyItemsOnColumns = pivotTableDefinition.ShowEmptyColumn.Value; - if (pivotTableDefinition.ShowItems != null) pt.DisplayItemLabels = pivotTableDefinition.ShowItems.Value; - if (pivotTableDefinition.FieldListSortAscending != null) pt.SortFieldsAtoZ = pivotTableDefinition.FieldListSortAscending.Value; - if (pivotTableDefinition.PrintDrill != null) pt.PrintExpandCollapsedButtons = pivotTableDefinition.PrintDrill.Value; - if (pivotTableDefinition.ItemPrintTitles != null) pt.RepeatRowLabels = pivotTableDefinition.ItemPrintTitles.Value; - if (pivotTableDefinition.FieldPrintTitles != null) pt.PrintTitles = pivotTableDefinition.FieldPrintTitles.Value; - if (pivotTableDefinition.EnableDrill != null) pt.EnableShowDetails = pivotTableDefinition.EnableDrill.Value; - - if (pivotTableDefinition.ShowMissing != null && pivotTableDefinition.MissingCaption != null) - pt.EmptyCellReplacement = pivotTableDefinition.MissingCaption.Value; - - if (pivotTableDefinition.ShowError != null && pivotTableDefinition.ErrorCaption != null) - pt.ErrorValueReplacement = pivotTableDefinition.ErrorCaption.Value; - - // Row labels - if (pivotTableDefinition.RowFields != null) - { - foreach (var rf in pivotTableDefinition.RowFields.Cast()) - { - if (rf.Index < pivotTableDefinition.PivotFields.Count) - { - IXLPivotField pivotField = null; - if (rf.Index.Value == -2) - pivotField = pt.RowLabels.Add(XLConstants.PivotTableValuesSentinalLabel); - else - { - var pf = pivotTableDefinition.PivotFields.ElementAt(rf.Index.Value) as PivotField; - if (pf == null) - continue; - - var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt(rf.Index.Value) as CacheField; - if (pf.Name != null) - pivotField = pt.RowLabels.Add(pf.Name.Value); - else if (cacheField.Name != null) - pivotField = pt.RowLabels.Add(cacheField.Name.Value); - else - continue; - - if (pivotField != null) - { - var items = pf.Items.OfType().Where(i => i.Index != null && i.Index.HasValue); - if (!items.Any(i => i.HideDetails == null || BooleanValue.ToBoolean(i.HideDetails))) - pivotField.SetCollapsed(); - } - } - } - } - } - - // Column labels - if (pivotTableDefinition.ColumnFields != null) - { - foreach (var cf in pivotTableDefinition.ColumnFields.Cast()) - { - IXLPivotField pivotField = null; - if (cf.Index.Value == -2) - pivotField = pt.ColumnLabels.Add(XLConstants.PivotTableValuesSentinalLabel); - else if (cf.Index < pivotTableDefinition.PivotFields.Count) - { - var pf = pivotTableDefinition.PivotFields.ElementAt(cf.Index.Value) as PivotField; - if (pf == null) - continue; - - var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt(cf.Index.Value) as CacheField; - if (pf.Name != null) - pivotField = pt.ColumnLabels.Add(pf.Name.Value); - else if (cacheField.Name != null) - pivotField = pt.ColumnLabels.Add(cacheField.Name.Value); - else - continue; - - if (pivotField != null) - { - var items = pf.Items.OfType().Where(i => i.Index != null && i.Index.HasValue); - if (!items.Any(i => i.HideDetails == null || BooleanValue.ToBoolean(i.HideDetails))) - pivotField.SetCollapsed(); - } - } - } - } - - // Values - if (pivotTableDefinition.DataFields != null) - { - foreach (var df in pivotTableDefinition.DataFields.Cast()) - { - IXLPivotValue pivotValue = null; - if ((int)df.Field.Value == -2) - pivotValue = pt.Values.Add(XLConstants.PivotTableValuesSentinalLabel); - else if (df.Field.Value < pivotTableDefinition.PivotFields.Count) - { - var pf = pivotTableDefinition.PivotFields.ElementAt((int)df.Field.Value) as PivotField; - if (pf == null) - continue; - - var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt((int)df.Field.Value) as CacheField; - - if (pf.Name != null) - pivotValue = pt.Values.Add(pf.Name.Value, df.Name.Value); - else if (cacheField.Name != null) - pivotValue = pt.Values.Add(cacheField.Name.Value, df.Name.Value); - else - continue; - - if (df.NumberFormatId != null) pivotValue.NumberFormat.SetNumberFormatId((int)df.NumberFormatId.Value); - if (df.Subtotal != null) pivotValue = pivotValue.SetSummaryFormula(df.Subtotal.Value.ToClosedXml()); - if (df.ShowDataAs != null) - { - var calculation = pivotValue.Calculation; - calculation = df.ShowDataAs.Value.ToClosedXml(); - pivotValue = pivotValue.SetCalculation(calculation); - } - - if (df.BaseField != null) - { - var col = pt.SourceRange.Column(df.BaseField.Value + 1); - - var items = col.CellsUsed() - .Select(c => c.Value) - .Skip(1) // Skip header column - .Distinct().ToList(); - - pivotValue.BaseField = col.FirstCell().GetValue(); - if (df.BaseItem != null) pivotValue.BaseItem = items[(int)df.BaseItem.Value].ToString(); - } - } - } - } - } - } - } - } - - #endregion - } - - #region Comment Helpers - - private XDocument GetCommentVmlFile(WorksheetPart wsPart) - { - XDocument xdoc = null; - - foreach (var vmlPart in wsPart.VmlDrawingParts) - { - xdoc = XDocumentExtensions.Load(vmlPart.GetStream(FileMode.Open)); - - //Probe for comments - if (xdoc.Root == null) continue; - var shape = GetCommentShape(xdoc); - if (shape != null) break; - } - - if (xdoc == null) throw new Exception("Could not load comments file"); - return xdoc; - } - - private static XElement GetCommentShape(XDocument xdoc) - { - var xml = xdoc.Root.Element("xml"); - - XElement shape; - if (xml != null) - shape = - xml.Elements().FirstOrDefault(e => (string)e.Attribute("type") == XLConstants.Comment.ShapeTypeId); - else - shape = xdoc.Root.Elements().FirstOrDefault(e => - (string)e.Attribute("type") == - XLConstants.Comment.ShapeTypeId || - (string)e.Attribute("type") == - XLConstants.Comment.AlternateShapeTypeId); - return shape; - } - - #endregion - - private String GetTableColumnName(string name) - { - return name.Replace("_x000a_", Environment.NewLine).Replace("_x005f_x000a_", "_x000a_"); - } - - // This may be part of XLHelper or XLColor - // Leaving it here for now. Can't decide what to call it and where to put it. - private XLColor ExtractColor(String color) - { - if (color.IndexOf("[") >= 0) - { - int start = color.IndexOf("[") + 1; - int end = color.IndexOf("]", start); - return XLColor.FromIndex(Int32.Parse(color.Substring(start, end - start))); - } - else - { - return XLColor.FromHtml(color); - } - } - - private void LoadColorsAndLines(IXLDrawing drawing, XElement shape) - { - var strokeColor = shape.Attribute("strokecolor"); - if (strokeColor != null) drawing.Style.ColorsAndLines.LineColor = ExtractColor(strokeColor.Value); - - var strokeWeight = shape.Attribute("strokeweight"); - if (strokeWeight != null) - drawing.Style.ColorsAndLines.LineWeight = GetPtValue(strokeWeight.Value); - - var fillColor = shape.Attribute("fillcolor"); - if (fillColor != null && !fillColor.Value.ToLower().Contains("infobackground")) drawing.Style.ColorsAndLines.FillColor = ExtractColor(fillColor.Value); - - var fill = shape.Elements().FirstOrDefault(e => e.Name.LocalName == "fill"); - if (fill != null) - { - var opacity = fill.Attribute("opacity"); - if (opacity != null) - { - String opacityVal = opacity.Value; - if (opacityVal.EndsWith("f")) - drawing.Style.ColorsAndLines.FillTransparency = - Double.Parse(opacityVal.Substring(0, opacityVal.Length - 1), CultureInfo.InvariantCulture) / 65536.0; - else - drawing.Style.ColorsAndLines.FillTransparency = Double.Parse(opacityVal, CultureInfo.InvariantCulture); - } - } - - var stroke = shape.Elements().FirstOrDefault(e => e.Name.LocalName == "stroke"); - if (stroke != null) - { - var opacity = stroke.Attribute("opacity"); - if (opacity != null) - { - String opacityVal = opacity.Value; - if (opacityVal.EndsWith("f")) - drawing.Style.ColorsAndLines.LineTransparency = - Double.Parse(opacityVal.Substring(0, opacityVal.Length - 1), CultureInfo.InvariantCulture) / 65536.0; - else - drawing.Style.ColorsAndLines.LineTransparency = Double.Parse(opacityVal, CultureInfo.InvariantCulture); - } - - var dashStyle = stroke.Attribute("dashstyle"); - if (dashStyle != null) - { - String dashStyleVal = dashStyle.Value.ToLower(); - if (dashStyleVal == "1 1" || dashStyleVal == "shortdot") - { - var endCap = stroke.Attribute("endcap"); - if (endCap != null && endCap.Value == "round") - drawing.Style.ColorsAndLines.LineDash = XLDashStyle.RoundDot; - else - drawing.Style.ColorsAndLines.LineDash = XLDashStyle.SquareDot; - } - else - { - switch (dashStyleVal) - { - case "dash": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.Dash; break; - case "dashdot": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.DashDot; break; - case "longdash": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.LongDash; break; - case "longdashdot": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.LongDashDot; break; - case "longdashdotdot": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.LongDashDotDot; break; - } - } - } - - var lineStyle = stroke.Attribute("linestyle"); - if (lineStyle != null) - { - String lineStyleVal = lineStyle.Value.ToLower(); - switch (lineStyleVal) - { - case "single": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.Single; break; - case "thickbetweenthin": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThickBetweenThin; break; - case "thickthin": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThickThin; break; - case "thinthick": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThinThick; break; - case "thinthin": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThinThin; break; - } - } - } - } - - private void LoadTextBox(IXLDrawing xlDrawing, XElement textBox) - { - var attStyle = textBox.Attribute("style"); - if (attStyle != null) LoadTextBoxStyle(xlDrawing, attStyle); - - var attInset = textBox.Attribute("inset"); - if (attInset != null) LoadTextBoxInset(xlDrawing, attInset); - } - - private void LoadTextBoxInset(IXLDrawing xlDrawing, XAttribute attInset) - { - var split = attInset.Value.Split(','); - xlDrawing.Style.Margins.Left = GetInsetValue(split[0]); - xlDrawing.Style.Margins.Top = GetInsetValue(split[1]); - xlDrawing.Style.Margins.Right = GetInsetValue(split[2]); - xlDrawing.Style.Margins.Bottom = GetInsetValue(split[3]); - } - - private double GetInsetValue(string value) - { - String v = value.Trim(); - if (v.EndsWith("pt")) - return Double.Parse(v.Substring(0, v.Length - 2), CultureInfo.InvariantCulture) / 72.0; - else - return Double.Parse(v.Substring(0, v.Length - 2), CultureInfo.InvariantCulture); - } - - private static void LoadTextBoxStyle(IXLDrawing xlDrawing, XAttribute attStyle) - { - var style = attStyle.Value; - var attributes = style.Split(';'); - foreach (String pair in attributes) - { - var split = pair.Split(':'); - if (split.Length != 2) continue; - - var attribute = split[0].Trim().ToLower(); - var value = split[1].Trim(); - Boolean isVertical = false; - switch (attribute) - { - case "mso-fit-shape-to-text": xlDrawing.Style.Size.SetAutomaticSize(value.Equals("t")); break; - case "mso-layout-flow-alt": - if (value.Equals("bottom-to-top")) xlDrawing.Style.Alignment.SetOrientation(XLDrawingTextOrientation.BottomToTop); - else if (value.Equals("top-to-bottom")) xlDrawing.Style.Alignment.SetOrientation(XLDrawingTextOrientation.Vertical); - break; - - case "layout-flow": isVertical = value.Equals("vertical"); break; - case "mso-direction-alt": if (value == "auto") xlDrawing.Style.Alignment.Direction = XLDrawingTextDirection.Context; break; - case "direction": if (value == "RTL") xlDrawing.Style.Alignment.Direction = XLDrawingTextDirection.RightToLeft; break; - } - if (isVertical && xlDrawing.Style.Alignment.Orientation == XLDrawingTextOrientation.LeftToRight) - xlDrawing.Style.Alignment.Orientation = XLDrawingTextOrientation.TopToBottom; - } - } - - private void LoadClientData(IXLDrawing drawing, XElement clientData) - { - var anchor = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "Anchor"); - if (anchor != null) LoadClientDataAnchor(drawing, anchor); - - LoadDrawingPositioning(drawing, clientData); - LoadDrawingProtection(drawing, clientData); - - var visible = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "Visible"); - drawing.Visible = visible != null && visible.Value.ToLower().StartsWith("t"); - - LoadDrawingHAlignment(drawing, clientData); - LoadDrawingVAlignment(drawing, clientData); - } - - private void LoadDrawingHAlignment(IXLDrawing drawing, XElement clientData) - { - var textHAlign = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "TextHAlign"); - if (textHAlign != null) - drawing.Style.Alignment.Horizontal = (XLDrawingHorizontalAlignment)Enum.Parse(typeof(XLDrawingHorizontalAlignment), textHAlign.Value.ToProper()); - } - - private void LoadDrawingVAlignment(IXLDrawing drawing, XElement clientData) - { - var textVAlign = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "TextVAlign"); - if (textVAlign != null) - drawing.Style.Alignment.Vertical = (XLDrawingVerticalAlignment)Enum.Parse(typeof(XLDrawingVerticalAlignment), textVAlign.Value.ToProper()); - } - - private void LoadDrawingProtection(IXLDrawing drawing, XElement clientData) - { - var lockedElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "Locked"); - var lockTextElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "LockText"); - Boolean locked = lockedElement != null && lockedElement.Value.ToLower() == "true"; - Boolean lockText = lockTextElement != null && lockTextElement.Value.ToLower() == "true"; - drawing.Style.Protection.Locked = locked; - drawing.Style.Protection.LockText = lockText; - } - - private static void LoadDrawingPositioning(IXLDrawing drawing, XElement clientData) - { - var moveWithCellsElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "MoveWithCells"); - var sizeWithCellsElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "SizeWithCells"); - Boolean moveWithCells = !(moveWithCellsElement != null && moveWithCellsElement.Value.ToLower() == "true"); - Boolean sizeWithCells = !(sizeWithCellsElement != null && sizeWithCellsElement.Value.ToLower() == "true"); - if (moveWithCells && !sizeWithCells) - drawing.Style.Properties.Positioning = XLDrawingAnchor.MoveWithCells; - else if (moveWithCells && sizeWithCells) - drawing.Style.Properties.Positioning = XLDrawingAnchor.MoveAndSizeWithCells; - else - drawing.Style.Properties.Positioning = XLDrawingAnchor.Absolute; - } - - private static void LoadClientDataAnchor(IXLDrawing drawing, XElement anchor) - { - var location = anchor.Value.Split(','); - drawing.Position.Column = int.Parse(location[0]) + 1; - drawing.Position.ColumnOffset = Double.Parse(location[1], CultureInfo.InvariantCulture) / 7.2; - drawing.Position.Row = int.Parse(location[2]) + 1; - drawing.Position.RowOffset = Double.Parse(location[3], CultureInfo.InvariantCulture); - } - - private void LoadShapeProperties(IXLDrawing xlDrawing, XElement shape) - { - var attStyle = shape.Attribute("style"); - if (attStyle == null) return; - - var style = attStyle.Value; - var attributes = style.Split(';'); - foreach (String pair in attributes) - { - var split = pair.Split(':'); - if (split.Length != 2) continue; - - var attribute = split[0].Trim().ToLower(); - var value = split[1].Trim(); - - switch (attribute) - { - case "visibility": xlDrawing.Visible = value.ToLower().Equals("visible"); break; - case "width": xlDrawing.Style.Size.Width = GetPtValue(value) / 7.5; break; - case "height": xlDrawing.Style.Size.Height = GetPtValue(value); break; - case "z-index": xlDrawing.ZOrder = Int32.Parse(value); break; - } - } - } - - private readonly Dictionary knownUnits = new Dictionary - { - {"pt", 1.0}, - {"in", 72.0}, - {"mm", 72.0/25.4} - }; - - private double GetPtValue(string value) - { - var knownUnit = knownUnits.FirstOrDefault(ku => value.Contains(ku.Key)); - - if (knownUnit.Key == null) - return Double.Parse(value); - - return Double.Parse(value.Replace(knownUnit.Key, String.Empty), CultureInfo.InvariantCulture) * knownUnit.Value; - } - - private void LoadDefinedNames(Workbook workbook) - { - if (workbook.DefinedNames == null) return; - - foreach (var definedName in workbook.DefinedNames.OfType()) - { - var name = definedName.Name; - var visible = true; - if (definedName.Hidden != null) visible = !BooleanValue.ToBoolean(definedName.Hidden); - if (name == "_xlnm.Print_Area") - { - var fixedNames = validateDefinedNames(definedName.Text.Split(',')); - foreach (string area in fixedNames) - { - if (area.Contains("[")) - { - var ws = Worksheets.FirstOrDefault(w => (w as XLWorksheet).SheetId == definedName.LocalSheetId + 1); - if (ws != null) - { - ws.PageSetup.PrintAreas.Add(area); - } - } - else - { - string sheetName, sheetArea; - ParseReference(area, out sheetName, out sheetArea); - if (!(sheetArea.Equals("#REF") || sheetArea.EndsWith("#REF!") || sheetArea.Length == 0)) - WorksheetsInternal.Worksheet(sheetName).PageSetup.PrintAreas.Add(sheetArea); - } - } - } - else if (name == "_xlnm.Print_Titles") - { - LoadPrintTitles(definedName); - } - else - { - string text = definedName.Text; - - if (!(text.Equals("#REF") || text.EndsWith("#REF!"))) - { - var localSheetId = definedName.LocalSheetId; - var comment = definedName.Comment; - if (localSheetId == null) - { - if (!NamedRanges.Any(nr => nr.Name == name)) - NamedRanges.Add(name, text, comment).Visible = visible; - } - else - { - if (!Worksheet(Int32.Parse(localSheetId) + 1).NamedRanges.Any(nr => nr.Name == name)) - Worksheet(Int32.Parse(localSheetId) + 1).NamedRanges.Add(name, text, comment).Visible = visible; - } - } - } - } - } - - private static Regex definedNameRegex = new Regex(@"\A'.*'!.*\z", RegexOptions.Compiled); - - private IEnumerable validateDefinedNames(IEnumerable definedNames) - { - var fixedNames = new List(); - var sb = new StringBuilder(); - foreach (string testName in definedNames) - { - if (sb.Length > 0) - sb.Append(','); - - sb.Append(testName); - - Match matchedValidPattern = definedNameRegex.Match(sb.ToString()); - if (matchedValidPattern.Success) - { - yield return sb.ToString(); - sb = new StringBuilder(); - } - } - - if (sb.Length > 0) - yield return sb.ToString(); - } - - private void LoadPrintTitles(DefinedName definedName) - { - var areas = validateDefinedNames(definedName.Text.Split(',')); - foreach (var item in areas) - { - if (this.Range(item) != null) - SetColumnsOrRowsToRepeat(item); - } - } - - private void SetColumnsOrRowsToRepeat(string area) - { - string sheetName, sheetArea; - ParseReference(area, out sheetName, out sheetArea); - if (sheetArea.Equals("#REF")) return; - if (IsColReference(sheetArea)) - WorksheetsInternal.Worksheet(sheetName).PageSetup.SetColumnsToRepeatAtLeft(sheetArea); - if (IsRowReference(sheetArea)) - WorksheetsInternal.Worksheet(sheetName).PageSetup.SetRowsToRepeatAtTop(sheetArea); - } - - // either $A:$X => true or $1:$99 => false - private static bool IsColReference(string sheetArea) - { - char c = sheetArea[0] == '$' ? sheetArea[1] : sheetArea[0]; - return char.IsLetter(c); - } - - private static bool IsRowReference(string sheetArea) - { - char c = sheetArea[0] == '$' ? sheetArea[1] : sheetArea[0]; - return char.IsNumber(c); - } - - private static void ParseReference(string item, out string sheetName, out string sheetArea) - { - var sections = item.Trim().Split('!'); - sheetName = sections[0].Replace("\'", ""); - sheetArea = sections[1]; - } - - private Int32 lastCell; - - private void LoadCells(SharedStringItem[] sharedStrings, Stylesheet s, NumberingFormats numberingFormats, - Fills fills, Borders borders, Fonts fonts, Dictionary sharedFormulasR1C1, - XLWorksheet ws, Dictionary styleList, Cell cell, Int32 rowIndex) - { - Int32 styleIndex = cell.StyleIndex != null ? Int32.Parse(cell.StyleIndex.InnerText) : 0; - - String cellReference = cell.CellReference == null - ? XLHelper.GetColumnLetterFromNumber(++lastCell) + rowIndex - : cell.CellReference.Value; - var xlCell = ws.CellFast(cellReference); - - if (styleList.ContainsKey(styleIndex)) - { - xlCell.Style = styleList[styleIndex]; - } - else - { - ApplyStyle(xlCell, styleIndex, s, fills, borders, fonts, numberingFormats); - styleList.Add(styleIndex, xlCell.Style); - } - - if (cell.CellFormula != null && cell.CellFormula.SharedIndex != null && cell.CellFormula.Reference != null) - { - String formula; - if (cell.CellFormula.FormulaType != null && cell.CellFormula.FormulaType == CellFormulaValues.Array) - formula = "{" + cell.CellFormula.Text + "}"; - else - formula = cell.CellFormula.Text; - - if (cell.CellFormula.Reference != null) - xlCell.FormulaReference = ws.Range(cell.CellFormula.Reference.Value).RangeAddress; - - xlCell.FormulaA1 = formula; - sharedFormulasR1C1.Add(cell.CellFormula.SharedIndex.Value, xlCell.FormulaR1C1); - - if (cell.CellValue != null) - xlCell.ValueCached = cell.CellValue.Text; - } - else if (cell.CellFormula != null) - { - if (cell.CellFormula.SharedIndex != null) - xlCell.FormulaR1C1 = sharedFormulasR1C1[cell.CellFormula.SharedIndex.Value]; - else - { - String formula; - if (cell.CellFormula.FormulaType != null && cell.CellFormula.FormulaType == CellFormulaValues.Array) - formula = "{" + cell.CellFormula.Text + "}"; - else - formula = cell.CellFormula.Text; - - xlCell.FormulaA1 = formula; - } - - if (cell.CellFormula.Reference != null) - xlCell.FormulaReference = ws.Range(cell.CellFormula.Reference.Value).RangeAddress; - - if (cell.CellValue != null) - xlCell.ValueCached = cell.CellValue.Text; - } - else if (cell.DataType != null) - { - if (cell.DataType == CellValues.InlineString) - { - if (cell.InlineString != null) - { - if (cell.InlineString.Text != null) - xlCell._cellValue = cell.InlineString.Text.Text.FixNewLines(); - else - ParseCellValue(cell.InlineString, xlCell); - } - else - xlCell._cellValue = String.Empty; - - xlCell._dataType = XLCellValues.Text; - xlCell.ShareString = false; - } - else if (cell.DataType == CellValues.SharedString) - { - if (cell.CellValue != null && !XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text)) - { - var sharedString = sharedStrings[Int32.Parse(cell.CellValue.Text, XLHelper.NumberStyle, XLHelper.ParseCulture)]; - ParseCellValue(sharedString, xlCell); - } - else - xlCell._cellValue = String.Empty; - - xlCell._dataType = XLCellValues.Text; - } - else if (cell.DataType == CellValues.Date) - { - if (!XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text)) - xlCell._cellValue = Double.Parse(cell.CellValue.Text, XLHelper.NumberStyle, XLHelper.ParseCulture).ToInvariantString(); - xlCell._dataType = XLCellValues.DateTime; - } - else if (cell.DataType == CellValues.Boolean) - { - xlCell._cellValue = cell.CellValue.Text; - xlCell._dataType = XLCellValues.Boolean; - } - else if (cell.DataType == CellValues.Number) - { - if (!XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text)) - xlCell._cellValue = Double.Parse(cell.CellValue.Text, XLHelper.NumberStyle, XLHelper.ParseCulture).ToInvariantString(); - - if (s == null) - xlCell._dataType = XLCellValues.Number; - else - xlCell.DataType = GetDataTypeFromCell(xlCell.Style.NumberFormat); - } - } - else if (cell.CellValue != null) - { - if (s == null) - { - xlCell._dataType = XLCellValues.Number; - } - else - { - var numberFormatId = ((CellFormat)(s.CellFormats).ElementAt(styleIndex)).NumberFormatId; - if (!XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text)) - xlCell._cellValue = Double.Parse(cell.CellValue.Text, CultureInfo.InvariantCulture).ToInvariantString(); - - if (s.NumberingFormats != null && - s.NumberingFormats.Any(nf => ((NumberingFormat)nf).NumberFormatId.Value == numberFormatId)) - { - xlCell.Style.NumberFormat.Format = - ((NumberingFormat)s.NumberingFormats - .First( - nf => ((NumberingFormat)nf).NumberFormatId.Value == numberFormatId) - ).FormatCode.Value; - } - else - xlCell.Style.NumberFormat.NumberFormatId = Int32.Parse(numberFormatId); - - xlCell.DataType = GetDataTypeFromCell(xlCell.Style.NumberFormat); - } - } - } - - /// - /// Parses the cell value for normal or rich text - /// Input element should either be a shared string or inline string - /// - /// The element (either a shared string or inline string) - /// The cell. - private void ParseCellValue(RstType element, XLCell xlCell) - { - var runs = element.Elements(); - var phoneticRuns = element.Elements(); - var phoneticProperties = element.Elements(); - Boolean hasRuns = false; - foreach (Run run in runs) - { - var runProperties = run.RunProperties; - String text = run.Text.InnerText.FixNewLines(); - - if (runProperties == null) - xlCell.RichText.AddText(text, xlCell.Style.Font); - else - { - var rt = xlCell.RichText.AddText(text); - LoadFont(runProperties, rt); - } - if (!hasRuns) - hasRuns = true; - } - - if (!hasRuns) - xlCell._cellValue = XmlEncoder.DecodeString(element.Text.InnerText); - - #region Load PhoneticProperties - - var pp = phoneticProperties.FirstOrDefault(); - if (pp != null) - { - if (pp.Alignment != null) - xlCell.RichText.Phonetics.Alignment = pp.Alignment.Value.ToClosedXml(); - if (pp.Type != null) - xlCell.RichText.Phonetics.Type = pp.Type.Value.ToClosedXml(); - - LoadFont(pp, xlCell.RichText.Phonetics); - } - - #endregion - - #region Load Phonetic Runs - - foreach (PhoneticRun pr in phoneticRuns) - { - xlCell.RichText.Phonetics.Add(pr.Text.InnerText.FixNewLines(), (Int32)pr.BaseTextStartIndex.Value, - (Int32)pr.EndingBaseIndex.Value); - } - - #endregion - } - - private void LoadNumberFormat(NumberingFormat nfSource, IXLNumberFormat nf) - { - if (nfSource == null) return; - - if (nfSource.FormatCode != null) - nf.Format = nfSource.FormatCode.Value; - //if (nfSource.NumberFormatId != null) - // nf.NumberFormatId = (Int32)nfSource.NumberFormatId.Value; - } - - private void LoadBorder(Border borderSource, IXLBorder border) - { - if (borderSource == null) return; - - LoadBorderValues(borderSource.DiagonalBorder, border.SetDiagonalBorder, border.SetDiagonalBorderColor); - - if (borderSource.DiagonalUp != null) - border.DiagonalUp = borderSource.DiagonalUp.Value; - if (borderSource.DiagonalDown != null) - border.DiagonalDown = borderSource.DiagonalDown.Value; - - LoadBorderValues(borderSource.LeftBorder, border.SetLeftBorder, border.SetLeftBorderColor); - LoadBorderValues(borderSource.RightBorder, border.SetRightBorder, border.SetRightBorderColor); - LoadBorderValues(borderSource.TopBorder, border.SetTopBorder, border.SetTopBorderColor); - LoadBorderValues(borderSource.BottomBorder, border.SetBottomBorder, border.SetBottomBorderColor); - } - - private void LoadBorderValues(BorderPropertiesType source, Func setBorder, Func setColor) - { - if (source != null) - { - if (source.Style != null) - setBorder(source.Style.Value.ToClosedXml()); - if (source.Color != null) - setColor(GetColor(source.Color)); - } - } - - private void LoadFill(Fill fillSource, IXLFill fill) - { - if (fillSource == null) return; - - if (fillSource.PatternFill != null) - { - if (fillSource.PatternFill.PatternType != null) - fill.PatternType = fillSource.PatternFill.PatternType.Value.ToClosedXml(); - else - fill.PatternType = XLFillPatternValues.Solid; - - if (fillSource.PatternFill.ForegroundColor != null) - fill.PatternColor = GetColor(fillSource.PatternFill.ForegroundColor); - if (fillSource.PatternFill.BackgroundColor != null) - fill.PatternBackgroundColor = GetColor(fillSource.PatternFill.BackgroundColor); - } - } - - private void LoadFont(OpenXmlElement fontSource, IXLFontBase fontBase) - { - if (fontSource == null) return; - - fontBase.Bold = GetBoolean(fontSource.Elements().FirstOrDefault()); - var fontColor = GetColor(fontSource.Elements().FirstOrDefault()); - if (fontColor.HasValue) - fontBase.FontColor = fontColor; - - var fontFamilyNumbering = - fontSource.Elements().FirstOrDefault(); - if (fontFamilyNumbering != null && fontFamilyNumbering.Val != null) - fontBase.FontFamilyNumbering = - (XLFontFamilyNumberingValues)Int32.Parse(fontFamilyNumbering.Val.ToString()); - var runFont = fontSource.Elements().FirstOrDefault(); - if (runFont != null) - { - if (runFont.Val != null) - fontBase.FontName = runFont.Val; - } - var fontSize = fontSource.Elements().FirstOrDefault(); - if (fontSize != null) - { - if ((fontSize).Val != null) - fontBase.FontSize = (fontSize).Val; - } - - fontBase.Italic = GetBoolean(fontSource.Elements().FirstOrDefault()); - fontBase.Shadow = GetBoolean(fontSource.Elements().FirstOrDefault()); - fontBase.Strikethrough = GetBoolean(fontSource.Elements().FirstOrDefault()); - - var underline = fontSource.Elements().FirstOrDefault(); - if (underline != null) - { - fontBase.Underline = underline.Val != null ? underline.Val.Value.ToClosedXml() : XLFontUnderlineValues.Single; - } - - var verticalTextAlignment = fontSource.Elements().FirstOrDefault(); - - if (verticalTextAlignment == null) return; - - fontBase.VerticalAlignment = verticalTextAlignment.Val != null ? verticalTextAlignment.Val.Value.ToClosedXml() : XLFontVerticalTextAlignmentValues.Baseline; - } - - private Int32 lastRow; - - private void LoadRows(Stylesheet s, NumberingFormats numberingFormats, Fills fills, Borders borders, Fonts fonts, - XLWorksheet ws, SharedStringItem[] sharedStrings, - Dictionary sharedFormulasR1C1, Dictionary styleList, - Row row) - { - Int32 rowIndex = row.RowIndex == null ? ++lastRow : (Int32)row.RowIndex.Value; - var xlRow = ws.Row(rowIndex, false); - - if (row.Height != null) - xlRow.Height = row.Height; - else - { - xlRow.Loading = true; - xlRow.Height = ws.RowHeight; - xlRow.Loading = false; - } - - if (row.Hidden != null && row.Hidden) - xlRow.Hide(); - - if (row.Collapsed != null && row.Collapsed) - xlRow.Collapsed = true; - - if (row.OutlineLevel != null && row.OutlineLevel > 0) - xlRow.OutlineLevel = row.OutlineLevel; - - if (row.CustomFormat != null) - { - Int32 styleIndex = row.StyleIndex != null ? Int32.Parse(row.StyleIndex.InnerText) : -1; - if (styleIndex > 0) - { - ApplyStyle(xlRow, styleIndex, s, fills, borders, fonts, numberingFormats); - } - else - { - xlRow.Style = DefaultStyle; - } - } - - lastCell = 0; - foreach (Cell cell in row.Elements()) - LoadCells(sharedStrings, s, numberingFormats, fills, borders, fonts, sharedFormulasR1C1, ws, styleList, - cell, rowIndex); - } - - private void LoadColumns(Stylesheet s, NumberingFormats numberingFormats, Fills fills, Borders borders, - Fonts fonts, XLWorksheet ws, Columns columns) - { - if (columns == null) return; - - var wsDefaultColumn = - columns.Elements().Where(c => c.Max == XLHelper.MaxColumnNumber).FirstOrDefault(); - - if (wsDefaultColumn != null && wsDefaultColumn.Width != null) - ws.ColumnWidth = wsDefaultColumn.Width - ColumnWidthOffset; - - Int32 styleIndexDefault = wsDefaultColumn != null && wsDefaultColumn.Style != null - ? Int32.Parse(wsDefaultColumn.Style.InnerText) - : -1; - if (styleIndexDefault >= 0) - ApplyStyle(ws, styleIndexDefault, s, fills, borders, fonts, numberingFormats); - - foreach (Column col in columns.Elements()) - { - //IXLStylized toApply; - if (col.Max == XLHelper.MaxColumnNumber) continue; - - var xlColumns = (XLColumns)ws.Columns(col.Min, col.Max); - if (col.Width != null) - { - Double width = col.Width - ColumnWidthOffset; - //if (width < 0) width = 0; - xlColumns.Width = width; - } - else - xlColumns.Width = ws.ColumnWidth; - - if (col.Hidden != null && col.Hidden) - xlColumns.Hide(); - - if (col.Collapsed != null && col.Collapsed) - xlColumns.CollapseOnly(); - - if (col.OutlineLevel != null) - { - var outlineLevel = col.OutlineLevel; - xlColumns.ForEach(c => c.OutlineLevel = outlineLevel); - } - - Int32 styleIndex = col.Style != null ? Int32.Parse(col.Style.InnerText) : -1; - if (styleIndex > 0) - { - ApplyStyle(xlColumns, styleIndex, s, fills, borders, fonts, numberingFormats); - } - else - { - xlColumns.Style = DefaultStyle; - } - } - } - - private static XLCellValues GetDataTypeFromCell(IXLNumberFormat numberFormat) - { - var numberFormatId = numberFormat.NumberFormatId; - if (numberFormatId == 46U) - return XLCellValues.TimeSpan; - else if ((numberFormatId >= 14 && numberFormatId <= 22) || - (numberFormatId >= 45 && numberFormatId <= 47)) - return XLCellValues.DateTime; - else if (numberFormatId == 49) - return XLCellValues.Text; - else - { - if (!XLHelper.IsNullOrWhiteSpace(numberFormat.Format)) - { - var dataType = GetDataTypeFromFormat(numberFormat.Format); - return dataType.HasValue ? dataType.Value : XLCellValues.Number; - } - else - return XLCellValues.Number; - } - } - - private static XLCellValues? GetDataTypeFromFormat(String format) - { - int length = format.Length; - String f = format.ToLower(); - for (Int32 i = 0; i < length; i++) - { - Char c = f[i]; - if (c == '"') - i = f.IndexOf('"', i + 1); - else if (c == '0' || c == '#' || c == '?') - return XLCellValues.Number; - else if (c == 'y' || c == 'm' || c == 'd' || c == 'h' || c == 's') - return XLCellValues.DateTime; - } - return null; - } - - private static void LoadAutoFilter(AutoFilter af, XLWorksheet ws) - { - if (af != null) - { - ws.Range(af.Reference.Value).SetAutoFilter(); - var autoFilter = ws.AutoFilter; - LoadAutoFilterSort(af, ws, autoFilter); - LoadAutoFilterColumns(af, autoFilter); - } - } - - private static void LoadAutoFilterColumns(AutoFilter af, XLAutoFilter autoFilter) - { - foreach (var filterColumn in af.Elements()) - { - Int32 column = (int)filterColumn.ColumnId.Value + 1; - if (filterColumn.CustomFilters != null) - { - var filterList = new List(); - autoFilter.Column(column).FilterType = XLFilterType.Custom; - autoFilter.Filters.Add(column, filterList); - XLConnector connector = filterColumn.CustomFilters.And != null && filterColumn.CustomFilters.And.Value ? XLConnector.And : XLConnector.Or; - - Boolean isText = false; - foreach (CustomFilter filter in filterColumn.CustomFilters) - { - Double dTest; - String val = filter.Val.Value; - if (!Double.TryParse(val, out dTest)) - { - isText = true; - break; - } - } - - foreach (CustomFilter filter in filterColumn.CustomFilters) - { - var xlFilter = new XLFilter { Value = filter.Val.Value, Connector = connector }; - if (isText) - xlFilter.Value = filter.Val.Value; - else - xlFilter.Value = Double.Parse(filter.Val.Value, CultureInfo.InvariantCulture); - - if (filter.Operator != null) - xlFilter.Operator = filter.Operator.Value.ToClosedXml(); - else - xlFilter.Operator = XLFilterOperator.Equal; - - Func condition = null; - switch (xlFilter.Operator) - { - case XLFilterOperator.Equal: - if (isText) - condition = o => o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.InvariantCultureIgnoreCase); - else - condition = o => (o as IComparable).CompareTo(xlFilter.Value) == 0; - break; - - case XLFilterOperator.EqualOrGreaterThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) >= 0; break; - case XLFilterOperator.EqualOrLessThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) <= 0; break; - case XLFilterOperator.GreaterThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) > 0; break; - case XLFilterOperator.LessThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) < 0; break; - case XLFilterOperator.NotEqual: - if (isText) - condition = o => !o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.InvariantCultureIgnoreCase); - else - condition = o => (o as IComparable).CompareTo(xlFilter.Value) != 0; - break; - } - - xlFilter.Condition = condition; - filterList.Add(xlFilter); - } - } - else if (filterColumn.Filters != null) - { - var filterList = new List(); - autoFilter.Column(column).FilterType = XLFilterType.Regular; - autoFilter.Filters.Add((int)filterColumn.ColumnId.Value + 1, filterList); - - Boolean isText = false; - foreach (Filter filter in filterColumn.Filters.OfType()) - { - Double dTest; - String val = filter.Val.Value; - if (!Double.TryParse(val, out dTest)) - { - isText = true; - break; - } - } - - foreach (Filter filter in filterColumn.Filters.OfType()) - { - var xlFilter = new XLFilter { Connector = XLConnector.Or, Operator = XLFilterOperator.Equal }; - - Func condition; - if (isText) - { - xlFilter.Value = filter.Val.Value; - condition = o => o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.InvariantCultureIgnoreCase); - } - else - { - xlFilter.Value = Double.Parse(filter.Val.Value, CultureInfo.InvariantCulture); - condition = o => (o as IComparable).CompareTo(xlFilter.Value) == 0; - } - - xlFilter.Condition = condition; - filterList.Add(xlFilter); - } - } - else if (filterColumn.Top10 != null) - { - var xlFilterColumn = autoFilter.Column(column); - autoFilter.Filters.Add(column, null); - xlFilterColumn.FilterType = XLFilterType.TopBottom; - if (filterColumn.Top10.Percent != null && filterColumn.Top10.Percent.Value) - xlFilterColumn.TopBottomType = XLTopBottomType.Percent; - else - xlFilterColumn.TopBottomType = XLTopBottomType.Items; - - if (filterColumn.Top10.Top != null && !filterColumn.Top10.Top.Value) - xlFilterColumn.TopBottomPart = XLTopBottomPart.Bottom; - else - xlFilterColumn.TopBottomPart = XLTopBottomPart.Top; - - xlFilterColumn.TopBottomValue = (int)filterColumn.Top10.Val.Value; - } - else if (filterColumn.DynamicFilter != null) - { - autoFilter.Filters.Add(column, null); - var xlFilterColumn = autoFilter.Column(column); - xlFilterColumn.FilterType = XLFilterType.Dynamic; - if (filterColumn.DynamicFilter.Type != null) - xlFilterColumn.DynamicType = filterColumn.DynamicFilter.Type.Value.ToClosedXml(); - else - xlFilterColumn.DynamicType = XLFilterDynamicType.AboveAverage; - - xlFilterColumn.DynamicValue = filterColumn.DynamicFilter.Val.Value; - } - } - } - - private static void LoadAutoFilterSort(AutoFilter af, XLWorksheet ws, IXLBaseAutoFilter autoFilter) - { - var sort = af.Elements().FirstOrDefault(); - if (sort != null) - { - var condition = sort.Elements().FirstOrDefault(); - if (condition != null) - { - Int32 column = ws.Range(condition.Reference.Value).FirstCell().Address.ColumnNumber - autoFilter.Range.FirstCell().Address.ColumnNumber + 1; - autoFilter.SortColumn = column; - autoFilter.Sorted = true; - autoFilter.SortOrder = condition.Descending != null && condition.Descending.Value ? XLSortOrder.Descending : XLSortOrder.Ascending; - } - } - } - - private static void LoadSheetProtection(SheetProtection sp, XLWorksheet ws) - { - if (sp == null) return; - - if (sp.Sheet != null) ws.Protection.Protected = sp.Sheet.Value; - if (sp.Password != null) ws.Protection.PasswordHash = sp.Password.Value; - if (sp.FormatCells != null) ws.Protection.FormatCells = !sp.FormatCells.Value; - if (sp.FormatColumns != null) ws.Protection.FormatColumns = !sp.FormatColumns.Value; - if (sp.FormatRows != null) ws.Protection.FormatRows = !sp.FormatRows.Value; - if (sp.InsertColumns != null) ws.Protection.InsertColumns = !sp.InsertColumns.Value; - if (sp.InsertHyperlinks != null) ws.Protection.InsertHyperlinks = !sp.InsertHyperlinks.Value; - if (sp.InsertRows != null) ws.Protection.InsertRows = !sp.InsertRows.Value; - if (sp.DeleteColumns != null) ws.Protection.DeleteColumns = !sp.DeleteColumns.Value; - if (sp.DeleteRows != null) ws.Protection.DeleteRows = !sp.DeleteRows.Value; - if (sp.AutoFilter != null) ws.Protection.AutoFilter = !sp.AutoFilter.Value; - if (sp.PivotTables != null) ws.Protection.PivotTables = !sp.PivotTables.Value; - if (sp.Sort != null) ws.Protection.Sort = !sp.Sort.Value; - if (sp.SelectLockedCells != null) ws.Protection.SelectLockedCells = sp.SelectLockedCells.Value; - if (sp.SelectUnlockedCells != null) ws.Protection.SelectUnlockedCells = sp.SelectUnlockedCells.Value; - } - - private static void LoadDataValidations(DataValidations dataValidations, XLWorksheet ws) - { - if (dataValidations == null) return; - - foreach (DataValidation dvs in dataValidations.Elements()) - { - String txt = dvs.SequenceOfReferences.InnerText; - if (XLHelper.IsNullOrWhiteSpace(txt)) continue; - foreach (var dvt in txt.Split(' ').Select(rangeAddress => ws.Range(rangeAddress).DataValidation)) - { - if (dvs.AllowBlank != null) dvt.IgnoreBlanks = dvs.AllowBlank; - if (dvs.ShowDropDown != null) dvt.InCellDropdown = !dvs.ShowDropDown.Value; - if (dvs.ShowErrorMessage != null) dvt.ShowErrorMessage = dvs.ShowErrorMessage; - if (dvs.ShowInputMessage != null) dvt.ShowInputMessage = dvs.ShowInputMessage; - if (dvs.PromptTitle != null) dvt.InputTitle = dvs.PromptTitle; - if (dvs.Prompt != null) dvt.InputMessage = dvs.Prompt; - if (dvs.ErrorTitle != null) dvt.ErrorTitle = dvs.ErrorTitle; - if (dvs.Error != null) dvt.ErrorMessage = dvs.Error; - if (dvs.ErrorStyle != null) dvt.ErrorStyle = dvs.ErrorStyle.Value.ToClosedXml(); - if (dvs.Type != null) dvt.AllowedValues = dvs.Type.Value.ToClosedXml(); - if (dvs.Operator != null) dvt.Operator = dvs.Operator.Value.ToClosedXml(); - if (dvs.Formula1 != null) dvt.MinValue = dvs.Formula1.Text; - if (dvs.Formula2 != null) dvt.MaxValue = dvs.Formula2.Text; - } - } - } - - /// - /// Loads the conditional formatting. - /// - // https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.conditionalformattingrule%28v=office.15%29.aspx?f=255&MSPPError=-2147217396 - private void LoadConditionalFormatting(ConditionalFormatting conditionalFormatting, XLWorksheet ws, Dictionary differentialFormats) - { - if (conditionalFormatting == null) return; - - foreach (var sor in conditionalFormatting.SequenceOfReferences.Items) - { - foreach (var fr in conditionalFormatting.Elements()) - { - var conditionalFormat = new XLConditionalFormat(ws.Range(sor.Value)); - if (fr.FormatId != null) - { - LoadFont(differentialFormats[(Int32)fr.FormatId.Value].Font, conditionalFormat.Style.Font); - LoadFill(differentialFormats[(Int32)fr.FormatId.Value].Fill, conditionalFormat.Style.Fill); - LoadBorder(differentialFormats[(Int32)fr.FormatId.Value].Border, conditionalFormat.Style.Border); - LoadNumberFormat(differentialFormats[(Int32)fr.FormatId.Value].NumberingFormat, conditionalFormat.Style.NumberFormat); - } - - // The conditional formatting type is compulsory. If it doesn't exist, skip the entire rule. - if (fr.Type == null) continue; - conditionalFormat.ConditionalFormatType = fr.Type.Value.ToClosedXml(); - - if (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.CellIs && fr.Operator != null) - conditionalFormat.Operator = fr.Operator.Value.ToClosedXml(); - - if (fr.Text != null && !XLHelper.IsNullOrWhiteSpace(fr.Text)) - conditionalFormat.Values.Add(GetFormula(fr.Text.Value)); - - if (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.Top10) - { - if (fr.Percent != null) - conditionalFormat.Percent = fr.Percent.Value; - if (fr.Bottom != null) - conditionalFormat.Bottom = fr.Bottom.Value; - if (fr.Rank != null) - conditionalFormat.Values.Add(GetFormula(fr.Rank.Value.ToString())); - } - - if (fr.Elements().Any()) - { - var colorScale = fr.Elements().First(); - ExtractConditionalFormatValueObjects(conditionalFormat, colorScale); - } - else if (fr.Elements().Any()) - { - var dataBar = fr.Elements().First(); - if (dataBar.ShowValue != null) - conditionalFormat.ShowBarOnly = !dataBar.ShowValue.Value; - ExtractConditionalFormatValueObjects(conditionalFormat, dataBar); - } - else if (fr.Elements().Any()) - { - var iconSet = fr.Elements().First(); - if (iconSet.ShowValue != null) - conditionalFormat.ShowIconOnly = !iconSet.ShowValue.Value; - if (iconSet.Reverse != null) - conditionalFormat.ReverseIconOrder = iconSet.Reverse.Value; - - if (iconSet.IconSetValue != null) - conditionalFormat.IconSetStyle = iconSet.IconSetValue.Value.ToClosedXml(); - else - conditionalFormat.IconSetStyle = XLIconSetStyle.ThreeTrafficLights1; - - ExtractConditionalFormatValueObjects(conditionalFormat, iconSet); - } - else - { - foreach (var formula in fr.Elements()) - { - if (formula.Text != null - && (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.CellIs - || conditionalFormat.ConditionalFormatType == XLConditionalFormatType.Expression)) - { - conditionalFormat.Values.Add(GetFormula(formula.Text)); - } - } - } - ws.ConditionalFormats.Add(conditionalFormat); - } - } - } - - private static XLFormula GetFormula(String value) - { - var formula = new XLFormula(); - formula._value = value; - formula.IsFormula = !(value[0] == '"' && value.EndsWith("\"")); - return formula; - } - - private void ExtractConditionalFormatValueObjects(XLConditionalFormat conditionalFormat, OpenXmlElement element) - { - foreach (var c in element.Elements()) - { - if (c.Type != null) - conditionalFormat.ContentTypes.Add(c.Type.Value.ToClosedXml()); - if (c.Val != null) - conditionalFormat.Values.Add(new XLFormula { Value = c.Val.Value }); - else - conditionalFormat.Values.Add(null); - - if (c.GreaterThanOrEqual != null) - conditionalFormat.IconSetOperators.Add(c.GreaterThanOrEqual.Value ? XLCFIconSetOperator.EqualOrGreaterThan : XLCFIconSetOperator.GreaterThan); - else - conditionalFormat.IconSetOperators.Add(XLCFIconSetOperator.EqualOrGreaterThan); - } - foreach (var c in element.Elements()) - { - conditionalFormat.Colors.Add(GetColor(c)); - } - } - - private static void LoadHyperlinks(Hyperlinks hyperlinks, WorksheetPart worksheetPart, XLWorksheet ws) - { - var hyperlinkDictionary = new Dictionary(); - if (worksheetPart.HyperlinkRelationships != null) - hyperlinkDictionary = worksheetPart.HyperlinkRelationships.ToDictionary(hr => hr.Id, hr => hr.Uri); - - if (hyperlinks == null) return; - - foreach (Hyperlink hl in hyperlinks.Elements()) - { - if (hl.Reference.Value.Equals("#REF")) continue; - String tooltip = hl.Tooltip != null ? hl.Tooltip.Value : String.Empty; - var xlRange = ws.Range(hl.Reference.Value); - foreach (XLCell xlCell in xlRange.Cells()) - { - xlCell.SettingHyperlink = true; - - if (hl.Id != null) - xlCell.Hyperlink = new XLHyperlink(hyperlinkDictionary[hl.Id], tooltip); - else if (hl.Location != null) - xlCell.Hyperlink = new XLHyperlink(hl.Location.Value, tooltip); - else - xlCell.Hyperlink = new XLHyperlink(hl.Reference.Value, tooltip); - - xlCell.SettingHyperlink = false; - } - } - } - - private static void LoadColumnBreaks(ColumnBreaks columnBreaks, XLWorksheet ws) - { - if (columnBreaks == null) return; - - foreach (Break columnBreak in columnBreaks.Elements().Where(columnBreak => columnBreak.Id != null)) - { - ws.PageSetup.ColumnBreaks.Add(Int32.Parse(columnBreak.Id.InnerText)); - } - } - - private static void LoadRowBreaks(RowBreaks rowBreaks, XLWorksheet ws) - { - if (rowBreaks == null) return; - - foreach (Break rowBreak in rowBreaks.Elements()) - ws.PageSetup.RowBreaks.Add(Int32.Parse(rowBreak.Id.InnerText)); - } - - private void LoadSheetProperties(SheetProperties sheetProperty, XLWorksheet ws, out PageSetupProperties pageSetupProperties) - { - pageSetupProperties = null; - if (sheetProperty == null) return; - - if (sheetProperty.TabColor != null) - ws.TabColor = GetColor(sheetProperty.TabColor); - - if (sheetProperty.OutlineProperties != null) - { - if (sheetProperty.OutlineProperties.SummaryBelow != null) - { - ws.Outline.SummaryVLocation = sheetProperty.OutlineProperties.SummaryBelow - ? XLOutlineSummaryVLocation.Bottom - : XLOutlineSummaryVLocation.Top; - } - - if (sheetProperty.OutlineProperties.SummaryRight != null) - { - ws.Outline.SummaryHLocation = sheetProperty.OutlineProperties.SummaryRight - ? XLOutlineSummaryHLocation.Right - : XLOutlineSummaryHLocation.Left; - } - } - - if (sheetProperty.PageSetupProperties != null) - pageSetupProperties = sheetProperty.PageSetupProperties; - } - - private static void LoadHeaderFooter(HeaderFooter headerFooter, XLWorksheet ws) - { - if (headerFooter == null) return; - - if (headerFooter.AlignWithMargins != null) - ws.PageSetup.AlignHFWithMargins = headerFooter.AlignWithMargins; - if (headerFooter.ScaleWithDoc != null) - ws.PageSetup.ScaleHFWithDocument = headerFooter.ScaleWithDoc; - - if (headerFooter.DifferentFirst != null) - ws.PageSetup.DifferentFirstPageOnHF = headerFooter.DifferentFirst; - if (headerFooter.DifferentOddEven != null) - ws.PageSetup.DifferentOddEvenPagesOnHF = headerFooter.DifferentOddEven; - - // Footers - var xlFooter = (XLHeaderFooter)ws.PageSetup.Footer; - var evenFooter = headerFooter.EvenFooter; - if (evenFooter != null) - xlFooter.SetInnerText(XLHFOccurrence.EvenPages, evenFooter.Text); - var oddFooter = headerFooter.OddFooter; - if (oddFooter != null) - xlFooter.SetInnerText(XLHFOccurrence.OddPages, oddFooter.Text); - var firstFooter = headerFooter.FirstFooter; - if (firstFooter != null) - xlFooter.SetInnerText(XLHFOccurrence.FirstPage, firstFooter.Text); - // Headers - var xlHeader = (XLHeaderFooter)ws.PageSetup.Header; - var evenHeader = headerFooter.EvenHeader; - if (evenHeader != null) - xlHeader.SetInnerText(XLHFOccurrence.EvenPages, evenHeader.Text); - var oddHeader = headerFooter.OddHeader; - if (oddHeader != null) - xlHeader.SetInnerText(XLHFOccurrence.OddPages, oddHeader.Text); - var firstHeader = headerFooter.FirstHeader; - if (firstHeader != null) - xlHeader.SetInnerText(XLHFOccurrence.FirstPage, firstHeader.Text); - - ((XLHeaderFooter)ws.PageSetup.Header).SetAsInitial(); - ((XLHeaderFooter)ws.PageSetup.Footer).SetAsInitial(); - } - - private static void LoadPageSetup(PageSetup pageSetup, XLWorksheet ws, PageSetupProperties pageSetupProperties) - { - if (pageSetup == null) return; - - if (pageSetup.PaperSize != null) - ws.PageSetup.PaperSize = (XLPaperSize)Int32.Parse(pageSetup.PaperSize.InnerText); - if (pageSetup.Scale != null) - ws.PageSetup.Scale = Int32.Parse(pageSetup.Scale.InnerText); - if (pageSetupProperties != null && pageSetupProperties.FitToPage != null && pageSetupProperties.FitToPage.Value) - { - if (pageSetup.FitToWidth == null) - ws.PageSetup.PagesWide = 1; - else - ws.PageSetup.PagesWide = Int32.Parse(pageSetup.FitToWidth.InnerText); - - if (pageSetup.FitToHeight == null) - ws.PageSetup.PagesTall = 1; - else - ws.PageSetup.PagesTall = Int32.Parse(pageSetup.FitToHeight.InnerText); - } - if (pageSetup.PageOrder != null) - ws.PageSetup.PageOrder = pageSetup.PageOrder.Value.ToClosedXml(); - if (pageSetup.Orientation != null) - ws.PageSetup.PageOrientation = pageSetup.Orientation.Value.ToClosedXml(); - if (pageSetup.BlackAndWhite != null) - ws.PageSetup.BlackAndWhite = pageSetup.BlackAndWhite; - if (pageSetup.Draft != null) - ws.PageSetup.DraftQuality = pageSetup.Draft; - if (pageSetup.CellComments != null) - ws.PageSetup.ShowComments = pageSetup.CellComments.Value.ToClosedXml(); - if (pageSetup.Errors != null) - ws.PageSetup.PrintErrorValue = pageSetup.Errors.Value.ToClosedXml(); - if (pageSetup.HorizontalDpi != null) ws.PageSetup.HorizontalDpi = (Int32)pageSetup.HorizontalDpi.Value; - if (pageSetup.VerticalDpi != null) ws.PageSetup.VerticalDpi = (Int32)pageSetup.VerticalDpi.Value; - if (pageSetup.FirstPageNumber != null) - ws.PageSetup.FirstPageNumber = UInt32.Parse(pageSetup.FirstPageNumber.InnerText); - } - - private static void LoadPageMargins(PageMargins pageMargins, XLWorksheet ws) - { - if (pageMargins == null) return; - - if (pageMargins.Bottom != null) - ws.PageSetup.Margins.Bottom = pageMargins.Bottom; - if (pageMargins.Footer != null) - ws.PageSetup.Margins.Footer = pageMargins.Footer; - if (pageMargins.Header != null) - ws.PageSetup.Margins.Header = pageMargins.Header; - if (pageMargins.Left != null) - ws.PageSetup.Margins.Left = pageMargins.Left; - if (pageMargins.Right != null) - ws.PageSetup.Margins.Right = pageMargins.Right; - if (pageMargins.Top != null) - ws.PageSetup.Margins.Top = pageMargins.Top; - } - - private static void LoadPrintOptions(PrintOptions printOptions, XLWorksheet ws) - { - if (printOptions == null) return; - - if (printOptions.GridLines != null) - ws.PageSetup.ShowGridlines = printOptions.GridLines; - if (printOptions.HorizontalCentered != null) - ws.PageSetup.CenterHorizontally = printOptions.HorizontalCentered; - if (printOptions.VerticalCentered != null) - ws.PageSetup.CenterVertically = printOptions.VerticalCentered; - if (printOptions.Headings != null) - ws.PageSetup.ShowRowAndColumnHeadings = printOptions.Headings; - } - - private static void LoadSheetViews(SheetViews sheetViews, XLWorksheet ws) - { - if (sheetViews == null) return; - - var sheetView = sheetViews.Elements().FirstOrDefault(); - - if (sheetView == null) return; - - if (sheetView.RightToLeft != null) ws.RightToLeft = sheetView.RightToLeft.Value; - if (sheetView.ShowFormulas != null) ws.ShowFormulas = sheetView.ShowFormulas.Value; - if (sheetView.ShowGridLines != null) ws.ShowGridLines = sheetView.ShowGridLines.Value; - if (sheetView.ShowOutlineSymbols != null) - ws.ShowOutlineSymbols = sheetView.ShowOutlineSymbols.Value; - if (sheetView.ShowRowColHeaders != null) ws.ShowRowColHeaders = sheetView.ShowRowColHeaders.Value; - if (sheetView.ShowRuler != null) ws.ShowRuler = sheetView.ShowRuler.Value; - if (sheetView.ShowWhiteSpace != null) ws.ShowWhiteSpace = sheetView.ShowWhiteSpace.Value; - if (sheetView.ShowZeros != null) ws.ShowZeros = sheetView.ShowZeros.Value; - if (sheetView.TabSelected != null) ws.TabSelected = sheetView.TabSelected.Value; - - var selection = sheetView.Elements().FirstOrDefault(); - if (selection != null) - { - if (selection.SequenceOfReferences != null) - ws.Ranges(selection.SequenceOfReferences.InnerText.Replace(" ", ",")).Select(); - - if (selection.ActiveCell != null) - ws.Cell(selection.ActiveCell).SetActive(); - } - - if (sheetView.ZoomScale != null) - ws.SheetView.ZoomScale = (int)UInt32Value.ToUInt32(sheetView.ZoomScale); - if (sheetView.ZoomScaleNormal != null) - ws.SheetView.ZoomScaleNormal = (int)UInt32Value.ToUInt32(sheetView.ZoomScaleNormal); - if (sheetView.ZoomScalePageLayoutView != null) - ws.SheetView.ZoomScalePageLayoutView = (int)UInt32Value.ToUInt32(sheetView.ZoomScalePageLayoutView); - if (sheetView.ZoomScaleSheetLayoutView != null) - ws.SheetView.ZoomScaleSheetLayoutView = (int)UInt32Value.ToUInt32(sheetView.ZoomScaleSheetLayoutView); - - var pane = sheetView.Elements().FirstOrDefault(); - if (pane == null) return; - - if (pane.State == null || - (pane.State != PaneStateValues.FrozenSplit && pane.State != PaneStateValues.Frozen)) return; - - if (pane.HorizontalSplit != null) - ws.SheetView.SplitColumn = (Int32)pane.HorizontalSplit.Value; - if (pane.VerticalSplit != null) - ws.SheetView.SplitRow = (Int32)pane.VerticalSplit.Value; - } - - private void SetProperties(SpreadsheetDocument dSpreadsheet) - { - var p = dSpreadsheet.PackageProperties; - Properties.Author = p.Creator; - Properties.Category = p.Category; - Properties.Comments = p.Description; - if (p.Created != null) - Properties.Created = p.Created.Value; - Properties.Keywords = p.Keywords; - Properties.LastModifiedBy = p.LastModifiedBy; - Properties.Status = p.ContentStatus; - Properties.Subject = p.Subject; - Properties.Title = p.Title; - } - - private XLColor GetColor(ColorType color) - { - XLColor retVal = null; - if (color != null) - { - if (color.Rgb != null) - { - String htmlColor = "#" + color.Rgb.Value; - Color thisColor; - if (!_colorList.ContainsKey(htmlColor)) - { - thisColor = ColorTranslator.FromHtml(htmlColor); - _colorList.Add(htmlColor, thisColor); - } - else - thisColor = _colorList[htmlColor]; - retVal = XLColor.FromColor(thisColor); - } - else if (color.Indexed != null && color.Indexed < 64) - retVal = XLColor.FromIndex((Int32)color.Indexed.Value); - else if (color.Theme != null) - { - retVal = color.Tint != null ? XLColor.FromTheme((XLThemeColor)color.Theme.Value, color.Tint.Value) : XLColor.FromTheme((XLThemeColor)color.Theme.Value); - } - } - return retVal ?? XLColor.NoColor; - } - - private void ApplyStyle(IXLStylized xlStylized, Int32 styleIndex, Stylesheet s, Fills fills, Borders borders, - Fonts fonts, NumberingFormats numberingFormats) - { - if (s == null) return; //No Stylesheet, no Styles - - var cellFormat = (CellFormat)s.CellFormats.ElementAt(styleIndex); - - if (cellFormat.ApplyProtection != null) - { - var protection = cellFormat.Protection; - - if (protection == null) - xlStylized.InnerStyle.Protection = new XLProtection(null, DefaultStyle.Protection); - else - { - xlStylized.InnerStyle.Protection.Hidden = protection.Hidden != null && protection.Hidden.HasValue && - protection.Hidden.Value; - xlStylized.InnerStyle.Protection.Locked = protection.Locked == null || - (protection.Locked.HasValue && protection.Locked.Value); - } - } - - if (UInt32HasValue(cellFormat.FillId)) - { - var fill = (Fill)fills.ElementAt((Int32)cellFormat.FillId.Value); - if (fill.PatternFill != null) - { - if (fill.PatternFill.PatternType != null) - xlStylized.InnerStyle.Fill.PatternType = fill.PatternFill.PatternType.Value.ToClosedXml(); - - var fgColor = GetColor(fill.PatternFill.ForegroundColor); - if (fgColor.HasValue) xlStylized.InnerStyle.Fill.PatternColor = fgColor; - - var bgColor = GetColor(fill.PatternFill.BackgroundColor); - if (bgColor.HasValue) - xlStylized.InnerStyle.Fill.PatternBackgroundColor = bgColor; - } - } - - var alignment = cellFormat.Alignment; - if (alignment != null) - { - if (alignment.Horizontal != null) - xlStylized.InnerStyle.Alignment.Horizontal = alignment.Horizontal.Value.ToClosedXml(); - if (alignment.Indent != null && alignment.Indent != 0) - xlStylized.InnerStyle.Alignment.Indent = Int32.Parse(alignment.Indent.ToString()); - if (alignment.JustifyLastLine != null) - xlStylized.InnerStyle.Alignment.JustifyLastLine = alignment.JustifyLastLine; - if (alignment.ReadingOrder != null) - { - xlStylized.InnerStyle.Alignment.ReadingOrder = - (XLAlignmentReadingOrderValues)Int32.Parse(alignment.ReadingOrder.ToString()); - } - if (alignment.RelativeIndent != null) - xlStylized.InnerStyle.Alignment.RelativeIndent = alignment.RelativeIndent; - if (alignment.ShrinkToFit != null) - xlStylized.InnerStyle.Alignment.ShrinkToFit = alignment.ShrinkToFit; - if (alignment.TextRotation != null) - xlStylized.InnerStyle.Alignment.TextRotation = (Int32)alignment.TextRotation.Value; - if (alignment.Vertical != null) - xlStylized.InnerStyle.Alignment.Vertical = alignment.Vertical.Value.ToClosedXml(); - if (alignment.WrapText != null) - xlStylized.InnerStyle.Alignment.WrapText = alignment.WrapText; - } - - if (UInt32HasValue(cellFormat.BorderId)) - { - uint borderId = cellFormat.BorderId.Value; - var border = (Border)borders.ElementAt((Int32)borderId); - if (border != null) - { - var bottomBorder = border.BottomBorder; - if (bottomBorder != null) - { - if (bottomBorder.Style != null) - xlStylized.InnerStyle.Border.BottomBorder = bottomBorder.Style.Value.ToClosedXml(); - - var bottomBorderColor = GetColor(bottomBorder.Color); - if (bottomBorderColor.HasValue) - xlStylized.InnerStyle.Border.BottomBorderColor = bottomBorderColor; - } - var topBorder = border.TopBorder; - if (topBorder != null) - { - if (topBorder.Style != null) - xlStylized.InnerStyle.Border.TopBorder = topBorder.Style.Value.ToClosedXml(); - var topBorderColor = GetColor(topBorder.Color); - if (topBorderColor.HasValue) - xlStylized.InnerStyle.Border.TopBorderColor = topBorderColor; - } - var leftBorder = border.LeftBorder; - if (leftBorder != null) - { - if (leftBorder.Style != null) - xlStylized.InnerStyle.Border.LeftBorder = leftBorder.Style.Value.ToClosedXml(); - var leftBorderColor = GetColor(leftBorder.Color); - if (leftBorderColor.HasValue) - xlStylized.InnerStyle.Border.LeftBorderColor = leftBorderColor; - } - var rightBorder = border.RightBorder; - if (rightBorder != null) - { - if (rightBorder.Style != null) - xlStylized.InnerStyle.Border.RightBorder = rightBorder.Style.Value.ToClosedXml(); - var rightBorderColor = GetColor(rightBorder.Color); - if (rightBorderColor.HasValue) - xlStylized.InnerStyle.Border.RightBorderColor = rightBorderColor; - } - var diagonalBorder = border.DiagonalBorder; - if (diagonalBorder != null) - { - if (diagonalBorder.Style != null) - xlStylized.InnerStyle.Border.DiagonalBorder = diagonalBorder.Style.Value.ToClosedXml(); - var diagonalBorderColor = GetColor(diagonalBorder.Color); - if (diagonalBorderColor.HasValue) - xlStylized.InnerStyle.Border.DiagonalBorderColor = diagonalBorderColor; - if (border.DiagonalDown != null) - xlStylized.InnerStyle.Border.DiagonalDown = border.DiagonalDown; - if (border.DiagonalUp != null) - xlStylized.InnerStyle.Border.DiagonalUp = border.DiagonalUp; - } - } - } - - if (UInt32HasValue(cellFormat.FontId)) - { - var fontId = cellFormat.FontId; - var font = (DocumentFormat.OpenXml.Spreadsheet.Font)fonts.ElementAt((Int32)fontId.Value); - if (font != null) - { - xlStylized.InnerStyle.Font.Bold = GetBoolean(font.Bold); - - var fontColor = GetColor(font.Color); - if (fontColor.HasValue) - xlStylized.InnerStyle.Font.FontColor = fontColor; - - if (font.FontFamilyNumbering != null && (font.FontFamilyNumbering).Val != null) - { - xlStylized.InnerStyle.Font.FontFamilyNumbering = - (XLFontFamilyNumberingValues)Int32.Parse((font.FontFamilyNumbering).Val.ToString()); - } - if (font.FontName != null) - { - if ((font.FontName).Val != null) - xlStylized.InnerStyle.Font.FontName = (font.FontName).Val; - } - if (font.FontSize != null) - { - if ((font.FontSize).Val != null) - xlStylized.InnerStyle.Font.FontSize = (font.FontSize).Val; - } - - xlStylized.InnerStyle.Font.Italic = GetBoolean(font.Italic); - xlStylized.InnerStyle.Font.Shadow = GetBoolean(font.Shadow); - xlStylized.InnerStyle.Font.Strikethrough = GetBoolean(font.Strike); - - if (font.Underline != null) - { - xlStylized.InnerStyle.Font.Underline = font.Underline.Val != null - ? (font.Underline).Val.Value.ToClosedXml() - : XLFontUnderlineValues.Single; - } - - if (font.VerticalTextAlignment != null) - { - xlStylized.InnerStyle.Font.VerticalAlignment = font.VerticalTextAlignment.Val != null - ? (font.VerticalTextAlignment).Val.Value. - ToClosedXml() - : XLFontVerticalTextAlignmentValues.Baseline; - } - } - } - - if (!UInt32HasValue(cellFormat.NumberFormatId)) return; - - var numberFormatId = cellFormat.NumberFormatId; - - string formatCode = String.Empty; - if (numberingFormats != null) - { - var numberingFormat = - numberingFormats.FirstOrDefault( - nf => - ((NumberingFormat)nf).NumberFormatId != null && - ((NumberingFormat)nf).NumberFormatId.Value == numberFormatId) as NumberingFormat; - - if (numberingFormat != null && numberingFormat.FormatCode != null) - formatCode = numberingFormat.FormatCode.Value; - } - if (formatCode.Length > 0) - xlStylized.InnerStyle.NumberFormat.Format = formatCode; - else - xlStylized.InnerStyle.NumberFormat.NumberFormatId = (Int32)numberFormatId.Value; - } - - private static Boolean UInt32HasValue(UInt32Value value) - { - return value != null && value.HasValue; - } - - private static Boolean GetBoolean(BooleanPropertyType property) - { - if (property != null) - { - if (property.Val != null) - return property.Val; - return true; - } - - return false; - } - } -} +#region + +using ClosedXML.Utils; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml.Linq; +using Ap = DocumentFormat.OpenXml.ExtendedProperties; +using Op = DocumentFormat.OpenXml.CustomProperties; +using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet; + +#endregion + +namespace ClosedXML.Excel +{ + #region + + using Ap; + using Drawings; + using Op; + using System.Drawing; + + #endregion + + public partial class XLWorkbook + { + private readonly Dictionary _colorList = new Dictionary(); + + private void Load(String file) + { + LoadSheets(file); + } + + private void Load(Stream stream) + { + LoadSheets(stream); + } + + private void LoadSheets(String fileName) + { + using (var dSpreadsheet = SpreadsheetDocument.Open(fileName, false)) + LoadSpreadsheetDocument(dSpreadsheet); + } + + private void LoadSheets(Stream stream) + { + using (var dSpreadsheet = SpreadsheetDocument.Open(stream, false)) + LoadSpreadsheetDocument(dSpreadsheet); + } + + private void LoadSpreadsheetDocument(SpreadsheetDocument dSpreadsheet) + { + ShapeIdManager = new XLIdManager(); + SetProperties(dSpreadsheet); + //var sharedStrings = dSpreadsheet.WorkbookPart.SharedStringTablePart.SharedStringTable.Elements(); + SharedStringItem[] sharedStrings = null; + if (dSpreadsheet.WorkbookPart.GetPartsOfType().Count() > 0) + { + var shareStringPart = dSpreadsheet.WorkbookPart.GetPartsOfType().First(); + sharedStrings = shareStringPart.SharedStringTable.Elements().ToArray(); + } + + if (dSpreadsheet.CustomFilePropertiesPart != null) + { + foreach (var m in dSpreadsheet.CustomFilePropertiesPart.Properties.Elements()) + { + String name = m.Name.Value; + if (m.VTLPWSTR != null) + CustomProperties.Add(name, m.VTLPWSTR.Text); + else if (m.VTFileTime != null) + { + CustomProperties.Add(name, + DateTime.ParseExact(m.VTFileTime.Text, "yyyy'-'MM'-'dd'T'HH':'mm':'ssK", + CultureInfo.InvariantCulture)); + } + else if (m.VTDouble != null) + CustomProperties.Add(name, Double.Parse(m.VTDouble.Text, CultureInfo.InvariantCulture)); + else if (m.VTBool != null) + CustomProperties.Add(name, m.VTBool.Text == "true"); + } + } + + var wbProps = dSpreadsheet.WorkbookPart.Workbook.WorkbookProperties; + Use1904DateSystem = wbProps != null && wbProps.Date1904 != null && wbProps.Date1904.Value; + + var wbProtection = dSpreadsheet.WorkbookPart.Workbook.WorkbookProtection; + if (wbProtection != null) + { + if (wbProtection.LockStructure != null) + LockStructure = wbProtection.LockStructure.Value; + if (wbProtection.LockWindows != null) + LockWindows = wbProtection.LockWindows.Value; + } + + var calculationProperties = dSpreadsheet.WorkbookPart.Workbook.CalculationProperties; + if (calculationProperties != null) + { + var calculateMode = calculationProperties.CalculationMode; + if (calculateMode != null) + CalculateMode = calculateMode.Value.ToClosedXml(); + + var calculationOnSave = calculationProperties.CalculationOnSave; + if (calculationOnSave != null) + CalculationOnSave = calculationOnSave.Value; + + var forceFullCalculation = calculationProperties.ForceFullCalculation; + if (forceFullCalculation != null) + ForceFullCalculation = forceFullCalculation.Value; + + var fullCalculationOnLoad = calculationProperties.FullCalculationOnLoad; + if (fullCalculationOnLoad != null) + FullCalculationOnLoad = fullCalculationOnLoad.Value; + + var fullPrecision = calculationProperties.FullPrecision; + if (fullPrecision != null) + FullPrecision = fullPrecision.Value; + + var referenceMode = calculationProperties.ReferenceMode; + if (referenceMode != null) + ReferenceStyle = referenceMode.Value.ToClosedXml(); + } + + var efp = dSpreadsheet.ExtendedFilePropertiesPart; + if (efp != null && efp.Properties != null) + { + if (efp.Properties.Elements().Any()) + Properties.Company = efp.Properties.GetFirstChild().Text; + + if (efp.Properties.Elements().Any()) + Properties.Manager = efp.Properties.GetFirstChild().Text; + } + + Stylesheet s = null; + if (dSpreadsheet.WorkbookPart.WorkbookStylesPart != null && + dSpreadsheet.WorkbookPart.WorkbookStylesPart.Stylesheet != null) + { + s = dSpreadsheet.WorkbookPart.WorkbookStylesPart.Stylesheet; + } + + NumberingFormats numberingFormats = s == null ? null : s.NumberingFormats; + Fills fills = s == null ? null : s.Fills; + Borders borders = s == null ? null : s.Borders; + Fonts fonts = s == null ? null : s.Fonts; + Int32 dfCount = 0; + Dictionary differentialFormats; + if (s != null && s.DifferentialFormats != null) + differentialFormats = s.DifferentialFormats.Elements().ToDictionary(k => dfCount++); + else + differentialFormats = new Dictionary(); + + var sheets = dSpreadsheet.WorkbookPart.Workbook.Sheets; + Int32 position = 0; + foreach (Sheet dSheet in sheets.OfType()) + { + position++; + var sharedFormulasR1C1 = new Dictionary(); + + var wsPart = dSpreadsheet.WorkbookPart.GetPartById(dSheet.Id) as WorksheetPart; + + if (wsPart == null) + { + UnsupportedSheets.Add(new UnsupportedSheet { SheetId = dSheet.SheetId.Value, Position = position }); + continue; + } + + var sheetName = dSheet.Name; + + var ws = (XLWorksheet)WorksheetsInternal.Add(sheetName, position); + ws.RelId = dSheet.Id; + ws.SheetId = (Int32)dSheet.SheetId.Value; + + if (dSheet.State != null) + ws.Visibility = dSheet.State.Value.ToClosedXml(); + + var styleList = new Dictionary();// {{0, ws.Style}}; + PageSetupProperties pageSetupProperties = null; + + using (var reader = OpenXmlReader.Create(wsPart)) + { + Type[] ignoredElements = new Type[] + { + typeof(CustomSheetViews) // Custom sheet views contain its own auto filter data, and more, which should be ignored for now + }; + + while (reader.Read()) + { + while (ignoredElements.Contains(reader.ElementType)) + reader.ReadNextSibling(); + + if (reader.ElementType == typeof(SheetFormatProperties)) + { + var sheetFormatProperties = (SheetFormatProperties)reader.LoadCurrentElement(); + if (sheetFormatProperties != null) + { + if (sheetFormatProperties.DefaultRowHeight != null) + ws.RowHeight = sheetFormatProperties.DefaultRowHeight; + + ws.RowHeightChanged = (sheetFormatProperties.CustomHeight != null && + sheetFormatProperties.CustomHeight.Value); + + if (sheetFormatProperties.DefaultColumnWidth != null) + { + ws.ColumnWidth = sheetFormatProperties.DefaultColumnWidth; + } + } + } + else if (reader.ElementType == typeof(SheetViews)) + LoadSheetViews((SheetViews)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(MergeCells)) + { + var mergedCells = (MergeCells)reader.LoadCurrentElement(); + if (mergedCells != null) + { + foreach (MergeCell mergeCell in mergedCells.Elements()) + ws.Range(mergeCell.Reference).Merge(false); + } + } + else if (reader.ElementType == typeof(Columns)) + LoadColumns(s, numberingFormats, fills, borders, fonts, ws, + (Columns)reader.LoadCurrentElement()); + else if (reader.ElementType == typeof(Row)) + { + lastRow = 0; + LoadRows(s, numberingFormats, fills, borders, fonts, ws, sharedStrings, sharedFormulasR1C1, + styleList, (Row)reader.LoadCurrentElement()); + } + else if (reader.ElementType == typeof(AutoFilter)) + LoadAutoFilter((AutoFilter)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(SheetProtection)) + LoadSheetProtection((SheetProtection)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(DataValidations)) + LoadDataValidations((DataValidations)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(ConditionalFormatting)) + LoadConditionalFormatting((ConditionalFormatting)reader.LoadCurrentElement(), ws, differentialFormats); + else if (reader.ElementType == typeof(Hyperlinks)) + LoadHyperlinks((Hyperlinks)reader.LoadCurrentElement(), wsPart, ws); + else if (reader.ElementType == typeof(PrintOptions)) + LoadPrintOptions((PrintOptions)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(PageMargins)) + LoadPageMargins((PageMargins)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(PageSetup)) + LoadPageSetup((PageSetup)reader.LoadCurrentElement(), ws, pageSetupProperties); + else if (reader.ElementType == typeof(HeaderFooter)) + LoadHeaderFooter((HeaderFooter)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(SheetProperties)) + LoadSheetProperties((SheetProperties)reader.LoadCurrentElement(), ws, out pageSetupProperties); + else if (reader.ElementType == typeof(RowBreaks)) + LoadRowBreaks((RowBreaks)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(ColumnBreaks)) + LoadColumnBreaks((ColumnBreaks)reader.LoadCurrentElement(), ws); + else if (reader.ElementType == typeof(LegacyDrawing)) + ws.LegacyDrawingId = (reader.LoadCurrentElement() as LegacyDrawing).Id.Value; + } + reader.Close(); + } + + #region LoadTables + + foreach (TableDefinitionPart tablePart in wsPart.TableDefinitionParts) + { + var dTable = tablePart.Table; + string reference = dTable.Reference.Value; + XLTable xlTable = ws.Range(reference).CreateTable(dTable.Name, false) as XLTable; + if (dTable.HeaderRowCount != null && dTable.HeaderRowCount == 0) + { + xlTable._showHeaderRow = false; + //foreach (var tableColumn in dTable.TableColumns.Cast()) + xlTable.AddFields(dTable.TableColumns.Cast().Select(t => GetTableColumnName(t.Name.Value))); + } + else + { + xlTable.InitializeAutoFilter(); + } + + if (dTable.TotalsRowCount != null && dTable.TotalsRowCount.Value > 0) + ((XLTable)xlTable)._showTotalsRow = true; + + if (dTable.TableStyleInfo != null) + { + if (dTable.TableStyleInfo.ShowFirstColumn != null) + xlTable.EmphasizeFirstColumn = dTable.TableStyleInfo.ShowFirstColumn.Value; + if (dTable.TableStyleInfo.ShowLastColumn != null) + xlTable.EmphasizeLastColumn = dTable.TableStyleInfo.ShowLastColumn.Value; + if (dTable.TableStyleInfo.ShowRowStripes != null) + xlTable.ShowRowStripes = dTable.TableStyleInfo.ShowRowStripes.Value; + if (dTable.TableStyleInfo.ShowColumnStripes != null) + xlTable.ShowColumnStripes = dTable.TableStyleInfo.ShowColumnStripes.Value; + if (dTable.TableStyleInfo.Name != null) + { + var theme = XLTableTheme.FromName(dTable.TableStyleInfo.Name.Value); + if (theme != null) + xlTable.Theme = theme; + else + xlTable.Theme = new XLTableTheme(dTable.TableStyleInfo.Name.Value); + } + else + xlTable.Theme = XLTableTheme.None; + } + + if (dTable.AutoFilter != null) + { + xlTable.ShowAutoFilter = true; + LoadAutoFilterColumns(dTable.AutoFilter, (xlTable as XLTable).AutoFilter); + } + else + xlTable.ShowAutoFilter = false; + + if (xlTable.ShowTotalsRow) + { + foreach (var tableColumn in dTable.TableColumns.Cast()) + { + var tableColumnName = GetTableColumnName(tableColumn.Name.Value); + if (tableColumn.TotalsRowFunction != null) + xlTable.Field(tableColumnName).TotalsRowFunction = + tableColumn.TotalsRowFunction.Value.ToClosedXml(); + + if (tableColumn.TotalsRowFormula != null) + xlTable.Field(tableColumnName).TotalsRowFormulaA1 = + tableColumn.TotalsRowFormula.Text; + + if (tableColumn.TotalsRowLabel != null) + xlTable.Field(tableColumnName).TotalsRowLabel = tableColumn.TotalsRowLabel.Value; + } + if (xlTable.AutoFilter != null) + xlTable.AutoFilter.Range = xlTable.Worksheet.Range( + xlTable.RangeAddress.FirstAddress.RowNumber, xlTable.RangeAddress.FirstAddress.ColumnNumber, + xlTable.RangeAddress.LastAddress.RowNumber - 1, xlTable.RangeAddress.LastAddress.ColumnNumber); + } + else if (xlTable.AutoFilter != null) + xlTable.AutoFilter.Range = xlTable.Worksheet.Range(xlTable.RangeAddress); + } + + #endregion + + LoadDrawings(wsPart, ws); + + #region LoadComments + + if (wsPart.WorksheetCommentsPart != null) + { + var root = wsPart.WorksheetCommentsPart.Comments; + var authors = root.GetFirstChild().ChildElements; + var comments = root.GetFirstChild().ChildElements; + + // **** MAYBE FUTURE SHAPE SIZE SUPPORT + XDocument xdoc = GetCommentVmlFile(wsPart); + + foreach (Comment c in comments) + { + // find cell by reference + var cell = ws.Cell(c.Reference); + + XLComment xlComment = cell.Comment as XLComment; + xlComment.Author = authors[(int)c.AuthorId.Value].InnerText; + //xlComment.ShapeId = (Int32)c.ShapeId.Value; + //ShapeIdManager.Add(xlComment.ShapeId); + + var runs = c.GetFirstChild().Elements(); + foreach (Run run in runs) + { + var runProperties = run.RunProperties; + String text = run.Text.InnerText.FixNewLines(); + var rt = cell.Comment.AddText(text); + LoadFont(runProperties, rt); + } + + XElement shape = GetCommentShape(xdoc); + + LoadShapeProperties(xlComment, shape); + + var clientData = shape.Elements().First(e => e.Name.LocalName == "ClientData"); + LoadClientData(xlComment, clientData); + + var textBox = shape.Elements().First(e => e.Name.LocalName == "textbox"); + LoadTextBox(xlComment, textBox); + + var alt = shape.Attribute("alt"); + if (alt != null) xlComment.Style.Web.SetAlternateText(alt.Value); + + LoadColorsAndLines(xlComment, shape); + + //var insetmode = (string)shape.Attributes().First(a=> a.Name.LocalName == "insetmode"); + //xlComment.Style.Margins.Automatic = insetmode != null && insetmode.Equals("auto"); + + shape.Remove(); + } + } + + #endregion + } + + var workbook = dSpreadsheet.WorkbookPart.Workbook; + + var bookViews = workbook.BookViews; + if (bookViews != null && bookViews.Any()) + { + var workbookView = bookViews.First() as WorkbookView; + if (workbookView != null && workbookView.ActiveTab != null) + { + UnsupportedSheet unsupportedSheet = + UnsupportedSheets.FirstOrDefault(us => us.Position == (Int32)(workbookView.ActiveTab.Value + 1)); + if (unsupportedSheet != null) + unsupportedSheet.IsActive = true; + else + { + Worksheet((Int32)(workbookView.ActiveTab.Value + 1)).SetTabActive(); + } + } + } + LoadDefinedNames(workbook); + + #region Pivot tables + + // Delay loading of pivot tables until all sheets have been loaded + foreach (Sheet dSheet in sheets.OfType()) + { + var wsPart = dSpreadsheet.WorkbookPart.GetPartById(dSheet.Id) as WorksheetPart; + + if (wsPart != null) + { + var ws = (XLWorksheet)WorksheetsInternal.Worksheet(dSheet.Name); + + foreach (var pivotTablePart in wsPart.PivotTableParts) + { + var pivotTableCacheDefinitionPart = pivotTablePart.PivotTableCacheDefinitionPart; + var pivotTableDefinition = pivotTablePart.PivotTableDefinition; + + var target = ws.FirstCell(); + if (pivotTableDefinition.Location != null && pivotTableDefinition.Location.Reference != null && pivotTableDefinition.Location.Reference.HasValue) + { + target = ws.Range(pivotTableDefinition.Location.Reference.Value).FirstCell(); + } + + IXLRange source = null; + if (pivotTableCacheDefinitionPart.PivotCacheDefinition != null + && pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheSource != null + && pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheSource.WorksheetSource != null) + { + // TODO: Implement other sources besides worksheetSource (e.g. Table source?) + // But for now assume names and references point directly to a range + var wss = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheSource.WorksheetSource; + string rangeAddress = string.Empty; + if (wss.Name != null) + rangeAddress = wss.Name.Value; + else + { + var sourceSheet = wss.Sheet == null ? ws : this.Worksheet(wss.Sheet.Value); + rangeAddress = sourceSheet.Range(wss.Reference.Value).RangeAddress.ToStringRelative(true); + } + + source = this.Range(rangeAddress); + if (source == null) + continue; + } + + if (target != null && source != null) + { + var pt = ws.PivotTables.AddNew(pivotTableDefinition.Name, target, source) as XLPivotTable; + pt.RelId = wsPart.GetIdOfPart(pivotTablePart); + pt.CacheDefinitionRelId = pivotTablePart.GetIdOfPart(pivotTableCacheDefinitionPart); + pt.WorkbookCacheRelId = dSpreadsheet.WorkbookPart.GetIdOfPart(pivotTableCacheDefinitionPart); + + if (pivotTableDefinition.MergeItem != null) pt.MergeAndCenterWithLabels = pivotTableDefinition.MergeItem.Value; + if (pivotTableDefinition.Indent != null) pt.RowLabelIndent = (int)pivotTableDefinition.Indent.Value; + if (pivotTableDefinition.PageOverThenDown != null) pt.FilterAreaOrder = pivotTableDefinition.PageOverThenDown.Value ? XLFilterAreaOrder.OverThenDown : XLFilterAreaOrder.DownThenOver; + if (pivotTableDefinition.PageWrap != null) pt.FilterFieldsPageWrap = (int)pivotTableDefinition.PageWrap.Value; + if (pivotTableDefinition.UseAutoFormatting != null) pt.AutofitColumns = pivotTableDefinition.UseAutoFormatting.Value; + if (pivotTableDefinition.PreserveFormatting != null) pt.PreserveCellFormatting = pivotTableDefinition.PreserveFormatting.Value; + if (pivotTableDefinition.RowGrandTotals != null) pt.ShowGrandTotalsRows = pivotTableDefinition.RowGrandTotals.Value; + if (pivotTableDefinition.ColumnGrandTotals != null) pt.ShowGrandTotalsColumns = pivotTableDefinition.ColumnGrandTotals.Value; + if (pivotTableDefinition.SubtotalHiddenItems != null) pt.FilteredItemsInSubtotals = pivotTableDefinition.SubtotalHiddenItems.Value; + if (pivotTableDefinition.MultipleFieldFilters != null) pt.AllowMultipleFilters = pivotTableDefinition.MultipleFieldFilters.Value; + if (pivotTableDefinition.CustomListSort != null) pt.UseCustomListsForSorting = pivotTableDefinition.CustomListSort.Value; + if (pivotTableDefinition.ShowDrill != null) pt.ShowExpandCollapseButtons = pivotTableDefinition.ShowDrill.Value; + if (pivotTableDefinition.ShowDataTips != null) pt.ShowContextualTooltips = pivotTableDefinition.ShowDataTips.Value; + if (pivotTableDefinition.ShowMemberPropertyTips != null) pt.ShowPropertiesInTooltips = pivotTableDefinition.ShowMemberPropertyTips.Value; + if (pivotTableDefinition.ShowHeaders != null) pt.DisplayCaptionsAndDropdowns = pivotTableDefinition.ShowHeaders.Value; + if (pivotTableDefinition.GridDropZones != null) pt.ClassicPivotTableLayout = pivotTableDefinition.GridDropZones.Value; + if (pivotTableDefinition.ShowEmptyRow != null) pt.ShowEmptyItemsOnRows = pivotTableDefinition.ShowEmptyRow.Value; + if (pivotTableDefinition.ShowEmptyColumn != null) pt.ShowEmptyItemsOnColumns = pivotTableDefinition.ShowEmptyColumn.Value; + if (pivotTableDefinition.ShowItems != null) pt.DisplayItemLabels = pivotTableDefinition.ShowItems.Value; + if (pivotTableDefinition.FieldListSortAscending != null) pt.SortFieldsAtoZ = pivotTableDefinition.FieldListSortAscending.Value; + if (pivotTableDefinition.PrintDrill != null) pt.PrintExpandCollapsedButtons = pivotTableDefinition.PrintDrill.Value; + if (pivotTableDefinition.ItemPrintTitles != null) pt.RepeatRowLabels = pivotTableDefinition.ItemPrintTitles.Value; + if (pivotTableDefinition.FieldPrintTitles != null) pt.PrintTitles = pivotTableDefinition.FieldPrintTitles.Value; + if (pivotTableDefinition.EnableDrill != null) pt.EnableShowDetails = pivotTableDefinition.EnableDrill.Value; + + if (pivotTableDefinition.ShowMissing != null && pivotTableDefinition.MissingCaption != null) + pt.EmptyCellReplacement = pivotTableDefinition.MissingCaption.Value; + + if (pivotTableDefinition.ShowError != null && pivotTableDefinition.ErrorCaption != null) + pt.ErrorValueReplacement = pivotTableDefinition.ErrorCaption.Value; + + // Row labels + if (pivotTableDefinition.RowFields != null) + { + foreach (var rf in pivotTableDefinition.RowFields.Cast()) + { + if (rf.Index < pivotTableDefinition.PivotFields.Count) + { + IXLPivotField pivotField = null; + if (rf.Index.Value == -2) + pivotField = pt.RowLabels.Add(XLConstants.PivotTableValuesSentinalLabel); + else + { + var pf = pivotTableDefinition.PivotFields.ElementAt(rf.Index.Value) as PivotField; + if (pf == null) + continue; + + var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt(rf.Index.Value) as CacheField; + if (pf.Name != null) + pivotField = pt.RowLabels.Add(pf.Name.Value); + else if (cacheField.Name != null) + pivotField = pt.RowLabels.Add(cacheField.Name.Value); + else + continue; + + if (pivotField != null) + { + var items = pf.Items.OfType().Where(i => i.Index != null && i.Index.HasValue); + if (!items.Any(i => i.HideDetails == null || BooleanValue.ToBoolean(i.HideDetails))) + pivotField.SetCollapsed(); + } + } + } + } + } + + // Column labels + if (pivotTableDefinition.ColumnFields != null) + { + foreach (var cf in pivotTableDefinition.ColumnFields.Cast()) + { + IXLPivotField pivotField = null; + if (cf.Index.Value == -2) + pivotField = pt.ColumnLabels.Add(XLConstants.PivotTableValuesSentinalLabel); + else if (cf.Index < pivotTableDefinition.PivotFields.Count) + { + var pf = pivotTableDefinition.PivotFields.ElementAt(cf.Index.Value) as PivotField; + if (pf == null) + continue; + + var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt(cf.Index.Value) as CacheField; + if (pf.Name != null) + pivotField = pt.ColumnLabels.Add(pf.Name.Value); + else if (cacheField.Name != null) + pivotField = pt.ColumnLabels.Add(cacheField.Name.Value); + else + continue; + + if (pivotField != null) + { + var items = pf.Items.OfType().Where(i => i.Index != null && i.Index.HasValue); + if (!items.Any(i => i.HideDetails == null || BooleanValue.ToBoolean(i.HideDetails))) + pivotField.SetCollapsed(); + } + } + } + } + + // Values + if (pivotTableDefinition.DataFields != null) + { + foreach (var df in pivotTableDefinition.DataFields.Cast()) + { + IXLPivotValue pivotValue = null; + if ((int)df.Field.Value == -2) + pivotValue = pt.Values.Add(XLConstants.PivotTableValuesSentinalLabel); + else if (df.Field.Value < pivotTableDefinition.PivotFields.Count) + { + var pf = pivotTableDefinition.PivotFields.ElementAt((int)df.Field.Value) as PivotField; + if (pf == null) + continue; + + var cacheField = pivotTableCacheDefinitionPart.PivotCacheDefinition.CacheFields.ElementAt((int)df.Field.Value) as CacheField; + + if (pf.Name != null) + pivotValue = pt.Values.Add(pf.Name.Value, df.Name.Value); + else if (cacheField.Name != null) + pivotValue = pt.Values.Add(cacheField.Name.Value, df.Name.Value); + else + continue; + + if (df.NumberFormatId != null) pivotValue.NumberFormat.SetNumberFormatId((int)df.NumberFormatId.Value); + if (df.Subtotal != null) pivotValue = pivotValue.SetSummaryFormula(df.Subtotal.Value.ToClosedXml()); + if (df.ShowDataAs != null) + { + var calculation = pivotValue.Calculation; + calculation = df.ShowDataAs.Value.ToClosedXml(); + pivotValue = pivotValue.SetCalculation(calculation); + } + + if (df.BaseField != null) + { + var col = pt.SourceRange.Column(df.BaseField.Value + 1); + + var items = col.CellsUsed() + .Select(c => c.Value) + .Skip(1) // Skip header column + .Distinct().ToList(); + + pivotValue.BaseField = col.FirstCell().GetValue(); + if (df.BaseItem != null) pivotValue.BaseItem = items[(int)df.BaseItem.Value].ToString(); + } + } + } + } + } + } + } + } + + #endregion + } + + private void LoadDrawings(WorksheetPart wsPart, IXLWorksheet ws) + { + if (wsPart.DrawingsPart != null) + { + var drawingsPart = wsPart.DrawingsPart; + + foreach (var anchor in drawingsPart.WorksheetDrawing.ChildElements) + { + var imgId = GetImageRelIdFromAnchor(anchor); + var imagePart = drawingsPart.GetPartById(imgId); + using (var stream = imagePart.GetStream()) + { + var vsdp = GetPropertiesFromAnchor(anchor); + + var picture = ws.AddPicture(stream, vsdp.Name) as XLPicture; + picture.RelId = imgId; + + Xdr.ShapeProperties spPr = anchor.Descendants().First(); + picture.Placement = XLPicturePlacement.FreeFloating; + picture.Width = ConvertFromEnglishMetricUnits(spPr.Transform2D.Extents.Cx, GraphicsUtils.Graphics.DpiX); + picture.Height = ConvertFromEnglishMetricUnits(spPr.Transform2D.Extents.Cy, GraphicsUtils.Graphics.DpiY); + + if (anchor is Xdr.AbsoluteAnchor) + { + var absoluteAnchor = anchor as Xdr.AbsoluteAnchor; + picture.MoveTo( + ConvertFromEnglishMetricUnits(absoluteAnchor.Position.X.Value, GraphicsUtils.Graphics.DpiX), + ConvertFromEnglishMetricUnits(absoluteAnchor.Position.Y.Value, GraphicsUtils.Graphics.DpiY) + ); + } + else if (anchor is Xdr.OneCellAnchor) + { + var oneCellAnchor = anchor as Xdr.OneCellAnchor; + var from = LoadMarker(ws, oneCellAnchor.FromMarker); + picture.MoveTo(from.Address, from.Offset); + } + else if (anchor is Xdr.TwoCellAnchor) + { + var twoCellAnchor = anchor as Xdr.TwoCellAnchor; + var from = LoadMarker(ws, twoCellAnchor.FromMarker); + var to = LoadMarker(ws, twoCellAnchor.ToMarker); + + if (twoCellAnchor.EditAs == null || !twoCellAnchor.EditAs.HasValue || twoCellAnchor.EditAs.Value == Xdr.EditAsValues.TwoCell) + { + picture.MoveTo(from.Address, from.Offset, to.Address, to.Offset); + } + else if (twoCellAnchor.EditAs.Value == Xdr.EditAsValues.Absolute) + { + var shapeProperties = twoCellAnchor.Descendants().FirstOrDefault(); + if (shapeProperties != null) + { + picture.MoveTo( + ConvertFromEnglishMetricUnits(spPr.Transform2D.Offset.X, GraphicsUtils.Graphics.DpiX), + ConvertFromEnglishMetricUnits(spPr.Transform2D.Offset.Y, GraphicsUtils.Graphics.DpiY) + ); + } + } + else if (twoCellAnchor.EditAs.Value == Xdr.EditAsValues.OneCell) + { + picture.MoveTo(from.Address, from.Offset); + } + } + } + } + } + } + + private static Int32 ConvertFromEnglishMetricUnits(long emu, float resolution) + { + return Convert.ToInt32(emu * resolution / 914400); + } + + private static IXLMarker LoadMarker(IXLWorksheet ws, Xdr.MarkerType marker) + { + return new XLMarker( + ws.Cell(Convert.ToInt32(marker.RowId.InnerText) + 1, Convert.ToInt32(marker.ColumnId.InnerText) + 1).Address, + new Point( + ConvertFromEnglishMetricUnits(Convert.ToInt32(marker.ColumnOffset.InnerText), GraphicsUtils.Graphics.DpiX), + ConvertFromEnglishMetricUnits(Convert.ToInt32(marker.RowOffset.InnerText), GraphicsUtils.Graphics.DpiY) + ) + ); + } + + #region Comment Helpers + + private XDocument GetCommentVmlFile(WorksheetPart wsPart) + { + XDocument xdoc = null; + + foreach (var vmlPart in wsPart.VmlDrawingParts) + { + xdoc = XDocumentExtensions.Load(vmlPart.GetStream(FileMode.Open)); + + //Probe for comments + if (xdoc.Root == null) continue; + var shape = GetCommentShape(xdoc); + if (shape != null) break; + } + + if (xdoc == null) throw new Exception("Could not load comments file"); + return xdoc; + } + + private static XElement GetCommentShape(XDocument xdoc) + { + var xml = xdoc.Root.Element("xml"); + + XElement shape; + if (xml != null) + shape = + xml.Elements().FirstOrDefault(e => (string)e.Attribute("type") == XLConstants.Comment.ShapeTypeId); + else + shape = xdoc.Root.Elements().FirstOrDefault(e => + (string)e.Attribute("type") == + XLConstants.Comment.ShapeTypeId || + (string)e.Attribute("type") == + XLConstants.Comment.AlternateShapeTypeId); + return shape; + } + + #endregion + + private String GetTableColumnName(string name) + { + return name.Replace("_x000a_", Environment.NewLine).Replace("_x005f_x000a_", "_x000a_"); + } + + // This may be part of XLHelper or XLColor + // Leaving it here for now. Can't decide what to call it and where to put it. + private XLColor ExtractColor(String color) + { + if (color.IndexOf("[") >= 0) + { + int start = color.IndexOf("[") + 1; + int end = color.IndexOf("]", start); + return XLColor.FromIndex(Int32.Parse(color.Substring(start, end - start))); + } + else + { + return XLColor.FromHtml(color); + } + } + + private void LoadColorsAndLines(IXLDrawing drawing, XElement shape) + { + var strokeColor = shape.Attribute("strokecolor"); + if (strokeColor != null) drawing.Style.ColorsAndLines.LineColor = ExtractColor(strokeColor.Value); + + var strokeWeight = shape.Attribute("strokeweight"); + if (strokeWeight != null) + drawing.Style.ColorsAndLines.LineWeight = GetPtValue(strokeWeight.Value); + + var fillColor = shape.Attribute("fillcolor"); + if (fillColor != null && !fillColor.Value.ToLower().Contains("infobackground")) drawing.Style.ColorsAndLines.FillColor = ExtractColor(fillColor.Value); + + var fill = shape.Elements().FirstOrDefault(e => e.Name.LocalName == "fill"); + if (fill != null) + { + var opacity = fill.Attribute("opacity"); + if (opacity != null) + { + String opacityVal = opacity.Value; + if (opacityVal.EndsWith("f")) + drawing.Style.ColorsAndLines.FillTransparency = + Double.Parse(opacityVal.Substring(0, opacityVal.Length - 1), CultureInfo.InvariantCulture) / 65536.0; + else + drawing.Style.ColorsAndLines.FillTransparency = Double.Parse(opacityVal, CultureInfo.InvariantCulture); + } + } + + var stroke = shape.Elements().FirstOrDefault(e => e.Name.LocalName == "stroke"); + if (stroke != null) + { + var opacity = stroke.Attribute("opacity"); + if (opacity != null) + { + String opacityVal = opacity.Value; + if (opacityVal.EndsWith("f")) + drawing.Style.ColorsAndLines.LineTransparency = + Double.Parse(opacityVal.Substring(0, opacityVal.Length - 1), CultureInfo.InvariantCulture) / 65536.0; + else + drawing.Style.ColorsAndLines.LineTransparency = Double.Parse(opacityVal, CultureInfo.InvariantCulture); + } + + var dashStyle = stroke.Attribute("dashstyle"); + if (dashStyle != null) + { + String dashStyleVal = dashStyle.Value.ToLower(); + if (dashStyleVal == "1 1" || dashStyleVal == "shortdot") + { + var endCap = stroke.Attribute("endcap"); + if (endCap != null && endCap.Value == "round") + drawing.Style.ColorsAndLines.LineDash = XLDashStyle.RoundDot; + else + drawing.Style.ColorsAndLines.LineDash = XLDashStyle.SquareDot; + } + else + { + switch (dashStyleVal) + { + case "dash": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.Dash; break; + case "dashdot": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.DashDot; break; + case "longdash": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.LongDash; break; + case "longdashdot": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.LongDashDot; break; + case "longdashdotdot": drawing.Style.ColorsAndLines.LineDash = XLDashStyle.LongDashDotDot; break; + } + } + } + + var lineStyle = stroke.Attribute("linestyle"); + if (lineStyle != null) + { + String lineStyleVal = lineStyle.Value.ToLower(); + switch (lineStyleVal) + { + case "single": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.Single; break; + case "thickbetweenthin": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThickBetweenThin; break; + case "thickthin": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThickThin; break; + case "thinthick": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThinThick; break; + case "thinthin": drawing.Style.ColorsAndLines.LineStyle = XLLineStyle.ThinThin; break; + } + } + } + } + + private void LoadTextBox(IXLDrawing xlDrawing, XElement textBox) + { + var attStyle = textBox.Attribute("style"); + if (attStyle != null) LoadTextBoxStyle(xlDrawing, attStyle); + + var attInset = textBox.Attribute("inset"); + if (attInset != null) LoadTextBoxInset(xlDrawing, attInset); + } + + private void LoadTextBoxInset(IXLDrawing xlDrawing, XAttribute attInset) + { + var split = attInset.Value.Split(','); + xlDrawing.Style.Margins.Left = GetInsetValue(split[0]); + xlDrawing.Style.Margins.Top = GetInsetValue(split[1]); + xlDrawing.Style.Margins.Right = GetInsetValue(split[2]); + xlDrawing.Style.Margins.Bottom = GetInsetValue(split[3]); + } + + private double GetInsetValue(string value) + { + String v = value.Trim(); + if (v.EndsWith("pt")) + return Double.Parse(v.Substring(0, v.Length - 2), CultureInfo.InvariantCulture) / 72.0; + else + return Double.Parse(v.Substring(0, v.Length - 2), CultureInfo.InvariantCulture); + } + + private static void LoadTextBoxStyle(IXLDrawing xlDrawing, XAttribute attStyle) + { + var style = attStyle.Value; + var attributes = style.Split(';'); + foreach (String pair in attributes) + { + var split = pair.Split(':'); + if (split.Length != 2) continue; + + var attribute = split[0].Trim().ToLower(); + var value = split[1].Trim(); + Boolean isVertical = false; + switch (attribute) + { + case "mso-fit-shape-to-text": xlDrawing.Style.Size.SetAutomaticSize(value.Equals("t")); break; + case "mso-layout-flow-alt": + if (value.Equals("bottom-to-top")) xlDrawing.Style.Alignment.SetOrientation(XLDrawingTextOrientation.BottomToTop); + else if (value.Equals("top-to-bottom")) xlDrawing.Style.Alignment.SetOrientation(XLDrawingTextOrientation.Vertical); + break; + + case "layout-flow": isVertical = value.Equals("vertical"); break; + case "mso-direction-alt": if (value == "auto") xlDrawing.Style.Alignment.Direction = XLDrawingTextDirection.Context; break; + case "direction": if (value == "RTL") xlDrawing.Style.Alignment.Direction = XLDrawingTextDirection.RightToLeft; break; + } + if (isVertical && xlDrawing.Style.Alignment.Orientation == XLDrawingTextOrientation.LeftToRight) + xlDrawing.Style.Alignment.Orientation = XLDrawingTextOrientation.TopToBottom; + } + } + + private void LoadClientData(IXLDrawing drawing, XElement clientData) + { + var anchor = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "Anchor"); + if (anchor != null) LoadClientDataAnchor(drawing, anchor); + + LoadDrawingPositioning(drawing, clientData); + LoadDrawingProtection(drawing, clientData); + + var visible = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "Visible"); + drawing.Visible = visible != null && visible.Value.ToLower().StartsWith("t"); + + LoadDrawingHAlignment(drawing, clientData); + LoadDrawingVAlignment(drawing, clientData); + } + + private void LoadDrawingHAlignment(IXLDrawing drawing, XElement clientData) + { + var textHAlign = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "TextHAlign"); + if (textHAlign != null) + drawing.Style.Alignment.Horizontal = (XLDrawingHorizontalAlignment)Enum.Parse(typeof(XLDrawingHorizontalAlignment), textHAlign.Value.ToProper()); + } + + private void LoadDrawingVAlignment(IXLDrawing drawing, XElement clientData) + { + var textVAlign = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "TextVAlign"); + if (textVAlign != null) + drawing.Style.Alignment.Vertical = (XLDrawingVerticalAlignment)Enum.Parse(typeof(XLDrawingVerticalAlignment), textVAlign.Value.ToProper()); + } + + private void LoadDrawingProtection(IXLDrawing drawing, XElement clientData) + { + var lockedElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "Locked"); + var lockTextElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "LockText"); + Boolean locked = lockedElement != null && lockedElement.Value.ToLower() == "true"; + Boolean lockText = lockTextElement != null && lockTextElement.Value.ToLower() == "true"; + drawing.Style.Protection.Locked = locked; + drawing.Style.Protection.LockText = lockText; + } + + private static void LoadDrawingPositioning(IXLDrawing drawing, XElement clientData) + { + var moveWithCellsElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "MoveWithCells"); + var sizeWithCellsElement = clientData.Elements().FirstOrDefault(e => e.Name.LocalName == "SizeWithCells"); + Boolean moveWithCells = !(moveWithCellsElement != null && moveWithCellsElement.Value.ToLower() == "true"); + Boolean sizeWithCells = !(sizeWithCellsElement != null && sizeWithCellsElement.Value.ToLower() == "true"); + if (moveWithCells && !sizeWithCells) + drawing.Style.Properties.Positioning = XLDrawingAnchor.MoveWithCells; + else if (moveWithCells && sizeWithCells) + drawing.Style.Properties.Positioning = XLDrawingAnchor.MoveAndSizeWithCells; + else + drawing.Style.Properties.Positioning = XLDrawingAnchor.Absolute; + } + + private static void LoadClientDataAnchor(IXLDrawing drawing, XElement anchor) + { + var location = anchor.Value.Split(','); + drawing.Position.Column = int.Parse(location[0]) + 1; + drawing.Position.ColumnOffset = Double.Parse(location[1], CultureInfo.InvariantCulture) / 7.2; + drawing.Position.Row = int.Parse(location[2]) + 1; + drawing.Position.RowOffset = Double.Parse(location[3], CultureInfo.InvariantCulture); + } + + private void LoadShapeProperties(IXLDrawing xlDrawing, XElement shape) + { + var attStyle = shape.Attribute("style"); + if (attStyle == null) return; + + var style = attStyle.Value; + var attributes = style.Split(';'); + foreach (String pair in attributes) + { + var split = pair.Split(':'); + if (split.Length != 2) continue; + + var attribute = split[0].Trim().ToLower(); + var value = split[1].Trim(); + + switch (attribute) + { + case "visibility": xlDrawing.Visible = value.ToLower().Equals("visible"); break; + case "width": xlDrawing.Style.Size.Width = GetPtValue(value) / 7.5; break; + case "height": xlDrawing.Style.Size.Height = GetPtValue(value); break; + case "z-index": xlDrawing.ZOrder = Int32.Parse(value); break; + } + } + } + + private readonly Dictionary knownUnits = new Dictionary + { + {"pt", 1.0}, + {"in", 72.0}, + {"mm", 72.0/25.4} + }; + + private double GetPtValue(string value) + { + var knownUnit = knownUnits.FirstOrDefault(ku => value.Contains(ku.Key)); + + if (knownUnit.Key == null) + return Double.Parse(value); + + return Double.Parse(value.Replace(knownUnit.Key, String.Empty), CultureInfo.InvariantCulture) * knownUnit.Value; + } + + private void LoadDefinedNames(Workbook workbook) + { + if (workbook.DefinedNames == null) return; + + foreach (var definedName in workbook.DefinedNames.OfType()) + { + var name = definedName.Name; + var visible = true; + if (definedName.Hidden != null) visible = !BooleanValue.ToBoolean(definedName.Hidden); + if (name == "_xlnm.Print_Area") + { + var fixedNames = validateDefinedNames(definedName.Text.Split(',')); + foreach (string area in fixedNames) + { + if (area.Contains("[")) + { + var ws = Worksheets.FirstOrDefault(w => (w as XLWorksheet).SheetId == definedName.LocalSheetId + 1); + if (ws != null) + { + ws.PageSetup.PrintAreas.Add(area); + } + } + else + { + string sheetName, sheetArea; + ParseReference(area, out sheetName, out sheetArea); + if (!(sheetArea.Equals("#REF") || sheetArea.EndsWith("#REF!") || sheetArea.Length == 0)) + WorksheetsInternal.Worksheet(sheetName).PageSetup.PrintAreas.Add(sheetArea); + } + } + } + else if (name == "_xlnm.Print_Titles") + { + LoadPrintTitles(definedName); + } + else + { + string text = definedName.Text; + + if (!(text.Equals("#REF") || text.EndsWith("#REF!"))) + { + var localSheetId = definedName.LocalSheetId; + var comment = definedName.Comment; + if (localSheetId == null) + { + if (!NamedRanges.Any(nr => nr.Name == name)) + NamedRanges.Add(name, text, comment).Visible = visible; + } + else + { + if (!Worksheet(Int32.Parse(localSheetId) + 1).NamedRanges.Any(nr => nr.Name == name)) + Worksheet(Int32.Parse(localSheetId) + 1).NamedRanges.Add(name, text, comment).Visible = visible; + } + } + } + } + } + + private static Regex definedNameRegex = new Regex(@"\A'.*'!.*\z", RegexOptions.Compiled); + + private IEnumerable validateDefinedNames(IEnumerable definedNames) + { + var fixedNames = new List(); + var sb = new StringBuilder(); + foreach (string testName in definedNames) + { + if (sb.Length > 0) + sb.Append(','); + + sb.Append(testName); + + Match matchedValidPattern = definedNameRegex.Match(sb.ToString()); + if (matchedValidPattern.Success) + { + yield return sb.ToString(); + sb = new StringBuilder(); + } + } + + if (sb.Length > 0) + yield return sb.ToString(); + } + + private void LoadPrintTitles(DefinedName definedName) + { + var areas = validateDefinedNames(definedName.Text.Split(',')); + foreach (var item in areas) + { + if (this.Range(item) != null) + SetColumnsOrRowsToRepeat(item); + } + } + + private void SetColumnsOrRowsToRepeat(string area) + { + string sheetName, sheetArea; + ParseReference(area, out sheetName, out sheetArea); + if (sheetArea.Equals("#REF")) return; + if (IsColReference(sheetArea)) + WorksheetsInternal.Worksheet(sheetName).PageSetup.SetColumnsToRepeatAtLeft(sheetArea); + if (IsRowReference(sheetArea)) + WorksheetsInternal.Worksheet(sheetName).PageSetup.SetRowsToRepeatAtTop(sheetArea); + } + + // either $A:$X => true or $1:$99 => false + private static bool IsColReference(string sheetArea) + { + char c = sheetArea[0] == '$' ? sheetArea[1] : sheetArea[0]; + return char.IsLetter(c); + } + + private static bool IsRowReference(string sheetArea) + { + char c = sheetArea[0] == '$' ? sheetArea[1] : sheetArea[0]; + return char.IsNumber(c); + } + + private static void ParseReference(string item, out string sheetName, out string sheetArea) + { + var sections = item.Trim().Split('!'); + sheetName = sections[0].Replace("\'", ""); + sheetArea = sections[1]; + } + + private Int32 lastCell; + + private void LoadCells(SharedStringItem[] sharedStrings, Stylesheet s, NumberingFormats numberingFormats, + Fills fills, Borders borders, Fonts fonts, Dictionary sharedFormulasR1C1, + XLWorksheet ws, Dictionary styleList, Cell cell, Int32 rowIndex) + { + Int32 styleIndex = cell.StyleIndex != null ? Int32.Parse(cell.StyleIndex.InnerText) : 0; + + String cellReference = cell.CellReference == null + ? XLHelper.GetColumnLetterFromNumber(++lastCell) + rowIndex + : cell.CellReference.Value; + var xlCell = ws.CellFast(cellReference); + + if (styleList.ContainsKey(styleIndex)) + { + xlCell.Style = styleList[styleIndex]; + } + else + { + ApplyStyle(xlCell, styleIndex, s, fills, borders, fonts, numberingFormats); + styleList.Add(styleIndex, xlCell.Style); + } + + if (cell.CellFormula != null && cell.CellFormula.SharedIndex != null && cell.CellFormula.Reference != null) + { + String formula; + if (cell.CellFormula.FormulaType != null && cell.CellFormula.FormulaType == CellFormulaValues.Array) + formula = "{" + cell.CellFormula.Text + "}"; + else + formula = cell.CellFormula.Text; + + if (cell.CellFormula.Reference != null) + xlCell.FormulaReference = ws.Range(cell.CellFormula.Reference.Value).RangeAddress; + + xlCell.FormulaA1 = formula; + sharedFormulasR1C1.Add(cell.CellFormula.SharedIndex.Value, xlCell.FormulaR1C1); + + if (cell.CellValue != null) + xlCell.ValueCached = cell.CellValue.Text; + } + else if (cell.CellFormula != null) + { + if (cell.CellFormula.SharedIndex != null) + xlCell.FormulaR1C1 = sharedFormulasR1C1[cell.CellFormula.SharedIndex.Value]; + else + { + String formula; + if (cell.CellFormula.FormulaType != null && cell.CellFormula.FormulaType == CellFormulaValues.Array) + formula = "{" + cell.CellFormula.Text + "}"; + else + formula = cell.CellFormula.Text; + + xlCell.FormulaA1 = formula; + } + + if (cell.CellFormula.Reference != null) + xlCell.FormulaReference = ws.Range(cell.CellFormula.Reference.Value).RangeAddress; + + if (cell.CellValue != null) + xlCell.ValueCached = cell.CellValue.Text; + } + else if (cell.DataType != null) + { + if (cell.DataType == CellValues.InlineString) + { + if (cell.InlineString != null) + { + if (cell.InlineString.Text != null) + xlCell._cellValue = cell.InlineString.Text.Text.FixNewLines(); + else + ParseCellValue(cell.InlineString, xlCell); + } + else + xlCell._cellValue = String.Empty; + + xlCell._dataType = XLCellValues.Text; + xlCell.ShareString = false; + } + else if (cell.DataType == CellValues.SharedString) + { + if (cell.CellValue != null && !XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text)) + { + var sharedString = sharedStrings[Int32.Parse(cell.CellValue.Text, XLHelper.NumberStyle, XLHelper.ParseCulture)]; + ParseCellValue(sharedString, xlCell); + } + else + xlCell._cellValue = String.Empty; + + xlCell._dataType = XLCellValues.Text; + } + else if (cell.DataType == CellValues.Date) + { + if (!XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text)) + xlCell._cellValue = Double.Parse(cell.CellValue.Text, XLHelper.NumberStyle, XLHelper.ParseCulture).ToInvariantString(); + xlCell._dataType = XLCellValues.DateTime; + } + else if (cell.DataType == CellValues.Boolean) + { + xlCell._cellValue = cell.CellValue.Text; + xlCell._dataType = XLCellValues.Boolean; + } + else if (cell.DataType == CellValues.Number) + { + if (!XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text)) + xlCell._cellValue = Double.Parse(cell.CellValue.Text, XLHelper.NumberStyle, XLHelper.ParseCulture).ToInvariantString(); + + if (s == null) + xlCell._dataType = XLCellValues.Number; + else + xlCell.DataType = GetDataTypeFromCell(xlCell.Style.NumberFormat); + } + } + else if (cell.CellValue != null) + { + if (s == null) + { + xlCell._dataType = XLCellValues.Number; + } + else + { + var numberFormatId = ((CellFormat)(s.CellFormats).ElementAt(styleIndex)).NumberFormatId; + if (!XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text)) + xlCell._cellValue = Double.Parse(cell.CellValue.Text, CultureInfo.InvariantCulture).ToInvariantString(); + + if (s.NumberingFormats != null && + s.NumberingFormats.Any(nf => ((NumberingFormat)nf).NumberFormatId.Value == numberFormatId)) + { + xlCell.Style.NumberFormat.Format = + ((NumberingFormat)s.NumberingFormats + .First( + nf => ((NumberingFormat)nf).NumberFormatId.Value == numberFormatId) + ).FormatCode.Value; + } + else + xlCell.Style.NumberFormat.NumberFormatId = Int32.Parse(numberFormatId); + + xlCell.DataType = GetDataTypeFromCell(xlCell.Style.NumberFormat); + } + } + } + + /// + /// Parses the cell value for normal or rich text + /// Input element should either be a shared string or inline string + /// + /// The element (either a shared string or inline string) + /// The cell. + private void ParseCellValue(RstType element, XLCell xlCell) + { + var runs = element.Elements(); + var phoneticRuns = element.Elements(); + var phoneticProperties = element.Elements(); + Boolean hasRuns = false; + foreach (Run run in runs) + { + var runProperties = run.RunProperties; + String text = run.Text.InnerText.FixNewLines(); + + if (runProperties == null) + xlCell.RichText.AddText(text, xlCell.Style.Font); + else + { + var rt = xlCell.RichText.AddText(text); + LoadFont(runProperties, rt); + } + if (!hasRuns) + hasRuns = true; + } + + if (!hasRuns) + xlCell._cellValue = XmlEncoder.DecodeString(element.Text.InnerText); + + #region Load PhoneticProperties + + var pp = phoneticProperties.FirstOrDefault(); + if (pp != null) + { + if (pp.Alignment != null) + xlCell.RichText.Phonetics.Alignment = pp.Alignment.Value.ToClosedXml(); + if (pp.Type != null) + xlCell.RichText.Phonetics.Type = pp.Type.Value.ToClosedXml(); + + LoadFont(pp, xlCell.RichText.Phonetics); + } + + #endregion + + #region Load Phonetic Runs + + foreach (PhoneticRun pr in phoneticRuns) + { + xlCell.RichText.Phonetics.Add(pr.Text.InnerText.FixNewLines(), (Int32)pr.BaseTextStartIndex.Value, + (Int32)pr.EndingBaseIndex.Value); + } + + #endregion + } + + private void LoadNumberFormat(NumberingFormat nfSource, IXLNumberFormat nf) + { + if (nfSource == null) return; + + if (nfSource.FormatCode != null) + nf.Format = nfSource.FormatCode.Value; + //if (nfSource.NumberFormatId != null) + // nf.NumberFormatId = (Int32)nfSource.NumberFormatId.Value; + } + + private void LoadBorder(Border borderSource, IXLBorder border) + { + if (borderSource == null) return; + + LoadBorderValues(borderSource.DiagonalBorder, border.SetDiagonalBorder, border.SetDiagonalBorderColor); + + if (borderSource.DiagonalUp != null) + border.DiagonalUp = borderSource.DiagonalUp.Value; + if (borderSource.DiagonalDown != null) + border.DiagonalDown = borderSource.DiagonalDown.Value; + + LoadBorderValues(borderSource.LeftBorder, border.SetLeftBorder, border.SetLeftBorderColor); + LoadBorderValues(borderSource.RightBorder, border.SetRightBorder, border.SetRightBorderColor); + LoadBorderValues(borderSource.TopBorder, border.SetTopBorder, border.SetTopBorderColor); + LoadBorderValues(borderSource.BottomBorder, border.SetBottomBorder, border.SetBottomBorderColor); + } + + private void LoadBorderValues(BorderPropertiesType source, Func setBorder, Func setColor) + { + if (source != null) + { + if (source.Style != null) + setBorder(source.Style.Value.ToClosedXml()); + if (source.Color != null) + setColor(GetColor(source.Color)); + } + } + + private void LoadFill(Fill fillSource, IXLFill fill) + { + if (fillSource == null) return; + + if (fillSource.PatternFill != null) + { + if (fillSource.PatternFill.PatternType != null) + fill.PatternType = fillSource.PatternFill.PatternType.Value.ToClosedXml(); + else + fill.PatternType = XLFillPatternValues.Solid; + + if (fillSource.PatternFill.ForegroundColor != null) + fill.PatternColor = GetColor(fillSource.PatternFill.ForegroundColor); + if (fillSource.PatternFill.BackgroundColor != null) + fill.PatternBackgroundColor = GetColor(fillSource.PatternFill.BackgroundColor); + } + } + + private void LoadFont(OpenXmlElement fontSource, IXLFontBase fontBase) + { + if (fontSource == null) return; + + fontBase.Bold = GetBoolean(fontSource.Elements().FirstOrDefault()); + var fontColor = GetColor(fontSource.Elements().FirstOrDefault()); + if (fontColor.HasValue) + fontBase.FontColor = fontColor; + + var fontFamilyNumbering = + fontSource.Elements().FirstOrDefault(); + if (fontFamilyNumbering != null && fontFamilyNumbering.Val != null) + fontBase.FontFamilyNumbering = + (XLFontFamilyNumberingValues)Int32.Parse(fontFamilyNumbering.Val.ToString()); + var runFont = fontSource.Elements().FirstOrDefault(); + if (runFont != null) + { + if (runFont.Val != null) + fontBase.FontName = runFont.Val; + } + var fontSize = fontSource.Elements().FirstOrDefault(); + if (fontSize != null) + { + if ((fontSize).Val != null) + fontBase.FontSize = (fontSize).Val; + } + + fontBase.Italic = GetBoolean(fontSource.Elements().FirstOrDefault()); + fontBase.Shadow = GetBoolean(fontSource.Elements().FirstOrDefault()); + fontBase.Strikethrough = GetBoolean(fontSource.Elements().FirstOrDefault()); + + var underline = fontSource.Elements().FirstOrDefault(); + if (underline != null) + { + fontBase.Underline = underline.Val != null ? underline.Val.Value.ToClosedXml() : XLFontUnderlineValues.Single; + } + + var verticalTextAlignment = fontSource.Elements().FirstOrDefault(); + + if (verticalTextAlignment == null) return; + + fontBase.VerticalAlignment = verticalTextAlignment.Val != null ? verticalTextAlignment.Val.Value.ToClosedXml() : XLFontVerticalTextAlignmentValues.Baseline; + } + + private Int32 lastRow; + + private void LoadRows(Stylesheet s, NumberingFormats numberingFormats, Fills fills, Borders borders, Fonts fonts, + XLWorksheet ws, SharedStringItem[] sharedStrings, + Dictionary sharedFormulasR1C1, Dictionary styleList, + Row row) + { + Int32 rowIndex = row.RowIndex == null ? ++lastRow : (Int32)row.RowIndex.Value; + var xlRow = ws.Row(rowIndex, false); + + if (row.Height != null) + xlRow.Height = row.Height; + else + { + xlRow.Loading = true; + xlRow.Height = ws.RowHeight; + xlRow.Loading = false; + } + + if (row.Hidden != null && row.Hidden) + xlRow.Hide(); + + if (row.Collapsed != null && row.Collapsed) + xlRow.Collapsed = true; + + if (row.OutlineLevel != null && row.OutlineLevel > 0) + xlRow.OutlineLevel = row.OutlineLevel; + + if (row.CustomFormat != null) + { + Int32 styleIndex = row.StyleIndex != null ? Int32.Parse(row.StyleIndex.InnerText) : -1; + if (styleIndex > 0) + { + ApplyStyle(xlRow, styleIndex, s, fills, borders, fonts, numberingFormats); + } + else + { + xlRow.Style = DefaultStyle; + } + } + + lastCell = 0; + foreach (Cell cell in row.Elements()) + LoadCells(sharedStrings, s, numberingFormats, fills, borders, fonts, sharedFormulasR1C1, ws, styleList, + cell, rowIndex); + } + + private void LoadColumns(Stylesheet s, NumberingFormats numberingFormats, Fills fills, Borders borders, + Fonts fonts, XLWorksheet ws, Columns columns) + { + if (columns == null) return; + + var wsDefaultColumn = + columns.Elements().Where(c => c.Max == XLHelper.MaxColumnNumber).FirstOrDefault(); + + if (wsDefaultColumn != null && wsDefaultColumn.Width != null) + ws.ColumnWidth = wsDefaultColumn.Width - ColumnWidthOffset; + + Int32 styleIndexDefault = wsDefaultColumn != null && wsDefaultColumn.Style != null + ? Int32.Parse(wsDefaultColumn.Style.InnerText) + : -1; + if (styleIndexDefault >= 0) + ApplyStyle(ws, styleIndexDefault, s, fills, borders, fonts, numberingFormats); + + foreach (Column col in columns.Elements()) + { + //IXLStylized toApply; + if (col.Max == XLHelper.MaxColumnNumber) continue; + + var xlColumns = (XLColumns)ws.Columns(col.Min, col.Max); + if (col.Width != null) + { + Double width = col.Width - ColumnWidthOffset; + //if (width < 0) width = 0; + xlColumns.Width = width; + } + else + xlColumns.Width = ws.ColumnWidth; + + if (col.Hidden != null && col.Hidden) + xlColumns.Hide(); + + if (col.Collapsed != null && col.Collapsed) + xlColumns.CollapseOnly(); + + if (col.OutlineLevel != null) + { + var outlineLevel = col.OutlineLevel; + xlColumns.ForEach(c => c.OutlineLevel = outlineLevel); + } + + Int32 styleIndex = col.Style != null ? Int32.Parse(col.Style.InnerText) : -1; + if (styleIndex > 0) + { + ApplyStyle(xlColumns, styleIndex, s, fills, borders, fonts, numberingFormats); + } + else + { + xlColumns.Style = DefaultStyle; + } + } + } + + private static XLCellValues GetDataTypeFromCell(IXLNumberFormat numberFormat) + { + var numberFormatId = numberFormat.NumberFormatId; + if (numberFormatId == 46U) + return XLCellValues.TimeSpan; + else if ((numberFormatId >= 14 && numberFormatId <= 22) || + (numberFormatId >= 45 && numberFormatId <= 47)) + return XLCellValues.DateTime; + else if (numberFormatId == 49) + return XLCellValues.Text; + else + { + if (!XLHelper.IsNullOrWhiteSpace(numberFormat.Format)) + { + var dataType = GetDataTypeFromFormat(numberFormat.Format); + return dataType.HasValue ? dataType.Value : XLCellValues.Number; + } + else + return XLCellValues.Number; + } + } + + private static XLCellValues? GetDataTypeFromFormat(String format) + { + int length = format.Length; + String f = format.ToLower(); + for (Int32 i = 0; i < length; i++) + { + Char c = f[i]; + if (c == '"') + i = f.IndexOf('"', i + 1); + else if (c == '0' || c == '#' || c == '?') + return XLCellValues.Number; + else if (c == 'y' || c == 'm' || c == 'd' || c == 'h' || c == 's') + return XLCellValues.DateTime; + } + return null; + } + + private static void LoadAutoFilter(AutoFilter af, XLWorksheet ws) + { + if (af != null) + { + ws.Range(af.Reference.Value).SetAutoFilter(); + var autoFilter = ws.AutoFilter; + LoadAutoFilterSort(af, ws, autoFilter); + LoadAutoFilterColumns(af, autoFilter); + } + } + + private static void LoadAutoFilterColumns(AutoFilter af, XLAutoFilter autoFilter) + { + foreach (var filterColumn in af.Elements()) + { + Int32 column = (int)filterColumn.ColumnId.Value + 1; + if (filterColumn.CustomFilters != null) + { + var filterList = new List(); + autoFilter.Column(column).FilterType = XLFilterType.Custom; + autoFilter.Filters.Add(column, filterList); + XLConnector connector = filterColumn.CustomFilters.And != null && filterColumn.CustomFilters.And.Value ? XLConnector.And : XLConnector.Or; + + Boolean isText = false; + foreach (CustomFilter filter in filterColumn.CustomFilters) + { + Double dTest; + String val = filter.Val.Value; + if (!Double.TryParse(val, out dTest)) + { + isText = true; + break; + } + } + + foreach (CustomFilter filter in filterColumn.CustomFilters) + { + var xlFilter = new XLFilter { Value = filter.Val.Value, Connector = connector }; + if (isText) + xlFilter.Value = filter.Val.Value; + else + xlFilter.Value = Double.Parse(filter.Val.Value, CultureInfo.InvariantCulture); + + if (filter.Operator != null) + xlFilter.Operator = filter.Operator.Value.ToClosedXml(); + else + xlFilter.Operator = XLFilterOperator.Equal; + + Func condition = null; + switch (xlFilter.Operator) + { + case XLFilterOperator.Equal: + if (isText) + condition = o => o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.InvariantCultureIgnoreCase); + else + condition = o => (o as IComparable).CompareTo(xlFilter.Value) == 0; + break; + + case XLFilterOperator.EqualOrGreaterThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) >= 0; break; + case XLFilterOperator.EqualOrLessThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) <= 0; break; + case XLFilterOperator.GreaterThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) > 0; break; + case XLFilterOperator.LessThan: condition = o => (o as IComparable).CompareTo(xlFilter.Value) < 0; break; + case XLFilterOperator.NotEqual: + if (isText) + condition = o => !o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.InvariantCultureIgnoreCase); + else + condition = o => (o as IComparable).CompareTo(xlFilter.Value) != 0; + break; + } + + xlFilter.Condition = condition; + filterList.Add(xlFilter); + } + } + else if (filterColumn.Filters != null) + { + var filterList = new List(); + autoFilter.Column(column).FilterType = XLFilterType.Regular; + autoFilter.Filters.Add((int)filterColumn.ColumnId.Value + 1, filterList); + + Boolean isText = false; + foreach (Filter filter in filterColumn.Filters.OfType()) + { + Double dTest; + String val = filter.Val.Value; + if (!Double.TryParse(val, out dTest)) + { + isText = true; + break; + } + } + + foreach (Filter filter in filterColumn.Filters.OfType()) + { + var xlFilter = new XLFilter { Connector = XLConnector.Or, Operator = XLFilterOperator.Equal }; + + Func condition; + if (isText) + { + xlFilter.Value = filter.Val.Value; + condition = o => o.ToString().Equals(xlFilter.Value.ToString(), StringComparison.InvariantCultureIgnoreCase); + } + else + { + xlFilter.Value = Double.Parse(filter.Val.Value, CultureInfo.InvariantCulture); + condition = o => (o as IComparable).CompareTo(xlFilter.Value) == 0; + } + + xlFilter.Condition = condition; + filterList.Add(xlFilter); + } + } + else if (filterColumn.Top10 != null) + { + var xlFilterColumn = autoFilter.Column(column); + autoFilter.Filters.Add(column, null); + xlFilterColumn.FilterType = XLFilterType.TopBottom; + if (filterColumn.Top10.Percent != null && filterColumn.Top10.Percent.Value) + xlFilterColumn.TopBottomType = XLTopBottomType.Percent; + else + xlFilterColumn.TopBottomType = XLTopBottomType.Items; + + if (filterColumn.Top10.Top != null && !filterColumn.Top10.Top.Value) + xlFilterColumn.TopBottomPart = XLTopBottomPart.Bottom; + else + xlFilterColumn.TopBottomPart = XLTopBottomPart.Top; + + xlFilterColumn.TopBottomValue = (int)filterColumn.Top10.Val.Value; + } + else if (filterColumn.DynamicFilter != null) + { + autoFilter.Filters.Add(column, null); + var xlFilterColumn = autoFilter.Column(column); + xlFilterColumn.FilterType = XLFilterType.Dynamic; + if (filterColumn.DynamicFilter.Type != null) + xlFilterColumn.DynamicType = filterColumn.DynamicFilter.Type.Value.ToClosedXml(); + else + xlFilterColumn.DynamicType = XLFilterDynamicType.AboveAverage; + + xlFilterColumn.DynamicValue = filterColumn.DynamicFilter.Val.Value; + } + } + } + + private static void LoadAutoFilterSort(AutoFilter af, XLWorksheet ws, IXLBaseAutoFilter autoFilter) + { + var sort = af.Elements().FirstOrDefault(); + if (sort != null) + { + var condition = sort.Elements().FirstOrDefault(); + if (condition != null) + { + Int32 column = ws.Range(condition.Reference.Value).FirstCell().Address.ColumnNumber - autoFilter.Range.FirstCell().Address.ColumnNumber + 1; + autoFilter.SortColumn = column; + autoFilter.Sorted = true; + autoFilter.SortOrder = condition.Descending != null && condition.Descending.Value ? XLSortOrder.Descending : XLSortOrder.Ascending; + } + } + } + + private static void LoadSheetProtection(SheetProtection sp, XLWorksheet ws) + { + if (sp == null) return; + + if (sp.Sheet != null) ws.Protection.Protected = sp.Sheet.Value; + if (sp.Password != null) ws.Protection.PasswordHash = sp.Password.Value; + if (sp.FormatCells != null) ws.Protection.FormatCells = !sp.FormatCells.Value; + if (sp.FormatColumns != null) ws.Protection.FormatColumns = !sp.FormatColumns.Value; + if (sp.FormatRows != null) ws.Protection.FormatRows = !sp.FormatRows.Value; + if (sp.InsertColumns != null) ws.Protection.InsertColumns = !sp.InsertColumns.Value; + if (sp.InsertHyperlinks != null) ws.Protection.InsertHyperlinks = !sp.InsertHyperlinks.Value; + if (sp.InsertRows != null) ws.Protection.InsertRows = !sp.InsertRows.Value; + if (sp.DeleteColumns != null) ws.Protection.DeleteColumns = !sp.DeleteColumns.Value; + if (sp.DeleteRows != null) ws.Protection.DeleteRows = !sp.DeleteRows.Value; + if (sp.AutoFilter != null) ws.Protection.AutoFilter = !sp.AutoFilter.Value; + if (sp.PivotTables != null) ws.Protection.PivotTables = !sp.PivotTables.Value; + if (sp.Sort != null) ws.Protection.Sort = !sp.Sort.Value; + if (sp.SelectLockedCells != null) ws.Protection.SelectLockedCells = sp.SelectLockedCells.Value; + if (sp.SelectUnlockedCells != null) ws.Protection.SelectUnlockedCells = sp.SelectUnlockedCells.Value; + } + + private static void LoadDataValidations(DataValidations dataValidations, XLWorksheet ws) + { + if (dataValidations == null) return; + + foreach (DataValidation dvs in dataValidations.Elements()) + { + String txt = dvs.SequenceOfReferences.InnerText; + if (XLHelper.IsNullOrWhiteSpace(txt)) continue; + foreach (var dvt in txt.Split(' ').Select(rangeAddress => ws.Range(rangeAddress).DataValidation)) + { + if (dvs.AllowBlank != null) dvt.IgnoreBlanks = dvs.AllowBlank; + if (dvs.ShowDropDown != null) dvt.InCellDropdown = !dvs.ShowDropDown.Value; + if (dvs.ShowErrorMessage != null) dvt.ShowErrorMessage = dvs.ShowErrorMessage; + if (dvs.ShowInputMessage != null) dvt.ShowInputMessage = dvs.ShowInputMessage; + if (dvs.PromptTitle != null) dvt.InputTitle = dvs.PromptTitle; + if (dvs.Prompt != null) dvt.InputMessage = dvs.Prompt; + if (dvs.ErrorTitle != null) dvt.ErrorTitle = dvs.ErrorTitle; + if (dvs.Error != null) dvt.ErrorMessage = dvs.Error; + if (dvs.ErrorStyle != null) dvt.ErrorStyle = dvs.ErrorStyle.Value.ToClosedXml(); + if (dvs.Type != null) dvt.AllowedValues = dvs.Type.Value.ToClosedXml(); + if (dvs.Operator != null) dvt.Operator = dvs.Operator.Value.ToClosedXml(); + if (dvs.Formula1 != null) dvt.MinValue = dvs.Formula1.Text; + if (dvs.Formula2 != null) dvt.MaxValue = dvs.Formula2.Text; + } + } + } + + /// + /// Loads the conditional formatting. + /// + // https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.conditionalformattingrule%28v=office.15%29.aspx?f=255&MSPPError=-2147217396 + private void LoadConditionalFormatting(ConditionalFormatting conditionalFormatting, XLWorksheet ws, Dictionary differentialFormats) + { + if (conditionalFormatting == null) return; + + foreach (var sor in conditionalFormatting.SequenceOfReferences.Items) + { + foreach (var fr in conditionalFormatting.Elements()) + { + var conditionalFormat = new XLConditionalFormat(ws.Range(sor.Value)); + if (fr.FormatId != null) + { + LoadFont(differentialFormats[(Int32)fr.FormatId.Value].Font, conditionalFormat.Style.Font); + LoadFill(differentialFormats[(Int32)fr.FormatId.Value].Fill, conditionalFormat.Style.Fill); + LoadBorder(differentialFormats[(Int32)fr.FormatId.Value].Border, conditionalFormat.Style.Border); + LoadNumberFormat(differentialFormats[(Int32)fr.FormatId.Value].NumberingFormat, conditionalFormat.Style.NumberFormat); + } + + // The conditional formatting type is compulsory. If it doesn't exist, skip the entire rule. + if (fr.Type == null) continue; + conditionalFormat.ConditionalFormatType = fr.Type.Value.ToClosedXml(); + + if (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.CellIs && fr.Operator != null) + conditionalFormat.Operator = fr.Operator.Value.ToClosedXml(); + + if (fr.Text != null && !XLHelper.IsNullOrWhiteSpace(fr.Text)) + conditionalFormat.Values.Add(GetFormula(fr.Text.Value)); + + if (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.Top10) + { + if (fr.Percent != null) + conditionalFormat.Percent = fr.Percent.Value; + if (fr.Bottom != null) + conditionalFormat.Bottom = fr.Bottom.Value; + if (fr.Rank != null) + conditionalFormat.Values.Add(GetFormula(fr.Rank.Value.ToString())); + } + + if (fr.Elements().Any()) + { + var colorScale = fr.Elements().First(); + ExtractConditionalFormatValueObjects(conditionalFormat, colorScale); + } + else if (fr.Elements().Any()) + { + var dataBar = fr.Elements().First(); + if (dataBar.ShowValue != null) + conditionalFormat.ShowBarOnly = !dataBar.ShowValue.Value; + ExtractConditionalFormatValueObjects(conditionalFormat, dataBar); + } + else if (fr.Elements().Any()) + { + var iconSet = fr.Elements().First(); + if (iconSet.ShowValue != null) + conditionalFormat.ShowIconOnly = !iconSet.ShowValue.Value; + if (iconSet.Reverse != null) + conditionalFormat.ReverseIconOrder = iconSet.Reverse.Value; + + if (iconSet.IconSetValue != null) + conditionalFormat.IconSetStyle = iconSet.IconSetValue.Value.ToClosedXml(); + else + conditionalFormat.IconSetStyle = XLIconSetStyle.ThreeTrafficLights1; + + ExtractConditionalFormatValueObjects(conditionalFormat, iconSet); + } + else + { + foreach (var formula in fr.Elements()) + { + if (formula.Text != null + && (conditionalFormat.ConditionalFormatType == XLConditionalFormatType.CellIs + || conditionalFormat.ConditionalFormatType == XLConditionalFormatType.Expression)) + { + conditionalFormat.Values.Add(GetFormula(formula.Text)); + } + } + } + ws.ConditionalFormats.Add(conditionalFormat); + } + } + } + + private static XLFormula GetFormula(String value) + { + var formula = new XLFormula(); + formula._value = value; + formula.IsFormula = !(value[0] == '"' && value.EndsWith("\"")); + return formula; + } + + private void ExtractConditionalFormatValueObjects(XLConditionalFormat conditionalFormat, OpenXmlElement element) + { + foreach (var c in element.Elements()) + { + if (c.Type != null) + conditionalFormat.ContentTypes.Add(c.Type.Value.ToClosedXml()); + if (c.Val != null) + conditionalFormat.Values.Add(new XLFormula { Value = c.Val.Value }); + else + conditionalFormat.Values.Add(null); + + if (c.GreaterThanOrEqual != null) + conditionalFormat.IconSetOperators.Add(c.GreaterThanOrEqual.Value ? XLCFIconSetOperator.EqualOrGreaterThan : XLCFIconSetOperator.GreaterThan); + else + conditionalFormat.IconSetOperators.Add(XLCFIconSetOperator.EqualOrGreaterThan); + } + foreach (var c in element.Elements()) + { + conditionalFormat.Colors.Add(GetColor(c)); + } + } + + private static void LoadHyperlinks(Hyperlinks hyperlinks, WorksheetPart worksheetPart, XLWorksheet ws) + { + var hyperlinkDictionary = new Dictionary(); + if (worksheetPart.HyperlinkRelationships != null) + hyperlinkDictionary = worksheetPart.HyperlinkRelationships.ToDictionary(hr => hr.Id, hr => hr.Uri); + + if (hyperlinks == null) return; + + foreach (Hyperlink hl in hyperlinks.Elements()) + { + if (hl.Reference.Value.Equals("#REF")) continue; + String tooltip = hl.Tooltip != null ? hl.Tooltip.Value : String.Empty; + var xlRange = ws.Range(hl.Reference.Value); + foreach (XLCell xlCell in xlRange.Cells()) + { + xlCell.SettingHyperlink = true; + + if (hl.Id != null) + xlCell.Hyperlink = new XLHyperlink(hyperlinkDictionary[hl.Id], tooltip); + else if (hl.Location != null) + xlCell.Hyperlink = new XLHyperlink(hl.Location.Value, tooltip); + else + xlCell.Hyperlink = new XLHyperlink(hl.Reference.Value, tooltip); + + xlCell.SettingHyperlink = false; + } + } + } + + private static void LoadColumnBreaks(ColumnBreaks columnBreaks, XLWorksheet ws) + { + if (columnBreaks == null) return; + + foreach (Break columnBreak in columnBreaks.Elements().Where(columnBreak => columnBreak.Id != null)) + { + ws.PageSetup.ColumnBreaks.Add(Int32.Parse(columnBreak.Id.InnerText)); + } + } + + private static void LoadRowBreaks(RowBreaks rowBreaks, XLWorksheet ws) + { + if (rowBreaks == null) return; + + foreach (Break rowBreak in rowBreaks.Elements()) + ws.PageSetup.RowBreaks.Add(Int32.Parse(rowBreak.Id.InnerText)); + } + + private void LoadSheetProperties(SheetProperties sheetProperty, XLWorksheet ws, out PageSetupProperties pageSetupProperties) + { + pageSetupProperties = null; + if (sheetProperty == null) return; + + if (sheetProperty.TabColor != null) + ws.TabColor = GetColor(sheetProperty.TabColor); + + if (sheetProperty.OutlineProperties != null) + { + if (sheetProperty.OutlineProperties.SummaryBelow != null) + { + ws.Outline.SummaryVLocation = sheetProperty.OutlineProperties.SummaryBelow + ? XLOutlineSummaryVLocation.Bottom + : XLOutlineSummaryVLocation.Top; + } + + if (sheetProperty.OutlineProperties.SummaryRight != null) + { + ws.Outline.SummaryHLocation = sheetProperty.OutlineProperties.SummaryRight + ? XLOutlineSummaryHLocation.Right + : XLOutlineSummaryHLocation.Left; + } + } + + if (sheetProperty.PageSetupProperties != null) + pageSetupProperties = sheetProperty.PageSetupProperties; + } + + private static void LoadHeaderFooter(HeaderFooter headerFooter, XLWorksheet ws) + { + if (headerFooter == null) return; + + if (headerFooter.AlignWithMargins != null) + ws.PageSetup.AlignHFWithMargins = headerFooter.AlignWithMargins; + if (headerFooter.ScaleWithDoc != null) + ws.PageSetup.ScaleHFWithDocument = headerFooter.ScaleWithDoc; + + if (headerFooter.DifferentFirst != null) + ws.PageSetup.DifferentFirstPageOnHF = headerFooter.DifferentFirst; + if (headerFooter.DifferentOddEven != null) + ws.PageSetup.DifferentOddEvenPagesOnHF = headerFooter.DifferentOddEven; + + // Footers + var xlFooter = (XLHeaderFooter)ws.PageSetup.Footer; + var evenFooter = headerFooter.EvenFooter; + if (evenFooter != null) + xlFooter.SetInnerText(XLHFOccurrence.EvenPages, evenFooter.Text); + var oddFooter = headerFooter.OddFooter; + if (oddFooter != null) + xlFooter.SetInnerText(XLHFOccurrence.OddPages, oddFooter.Text); + var firstFooter = headerFooter.FirstFooter; + if (firstFooter != null) + xlFooter.SetInnerText(XLHFOccurrence.FirstPage, firstFooter.Text); + // Headers + var xlHeader = (XLHeaderFooter)ws.PageSetup.Header; + var evenHeader = headerFooter.EvenHeader; + if (evenHeader != null) + xlHeader.SetInnerText(XLHFOccurrence.EvenPages, evenHeader.Text); + var oddHeader = headerFooter.OddHeader; + if (oddHeader != null) + xlHeader.SetInnerText(XLHFOccurrence.OddPages, oddHeader.Text); + var firstHeader = headerFooter.FirstHeader; + if (firstHeader != null) + xlHeader.SetInnerText(XLHFOccurrence.FirstPage, firstHeader.Text); + + ((XLHeaderFooter)ws.PageSetup.Header).SetAsInitial(); + ((XLHeaderFooter)ws.PageSetup.Footer).SetAsInitial(); + } + + private static void LoadPageSetup(PageSetup pageSetup, XLWorksheet ws, PageSetupProperties pageSetupProperties) + { + if (pageSetup == null) return; + + if (pageSetup.PaperSize != null) + ws.PageSetup.PaperSize = (XLPaperSize)Int32.Parse(pageSetup.PaperSize.InnerText); + if (pageSetup.Scale != null) + ws.PageSetup.Scale = Int32.Parse(pageSetup.Scale.InnerText); + if (pageSetupProperties != null && pageSetupProperties.FitToPage != null && pageSetupProperties.FitToPage.Value) + { + if (pageSetup.FitToWidth == null) + ws.PageSetup.PagesWide = 1; + else + ws.PageSetup.PagesWide = Int32.Parse(pageSetup.FitToWidth.InnerText); + + if (pageSetup.FitToHeight == null) + ws.PageSetup.PagesTall = 1; + else + ws.PageSetup.PagesTall = Int32.Parse(pageSetup.FitToHeight.InnerText); + } + if (pageSetup.PageOrder != null) + ws.PageSetup.PageOrder = pageSetup.PageOrder.Value.ToClosedXml(); + if (pageSetup.Orientation != null) + ws.PageSetup.PageOrientation = pageSetup.Orientation.Value.ToClosedXml(); + if (pageSetup.BlackAndWhite != null) + ws.PageSetup.BlackAndWhite = pageSetup.BlackAndWhite; + if (pageSetup.Draft != null) + ws.PageSetup.DraftQuality = pageSetup.Draft; + if (pageSetup.CellComments != null) + ws.PageSetup.ShowComments = pageSetup.CellComments.Value.ToClosedXml(); + if (pageSetup.Errors != null) + ws.PageSetup.PrintErrorValue = pageSetup.Errors.Value.ToClosedXml(); + if (pageSetup.HorizontalDpi != null) ws.PageSetup.HorizontalDpi = (Int32)pageSetup.HorizontalDpi.Value; + if (pageSetup.VerticalDpi != null) ws.PageSetup.VerticalDpi = (Int32)pageSetup.VerticalDpi.Value; + if (pageSetup.FirstPageNumber != null) + ws.PageSetup.FirstPageNumber = UInt32.Parse(pageSetup.FirstPageNumber.InnerText); + } + + private static void LoadPageMargins(PageMargins pageMargins, XLWorksheet ws) + { + if (pageMargins == null) return; + + if (pageMargins.Bottom != null) + ws.PageSetup.Margins.Bottom = pageMargins.Bottom; + if (pageMargins.Footer != null) + ws.PageSetup.Margins.Footer = pageMargins.Footer; + if (pageMargins.Header != null) + ws.PageSetup.Margins.Header = pageMargins.Header; + if (pageMargins.Left != null) + ws.PageSetup.Margins.Left = pageMargins.Left; + if (pageMargins.Right != null) + ws.PageSetup.Margins.Right = pageMargins.Right; + if (pageMargins.Top != null) + ws.PageSetup.Margins.Top = pageMargins.Top; + } + + private static void LoadPrintOptions(PrintOptions printOptions, XLWorksheet ws) + { + if (printOptions == null) return; + + if (printOptions.GridLines != null) + ws.PageSetup.ShowGridlines = printOptions.GridLines; + if (printOptions.HorizontalCentered != null) + ws.PageSetup.CenterHorizontally = printOptions.HorizontalCentered; + if (printOptions.VerticalCentered != null) + ws.PageSetup.CenterVertically = printOptions.VerticalCentered; + if (printOptions.Headings != null) + ws.PageSetup.ShowRowAndColumnHeadings = printOptions.Headings; + } + + private static void LoadSheetViews(SheetViews sheetViews, XLWorksheet ws) + { + if (sheetViews == null) return; + + var sheetView = sheetViews.Elements().FirstOrDefault(); + + if (sheetView == null) return; + + if (sheetView.RightToLeft != null) ws.RightToLeft = sheetView.RightToLeft.Value; + if (sheetView.ShowFormulas != null) ws.ShowFormulas = sheetView.ShowFormulas.Value; + if (sheetView.ShowGridLines != null) ws.ShowGridLines = sheetView.ShowGridLines.Value; + if (sheetView.ShowOutlineSymbols != null) + ws.ShowOutlineSymbols = sheetView.ShowOutlineSymbols.Value; + if (sheetView.ShowRowColHeaders != null) ws.ShowRowColHeaders = sheetView.ShowRowColHeaders.Value; + if (sheetView.ShowRuler != null) ws.ShowRuler = sheetView.ShowRuler.Value; + if (sheetView.ShowWhiteSpace != null) ws.ShowWhiteSpace = sheetView.ShowWhiteSpace.Value; + if (sheetView.ShowZeros != null) ws.ShowZeros = sheetView.ShowZeros.Value; + if (sheetView.TabSelected != null) ws.TabSelected = sheetView.TabSelected.Value; + + var selection = sheetView.Elements().FirstOrDefault(); + if (selection != null) + { + if (selection.SequenceOfReferences != null) + ws.Ranges(selection.SequenceOfReferences.InnerText.Replace(" ", ",")).Select(); + + if (selection.ActiveCell != null) + ws.Cell(selection.ActiveCell).SetActive(); + } + + if (sheetView.ZoomScale != null) + ws.SheetView.ZoomScale = (int)UInt32Value.ToUInt32(sheetView.ZoomScale); + if (sheetView.ZoomScaleNormal != null) + ws.SheetView.ZoomScaleNormal = (int)UInt32Value.ToUInt32(sheetView.ZoomScaleNormal); + if (sheetView.ZoomScalePageLayoutView != null) + ws.SheetView.ZoomScalePageLayoutView = (int)UInt32Value.ToUInt32(sheetView.ZoomScalePageLayoutView); + if (sheetView.ZoomScaleSheetLayoutView != null) + ws.SheetView.ZoomScaleSheetLayoutView = (int)UInt32Value.ToUInt32(sheetView.ZoomScaleSheetLayoutView); + + var pane = sheetView.Elements().FirstOrDefault(); + if (pane == null) return; + + if (pane.State == null || + (pane.State != PaneStateValues.FrozenSplit && pane.State != PaneStateValues.Frozen)) return; + + if (pane.HorizontalSplit != null) + ws.SheetView.SplitColumn = (Int32)pane.HorizontalSplit.Value; + if (pane.VerticalSplit != null) + ws.SheetView.SplitRow = (Int32)pane.VerticalSplit.Value; + } + + private void SetProperties(SpreadsheetDocument dSpreadsheet) + { + var p = dSpreadsheet.PackageProperties; + Properties.Author = p.Creator; + Properties.Category = p.Category; + Properties.Comments = p.Description; + if (p.Created != null) + Properties.Created = p.Created.Value; + Properties.Keywords = p.Keywords; + Properties.LastModifiedBy = p.LastModifiedBy; + Properties.Status = p.ContentStatus; + Properties.Subject = p.Subject; + Properties.Title = p.Title; + } + + private XLColor GetColor(ColorType color) + { + XLColor retVal = null; + if (color != null) + { + if (color.Rgb != null) + { + String htmlColor = "#" + color.Rgb.Value; + Color thisColor; + if (!_colorList.ContainsKey(htmlColor)) + { + thisColor = ColorTranslator.FromHtml(htmlColor); + _colorList.Add(htmlColor, thisColor); + } + else + thisColor = _colorList[htmlColor]; + retVal = XLColor.FromColor(thisColor); + } + else if (color.Indexed != null && color.Indexed < 64) + retVal = XLColor.FromIndex((Int32)color.Indexed.Value); + else if (color.Theme != null) + { + retVal = color.Tint != null ? XLColor.FromTheme((XLThemeColor)color.Theme.Value, color.Tint.Value) : XLColor.FromTheme((XLThemeColor)color.Theme.Value); + } + } + return retVal ?? XLColor.NoColor; + } + + private void ApplyStyle(IXLStylized xlStylized, Int32 styleIndex, Stylesheet s, Fills fills, Borders borders, + Fonts fonts, NumberingFormats numberingFormats) + { + if (s == null) return; //No Stylesheet, no Styles + + var cellFormat = (CellFormat)s.CellFormats.ElementAt(styleIndex); + + if (cellFormat.ApplyProtection != null) + { + var protection = cellFormat.Protection; + + if (protection == null) + xlStylized.InnerStyle.Protection = new XLProtection(null, DefaultStyle.Protection); + else + { + xlStylized.InnerStyle.Protection.Hidden = protection.Hidden != null && protection.Hidden.HasValue && + protection.Hidden.Value; + xlStylized.InnerStyle.Protection.Locked = protection.Locked == null || + (protection.Locked.HasValue && protection.Locked.Value); + } + } + + if (UInt32HasValue(cellFormat.FillId)) + { + var fill = (Fill)fills.ElementAt((Int32)cellFormat.FillId.Value); + if (fill.PatternFill != null) + { + if (fill.PatternFill.PatternType != null) + xlStylized.InnerStyle.Fill.PatternType = fill.PatternFill.PatternType.Value.ToClosedXml(); + + var fgColor = GetColor(fill.PatternFill.ForegroundColor); + if (fgColor.HasValue) xlStylized.InnerStyle.Fill.PatternColor = fgColor; + + var bgColor = GetColor(fill.PatternFill.BackgroundColor); + if (bgColor.HasValue) + xlStylized.InnerStyle.Fill.PatternBackgroundColor = bgColor; + } + } + + var alignment = cellFormat.Alignment; + if (alignment != null) + { + if (alignment.Horizontal != null) + xlStylized.InnerStyle.Alignment.Horizontal = alignment.Horizontal.Value.ToClosedXml(); + if (alignment.Indent != null && alignment.Indent != 0) + xlStylized.InnerStyle.Alignment.Indent = Int32.Parse(alignment.Indent.ToString()); + if (alignment.JustifyLastLine != null) + xlStylized.InnerStyle.Alignment.JustifyLastLine = alignment.JustifyLastLine; + if (alignment.ReadingOrder != null) + { + xlStylized.InnerStyle.Alignment.ReadingOrder = + (XLAlignmentReadingOrderValues)Int32.Parse(alignment.ReadingOrder.ToString()); + } + if (alignment.RelativeIndent != null) + xlStylized.InnerStyle.Alignment.RelativeIndent = alignment.RelativeIndent; + if (alignment.ShrinkToFit != null) + xlStylized.InnerStyle.Alignment.ShrinkToFit = alignment.ShrinkToFit; + if (alignment.TextRotation != null) + xlStylized.InnerStyle.Alignment.TextRotation = (Int32)alignment.TextRotation.Value; + if (alignment.Vertical != null) + xlStylized.InnerStyle.Alignment.Vertical = alignment.Vertical.Value.ToClosedXml(); + if (alignment.WrapText != null) + xlStylized.InnerStyle.Alignment.WrapText = alignment.WrapText; + } + + if (UInt32HasValue(cellFormat.BorderId)) + { + uint borderId = cellFormat.BorderId.Value; + var border = (Border)borders.ElementAt((Int32)borderId); + if (border != null) + { + var bottomBorder = border.BottomBorder; + if (bottomBorder != null) + { + if (bottomBorder.Style != null) + xlStylized.InnerStyle.Border.BottomBorder = bottomBorder.Style.Value.ToClosedXml(); + + var bottomBorderColor = GetColor(bottomBorder.Color); + if (bottomBorderColor.HasValue) + xlStylized.InnerStyle.Border.BottomBorderColor = bottomBorderColor; + } + var topBorder = border.TopBorder; + if (topBorder != null) + { + if (topBorder.Style != null) + xlStylized.InnerStyle.Border.TopBorder = topBorder.Style.Value.ToClosedXml(); + var topBorderColor = GetColor(topBorder.Color); + if (topBorderColor.HasValue) + xlStylized.InnerStyle.Border.TopBorderColor = topBorderColor; + } + var leftBorder = border.LeftBorder; + if (leftBorder != null) + { + if (leftBorder.Style != null) + xlStylized.InnerStyle.Border.LeftBorder = leftBorder.Style.Value.ToClosedXml(); + var leftBorderColor = GetColor(leftBorder.Color); + if (leftBorderColor.HasValue) + xlStylized.InnerStyle.Border.LeftBorderColor = leftBorderColor; + } + var rightBorder = border.RightBorder; + if (rightBorder != null) + { + if (rightBorder.Style != null) + xlStylized.InnerStyle.Border.RightBorder = rightBorder.Style.Value.ToClosedXml(); + var rightBorderColor = GetColor(rightBorder.Color); + if (rightBorderColor.HasValue) + xlStylized.InnerStyle.Border.RightBorderColor = rightBorderColor; + } + var diagonalBorder = border.DiagonalBorder; + if (diagonalBorder != null) + { + if (diagonalBorder.Style != null) + xlStylized.InnerStyle.Border.DiagonalBorder = diagonalBorder.Style.Value.ToClosedXml(); + var diagonalBorderColor = GetColor(diagonalBorder.Color); + if (diagonalBorderColor.HasValue) + xlStylized.InnerStyle.Border.DiagonalBorderColor = diagonalBorderColor; + if (border.DiagonalDown != null) + xlStylized.InnerStyle.Border.DiagonalDown = border.DiagonalDown; + if (border.DiagonalUp != null) + xlStylized.InnerStyle.Border.DiagonalUp = border.DiagonalUp; + } + } + } + + if (UInt32HasValue(cellFormat.FontId)) + { + var fontId = cellFormat.FontId; + var font = (DocumentFormat.OpenXml.Spreadsheet.Font)fonts.ElementAt((Int32)fontId.Value); + if (font != null) + { + xlStylized.InnerStyle.Font.Bold = GetBoolean(font.Bold); + + var fontColor = GetColor(font.Color); + if (fontColor.HasValue) + xlStylized.InnerStyle.Font.FontColor = fontColor; + + if (font.FontFamilyNumbering != null && (font.FontFamilyNumbering).Val != null) + { + xlStylized.InnerStyle.Font.FontFamilyNumbering = + (XLFontFamilyNumberingValues)Int32.Parse((font.FontFamilyNumbering).Val.ToString()); + } + if (font.FontName != null) + { + if ((font.FontName).Val != null) + xlStylized.InnerStyle.Font.FontName = (font.FontName).Val; + } + if (font.FontSize != null) + { + if ((font.FontSize).Val != null) + xlStylized.InnerStyle.Font.FontSize = (font.FontSize).Val; + } + + xlStylized.InnerStyle.Font.Italic = GetBoolean(font.Italic); + xlStylized.InnerStyle.Font.Shadow = GetBoolean(font.Shadow); + xlStylized.InnerStyle.Font.Strikethrough = GetBoolean(font.Strike); + + if (font.Underline != null) + { + xlStylized.InnerStyle.Font.Underline = font.Underline.Val != null + ? (font.Underline).Val.Value.ToClosedXml() + : XLFontUnderlineValues.Single; + } + + if (font.VerticalTextAlignment != null) + { + xlStylized.InnerStyle.Font.VerticalAlignment = font.VerticalTextAlignment.Val != null + ? (font.VerticalTextAlignment).Val.Value. + ToClosedXml() + : XLFontVerticalTextAlignmentValues.Baseline; + } + } + } + + if (!UInt32HasValue(cellFormat.NumberFormatId)) return; + + var numberFormatId = cellFormat.NumberFormatId; + + string formatCode = String.Empty; + if (numberingFormats != null) + { + var numberingFormat = + numberingFormats.FirstOrDefault( + nf => + ((NumberingFormat)nf).NumberFormatId != null && + ((NumberingFormat)nf).NumberFormatId.Value == numberFormatId) as NumberingFormat; + + if (numberingFormat != null && numberingFormat.FormatCode != null) + formatCode = numberingFormat.FormatCode.Value; + } + if (formatCode.Length > 0) + xlStylized.InnerStyle.NumberFormat.Format = formatCode; + else + xlStylized.InnerStyle.NumberFormat.NumberFormatId = (Int32)numberFormatId.Value; + } + + private static Boolean UInt32HasValue(UInt32Value value) + { + return value != null && value.HasValue; + } + + private static Boolean GetBoolean(BooleanPropertyType property) + { + if (property != null) + { + if (property.Val != null) + return property.Val; + return true; + } + + return false; + } + } +} diff --git a/ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs b/ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs index c4dee57..491b37c 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.NestedTypes.cs @@ -1,159 +1,165 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; - -namespace ClosedXML.Excel -{ - public partial class XLWorkbook - { - #region Nested type: SaveContext - internal sealed class SaveContext - { - #region Private fields - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly RelIdGenerator _relIdGenerator; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly Dictionary _sharedStyles; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly Dictionary _sharedNumberFormats; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly Dictionary _sharedFonts; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private readonly HashSet _tableNames; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] - private uint _tableId; - #endregion - #region Constructor - public SaveContext() - { - _relIdGenerator = new RelIdGenerator(); - _sharedStyles = new Dictionary(); - _sharedNumberFormats = new Dictionary(); - _sharedFonts = new Dictionary(); - _tableNames = new HashSet(); - _tableId = 0; - } - #endregion - #region Public properties - public RelIdGenerator RelIdGenerator - { - [DebuggerStepThrough] - get { return _relIdGenerator; } - } - public Dictionary SharedStyles - { - [DebuggerStepThrough] - get { return _sharedStyles; } - } - public Dictionary SharedNumberFormats - { - [DebuggerStepThrough] - get { return _sharedNumberFormats; } - } - public Dictionary SharedFonts - { - [DebuggerStepThrough] - get { return _sharedFonts; } - } - public HashSet TableNames - { - [DebuggerStepThrough] - get { return _tableNames; } - } - public uint TableId - { - [DebuggerStepThrough] - get { return _tableId; } - [DebuggerStepThrough] - set { _tableId = value; } - } - public Dictionary DifferentialFormats = new Dictionary(); - #endregion - } - #endregion - #region Nested type: RelType - internal enum RelType - { - Workbook//, Worksheet - } - #endregion - #region Nested type: RelIdGenerator - internal sealed class RelIdGenerator - { - private readonly Dictionary> _relIds = new Dictionary>(); - public String GetNext(RelType relType) - { - if (!_relIds.ContainsKey(relType)) - { - _relIds.Add(relType, new List()); - } - - Int32 id = _relIds[relType].Count + 1; - while (true) - { - String relId = String.Format("rId{0}", id); - if (!_relIds[relType].Contains(relId)) - { - _relIds[relType].Add(relId); - return relId; - } - id++; - } - } - public void AddValues(IEnumerable values, RelType relType) - { - if (!_relIds.ContainsKey(relType)) - { - _relIds.Add(relType, new List()); - } - _relIds[relType].AddRange(values.Where(v => !_relIds[relType].Contains(v))); - } - public void Reset(RelType relType) - { - if (_relIds.ContainsKey(relType)) - _relIds.Remove(relType); - } - } - #endregion - #region Nested type: FontInfo - internal struct FontInfo - { - public UInt32 FontId; - public XLFont Font; - }; - #endregion - #region Nested type: FillInfo - internal struct FillInfo - { - public UInt32 FillId; - public XLFill Fill; - } - #endregion - #region Nested type: BorderInfo - internal struct BorderInfo - { - public UInt32 BorderId; - public XLBorder Border; - } - #endregion - #region Nested type: NumberFormatInfo - internal struct NumberFormatInfo - { - public Int32 NumberFormatId; - public IXLNumberFormatBase NumberFormat; - } - #endregion - #region Nested type: StyleInfo - internal struct StyleInfo - { - public UInt32 StyleId; - public UInt32 FontId; - public UInt32 FillId; - public UInt32 BorderId; - public Int32 NumberFormatId; - public IXLStyle Style; - } - #endregion - } -} +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace ClosedXML.Excel +{ + public partial class XLWorkbook + { + #region Nested type: SaveContext + internal sealed class SaveContext + { + #region Private fields + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly RelIdGenerator _relIdGenerator; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly Dictionary _sharedStyles; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly Dictionary _sharedNumberFormats; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly Dictionary _sharedFonts; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly HashSet _tableNames; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private uint _tableId; + #endregion + #region Constructor + public SaveContext() + { + _relIdGenerator = new RelIdGenerator(); + _sharedStyles = new Dictionary(); + _sharedNumberFormats = new Dictionary(); + _sharedFonts = new Dictionary(); + _tableNames = new HashSet(); + _tableId = 0; + } + #endregion + #region Public properties + public RelIdGenerator RelIdGenerator + { + [DebuggerStepThrough] + get { return _relIdGenerator; } + } + public Dictionary SharedStyles + { + [DebuggerStepThrough] + get { return _sharedStyles; } + } + public Dictionary SharedNumberFormats + { + [DebuggerStepThrough] + get { return _sharedNumberFormats; } + } + public Dictionary SharedFonts + { + [DebuggerStepThrough] + get { return _sharedFonts; } + } + public HashSet TableNames + { + [DebuggerStepThrough] + get { return _tableNames; } + } + public uint TableId + { + [DebuggerStepThrough] + get { return _tableId; } + [DebuggerStepThrough] + set { _tableId = value; } + } + public Dictionary DifferentialFormats = new Dictionary(); + #endregion + } + #endregion + #region Nested type: RelType + internal enum RelType + { + Workbook//, Worksheet + } + #endregion + #region Nested type: RelIdGenerator + internal sealed class RelIdGenerator + { + private readonly Dictionary> _relIds = new Dictionary>(); + + public String GetNext() + { + return GetNext(RelType.Workbook); + } + + public String GetNext(RelType relType) + { + if (!_relIds.ContainsKey(relType)) + { + _relIds.Add(relType, new List()); + } + + Int32 id = _relIds[relType].Count + 1; + while (true) + { + String relId = String.Format("rId{0}", id); + if (!_relIds[relType].Contains(relId)) + { + _relIds[relType].Add(relId); + return relId; + } + id++; + } + } + public void AddValues(IEnumerable values, RelType relType) + { + if (!_relIds.ContainsKey(relType)) + { + _relIds.Add(relType, new List()); + } + _relIds[relType].AddRange(values.Where(v => !_relIds[relType].Contains(v))); + } + public void Reset(RelType relType) + { + if (_relIds.ContainsKey(relType)) + _relIds.Remove(relType); + } + } + #endregion + #region Nested type: FontInfo + internal struct FontInfo + { + public UInt32 FontId; + public XLFont Font; + }; + #endregion + #region Nested type: FillInfo + internal struct FillInfo + { + public UInt32 FillId; + public XLFill Fill; + } + #endregion + #region Nested type: BorderInfo + internal struct BorderInfo + { + public UInt32 BorderId; + public XLBorder Border; + } + #endregion + #region Nested type: NumberFormatInfo + internal struct NumberFormatInfo + { + public Int32 NumberFormatId; + public IXLNumberFormatBase NumberFormat; + } + #endregion + #region Nested type: StyleInfo + internal struct StyleInfo + { + public UInt32 StyleId; + public UInt32 FontId; + public UInt32 FillId; + public UInt32 BorderId; + public Int32 NumberFormatId; + public IXLStyle Style; + } + #endregion + } +} diff --git a/ClosedXML/Excel/XLWorkbook_Save.cs b/ClosedXML/Excel/XLWorkbook_Save.cs index 9b099a8..7604838 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -1,5013 +1,5014 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; -using DocumentFormat.OpenXml; -using DocumentFormat.OpenXml.CustomProperties; -using DocumentFormat.OpenXml.Drawing; -using DocumentFormat.OpenXml.ExtendedProperties; -using DocumentFormat.OpenXml.Packaging; -using DocumentFormat.OpenXml.Spreadsheet; -using DocumentFormat.OpenXml.VariantTypes; -using DocumentFormat.OpenXml.Validation; -using DocumentFormat.OpenXml.Vml.Office; -using DocumentFormat.OpenXml.Vml.Spreadsheet; -using Vml = DocumentFormat.OpenXml.Vml; -using BackgroundColor = DocumentFormat.OpenXml.Spreadsheet.BackgroundColor; -using BottomBorder = DocumentFormat.OpenXml.Spreadsheet.BottomBorder; -using Break = DocumentFormat.OpenXml.Spreadsheet.Break; -using Fill = DocumentFormat.OpenXml.Spreadsheet.Fill; -using FontScheme = DocumentFormat.OpenXml.Drawing.FontScheme; -using Fonts = DocumentFormat.OpenXml.Spreadsheet.Fonts; -using ForegroundColor = DocumentFormat.OpenXml.Spreadsheet.ForegroundColor; -using GradientFill = DocumentFormat.OpenXml.Drawing.GradientFill; -using GradientStop = DocumentFormat.OpenXml.Drawing.GradientStop; -using Hyperlink = DocumentFormat.OpenXml.Spreadsheet.Hyperlink; -using LeftBorder = DocumentFormat.OpenXml.Spreadsheet.LeftBorder; -using Outline = DocumentFormat.OpenXml.Drawing.Outline; -using Path = System.IO.Path; -using PatternFill = DocumentFormat.OpenXml.Spreadsheet.PatternFill; -using Properties = DocumentFormat.OpenXml.ExtendedProperties.Properties; -using RightBorder = DocumentFormat.OpenXml.Spreadsheet.RightBorder; -using Table = DocumentFormat.OpenXml.Spreadsheet.Table; -using Text = DocumentFormat.OpenXml.Spreadsheet.Text; -using TopBorder = DocumentFormat.OpenXml.Spreadsheet.TopBorder; -using Underline = DocumentFormat.OpenXml.Spreadsheet.Underline; -using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet; -using System.Xml; -using System.Xml.Linq; -using System.Text; -using ClosedXML.Utils; -using Anchor = DocumentFormat.OpenXml.Vml.Spreadsheet.Anchor; -using Field = DocumentFormat.OpenXml.Spreadsheet.Field; -using Run = DocumentFormat.OpenXml.Spreadsheet.Run; -using RunProperties = DocumentFormat.OpenXml.Spreadsheet.RunProperties; -using VerticalTextAlignment = DocumentFormat.OpenXml.Spreadsheet.VerticalTextAlignment; -using System.Threading; - -namespace ClosedXML.Excel -{ - public partial class XLWorkbook - { - private const Double ColumnWidthOffset = 0.710625; - - //private Dictionary sharedStrings; - //private Dictionary context.SharedStyles; - - private static readonly EnumValue CvSharedString = new EnumValue(CellValues.SharedString); - private static readonly EnumValue CvInlineString = new EnumValue(CellValues.InlineString); - private static readonly EnumValue CvNumber = new EnumValue(CellValues.Number); - private static readonly EnumValue CvDate = new EnumValue(CellValues.Date); - private static readonly EnumValue CvBoolean = new EnumValue(CellValues.Boolean); - - private static EnumValue GetCellValue(XLCell xlCell) - { - switch (xlCell.DataType) - { - case XLCellValues.Text: - { - return xlCell.ShareString ? CvSharedString : CvInlineString; - } - case XLCellValues.Number: - return CvNumber; - case XLCellValues.DateTime: - return CvDate; - case XLCellValues.Boolean: - return CvBoolean; - case XLCellValues.TimeSpan: - return CvNumber; - default: - throw new NotImplementedException(); - } - } - - private bool Validate(SpreadsheetDocument package) - { - var backupCulture = Thread.CurrentThread.CurrentCulture; - - IEnumerable errors; - try - { - Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; - var validator = new OpenXmlValidator(); - errors = validator.Validate(package); - } - finally - { - Thread.CurrentThread.CurrentCulture = backupCulture; - } - - if (errors.Any()) - { - var message = string.Join("\r\n", errors.Select(e => string.Format("{0} in {1}", e.Description, e.Path.XPath)).ToArray()); - throw new ApplicationException(message); - } - return true; - } - - private void CreatePackage(String filePath, SpreadsheetDocumentType spreadsheetDocumentType, bool validate) - { - PathHelper.CreateDirectory(Path.GetDirectoryName(filePath)); - var package = File.Exists(filePath) - ? SpreadsheetDocument.Open(filePath, true) - : SpreadsheetDocument.Create(filePath, spreadsheetDocumentType); - - using (package) - { - CreateParts(package); - if (validate) Validate(package); - } - } - - private void CreatePackage(Stream stream, bool newStream, SpreadsheetDocumentType spreadsheetDocumentType, bool validate) - { - var package = newStream - ? SpreadsheetDocument.Create(stream, spreadsheetDocumentType) - : SpreadsheetDocument.Open(stream, true); - - using (package) - { - CreateParts(package); - if (validate) Validate(package); - } - } - - // http://blogs.msdn.com/b/vsod/archive/2010/02/05/how-to-delete-a-worksheet-from-excel-using-open-xml-sdk-2-0.aspx - private void DeleteSheetAndDependencies(WorkbookPart wbPart, string sheetId) - { - //Get the SheetToDelete from workbook.xml - Sheet worksheet = wbPart.Workbook.Descendants().Where(s => s.Id == sheetId).FirstOrDefault(); - if (worksheet == null) - { } - - string sheetName = worksheet.Name; - // Get the pivot Table Parts - IEnumerable pvtTableCacheParts = wbPart.PivotTableCacheDefinitionParts; - Dictionary pvtTableCacheDefinationPart = new Dictionary(); - foreach (PivotTableCacheDefinitionPart Item in pvtTableCacheParts) - { - PivotCacheDefinition pvtCacheDef = Item.PivotCacheDefinition; - //Check if this CacheSource is linked to SheetToDelete - var pvtCahce = pvtCacheDef.Descendants().Where(s => s.WorksheetSource.Sheet == sheetName); - if (pvtCahce.Count() > 0) - { - pvtTableCacheDefinationPart.Add(Item, Item.ToString()); - } - } - foreach (var Item in pvtTableCacheDefinationPart) - { - wbPart.DeletePart(Item.Key); - } - - // Remove the sheet reference from the workbook. - WorksheetPart worksheetPart = (WorksheetPart)(wbPart.GetPartById(sheetId)); - worksheet.Remove(); - - // Delete the worksheet part. - wbPart.DeletePart(worksheetPart); - - //Get the DefinedNames - var definedNames = wbPart.Workbook.Descendants().FirstOrDefault(); - if (definedNames != null) - { - List defNamesToDelete = new List(); - - foreach (DefinedName Item in definedNames) - { - // This condition checks to delete only those names which are part of Sheet in question - if (Item.Text.Contains(worksheet.Name + "!")) - defNamesToDelete.Add(Item); - } - - foreach (DefinedName Item in defNamesToDelete) - { - Item.Remove(); - } - - } - // Get the CalculationChainPart - //Note: An instance of this part type contains an ordered set of references to all cells in all worksheets in the - //workbook whose value is calculated from any formula - - CalculationChainPart calChainPart; - calChainPart = wbPart.CalculationChainPart; - if (calChainPart != null) - { - var calChainEntries = calChainPart.CalculationChain.Descendants().Where(c => c.SheetId == sheetId); - List calcsToDelete = new List(); - foreach (CalculationCell Item in calChainEntries) - { - calcsToDelete.Add(Item); - } - - foreach (CalculationCell Item in calcsToDelete) - { - Item.Remove(); - } - - if (calChainPart.CalculationChain.Count() == 0) - { - wbPart.DeletePart(calChainPart); - } - } - } - - // Adds child parts and generates content of the specified part. - private void CreateParts(SpreadsheetDocument document) - { - var context = new SaveContext(); - - var workbookPart = document.WorkbookPart ?? document.AddWorkbookPart(); - - var worksheets = WorksheetsInternal; - - - var partsToRemove = workbookPart.Parts.Where(s => worksheets.Deleted.Contains(s.RelationshipId)).ToList(); - - var pivotCacheDefinitionsToRemove = partsToRemove.SelectMany(s => ((WorksheetPart)s.OpenXmlPart).PivotTableParts.Select(pt => pt.PivotTableCacheDefinitionPart)).Distinct().ToList(); - pivotCacheDefinitionsToRemove.ForEach(c => workbookPart.DeletePart(c)); - - if (workbookPart.Workbook != null && workbookPart.Workbook.PivotCaches != null) - { - var pivotCachesToRemove = workbookPart.Workbook.PivotCaches.Where(pc => pivotCacheDefinitionsToRemove.Select(pcd => workbookPart.GetIdOfPart(pcd)).ToList().Contains(((PivotCache)pc).Id)).Distinct().ToList(); - pivotCachesToRemove.ForEach(c => workbookPart.Workbook.PivotCaches.RemoveChild(c)); - } - - worksheets.Deleted.ToList().ForEach(ws => DeleteSheetAndDependencies(workbookPart, ws)); - - // Ensure all RelId's have been added to the context - context.RelIdGenerator.AddValues(workbookPart.Parts.Select(p => p.RelationshipId), RelType.Workbook); - context.RelIdGenerator.AddValues(WorksheetsInternal.Cast().Where(ws => !XLHelper.IsNullOrWhiteSpace(ws.RelId)).Select(ws => ws.RelId), RelType.Workbook); - context.RelIdGenerator.AddValues(WorksheetsInternal.Cast().Where(ws => !XLHelper.IsNullOrWhiteSpace(ws.LegacyDrawingId)).Select(ws => ws.LegacyDrawingId), RelType.Workbook); - context.RelIdGenerator.AddValues(WorksheetsInternal - .Cast() - .SelectMany(ws => ws.Tables.Cast()) - .Where(t => !XLHelper.IsNullOrWhiteSpace(t.RelId)) - .Select(t => t.RelId), RelType.Workbook); - - var extendedFilePropertiesPart = document.ExtendedFilePropertiesPart ?? - document.AddNewPart( - context.RelIdGenerator.GetNext(RelType.Workbook)); - - GenerateExtendedFilePropertiesPartContent(extendedFilePropertiesPart); - - GenerateWorkbookPartContent(workbookPart, context); - - var sharedStringTablePart = workbookPart.SharedStringTablePart ?? - workbookPart.AddNewPart( - context.RelIdGenerator.GetNext(RelType.Workbook)); - - GenerateSharedStringTablePartContent(sharedStringTablePart, context); - - var workbookStylesPart = workbookPart.WorkbookStylesPart ?? - workbookPart.AddNewPart( - context.RelIdGenerator.GetNext(RelType.Workbook)); - - GenerateWorkbookStylesPartContent(workbookStylesPart, context); - - foreach (var worksheet in WorksheetsInternal.Cast().OrderBy(w => w.Position)) - { - //context.RelIdGenerator.Reset(RelType.); - WorksheetPart worksheetPart; - var wsRelId = worksheet.RelId; - if (workbookPart.Parts.Any(p => p.RelationshipId == wsRelId)) - { - worksheetPart = (WorksheetPart)workbookPart.GetPartById(wsRelId); - var wsPartsToRemove = worksheetPart.TableDefinitionParts.ToList(); - wsPartsToRemove.ForEach(tdp => worksheetPart.DeletePart(tdp)); - } - else - worksheetPart = workbookPart.AddNewPart(wsRelId); - - - context.RelIdGenerator.AddValues(worksheetPart.HyperlinkRelationships.Select(hr => hr.Id), RelType.Workbook); - context.RelIdGenerator.AddValues(worksheetPart.Parts.Select(p => p.RelationshipId), RelType.Workbook); - if (worksheetPart.DrawingsPart != null) - context.RelIdGenerator.AddValues(worksheetPart.DrawingsPart.Parts.Select(p => p.RelationshipId), RelType.Workbook); - - // delete comment related parts (todo: review) - DeleteComments(worksheetPart, worksheet, context); - - if (worksheet.Internals.CellsCollection.GetCells(c => c.HasComment).Any()) - { - var id = context.RelIdGenerator.GetNext(RelType.Workbook); - var worksheetCommentsPart = - worksheetPart.AddNewPart(id); - - GenerateWorksheetCommentsPartContent(worksheetCommentsPart, worksheet); - - //VmlDrawingPart vmlDrawingPart = worksheetPart.AddNewPart(worksheet.LegacyDrawingId); - var vmlDrawingPart = worksheetPart.VmlDrawingParts.FirstOrDefault(); - if (vmlDrawingPart == null) - { - if (XLHelper.IsNullOrWhiteSpace(worksheet.LegacyDrawingId)) - { - worksheet.LegacyDrawingId = context.RelIdGenerator.GetNext(RelType.Workbook); - worksheet.LegacyDrawingIsNew = true; - } - - vmlDrawingPart = worksheetPart.AddNewPart(worksheet.LegacyDrawingId); - } - GenerateVmlDrawingPartContent(vmlDrawingPart, worksheet, context); - } - - GenerateWorksheetPartContent(worksheetPart, worksheet, context); - - if (worksheet.PivotTables.Any()) - { - GeneratePivotTables(workbookPart, worksheetPart, worksheet, context); - } - - // Remove any orphaned references - maybe more types? - foreach (var orphan in worksheetPart.Worksheet.OfType().Where(lg => !worksheetPart.Parts.Any(p => p.RelationshipId == lg.Id))) - worksheetPart.Worksheet.RemoveChild(orphan); - - foreach (var orphan in worksheetPart.Worksheet.OfType().Where(d => !worksheetPart.Parts.Any(p => p.RelationshipId == d.Id))) - worksheetPart.Worksheet.RemoveChild(orphan); - } - - // Remove empty pivot cache part - if (workbookPart.Workbook.PivotCaches != null && !workbookPart.Workbook.PivotCaches.Any()) - workbookPart.Workbook.RemoveChild(workbookPart.Workbook.PivotCaches); - - GenerateCalculationChainPartContent(workbookPart, context); - - if (workbookPart.ThemePart == null) - { - var themePart = workbookPart.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); - GenerateThemePartContent(themePart); - } - - if (CustomProperties.Any()) - { - document.GetPartsOfType().ToList().ForEach(p => document.DeletePart(p)); - var customFilePropertiesPart = - document.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); - - GenerateCustomFilePropertiesPartContent(customFilePropertiesPart); - } - SetPackageProperties(document); - } - - private void DeleteComments(WorksheetPart worksheetPart, XLWorksheet worksheet, SaveContext context) - { - // We have the comments so we can delete the comments part - worksheetPart.DeletePart(worksheetPart.WorksheetCommentsPart); - var vmlDrawingPart = worksheetPart.VmlDrawingParts.FirstOrDefault(); - - // Only delete the VmlDrawingParts for comments. - if (vmlDrawingPart != null) - { - var xdoc = XDocumentExtensions.Load(vmlDrawingPart.GetStream(FileMode.Open)); - //xdoc.Root.Elements().Where(e => e.Name.LocalName == "shapelayout").Remove(); - xdoc.Root.Elements().Where( - e => e.Name.LocalName == "shapetype" && (string)e.Attribute("id") == @"_x0000_t202").Remove(); - xdoc.Root.Elements().Where( - e => e.Name.LocalName == "shape" && (string)e.Attribute("type") == @"#_x0000_t202").Remove(); - var imageParts = vmlDrawingPart.ImageParts.ToList(); - var legacyParts = vmlDrawingPart.LegacyDiagramTextParts.ToList(); - var rId = worksheetPart.GetIdOfPart(vmlDrawingPart); - worksheet.LegacyDrawingId = rId; - worksheetPart.ChangeIdOfPart(vmlDrawingPart, "xxRRxx"); // Anything will do for the new relationship id - // we just want it alive enough to create the copy - - var hasShapes = xdoc.Root.Elements().Any(e => e.Name.LocalName == "shape" || e.Name.LocalName == "group"); - - VmlDrawingPart vmlDrawingPartNew = null; - var hasNewPart = (imageParts.Count > 0 || legacyParts.Count > 0 || hasShapes); - if (hasNewPart) - { - vmlDrawingPartNew = worksheetPart.AddNewPart(rId); - - using (var writer = new XmlTextWriter(vmlDrawingPartNew.GetStream(FileMode.Create), Encoding.UTF8)) - { - writer.WriteRaw(xdoc.ToString()); - } - - imageParts.ForEach(p => vmlDrawingPartNew.AddPart(p, vmlDrawingPart.GetIdOfPart(p))); - legacyParts.ForEach(p => vmlDrawingPartNew.AddPart(p, vmlDrawingPart.GetIdOfPart(p))); - } - - worksheetPart.DeletePart(vmlDrawingPart); - - if (hasNewPart && rId != worksheetPart.GetIdOfPart(vmlDrawingPartNew)) - worksheetPart.ChangeIdOfPart(vmlDrawingPartNew, rId); - } - } - - private static void GenerateTables(XLWorksheet worksheet, WorksheetPart worksheetPart, SaveContext context) - { - worksheetPart.Worksheet.RemoveAllChildren(); - - if (!worksheet.Tables.Any()) return; - - foreach (var table in worksheet.Tables) - { - var tableRelId = context.RelIdGenerator.GetNext(RelType.Workbook); - - var xlTable = (XLTable)table; - xlTable.RelId = tableRelId; - - var tableDefinitionPart = worksheetPart.AddNewPart(tableRelId); - GenerateTableDefinitionPartContent(tableDefinitionPart, xlTable, context); - } - } - - private void GenerateExtendedFilePropertiesPartContent(ExtendedFilePropertiesPart extendedFilePropertiesPart) - { - if (extendedFilePropertiesPart.Properties == null) - extendedFilePropertiesPart.Properties = new Properties(); - - var properties = extendedFilePropertiesPart.Properties; - if ( - !properties.NamespaceDeclarations.Contains(new KeyValuePair("vt", - "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"))) - { - properties.AddNamespaceDeclaration("vt", - "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); - } - - if (properties.Application == null) - properties.AppendChild(new Application { Text = "Microsoft Excel" }); - - if (properties.DocumentSecurity == null) - properties.AppendChild(new DocumentSecurity { Text = "0" }); - - if (properties.ScaleCrop == null) - properties.AppendChild(new ScaleCrop { Text = "false" }); - - if (properties.HeadingPairs == null) - properties.HeadingPairs = new HeadingPairs(); - - if (properties.TitlesOfParts == null) - properties.TitlesOfParts = new TitlesOfParts(); - - properties.HeadingPairs.VTVector = new VTVector { BaseType = VectorBaseValues.Variant }; - - properties.TitlesOfParts.VTVector = new VTVector { BaseType = VectorBaseValues.Lpstr }; - - var vTVectorOne = properties.HeadingPairs.VTVector; - - var vTVectorTwo = properties.TitlesOfParts.VTVector; - - var modifiedWorksheets = - ((IEnumerable)WorksheetsInternal).Select(w => new { w.Name, Order = w.Position }).ToList(); - var modifiedNamedRanges = GetModifiedNamedRanges(); - var modifiedWorksheetsCount = modifiedWorksheets.Count; - var modifiedNamedRangesCount = modifiedNamedRanges.Count; - - InsertOnVtVector(vTVectorOne, "Worksheets", 0, modifiedWorksheetsCount.ToString()); - InsertOnVtVector(vTVectorOne, "Named Ranges", 2, modifiedNamedRangesCount.ToString()); - - vTVectorTwo.Size = (UInt32)(modifiedNamedRangesCount + modifiedWorksheetsCount); - - foreach ( - var vTlpstr3 in modifiedWorksheets.OrderBy(w => w.Order).Select(w => new VTLPSTR { Text = w.Name })) - vTVectorTwo.AppendChild(vTlpstr3); - - foreach (var vTlpstr7 in modifiedNamedRanges.Select(nr => new VTLPSTR { Text = nr })) - vTVectorTwo.AppendChild(vTlpstr7); - - if (Properties.Manager != null) - { - if (!XLHelper.IsNullOrWhiteSpace(Properties.Manager)) - { - if (properties.Manager == null) - properties.Manager = new Manager(); - - properties.Manager.Text = Properties.Manager; - } - else - properties.Manager = null; - } - - if (Properties.Company == null) return; - - if (!XLHelper.IsNullOrWhiteSpace(Properties.Company)) - { - if (properties.Company == null) - properties.Company = new Company(); - - properties.Company.Text = Properties.Company; - } - else - properties.Company = null; - } - - private static void InsertOnVtVector(VTVector vTVector, String property, Int32 index, String text) - { - var m = from e1 in vTVector.Elements() - where e1.Elements().Any(e2 => e2.Text == property) - select e1; - if (!m.Any()) - { - if (vTVector.Size == null) - vTVector.Size = new UInt32Value(0U); - - vTVector.Size += 2U; - var variant1 = new Variant(); - var vTlpstr1 = new VTLPSTR { Text = property }; - variant1.AppendChild(vTlpstr1); - vTVector.InsertAt(variant1, index); - - var variant2 = new Variant(); - var vTInt321 = new VTInt32(); - variant2.AppendChild(vTInt321); - vTVector.InsertAt(variant2, index + 1); - } - - var targetIndex = 0; - foreach (var e in vTVector.Elements()) - { - if (e.Elements().Any(e2 => e2.Text == property)) - { - vTVector.ElementAt(targetIndex + 1).GetFirstChild().Text = text; - break; - } - targetIndex++; - } - } - - private List GetModifiedNamedRanges() - { - var namedRanges = new List(); - foreach (var w in WorksheetsInternal) - { - var wName = w.Name; - namedRanges.AddRange(w.NamedRanges.Select(n => wName + "!" + n.Name)); - namedRanges.Add(w.Name + "!Print_Area"); - namedRanges.Add(w.Name + "!Print_Titles"); - } - namedRanges.AddRange(NamedRanges.Select(n => n.Name)); - return namedRanges; - } - - private void GenerateWorkbookPartContent(WorkbookPart workbookPart, SaveContext context) - { - if (workbookPart.Workbook == null) - workbookPart.Workbook = new Workbook(); - - var workbook = workbookPart.Workbook; - if ( - !workbook.NamespaceDeclarations.Contains(new KeyValuePair("r", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships"))) - { - workbook.AddNamespaceDeclaration("r", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); - } - - #region WorkbookProperties - - if (workbook.WorkbookProperties == null) - workbook.WorkbookProperties = new WorkbookProperties(); - - if (workbook.WorkbookProperties.CodeName == null) - workbook.WorkbookProperties.CodeName = "ThisWorkbook"; - - if (Use1904DateSystem) - workbook.WorkbookProperties.Date1904 = true; - - #endregion - - if (LockStructure || LockWindows) - { - if (workbook.WorkbookProtection == null) - workbook.WorkbookProtection = new WorkbookProtection(); - - workbook.WorkbookProtection.LockStructure = LockStructure; - workbook.WorkbookProtection.LockWindows = LockWindows; - } - else - { - workbook.WorkbookProtection = null; - } - - - if (workbook.BookViews == null) - workbook.BookViews = new BookViews(); - - if (workbook.Sheets == null) - workbook.Sheets = new Sheets(); - - var worksheets = WorksheetsInternal; - workbook.Sheets.Elements().Where(s => worksheets.Deleted.Contains(s.Id)).ToList().ForEach( - s => s.Remove()); - - foreach (var sheet in workbook.Sheets.Elements()) - { - var sheetId = (Int32)sheet.SheetId.Value; - - if (WorksheetsInternal.All(w => w.SheetId != sheetId)) continue; - - var wks = WorksheetsInternal.Single(w => w.SheetId == sheetId); - wks.RelId = sheet.Id; - sheet.Name = wks.Name; - } - - foreach (var xlSheet in WorksheetsInternal.Cast().OrderBy(w => w.Position)) - { - string rId; - if (xlSheet.SheetId == 0 && XLHelper.IsNullOrWhiteSpace(xlSheet.RelId)) - { - rId = context.RelIdGenerator.GetNext(RelType.Workbook); - - while (WorksheetsInternal.Cast().Any(w => w.SheetId == Int32.Parse(rId.Substring(3)))) - rId = context.RelIdGenerator.GetNext(RelType.Workbook); - - xlSheet.SheetId = Int32.Parse(rId.Substring(3)); - xlSheet.RelId = rId; - } - else - { - if (XLHelper.IsNullOrWhiteSpace(xlSheet.RelId)) - { - rId = String.Format("rId{0}", xlSheet.SheetId); - context.RelIdGenerator.AddValues(new List { rId }, RelType.Workbook); - } - else - rId = xlSheet.RelId; - } - - if (!workbook.Sheets.Cast().Any(s => s.Id == rId)) - { - var newSheet = new Sheet - { - Name = xlSheet.Name, - Id = rId, - SheetId = (UInt32)xlSheet.SheetId - }; - - workbook.Sheets.AppendChild(newSheet); - } - } - - var sheetElements = from sheet in workbook.Sheets.Elements() - join worksheet in ((IEnumerable)WorksheetsInternal) on sheet.Id.Value - equals worksheet.RelId - orderby worksheet.Position - select sheet; - - UInt32 firstSheetVisible = 0; - var activeTab = - (from us in UnsupportedSheets where us.IsActive select (UInt32)us.Position - 1).FirstOrDefault(); - var foundVisible = false; - - var totalSheets = sheetElements.Count() + UnsupportedSheets.Count; - for (var p = 1; p <= totalSheets; p++) - { - if (UnsupportedSheets.All(us => us.Position != p)) - { - var sheet = sheetElements.ElementAt(p - UnsupportedSheets.Count(us => us.Position <= p) - 1); - workbook.Sheets.RemoveChild(sheet); - workbook.Sheets.AppendChild(sheet); - var xlSheet = Worksheet(sheet.Name); - if (xlSheet.Visibility != XLWorksheetVisibility.Visible) - sheet.State = xlSheet.Visibility.ToOpenXml(); - - if (foundVisible) continue; - - if (sheet.State == null || sheet.State == SheetStateValues.Visible) - foundVisible = true; - else - firstSheetVisible++; - } - else - { - var sheetId = UnsupportedSheets.First(us => us.Position == p).SheetId; - var sheet = workbook.Sheets.Elements().First(s => s.SheetId == sheetId); - workbook.Sheets.RemoveChild(sheet); - workbook.Sheets.AppendChild(sheet); - } - } - - var workbookView = workbook.BookViews.Elements().FirstOrDefault(); - - if (activeTab == 0) - { - activeTab = firstSheetVisible; - foreach (var ws in worksheets) - { - if (!ws.TabActive) continue; - - activeTab = (UInt32)(ws.Position - 1); - break; - } - } - - if (workbookView == null) - { - workbookView = new WorkbookView { ActiveTab = activeTab, FirstSheet = firstSheetVisible }; - workbook.BookViews.AppendChild(workbookView); - } - else - { - workbookView.ActiveTab = activeTab; - workbookView.FirstSheet = firstSheetVisible; - } - - var definedNames = new DefinedNames(); - foreach (var worksheet in WorksheetsInternal) - { - var wsSheetId = (UInt32)worksheet.SheetId; - UInt32 sheetId = 0; - foreach (var s in workbook.Sheets.Elements().TakeWhile(s => s.SheetId != wsSheetId)) - { - sheetId++; - } - - if (worksheet.PageSetup.PrintAreas.Any()) - { - var definedName = new DefinedName { Name = "_xlnm.Print_Area", LocalSheetId = sheetId }; - var worksheetName = worksheet.Name; - var definedNameText = worksheet.PageSetup.PrintAreas.Aggregate(String.Empty, - (current, printArea) => - current + - ("'" + worksheetName + "'!" + - printArea.RangeAddress. - FirstAddress.ToStringFixed( - XLReferenceStyle.A1) + - ":" + - printArea.RangeAddress. - LastAddress.ToStringFixed( - XLReferenceStyle.A1) + - ",")); - definedName.Text = definedNameText.Substring(0, definedNameText.Length - 1); - definedNames.AppendChild(definedName); - } - - if (worksheet.AutoFilter.Enabled) - { - var definedName = new DefinedName - { - Name = "_xlnm._FilterDatabase", - LocalSheetId = sheetId, - Text = "'" + worksheet.Name + "'!" + - worksheet.AutoFilter.Range.RangeAddress.FirstAddress.ToStringFixed( - XLReferenceStyle.A1) + - ":" + - worksheet.AutoFilter.Range.RangeAddress.LastAddress.ToStringFixed( - XLReferenceStyle.A1), - Hidden = BooleanValue.FromBoolean(true) - }; - definedNames.AppendChild(definedName); - } - - foreach (var nr in worksheet.NamedRanges.Where(n => n.Name != "_xlnm._FilterDatabase")) - { - var definedName = new DefinedName - { - Name = nr.Name, - LocalSheetId = sheetId, - Text = nr.ToString() - }; - - if (!nr.Visible) - definedName.Hidden = BooleanValue.FromBoolean(true); - - if (!XLHelper.IsNullOrWhiteSpace(nr.Comment)) - definedName.Comment = nr.Comment; - definedNames.AppendChild(definedName); - } - - - var definedNameTextRow = String.Empty; - var definedNameTextColumn = String.Empty; - if (worksheet.PageSetup.FirstRowToRepeatAtTop > 0) - { - definedNameTextRow = "'" + worksheet.Name + "'!" + worksheet.PageSetup.FirstRowToRepeatAtTop - + ":" + worksheet.PageSetup.LastRowToRepeatAtTop; - } - if (worksheet.PageSetup.FirstColumnToRepeatAtLeft > 0) - { - var minColumn = worksheet.PageSetup.FirstColumnToRepeatAtLeft; - var maxColumn = worksheet.PageSetup.LastColumnToRepeatAtLeft; - definedNameTextColumn = "'" + worksheet.Name + "'!" + - XLHelper.GetColumnLetterFromNumber(minColumn) - + ":" + XLHelper.GetColumnLetterFromNumber(maxColumn); - } - - string titles; - if (definedNameTextColumn.Length > 0) - { - titles = definedNameTextColumn; - if (definedNameTextRow.Length > 0) - titles += "," + definedNameTextRow; - } - else - titles = definedNameTextRow; - - if (titles.Length <= 0) continue; - - var definedName2 = new DefinedName - { - Name = "_xlnm.Print_Titles", - LocalSheetId = sheetId, - Text = titles - }; - - definedNames.AppendChild(definedName2); - } - - foreach (var nr in NamedRanges) - { - var definedName = new DefinedName - { - Name = nr.Name, - Text = nr.ToString() - }; - - if (!nr.Visible) - definedName.Hidden = BooleanValue.FromBoolean(true); - - if (!XLHelper.IsNullOrWhiteSpace(nr.Comment)) - definedName.Comment = nr.Comment; - definedNames.AppendChild(definedName); - } - - workbook.DefinedNames = definedNames; - - if (workbook.CalculationProperties == null) - workbook.CalculationProperties = new CalculationProperties { CalculationId = 125725U }; - - if (CalculateMode == XLCalculateMode.Default) - workbook.CalculationProperties.CalculationMode = null; - else - workbook.CalculationProperties.CalculationMode = CalculateMode.ToOpenXml(); - - if (ReferenceStyle == XLReferenceStyle.Default) - workbook.CalculationProperties.ReferenceMode = null; - else - workbook.CalculationProperties.ReferenceMode = ReferenceStyle.ToOpenXml(); - - if (CalculationOnSave) workbook.CalculationProperties.CalculationOnSave = CalculationOnSave; - if (ForceFullCalculation) workbook.CalculationProperties.ForceFullCalculation = ForceFullCalculation; - if (FullCalculationOnLoad) workbook.CalculationProperties.FullCalculationOnLoad = FullCalculationOnLoad; - if (FullPrecision) workbook.CalculationProperties.FullPrecision = FullPrecision; - } - - private void GenerateSharedStringTablePartContent(SharedStringTablePart sharedStringTablePart, - SaveContext context) - { - // Call all table headers to make sure their names are filled - var x = 0; - Worksheets.ForEach(w => w.Tables.ForEach(t => x = (t as XLTable).FieldNames.Count)); - - sharedStringTablePart.SharedStringTable = new SharedStringTable { Count = 0, UniqueCount = 0 }; - - var stringId = 0; - - var newStrings = new Dictionary(); - var newRichStrings = new Dictionary(); - foreach ( - var c in - Worksheets.Cast().SelectMany( - w => - w.Internals.CellsCollection.GetCells( - c => ((c.DataType == XLCellValues.Text && c.ShareString) || c.HasRichText) - && (c as XLCell).InnerText.Length > 0 - && XLHelper.IsNullOrWhiteSpace(c.FormulaA1) - ))) - { - c.DataType = XLCellValues.Text; - if (c.HasRichText) - { - if (newRichStrings.ContainsKey(c.RichText)) - c.SharedStringId = newRichStrings[c.RichText]; - else - { - var sharedStringItem = new SharedStringItem(); - foreach (var rt in c.RichText.Where(r => !String.IsNullOrEmpty(r.Text))) - { - sharedStringItem.Append(GetRun(rt)); - } - - if (c.RichText.HasPhonetics) - { - foreach (var p in c.RichText.Phonetics) - { - var phoneticRun = new PhoneticRun - { - BaseTextStartIndex = (UInt32)p.Start, - EndingBaseIndex = (UInt32)p.End - }; - - var text = new Text { Text = p.Text }; - if (p.Text.PreserveSpaces()) - text.Space = SpaceProcessingModeValues.Preserve; - - phoneticRun.Append(text); - sharedStringItem.Append(phoneticRun); - } - var f = new XLFont(null, c.RichText.Phonetics); - if (!context.SharedFonts.ContainsKey(f)) - context.SharedFonts.Add(f, new FontInfo { Font = f }); - - var phoneticProperties = new PhoneticProperties - { - FontId = - context.SharedFonts[ - new XLFont(null, c.RichText.Phonetics)]. - FontId - }; - if (c.RichText.Phonetics.Alignment != XLPhoneticAlignment.Left) - phoneticProperties.Alignment = c.RichText.Phonetics.Alignment.ToOpenXml(); - if (c.RichText.Phonetics.Type != XLPhoneticType.FullWidthKatakana) - phoneticProperties.Type = c.RichText.Phonetics.Type.ToOpenXml(); - - sharedStringItem.Append(phoneticProperties); - } - - sharedStringTablePart.SharedStringTable.Append(sharedStringItem); - sharedStringTablePart.SharedStringTable.Count += 1; - sharedStringTablePart.SharedStringTable.UniqueCount += 1; - - newRichStrings.Add(c.RichText, stringId); - c.SharedStringId = stringId; - - stringId++; - } - } - else - { - if (newStrings.ContainsKey(c.Value.ToString())) - c.SharedStringId = newStrings[c.Value.ToString()]; - else - { - var s = c.Value.ToString(); - var sharedStringItem = new SharedStringItem(); - var text = new Text { Text = XmlEncoder.EncodeString(s) }; - if (!s.Trim().Equals(s)) - text.Space = SpaceProcessingModeValues.Preserve; - sharedStringItem.Append(text); - sharedStringTablePart.SharedStringTable.Append(sharedStringItem); - sharedStringTablePart.SharedStringTable.Count += 1; - sharedStringTablePart.SharedStringTable.UniqueCount += 1; - - newStrings.Add(c.Value.ToString(), stringId); - c.SharedStringId = stringId; - - stringId++; - } - } - } - } - - private static Run GetRun(IXLRichString rt) - { - var run = new Run(); - - var runProperties = new RunProperties(); - - var bold = rt.Bold ? new Bold() : null; - var italic = rt.Italic ? new Italic() : null; - var underline = rt.Underline != XLFontUnderlineValues.None - ? new Underline { Val = rt.Underline.ToOpenXml() } - : null; - var strike = rt.Strikethrough ? new Strike() : null; - var verticalAlignment = new VerticalTextAlignment - { Val = rt.VerticalAlignment.ToOpenXml() }; - var shadow = rt.Shadow ? new Shadow() : null; - var fontSize = new FontSize { Val = rt.FontSize }; - var color = GetNewColor(rt.FontColor); - var fontName = new RunFont { Val = rt.FontName }; - var fontFamilyNumbering = new FontFamily { Val = (Int32)rt.FontFamilyNumbering }; - - if (bold != null) runProperties.Append(bold); - if (italic != null) runProperties.Append(italic); - - if (strike != null) runProperties.Append(strike); - if (shadow != null) runProperties.Append(shadow); - if (underline != null) runProperties.Append(underline); - runProperties.Append(verticalAlignment); - - runProperties.Append(fontSize); - runProperties.Append(color); - runProperties.Append(fontName); - runProperties.Append(fontFamilyNumbering); - - var text = new Text { Text = rt.Text }; - if (rt.Text.PreserveSpaces()) - text.Space = SpaceProcessingModeValues.Preserve; - - run.Append(runProperties); - run.Append(text); - return run; - } - - private void GenerateCalculationChainPartContent(WorkbookPart workbookPart, SaveContext context) - { - var thisRelId = context.RelIdGenerator.GetNext(RelType.Workbook); - if (workbookPart.CalculationChainPart == null) - workbookPart.AddNewPart(thisRelId); - - if (workbookPart.CalculationChainPart.CalculationChain == null) - workbookPart.CalculationChainPart.CalculationChain = new CalculationChain(); - - var calculationChain = workbookPart.CalculationChainPart.CalculationChain; - calculationChain.RemoveAllChildren(); - - foreach (var worksheet in WorksheetsInternal) - { - var cellsWithoutFormulas = new HashSet(); - foreach (var c in worksheet.Internals.CellsCollection.GetCells()) - { - if (XLHelper.IsNullOrWhiteSpace(c.FormulaA1)) - cellsWithoutFormulas.Add(c.Address.ToStringRelative()); - else - { - if (c.FormulaA1.StartsWith("{")) - { - var cc = new CalculationCell - { - CellReference = c.Address.ToString(), - SheetId = worksheet.SheetId - }; - - if (c.FormulaReference == null) - c.FormulaReference = c.AsRange().RangeAddress; - if (c.FormulaReference.FirstAddress.Equals(c.Address)) - { - cc.Array = true; - calculationChain.AppendChild(cc); - calculationChain.AppendChild(new CalculationCell { CellReference = c.Address.ToString(), InChildChain = true }); - } - else - { - calculationChain.AppendChild(cc); - } - } - else - { - calculationChain.AppendChild(new CalculationCell - { - CellReference = c.Address.ToString(), - SheetId = worksheet.SheetId - }); - } - } - } - - //var cCellsToRemove = new List(); - var m = from cc in calculationChain.Elements() - where !(cc.SheetId != null || cc.InChildChain != null) - && calculationChain.Elements() - .Where(c1 => c1.SheetId != null) - .Select(c1 => c1.CellReference.Value) - .Contains(cc.CellReference.Value) - || cellsWithoutFormulas.Contains(cc.CellReference.Value) - select cc; - //m.ToList().ForEach(cc => cCellsToRemove.Add(cc)); - m.ToList().ForEach(cc => calculationChain.RemoveChild(cc)); - } - - if (!calculationChain.Any()) - workbookPart.DeletePart(workbookPart.CalculationChainPart); - } - - private void GenerateThemePartContent(ThemePart themePart) - { - var theme1 = new Theme { Name = "Office Theme" }; - theme1.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main"); - - var themeElements1 = new ThemeElements(); - - var colorScheme1 = new ColorScheme { Name = "Office" }; - - var dark1Color1 = new Dark1Color(); - var systemColor1 = new SystemColor - { - Val = SystemColorValues.WindowText, - LastColor = Theme.Text1.Color.ToHex().Substring(2) - }; - - dark1Color1.AppendChild(systemColor1); - - var light1Color1 = new Light1Color(); - var systemColor2 = new SystemColor - { - Val = SystemColorValues.Window, - LastColor = Theme.Background1.Color.ToHex().Substring(2) - }; - - light1Color1.AppendChild(systemColor2); - - var dark2Color1 = new Dark2Color(); - var rgbColorModelHex1 = new RgbColorModelHex { Val = Theme.Text2.Color.ToHex().Substring(2) }; - - dark2Color1.AppendChild(rgbColorModelHex1); - - var light2Color1 = new Light2Color(); - var rgbColorModelHex2 = new RgbColorModelHex { Val = Theme.Background2.Color.ToHex().Substring(2) }; - - light2Color1.AppendChild(rgbColorModelHex2); - - var accent1Color1 = new Accent1Color(); - var rgbColorModelHex3 = new RgbColorModelHex { Val = Theme.Accent1.Color.ToHex().Substring(2) }; - - accent1Color1.AppendChild(rgbColorModelHex3); - - var accent2Color1 = new Accent2Color(); - var rgbColorModelHex4 = new RgbColorModelHex { Val = Theme.Accent2.Color.ToHex().Substring(2) }; - - accent2Color1.AppendChild(rgbColorModelHex4); - - var accent3Color1 = new Accent3Color(); - var rgbColorModelHex5 = new RgbColorModelHex { Val = Theme.Accent3.Color.ToHex().Substring(2) }; - - accent3Color1.AppendChild(rgbColorModelHex5); - - var accent4Color1 = new Accent4Color(); - var rgbColorModelHex6 = new RgbColorModelHex { Val = Theme.Accent4.Color.ToHex().Substring(2) }; - - accent4Color1.AppendChild(rgbColorModelHex6); - - var accent5Color1 = new Accent5Color(); - var rgbColorModelHex7 = new RgbColorModelHex { Val = Theme.Accent5.Color.ToHex().Substring(2) }; - - accent5Color1.AppendChild(rgbColorModelHex7); - - var accent6Color1 = new Accent6Color(); - var rgbColorModelHex8 = new RgbColorModelHex { Val = Theme.Accent6.Color.ToHex().Substring(2) }; - - accent6Color1.AppendChild(rgbColorModelHex8); - - var hyperlink1 = new DocumentFormat.OpenXml.Drawing.Hyperlink(); - var rgbColorModelHex9 = new RgbColorModelHex { Val = Theme.Hyperlink.Color.ToHex().Substring(2) }; - - hyperlink1.AppendChild(rgbColorModelHex9); - - var followedHyperlinkColor1 = new FollowedHyperlinkColor(); - var rgbColorModelHex10 = new RgbColorModelHex { Val = Theme.FollowedHyperlink.Color.ToHex().Substring(2) }; - - followedHyperlinkColor1.AppendChild(rgbColorModelHex10); - - colorScheme1.AppendChild(dark1Color1); - colorScheme1.AppendChild(light1Color1); - colorScheme1.AppendChild(dark2Color1); - colorScheme1.AppendChild(light2Color1); - colorScheme1.AppendChild(accent1Color1); - colorScheme1.AppendChild(accent2Color1); - colorScheme1.AppendChild(accent3Color1); - colorScheme1.AppendChild(accent4Color1); - colorScheme1.AppendChild(accent5Color1); - colorScheme1.AppendChild(accent6Color1); - colorScheme1.AppendChild(hyperlink1); - colorScheme1.AppendChild(followedHyperlinkColor1); - - var fontScheme2 = new FontScheme { Name = "Office" }; - - var majorFont1 = new MajorFont(); - var latinFont1 = new LatinFont { Typeface = "Cambria" }; - var eastAsianFont1 = new EastAsianFont { Typeface = "" }; - var complexScriptFont1 = new ComplexScriptFont { Typeface = "" }; - var supplementalFont1 = new SupplementalFont { Script = "Jpan", Typeface = "MS Pゴシック" }; - var supplementalFont2 = new SupplementalFont { Script = "Hang", Typeface = "맑은 고딕" }; - var supplementalFont3 = new SupplementalFont { Script = "Hans", Typeface = "宋体" }; - var supplementalFont4 = new SupplementalFont { Script = "Hant", Typeface = "新細明體" }; - var supplementalFont5 = new SupplementalFont { Script = "Arab", Typeface = "Times New Roman" }; - var supplementalFont6 = new SupplementalFont { Script = "Hebr", Typeface = "Times New Roman" }; - var supplementalFont7 = new SupplementalFont { Script = "Thai", Typeface = "Tahoma" }; - var supplementalFont8 = new SupplementalFont { Script = "Ethi", Typeface = "Nyala" }; - var supplementalFont9 = new SupplementalFont { Script = "Beng", Typeface = "Vrinda" }; - var supplementalFont10 = new SupplementalFont { Script = "Gujr", Typeface = "Shruti" }; - var supplementalFont11 = new SupplementalFont { Script = "Khmr", Typeface = "MoolBoran" }; - var supplementalFont12 = new SupplementalFont { Script = "Knda", Typeface = "Tunga" }; - var supplementalFont13 = new SupplementalFont { Script = "Guru", Typeface = "Raavi" }; - var supplementalFont14 = new SupplementalFont { Script = "Cans", Typeface = "Euphemia" }; - var supplementalFont15 = new SupplementalFont { Script = "Cher", Typeface = "Plantagenet Cherokee" }; - var supplementalFont16 = new SupplementalFont { Script = "Yiii", Typeface = "Microsoft Yi Baiti" }; - var supplementalFont17 = new SupplementalFont { Script = "Tibt", Typeface = "Microsoft Himalaya" }; - var supplementalFont18 = new SupplementalFont { Script = "Thaa", Typeface = "MV Boli" }; - var supplementalFont19 = new SupplementalFont { Script = "Deva", Typeface = "Mangal" }; - var supplementalFont20 = new SupplementalFont { Script = "Telu", Typeface = "Gautami" }; - var supplementalFont21 = new SupplementalFont { Script = "Taml", Typeface = "Latha" }; - var supplementalFont22 = new SupplementalFont { Script = "Syrc", Typeface = "Estrangelo Edessa" }; - var supplementalFont23 = new SupplementalFont { Script = "Orya", Typeface = "Kalinga" }; - var supplementalFont24 = new SupplementalFont { Script = "Mlym", Typeface = "Kartika" }; - var supplementalFont25 = new SupplementalFont { Script = "Laoo", Typeface = "DokChampa" }; - var supplementalFont26 = new SupplementalFont { Script = "Sinh", Typeface = "Iskoola Pota" }; - var supplementalFont27 = new SupplementalFont { Script = "Mong", Typeface = "Mongolian Baiti" }; - var supplementalFont28 = new SupplementalFont { Script = "Viet", Typeface = "Times New Roman" }; - var supplementalFont29 = new SupplementalFont { Script = "Uigh", Typeface = "Microsoft Uighur" }; - - majorFont1.AppendChild(latinFont1); - majorFont1.AppendChild(eastAsianFont1); - majorFont1.AppendChild(complexScriptFont1); - majorFont1.AppendChild(supplementalFont1); - majorFont1.AppendChild(supplementalFont2); - majorFont1.AppendChild(supplementalFont3); - majorFont1.AppendChild(supplementalFont4); - majorFont1.AppendChild(supplementalFont5); - majorFont1.AppendChild(supplementalFont6); - majorFont1.AppendChild(supplementalFont7); - majorFont1.AppendChild(supplementalFont8); - majorFont1.AppendChild(supplementalFont9); - majorFont1.AppendChild(supplementalFont10); - majorFont1.AppendChild(supplementalFont11); - majorFont1.AppendChild(supplementalFont12); - majorFont1.AppendChild(supplementalFont13); - majorFont1.AppendChild(supplementalFont14); - majorFont1.AppendChild(supplementalFont15); - majorFont1.AppendChild(supplementalFont16); - majorFont1.AppendChild(supplementalFont17); - majorFont1.AppendChild(supplementalFont18); - majorFont1.AppendChild(supplementalFont19); - majorFont1.AppendChild(supplementalFont20); - majorFont1.AppendChild(supplementalFont21); - majorFont1.AppendChild(supplementalFont22); - majorFont1.AppendChild(supplementalFont23); - majorFont1.AppendChild(supplementalFont24); - majorFont1.AppendChild(supplementalFont25); - majorFont1.AppendChild(supplementalFont26); - majorFont1.AppendChild(supplementalFont27); - majorFont1.AppendChild(supplementalFont28); - majorFont1.AppendChild(supplementalFont29); - - var minorFont1 = new MinorFont(); - var latinFont2 = new LatinFont { Typeface = "Calibri" }; - var eastAsianFont2 = new EastAsianFont { Typeface = "" }; - var complexScriptFont2 = new ComplexScriptFont { Typeface = "" }; - var supplementalFont30 = new SupplementalFont { Script = "Jpan", Typeface = "MS Pゴシック" }; - var supplementalFont31 = new SupplementalFont { Script = "Hang", Typeface = "맑은 고딕" }; - var supplementalFont32 = new SupplementalFont { Script = "Hans", Typeface = "宋体" }; - var supplementalFont33 = new SupplementalFont { Script = "Hant", Typeface = "新細明體" }; - var supplementalFont34 = new SupplementalFont { Script = "Arab", Typeface = "Arial" }; - var supplementalFont35 = new SupplementalFont { Script = "Hebr", Typeface = "Arial" }; - var supplementalFont36 = new SupplementalFont { Script = "Thai", Typeface = "Tahoma" }; - var supplementalFont37 = new SupplementalFont { Script = "Ethi", Typeface = "Nyala" }; - var supplementalFont38 = new SupplementalFont { Script = "Beng", Typeface = "Vrinda" }; - var supplementalFont39 = new SupplementalFont { Script = "Gujr", Typeface = "Shruti" }; - var supplementalFont40 = new SupplementalFont { Script = "Khmr", Typeface = "DaunPenh" }; - var supplementalFont41 = new SupplementalFont { Script = "Knda", Typeface = "Tunga" }; - var supplementalFont42 = new SupplementalFont { Script = "Guru", Typeface = "Raavi" }; - var supplementalFont43 = new SupplementalFont { Script = "Cans", Typeface = "Euphemia" }; - var supplementalFont44 = new SupplementalFont { Script = "Cher", Typeface = "Plantagenet Cherokee" }; - var supplementalFont45 = new SupplementalFont { Script = "Yiii", Typeface = "Microsoft Yi Baiti" }; - var supplementalFont46 = new SupplementalFont { Script = "Tibt", Typeface = "Microsoft Himalaya" }; - var supplementalFont47 = new SupplementalFont { Script = "Thaa", Typeface = "MV Boli" }; - var supplementalFont48 = new SupplementalFont { Script = "Deva", Typeface = "Mangal" }; - var supplementalFont49 = new SupplementalFont { Script = "Telu", Typeface = "Gautami" }; - var supplementalFont50 = new SupplementalFont { Script = "Taml", Typeface = "Latha" }; - var supplementalFont51 = new SupplementalFont { Script = "Syrc", Typeface = "Estrangelo Edessa" }; - var supplementalFont52 = new SupplementalFont { Script = "Orya", Typeface = "Kalinga" }; - var supplementalFont53 = new SupplementalFont { Script = "Mlym", Typeface = "Kartika" }; - var supplementalFont54 = new SupplementalFont { Script = "Laoo", Typeface = "DokChampa" }; - var supplementalFont55 = new SupplementalFont { Script = "Sinh", Typeface = "Iskoola Pota" }; - var supplementalFont56 = new SupplementalFont { Script = "Mong", Typeface = "Mongolian Baiti" }; - var supplementalFont57 = new SupplementalFont { Script = "Viet", Typeface = "Arial" }; - var supplementalFont58 = new SupplementalFont { Script = "Uigh", Typeface = "Microsoft Uighur" }; - - minorFont1.AppendChild(latinFont2); - minorFont1.AppendChild(eastAsianFont2); - minorFont1.AppendChild(complexScriptFont2); - minorFont1.AppendChild(supplementalFont30); - minorFont1.AppendChild(supplementalFont31); - minorFont1.AppendChild(supplementalFont32); - minorFont1.AppendChild(supplementalFont33); - minorFont1.AppendChild(supplementalFont34); - minorFont1.AppendChild(supplementalFont35); - minorFont1.AppendChild(supplementalFont36); - minorFont1.AppendChild(supplementalFont37); - minorFont1.AppendChild(supplementalFont38); - minorFont1.AppendChild(supplementalFont39); - minorFont1.AppendChild(supplementalFont40); - minorFont1.AppendChild(supplementalFont41); - minorFont1.AppendChild(supplementalFont42); - minorFont1.AppendChild(supplementalFont43); - minorFont1.AppendChild(supplementalFont44); - minorFont1.AppendChild(supplementalFont45); - minorFont1.AppendChild(supplementalFont46); - minorFont1.AppendChild(supplementalFont47); - minorFont1.AppendChild(supplementalFont48); - minorFont1.AppendChild(supplementalFont49); - minorFont1.AppendChild(supplementalFont50); - minorFont1.AppendChild(supplementalFont51); - minorFont1.AppendChild(supplementalFont52); - minorFont1.AppendChild(supplementalFont53); - minorFont1.AppendChild(supplementalFont54); - minorFont1.AppendChild(supplementalFont55); - minorFont1.AppendChild(supplementalFont56); - minorFont1.AppendChild(supplementalFont57); - minorFont1.AppendChild(supplementalFont58); - - fontScheme2.AppendChild(majorFont1); - fontScheme2.AppendChild(minorFont1); - - var formatScheme1 = new FormatScheme { Name = "Office" }; - - var fillStyleList1 = new FillStyleList(); - - var solidFill1 = new SolidFill(); - var schemeColor1 = new SchemeColor { Val = SchemeColorValues.PhColor }; - - solidFill1.AppendChild(schemeColor1); - - var gradientFill1 = new GradientFill { RotateWithShape = true }; - - var gradientStopList1 = new GradientStopList(); - - var gradientStop1 = new GradientStop { Position = 0 }; - - var schemeColor2 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var tint1 = new Tint { Val = 50000 }; - var saturationModulation1 = new SaturationModulation { Val = 300000 }; - - schemeColor2.AppendChild(tint1); - schemeColor2.AppendChild(saturationModulation1); - - gradientStop1.AppendChild(schemeColor2); - - var gradientStop2 = new GradientStop { Position = 35000 }; - - var schemeColor3 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var tint2 = new Tint { Val = 37000 }; - var saturationModulation2 = new SaturationModulation { Val = 300000 }; - - schemeColor3.AppendChild(tint2); - schemeColor3.AppendChild(saturationModulation2); - - gradientStop2.AppendChild(schemeColor3); - - var gradientStop3 = new GradientStop { Position = 100000 }; - - var schemeColor4 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var tint3 = new Tint { Val = 15000 }; - var saturationModulation3 = new SaturationModulation { Val = 350000 }; - - schemeColor4.AppendChild(tint3); - schemeColor4.AppendChild(saturationModulation3); - - gradientStop3.AppendChild(schemeColor4); - - gradientStopList1.AppendChild(gradientStop1); - gradientStopList1.AppendChild(gradientStop2); - gradientStopList1.AppendChild(gradientStop3); - var linearGradientFill1 = new LinearGradientFill { Angle = 16200000, Scaled = true }; - - gradientFill1.AppendChild(gradientStopList1); - gradientFill1.AppendChild(linearGradientFill1); - - var gradientFill2 = new GradientFill { RotateWithShape = true }; - - var gradientStopList2 = new GradientStopList(); - - var gradientStop4 = new GradientStop { Position = 0 }; - - var schemeColor5 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var shade1 = new Shade { Val = 51000 }; - var saturationModulation4 = new SaturationModulation { Val = 130000 }; - - schemeColor5.AppendChild(shade1); - schemeColor5.AppendChild(saturationModulation4); - - gradientStop4.AppendChild(schemeColor5); - - var gradientStop5 = new GradientStop { Position = 80000 }; - - var schemeColor6 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var shade2 = new Shade { Val = 93000 }; - var saturationModulation5 = new SaturationModulation { Val = 130000 }; - - schemeColor6.AppendChild(shade2); - schemeColor6.AppendChild(saturationModulation5); - - gradientStop5.AppendChild(schemeColor6); - - var gradientStop6 = new GradientStop { Position = 100000 }; - - var schemeColor7 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var shade3 = new Shade { Val = 94000 }; - var saturationModulation6 = new SaturationModulation { Val = 135000 }; - - schemeColor7.AppendChild(shade3); - schemeColor7.AppendChild(saturationModulation6); - - gradientStop6.AppendChild(schemeColor7); - - gradientStopList2.AppendChild(gradientStop4); - gradientStopList2.AppendChild(gradientStop5); - gradientStopList2.AppendChild(gradientStop6); - var linearGradientFill2 = new LinearGradientFill { Angle = 16200000, Scaled = false }; - - gradientFill2.AppendChild(gradientStopList2); - gradientFill2.AppendChild(linearGradientFill2); - - fillStyleList1.AppendChild(solidFill1); - fillStyleList1.AppendChild(gradientFill1); - fillStyleList1.AppendChild(gradientFill2); - - var lineStyleList1 = new LineStyleList(); - - var outline1 = new Outline - { - Width = 9525, - CapType = LineCapValues.Flat, - CompoundLineType = CompoundLineValues.Single, - Alignment = PenAlignmentValues.Center - }; - - var solidFill2 = new SolidFill(); - - var schemeColor8 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var shade4 = new Shade { Val = 95000 }; - var saturationModulation7 = new SaturationModulation { Val = 105000 }; - - schemeColor8.AppendChild(shade4); - schemeColor8.AppendChild(saturationModulation7); - - solidFill2.AppendChild(schemeColor8); - var presetDash1 = new PresetDash { Val = PresetLineDashValues.Solid }; - - outline1.AppendChild(solidFill2); - outline1.AppendChild(presetDash1); - - var outline2 = new Outline - { - Width = 25400, - CapType = LineCapValues.Flat, - CompoundLineType = CompoundLineValues.Single, - Alignment = PenAlignmentValues.Center - }; - - var solidFill3 = new SolidFill(); - var schemeColor9 = new SchemeColor { Val = SchemeColorValues.PhColor }; - - solidFill3.AppendChild(schemeColor9); - var presetDash2 = new PresetDash { Val = PresetLineDashValues.Solid }; - - outline2.AppendChild(solidFill3); - outline2.AppendChild(presetDash2); - - var outline3 = new Outline - { - Width = 38100, - CapType = LineCapValues.Flat, - CompoundLineType = CompoundLineValues.Single, - Alignment = PenAlignmentValues.Center - }; - - var solidFill4 = new SolidFill(); - var schemeColor10 = new SchemeColor { Val = SchemeColorValues.PhColor }; - - solidFill4.AppendChild(schemeColor10); - var presetDash3 = new PresetDash { Val = PresetLineDashValues.Solid }; - - outline3.AppendChild(solidFill4); - outline3.AppendChild(presetDash3); - - lineStyleList1.AppendChild(outline1); - lineStyleList1.AppendChild(outline2); - lineStyleList1.AppendChild(outline3); - - var effectStyleList1 = new EffectStyleList(); - - var effectStyle1 = new EffectStyle(); - - var effectList1 = new EffectList(); - - var outerShadow1 = new OuterShadow - { - BlurRadius = 40000L, - Distance = 20000L, - Direction = 5400000, - RotateWithShape = false - }; - - var rgbColorModelHex11 = new RgbColorModelHex { Val = "000000" }; - var alpha1 = new Alpha { Val = 38000 }; - - rgbColorModelHex11.AppendChild(alpha1); - - outerShadow1.AppendChild(rgbColorModelHex11); - - effectList1.AppendChild(outerShadow1); - - effectStyle1.AppendChild(effectList1); - - var effectStyle2 = new EffectStyle(); - - var effectList2 = new EffectList(); - - var outerShadow2 = new OuterShadow - { - BlurRadius = 40000L, - Distance = 23000L, - Direction = 5400000, - RotateWithShape = false - }; - - var rgbColorModelHex12 = new RgbColorModelHex { Val = "000000" }; - var alpha2 = new Alpha { Val = 35000 }; - - rgbColorModelHex12.AppendChild(alpha2); - - outerShadow2.AppendChild(rgbColorModelHex12); - - effectList2.AppendChild(outerShadow2); - - effectStyle2.AppendChild(effectList2); - - var effectStyle3 = new EffectStyle(); - - var effectList3 = new EffectList(); - - var outerShadow3 = new OuterShadow - { - BlurRadius = 40000L, - Distance = 23000L, - Direction = 5400000, - RotateWithShape = false - }; - - var rgbColorModelHex13 = new RgbColorModelHex { Val = "000000" }; - var alpha3 = new Alpha { Val = 35000 }; - - rgbColorModelHex13.AppendChild(alpha3); - - outerShadow3.AppendChild(rgbColorModelHex13); - - effectList3.AppendChild(outerShadow3); - - var scene3DType1 = new Scene3DType(); - - var camera1 = new Camera { Preset = PresetCameraValues.OrthographicFront }; - var rotation1 = new Rotation { Latitude = 0, Longitude = 0, Revolution = 0 }; - - camera1.AppendChild(rotation1); - - var lightRig1 = new LightRig { Rig = LightRigValues.ThreePoints, Direction = LightRigDirectionValues.Top }; - var rotation2 = new Rotation { Latitude = 0, Longitude = 0, Revolution = 1200000 }; - - lightRig1.AppendChild(rotation2); - - scene3DType1.AppendChild(camera1); - scene3DType1.AppendChild(lightRig1); - - var shape3DType1 = new Shape3DType(); - var bevelTop1 = new BevelTop { Width = 63500L, Height = 25400L }; - - shape3DType1.AppendChild(bevelTop1); - - effectStyle3.AppendChild(effectList3); - effectStyle3.AppendChild(scene3DType1); - effectStyle3.AppendChild(shape3DType1); - - effectStyleList1.AppendChild(effectStyle1); - effectStyleList1.AppendChild(effectStyle2); - effectStyleList1.AppendChild(effectStyle3); - - var backgroundFillStyleList1 = new BackgroundFillStyleList(); - - var solidFill5 = new SolidFill(); - var schemeColor11 = new SchemeColor { Val = SchemeColorValues.PhColor }; - - solidFill5.AppendChild(schemeColor11); - - var gradientFill3 = new GradientFill { RotateWithShape = true }; - - var gradientStopList3 = new GradientStopList(); - - var gradientStop7 = new GradientStop { Position = 0 }; - - var schemeColor12 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var tint4 = new Tint { Val = 40000 }; - var saturationModulation8 = new SaturationModulation { Val = 350000 }; - - schemeColor12.AppendChild(tint4); - schemeColor12.AppendChild(saturationModulation8); - - gradientStop7.AppendChild(schemeColor12); - - var gradientStop8 = new GradientStop { Position = 40000 }; - - var schemeColor13 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var tint5 = new Tint { Val = 45000 }; - var shade5 = new Shade { Val = 99000 }; - var saturationModulation9 = new SaturationModulation { Val = 350000 }; - - schemeColor13.AppendChild(tint5); - schemeColor13.AppendChild(shade5); - schemeColor13.AppendChild(saturationModulation9); - - gradientStop8.AppendChild(schemeColor13); - - var gradientStop9 = new GradientStop { Position = 100000 }; - - var schemeColor14 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var shade6 = new Shade { Val = 20000 }; - var saturationModulation10 = new SaturationModulation { Val = 255000 }; - - schemeColor14.AppendChild(shade6); - schemeColor14.AppendChild(saturationModulation10); - - gradientStop9.AppendChild(schemeColor14); - - gradientStopList3.AppendChild(gradientStop7); - gradientStopList3.AppendChild(gradientStop8); - gradientStopList3.AppendChild(gradientStop9); - - var pathGradientFill1 = new PathGradientFill { Path = PathShadeValues.Circle }; - var fillToRectangle1 = new FillToRectangle { Left = 50000, Top = -80000, Right = 50000, Bottom = 180000 }; - - pathGradientFill1.AppendChild(fillToRectangle1); - - gradientFill3.AppendChild(gradientStopList3); - gradientFill3.AppendChild(pathGradientFill1); - - var gradientFill4 = new GradientFill { RotateWithShape = true }; - - var gradientStopList4 = new GradientStopList(); - - var gradientStop10 = new GradientStop { Position = 0 }; - - var schemeColor15 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var tint6 = new Tint { Val = 80000 }; - var saturationModulation11 = new SaturationModulation { Val = 300000 }; - - schemeColor15.AppendChild(tint6); - schemeColor15.AppendChild(saturationModulation11); - - gradientStop10.AppendChild(schemeColor15); - - var gradientStop11 = new GradientStop { Position = 100000 }; - - var schemeColor16 = new SchemeColor { Val = SchemeColorValues.PhColor }; - var shade7 = new Shade { Val = 30000 }; - var saturationModulation12 = new SaturationModulation { Val = 200000 }; - - schemeColor16.AppendChild(shade7); - schemeColor16.AppendChild(saturationModulation12); - - gradientStop11.AppendChild(schemeColor16); - - gradientStopList4.AppendChild(gradientStop10); - gradientStopList4.AppendChild(gradientStop11); - - var pathGradientFill2 = new PathGradientFill { Path = PathShadeValues.Circle }; - var fillToRectangle2 = new FillToRectangle { Left = 50000, Top = 50000, Right = 50000, Bottom = 50000 }; - - pathGradientFill2.AppendChild(fillToRectangle2); - - gradientFill4.AppendChild(gradientStopList4); - gradientFill4.AppendChild(pathGradientFill2); - - backgroundFillStyleList1.AppendChild(solidFill5); - backgroundFillStyleList1.AppendChild(gradientFill3); - backgroundFillStyleList1.AppendChild(gradientFill4); - - formatScheme1.AppendChild(fillStyleList1); - formatScheme1.AppendChild(lineStyleList1); - formatScheme1.AppendChild(effectStyleList1); - formatScheme1.AppendChild(backgroundFillStyleList1); - - themeElements1.AppendChild(colorScheme1); - themeElements1.AppendChild(fontScheme2); - themeElements1.AppendChild(formatScheme1); - var objectDefaults1 = new ObjectDefaults(); - var extraColorSchemeList1 = new ExtraColorSchemeList(); - - theme1.AppendChild(themeElements1); - theme1.AppendChild(objectDefaults1); - theme1.AppendChild(extraColorSchemeList1); - - themePart.Theme = theme1; - } - - private void GenerateCustomFilePropertiesPartContent(CustomFilePropertiesPart customFilePropertiesPart1) - { - var properties2 = new DocumentFormat.OpenXml.CustomProperties.Properties(); - properties2.AddNamespaceDeclaration("vt", - "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); - var propertyId = 1; - foreach (var p in CustomProperties) - { - propertyId++; - var customDocumentProperty = new CustomDocumentProperty - { - FormatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}", - PropertyId = propertyId, - Name = p.Name - }; - if (p.Type == XLCustomPropertyType.Text) - { - var vTlpwstr1 = new VTLPWSTR { Text = p.GetValue() }; - customDocumentProperty.AppendChild(vTlpwstr1); - } - else if (p.Type == XLCustomPropertyType.Date) - { - var vTFileTime1 = new VTFileTime - { - Text = - p.GetValue().ToUniversalTime().ToString( - "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'") - }; - customDocumentProperty.AppendChild(vTFileTime1); - } - else if (p.Type == XLCustomPropertyType.Number) - { - var vTDouble1 = new VTDouble - { - Text = p.GetValue().ToInvariantString() - }; - customDocumentProperty.AppendChild(vTDouble1); - } - else - { - var vTBool1 = new VTBool { Text = p.GetValue().ToString().ToLower() }; - customDocumentProperty.AppendChild(vTBool1); - } - properties2.AppendChild(customDocumentProperty); - } - - customFilePropertiesPart1.Properties = properties2; - } - - private void SetPackageProperties(OpenXmlPackage document) - { - var created = Properties.Created == DateTime.MinValue ? DateTime.Now : Properties.Created; - var modified = Properties.Modified == DateTime.MinValue ? DateTime.Now : Properties.Modified; - document.PackageProperties.Created = created; - document.PackageProperties.Modified = modified; - document.PackageProperties.LastModifiedBy = Properties.LastModifiedBy; - - document.PackageProperties.Creator = Properties.Author; - document.PackageProperties.Title = Properties.Title; - document.PackageProperties.Subject = Properties.Subject; - document.PackageProperties.Category = Properties.Category; - document.PackageProperties.Keywords = Properties.Keywords; - document.PackageProperties.Description = Properties.Comments; - document.PackageProperties.ContentStatus = Properties.Status; - } - - private static string GetTableName(String originalTableName, SaveContext context) - { - var tableName = originalTableName.RemoveSpecialCharacters(); - var name = tableName; - if (context.TableNames.Contains(name)) - { - var i = 1; - name = tableName + i.ToInvariantString(); - while (context.TableNames.Contains(name)) - { - i++; - name = tableName + i.ToInvariantString(); - } - } - - context.TableNames.Add(name); - return name; - } - - private static void GenerateTableDefinitionPartContent(TableDefinitionPart tableDefinitionPart, XLTable xlTable, - SaveContext context) - { - context.TableId++; - var reference = xlTable.RangeAddress.FirstAddress + ":" + xlTable.RangeAddress.LastAddress; - var tableName = GetTableName(xlTable.Name, context); - var table = new Table - { - Id = context.TableId, - Name = tableName, - DisplayName = tableName, - Reference = reference - }; - - if (!xlTable.ShowHeaderRow) - table.HeaderRowCount = 0; - - if (xlTable.ShowTotalsRow) - table.TotalsRowCount = 1; - else - table.TotalsRowShown = false; - - var tableColumns1 = new TableColumns { Count = (UInt32)xlTable.ColumnCount() }; - - UInt32 columnId = 0; - foreach (var xlField in xlTable.Fields) - { - columnId++; - var fieldName = xlField.Name; - var tableColumn1 = new TableColumn - { - Id = columnId, - Name = fieldName.Replace("_x000a_", "_x005f_x000a_").Replace(Environment.NewLine, "_x000a_") - }; - if (xlTable.ShowTotalsRow) - { - if (xlField.TotalsRowFunction != XLTotalsRowFunction.None) - { - tableColumn1.TotalsRowFunction = xlField.TotalsRowFunction.ToOpenXml(); - - if (xlField.TotalsRowFunction == XLTotalsRowFunction.Custom) - tableColumn1.TotalsRowFormula = new TotalsRowFormula(xlField.TotalsRowFormulaA1); - } - - if (!XLHelper.IsNullOrWhiteSpace(xlField.TotalsRowLabel)) - tableColumn1.TotalsRowLabel = xlField.TotalsRowLabel; - } - tableColumns1.AppendChild(tableColumn1); - } - - var tableStyleInfo1 = new TableStyleInfo - { - ShowFirstColumn = xlTable.EmphasizeFirstColumn, - ShowLastColumn = xlTable.EmphasizeLastColumn, - ShowRowStripes = xlTable.ShowRowStripes, - ShowColumnStripes = xlTable.ShowColumnStripes - }; - - if (xlTable.Theme != XLTableTheme.None) - tableStyleInfo1.Name = xlTable.Theme.Name; - - if (xlTable.ShowAutoFilter) - { - var autoFilter1 = new AutoFilter(); - if (xlTable.ShowTotalsRow) - { - xlTable.AutoFilter.Range = xlTable.Worksheet.Range( - xlTable.RangeAddress.FirstAddress.RowNumber, xlTable.RangeAddress.FirstAddress.ColumnNumber, - xlTable.RangeAddress.LastAddress.RowNumber - 1, xlTable.RangeAddress.LastAddress.ColumnNumber); - } - else - xlTable.AutoFilter.Range = xlTable.Worksheet.Range(xlTable.RangeAddress); - - PopulateAutoFilter(xlTable.AutoFilter, autoFilter1); - - table.AppendChild(autoFilter1); - } - - table.AppendChild(tableColumns1); - table.AppendChild(tableStyleInfo1); - - tableDefinitionPart.Table = table; - } - - private static void GeneratePivotTables(WorkbookPart workbookPart, WorksheetPart worksheetPart, - XLWorksheet xlWorksheet, - SaveContext context) - { - PivotCaches pivotCaches; - uint cacheId = 0; - if (workbookPart.Workbook.PivotCaches == null) - pivotCaches = workbookPart.Workbook.InsertAfter(new PivotCaches(), workbookPart.Workbook.CalculationProperties); - else - { - pivotCaches = workbookPart.Workbook.PivotCaches; - if (pivotCaches.Any()) - cacheId = pivotCaches.Cast().Max(pc => pc.CacheId.Value) + 1; - } - - foreach (var pt in xlWorksheet.PivotTables.Cast()) - { - // TODO: Avoid duplicate pivot caches of same source range - - var workbookCacheRelId = pt.WorkbookCacheRelId; - PivotCache pivotCache; - PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart; - if (!XLHelper.IsNullOrWhiteSpace(pt.WorkbookCacheRelId)) - { - pivotCache = pivotCaches.Cast().Single(pc => pc.Id.Value == pt.WorkbookCacheRelId); - pivotTableCacheDefinitionPart = workbookPart.GetPartById(pt.WorkbookCacheRelId) as PivotTableCacheDefinitionPart; - } - else - { - workbookCacheRelId = context.RelIdGenerator.GetNext(RelType.Workbook); - pivotCache = new PivotCache { CacheId = cacheId++, Id = workbookCacheRelId }; - pivotTableCacheDefinitionPart = workbookPart.AddNewPart(workbookCacheRelId); - } - - GeneratePivotTableCacheDefinitionPartContent(pivotTableCacheDefinitionPart, pt); - - if (XLHelper.IsNullOrWhiteSpace(pt.WorkbookCacheRelId)) - pivotCaches.AppendChild(pivotCache); - - PivotTablePart pivotTablePart; - if (XLHelper.IsNullOrWhiteSpace(pt.RelId)) - pivotTablePart = worksheetPart.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); - else - pivotTablePart = worksheetPart.GetPartById(pt.RelId) as PivotTablePart; - - GeneratePivotTablePartContent(pivotTablePart, pt, pivotCache.CacheId, context); - - if (XLHelper.IsNullOrWhiteSpace(pt.RelId)) - pivotTablePart.AddPart(pivotTableCacheDefinitionPart, context.RelIdGenerator.GetNext(RelType.Workbook)); - } - } - - // Generates content of pivotTableCacheDefinitionPart - private static void GeneratePivotTableCacheDefinitionPartContent( - PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart, IXLPivotTable pt) - { - var source = pt.SourceRange; - - var pivotCacheDefinition = new PivotCacheDefinition - { - Id = "rId1", - SaveData = pt.SaveSourceData, - RefreshOnLoad = true //pt.RefreshDataOnOpen - }; - if (pt.ItemsToRetainPerField == XLItemsToRetain.None) - pivotCacheDefinition.MissingItemsLimit = 0U; - else if (pt.ItemsToRetainPerField == XLItemsToRetain.Max) - pivotCacheDefinition.MissingItemsLimit = XLHelper.MaxRowNumber; - - pivotCacheDefinition.AddNamespaceDeclaration("r", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); - - var cacheSource = new CacheSource { Type = SourceValues.Worksheet }; - cacheSource.AppendChild(new WorksheetSource { Name = source.ToString() }); - - var cacheFields = new CacheFields(); - - foreach (var c in source.Columns()) - { - var columnNumber = c.ColumnNumber(); - var columnName = c.FirstCell().Value.ToString(); - var xlpf = pt.Fields.Add(columnName); - - var field = - pt.RowLabels.Union(pt.ColumnLabels).Union(pt.ReportFilters).FirstOrDefault(f => f.SourceName == columnName); - if (field != null) - { - xlpf.CustomName = field.CustomName; - xlpf.Subtotals.AddRange(field.Subtotals); - } - - var sharedItems = new SharedItems(); - - var onlyNumbers = - !source.Cells().Any( - cell => - cell.Address.ColumnNumber == columnNumber && - cell.Address.RowNumber > source.FirstRow().RowNumber() && cell.DataType != XLCellValues.Number); - if (onlyNumbers) - { - sharedItems = new SharedItems - { ContainsSemiMixedTypes = false, ContainsString = false, ContainsNumber = true }; - } - else - { - foreach (var cellValue in source.Cells() - .Where(cell => cell.Address.ColumnNumber == columnNumber && cell.Address.RowNumber > source.FirstRow().RowNumber()) - .Select(cell => cell.Value.ToString()) - .Where(cellValue => !xlpf.SharedStrings.Select(ss => ss.ToLower()).Contains(cellValue.ToLower()))) - { - xlpf.SharedStrings.Add(cellValue); - } - - foreach (var li in xlpf.SharedStrings) - { - sharedItems.AppendChild(new StringItem { Val = li }); - } - } - - var cacheField = new CacheField { Name = xlpf.SourceName }; - cacheField.AppendChild(sharedItems); - cacheFields.AppendChild(cacheField); - } - - pivotCacheDefinition.AppendChild(cacheSource); - pivotCacheDefinition.AppendChild(cacheFields); - - pivotTableCacheDefinitionPart.PivotCacheDefinition = pivotCacheDefinition; - - var pivotTableCacheRecordsPart = pivotTableCacheDefinitionPart.GetPartsOfType().Any() ? - pivotTableCacheDefinitionPart.GetPartsOfType().First() : - pivotTableCacheDefinitionPart.AddNewPart("rId1"); - - var pivotCacheRecords = new PivotCacheRecords(); - pivotCacheRecords.AddNamespaceDeclaration("r", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); - pivotTableCacheRecordsPart.PivotCacheRecords = pivotCacheRecords; - } - - // Generates content of pivotTablePart - private static void GeneratePivotTablePartContent(PivotTablePart pivotTablePart, IXLPivotTable pt, uint cacheId, SaveContext context) - { - var pivotTableDefinition = new PivotTableDefinition - { - Name = pt.Name, - CacheId = cacheId, - DataCaption = "Values", - MergeItem = GetBooleanValue(pt.MergeAndCenterWithLabels, true), - Indent = Convert.ToUInt32(pt.RowLabelIndent), - PageOverThenDown = (pt.FilterAreaOrder == XLFilterAreaOrder.OverThenDown), - PageWrap = Convert.ToUInt32(pt.FilterFieldsPageWrap), - ShowError = String.IsNullOrEmpty(pt.ErrorValueReplacement), - UseAutoFormatting = GetBooleanValue(pt.AutofitColumns, true), - PreserveFormatting = GetBooleanValue(pt.PreserveCellFormatting, true), - RowGrandTotals = GetBooleanValue(pt.ShowGrandTotalsRows, true), - ColumnGrandTotals = GetBooleanValue(pt.ShowGrandTotalsColumns, true), - SubtotalHiddenItems = GetBooleanValue(pt.FilteredItemsInSubtotals, true), - MultipleFieldFilters = GetBooleanValue(pt.AllowMultipleFilters, true), - CustomListSort = GetBooleanValue(pt.UseCustomListsForSorting, true), - ShowDrill = GetBooleanValue(pt.ShowExpandCollapseButtons, true), - ShowDataTips = GetBooleanValue(pt.ShowContextualTooltips, true), - ShowMemberPropertyTips = GetBooleanValue(pt.ShowPropertiesInTooltips, true), - ShowHeaders = GetBooleanValue(pt.DisplayCaptionsAndDropdowns, true), - GridDropZones = GetBooleanValue(pt.ClassicPivotTableLayout, false), - ShowEmptyRow = GetBooleanValue(pt.ShowEmptyItemsOnRows, true), - ShowEmptyColumn = GetBooleanValue(pt.ShowEmptyItemsOnColumns, true), - ShowItems = GetBooleanValue(pt.DisplayItemLabels, true), - FieldListSortAscending = GetBooleanValue(pt.SortFieldsAtoZ, true), - PrintDrill = GetBooleanValue(pt.PrintExpandCollapsedButtons, true), - ItemPrintTitles = GetBooleanValue(pt.RepeatRowLabels, true), - FieldPrintTitles = GetBooleanValue(pt.PrintTitles, true), - EnableDrill = GetBooleanValue(pt.EnableShowDetails, true) - }; - - if (pt.EmptyCellReplacement != null) - { - pivotTableDefinition.ShowMissing = true; - pivotTableDefinition.MissingCaption = pt.EmptyCellReplacement; - } - else - { - pivotTableDefinition.ShowMissing = false; - } - - if (pt.ErrorValueReplacement != null) - { - pivotTableDefinition.ShowError = true; - pivotTableDefinition.ErrorCaption = pt.ErrorValueReplacement; - } - else - { - pivotTableDefinition.ShowError = false; - } - - var location = new Location - { - Reference = pt.TargetCell.Address.ToString(), - FirstHeaderRow = 1U, - FirstDataRow = 1U, - FirstDataColumn = 1U - }; - - - var rowFields = new RowFields(); - var columnFields = new ColumnFields(); - var rowItems = new RowItems(); - var columnItems = new ColumnItems(); - var pageFields = new PageFields { Count = (uint)pt.ReportFilters.Count() }; - var pivotFields = new PivotFields { Count = Convert.ToUInt32(pt.SourceRange.ColumnCount()) }; - - foreach (var xlpf in pt.Fields.OrderBy(f => pt.RowLabels.Any(p => p.SourceName == f.SourceName) ? pt.RowLabels.IndexOf(f) : Int32.MaxValue)) - { - if (pt.RowLabels.Any(p => p.SourceName == xlpf.SourceName)) - { - var f = new Field { Index = pt.Fields.IndexOf(xlpf) }; - rowFields.AppendChild(f); - - for (var i = 0; i < xlpf.SharedStrings.Count; i++) - { - var rowItem = new RowItem(); - rowItem.AppendChild(new MemberPropertyIndex { Val = i }); - rowItems.AppendChild(rowItem); - } - - var rowItemTotal = new RowItem { ItemType = ItemValues.Grand }; - rowItemTotal.AppendChild(new MemberPropertyIndex()); - rowItems.AppendChild(rowItemTotal); - } - else if (pt.ColumnLabels.Any(p => p.SourceName == xlpf.SourceName)) - { - var f = new Field { Index = pt.Fields.IndexOf(xlpf) }; - columnFields.AppendChild(f); - - for (var i = 0; i < xlpf.SharedStrings.Count; i++) - { - var rowItem = new RowItem(); - rowItem.AppendChild(new MemberPropertyIndex { Val = i }); - columnItems.AppendChild(rowItem); - } - - var rowItemTotal = new RowItem { ItemType = ItemValues.Grand }; - rowItemTotal.AppendChild(new MemberPropertyIndex()); - columnItems.AppendChild(rowItemTotal); - } - } - - if (pt.Values.Count() > 1) - { - // -2 is the sentinal value for "Values" - if (pt.ColumnLabels.Any(cl => cl.SourceName == XLConstants.PivotTableValuesSentinalLabel)) - columnFields.AppendChild(new Field { Index = -2 }); - else if (pt.RowLabels.Any(rl => rl.SourceName == XLConstants.PivotTableValuesSentinalLabel)) - { - pivotTableDefinition.DataOnRows = true; - rowFields.AppendChild(new Field { Index = -2 }); - } - } - - foreach (var xlpf in pt.Fields) - { - IXLPivotField labelField = null; - var pf = new PivotField { ShowAll = false, Name = xlpf.CustomName }; - - if (pt.RowLabels.Any(p => p.SourceName == xlpf.SourceName)) - { - labelField = pt.RowLabels.Single(p => p.SourceName == xlpf.SourceName); - pf.Axis = PivotTableAxisValues.AxisRow; - } - else if (pt.ColumnLabels.Any(p => p.SourceName == xlpf.SourceName)) - { - labelField = pt.ColumnLabels.Single(p => p.SourceName == xlpf.SourceName); - pf.Axis = PivotTableAxisValues.AxisColumn; - } - else if (pt.ReportFilters.Any(p => p.SourceName == xlpf.SourceName)) - { - location.ColumnsPerPage = 1; - location.RowPageCount = 1; - pf.Axis = PivotTableAxisValues.AxisPage; - pageFields.AppendChild(new PageField { Hierarchy = -1, Field = pt.Fields.IndexOf(xlpf) }); - } - - if (pt.Values.Any(p => p.SourceName == xlpf.SourceName)) - pf.DataField = true; - - var fieldItems = new Items(); - - if (xlpf.SharedStrings.Count > 0) - { - for (uint i = 0; i < xlpf.SharedStrings.Count; i++) - { - var item = new Item { Index = i }; - if (labelField != null && labelField.Collapsed) - item.HideDetails = BooleanValue.FromBoolean(false); - fieldItems.AppendChild(item); - } - } - - if (xlpf.Subtotals.Count > 0) - { - foreach (var subtotal in xlpf.Subtotals) - { - var itemSubtotal = new Item(); - switch (subtotal) - { - case XLSubtotalFunction.Average: - pf.AverageSubTotal = true; - itemSubtotal.ItemType = ItemValues.Average; - break; - case XLSubtotalFunction.Count: - pf.CountASubtotal = true; - itemSubtotal.ItemType = ItemValues.CountA; - break; - case XLSubtotalFunction.CountNumbers: - pf.CountSubtotal = true; - itemSubtotal.ItemType = ItemValues.Count; - break; - case XLSubtotalFunction.Maximum: - pf.MaxSubtotal = true; - itemSubtotal.ItemType = ItemValues.Maximum; - break; - case XLSubtotalFunction.Minimum: - pf.MinSubtotal = true; - itemSubtotal.ItemType = ItemValues.Minimum; - break; - case XLSubtotalFunction.PopulationStandardDeviation: - pf.ApplyStandardDeviationPInSubtotal = true; - itemSubtotal.ItemType = ItemValues.StandardDeviationP; - break; - case XLSubtotalFunction.PopulationVariance: - pf.ApplyVariancePInSubtotal = true; - itemSubtotal.ItemType = ItemValues.VarianceP; - break; - case XLSubtotalFunction.Product: - pf.ApplyProductInSubtotal = true; - itemSubtotal.ItemType = ItemValues.Product; - break; - case XLSubtotalFunction.StandardDeviation: - pf.ApplyStandardDeviationInSubtotal = true; - itemSubtotal.ItemType = ItemValues.StandardDeviation; - break; - case XLSubtotalFunction.Sum: - pf.SumSubtotal = true; - itemSubtotal.ItemType = ItemValues.Sum; - break; - case XLSubtotalFunction.Variance: - pf.ApplyVarianceInSubtotal = true; - itemSubtotal.ItemType = ItemValues.Variance; - break; - } - fieldItems.AppendChild(itemSubtotal); - } - } - else - { - fieldItems.AppendChild(new Item { ItemType = ItemValues.Default }); - } - - fieldItems.Count = Convert.ToUInt32(fieldItems.Count()); - pf.AppendChild(fieldItems); - pivotFields.AppendChild(pf); - } - - pivotTableDefinition.AppendChild(location); - pivotTableDefinition.AppendChild(pivotFields); - - if (pt.RowLabels.Any()) - { - rowFields.Count = Convert.ToUInt32(rowFields.Count()); - pivotTableDefinition.AppendChild(rowFields); - } - else - { - rowItems.AppendChild(new RowItem()); - } - - rowItems.Count = Convert.ToUInt32(rowItems.Count()); - pivotTableDefinition.AppendChild(rowItems); - - if (!pt.ColumnLabels.Any(cl => cl.CustomName != XLConstants.PivotTableValuesSentinalLabel)) - { - for (int i = 0; i < pt.Values.Count(); i++) - { - var rowItem = new RowItem(); - rowItem.Index = Convert.ToUInt32(i); - rowItem.AppendChild(new MemberPropertyIndex() { Val = i }); - columnItems.AppendChild(rowItem); - } - } - - if (columnFields.Any()) - { - columnFields.Count = Convert.ToUInt32(columnFields.Count()); - pivotTableDefinition.AppendChild(columnFields); - } - - if (columnItems.Any()) - { - columnItems.Count = Convert.ToUInt32(columnItems.Count()); - pivotTableDefinition.AppendChild(columnItems); - } - - if (pt.ReportFilters.Any()) - { - pageFields.Count = Convert.ToUInt32(pageFields.Count()); - pivotTableDefinition.AppendChild(pageFields); - } - - - var dataFields = new DataFields(); - foreach (var value in pt.Values) - { - var sourceColumn = - pt.SourceRange.Columns().FirstOrDefault(c => c.Cell(1).Value.ToString() == value.SourceName); - if (sourceColumn == null) continue; - - UInt32 numberFormatId = 0; - if (value.NumberFormat.NumberFormatId != -1 || context.SharedNumberFormats.ContainsKey(value.NumberFormat.NumberFormatId)) - numberFormatId = (UInt32)value.NumberFormat.NumberFormatId; - else if (context.SharedNumberFormats.Any(snf => snf.Value.NumberFormat.Format == value.NumberFormat.Format)) - numberFormatId = (UInt32)context.SharedNumberFormats.First(snf => snf.Value.NumberFormat.Format == value.NumberFormat.Format).Key; - - var df = new DataField - { - Name = value.CustomName, - Field = (UInt32)sourceColumn.ColumnNumber() - 1, - Subtotal = value.SummaryFormula.ToOpenXml(), - ShowDataAs = value.Calculation.ToOpenXml(), - NumberFormatId = numberFormatId - }; - - if (!String.IsNullOrEmpty(value.BaseField)) - { - var baseField = pt.SourceRange.Columns().FirstOrDefault(c => c.Cell(1).Value.ToString() == value.BaseField); - if (baseField != null) - { - df.BaseField = baseField.ColumnNumber() - 1; - - var items = baseField.CellsUsed() - .Select(c => c.Value) - .Skip(1) // Skip header column - .Distinct().ToList(); - - if (items.Any(i => i.Equals(value.BaseItem))) - df.BaseItem = Convert.ToUInt32(items.IndexOf(value.BaseItem)); - } - } - else - { - df.BaseField = 0; - } - - if (value.CalculationItem == XLPivotCalculationItem.Previous) - df.BaseItem = 1048828U; - else if (value.CalculationItem == XLPivotCalculationItem.Next) - df.BaseItem = 1048829U; - else if (df.BaseItem == null || !df.BaseItem.HasValue) - df.BaseItem = 0U; - - dataFields.AppendChild(df); - } - - dataFields.Count = Convert.ToUInt32(dataFields.Count()); - pivotTableDefinition.AppendChild(dataFields); - - pivotTableDefinition.AppendChild(new PivotTableStyle - { - Name = Enum.GetName(typeof(XLPivotTableTheme), pt.Theme), - ShowRowHeaders = pt.ShowRowHeaders, - ShowColumnHeaders = pt.ShowColumnHeaders, - ShowRowStripes = pt.ShowRowStripes, - ShowColumnStripes = pt.ShowColumnStripes - }); - - #region Excel 2010 Features - - var pivotTableDefinitionExtensionList = new PivotTableDefinitionExtensionList(); - - var pivotTableDefinitionExtension = new PivotTableDefinitionExtension - { Uri = "{962EF5D1-5CA2-4c93-8EF4-DBF5C05439D2}" }; - pivotTableDefinitionExtension.AddNamespaceDeclaration("x14", - "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); - - var pivotTableDefinition2 = new DocumentFormat.OpenXml.Office2010.Excel.PivotTableDefinition - { EnableEdit = pt.EnableCellEditing, HideValuesRow = !pt.ShowValuesRow }; - pivotTableDefinition2.AddNamespaceDeclaration("xm", "http://schemas.microsoft.com/office/excel/2006/main"); - - pivotTableDefinitionExtension.AppendChild(pivotTableDefinition2); - - pivotTableDefinitionExtensionList.AppendChild(pivotTableDefinitionExtension); - pivotTableDefinition.AppendChild(pivotTableDefinitionExtensionList); - - #endregion - - pivotTablePart.PivotTableDefinition = pivotTableDefinition; - } - - - private static void GenerateWorksheetCommentsPartContent(WorksheetCommentsPart worksheetCommentsPart, - XLWorksheet xlWorksheet) - { - var comments = new Comments(); - var commentList = new CommentList(); - var authorsDict = new Dictionary(); - foreach (var c in xlWorksheet.Internals.CellsCollection.GetCells(c => c.HasComment)) - { - var comment = new Comment { Reference = c.Address.ToStringRelative() }; - var authorName = c.Comment.Author; - - Int32 authorId; - if (!authorsDict.TryGetValue(authorName, out authorId)) - { - authorId = authorsDict.Count; - authorsDict.Add(authorName, authorId); - } - comment.AuthorId = (UInt32)authorId; - - var commentText = new CommentText(); - foreach (var rt in c.Comment) - { - commentText.Append(GetRun(rt)); - } - - comment.Append(commentText); - commentList.Append(comment); - } - - var authors = new Authors(); - foreach (var author in authorsDict.Select(a => new Author { Text = a.Key })) - { - authors.Append(author); - } - comments.Append(authors); - comments.Append(commentList); - - worksheetCommentsPart.Comments = comments; - } - - // Generates content of vmlDrawingPart1. - private static void GenerateVmlDrawingPartContent(VmlDrawingPart vmlDrawingPart, XLWorksheet xlWorksheet, - SaveContext context) - { - var ms = new MemoryStream(); - CopyStream(vmlDrawingPart.GetStream(FileMode.OpenOrCreate), ms); - ms.Position = 0; - var writer = new XmlTextWriter(vmlDrawingPart.GetStream(FileMode.Create), Encoding.UTF8); - - writer.WriteStartElement("xml"); - - const string shapeTypeId = "_x0000_t202"; // arbitrary, assigned by office - - new Vml.Shapetype( - new Vml.Stroke { JoinStyle = Vml.StrokeJoinStyleValues.Miter }, - new Vml.Path { AllowGradientShape = true, ConnectionPointType = ConnectValues.Rectangle } - ) - { - Id = shapeTypeId, - CoordinateSize = "21600,21600", - OptionalNumber = 202, - EdgePath = "m,l,21600r21600,l21600,xe", - } - .WriteTo(writer); - - var cellWithComments = xlWorksheet.Internals.CellsCollection.GetCells().Where(c => c.HasComment); - - foreach (var c in cellWithComments) - { - GenerateShape(c, shapeTypeId).WriteTo(writer); - } - - if (ms.Length > 0) - { - ms.Position = 0; - var xdoc = XDocumentExtensions.Load(ms); - xdoc.Root.Elements().ForEach(e => writer.WriteRaw(e.ToString())); - } - - - writer.WriteEndElement(); - writer.Flush(); - writer.Close(); - } - - // VML Shape for Comment - private static Vml.Shape GenerateShape(XLCell c, string shapeTypeId) - { - var rowNumber = c.Address.RowNumber; - var columnNumber = c.Address.ColumnNumber; - - var shapeId = String.Format("_x0000_s{0}", c.Comment.ShapeId); - // Unique per cell (workbook?), e.g.: "_x0000_s1026" - var anchor = GetAnchor(c); - var textBox = GetTextBox(c.Comment.Style); - var fill = new Vml.Fill { Color2 = "#" + c.Comment.Style.ColorsAndLines.FillColor.Color.ToHex().Substring(2) }; - if (c.Comment.Style.ColorsAndLines.FillTransparency < 1) - fill.Opacity = - Math.Round(Convert.ToDouble(c.Comment.Style.ColorsAndLines.FillTransparency), 2).ToString( - CultureInfo.InvariantCulture); - var stroke = GetStroke(c); - var shape = new Vml.Shape( - fill, - stroke, - new Vml.Shadow { On = true, Color = "black", Obscured = true }, - new Vml.Path { ConnectionPointType = ConnectValues.None }, - textBox, - new ClientData( - new MoveWithCells(c.Comment.Style.Properties.Positioning == XLDrawingAnchor.Absolute - ? "True" - : "False"), // Counterintuitive - new ResizeWithCells(c.Comment.Style.Properties.Positioning == XLDrawingAnchor.MoveAndSizeWithCells - ? "False" - : "True"), // Counterintuitive - anchor, - new HorizontalTextAlignment(c.Comment.Style.Alignment.Horizontal.ToString().ToCamel()), - new Vml.Spreadsheet.VerticalTextAlignment(c.Comment.Style.Alignment.Vertical.ToString().ToCamel()), - new AutoFill("False"), - new CommentRowTarget { Text = (rowNumber - 1).ToString() }, - new CommentColumnTarget { Text = (columnNumber - 1).ToString() }, - new Locked(c.Comment.Style.Protection.Locked ? "True" : "False"), - new LockText(c.Comment.Style.Protection.LockText ? "True" : "False"), - new Visible(c.Comment.Visible ? "True" : "False") - ) - { ObjectType = ObjectValues.Note } - ) - { - Id = shapeId, - Type = "#" + shapeTypeId, - Style = GetCommentStyle(c), - FillColor = "#" + c.Comment.Style.ColorsAndLines.FillColor.Color.ToHex().Substring(2), - StrokeColor = "#" + c.Comment.Style.ColorsAndLines.LineColor.Color.ToHex().Substring(2), - StrokeWeight = String.Format(CultureInfo.InvariantCulture, "{0}pt", c.Comment.Style.ColorsAndLines.LineWeight), - InsetMode = c.Comment.Style.Margins.Automatic ? InsetMarginValues.Auto : InsetMarginValues.Custom - }; - if (!XLHelper.IsNullOrWhiteSpace(c.Comment.Style.Web.AlternateText)) - shape.Alternate = c.Comment.Style.Web.AlternateText; - - - return shape; - } - - private static Vml.Stroke GetStroke(XLCell c) - { - var lineDash = c.Comment.Style.ColorsAndLines.LineDash; - var stroke = new Vml.Stroke - { - LineStyle = c.Comment.Style.ColorsAndLines.LineStyle.ToOpenXml(), - DashStyle = - lineDash == XLDashStyle.RoundDot || lineDash == XLDashStyle.SquareDot - ? "shortDot" - : lineDash.ToString().ToCamel() - }; - if (lineDash == XLDashStyle.RoundDot) - stroke.EndCap = Vml.StrokeEndCapValues.Round; - if (c.Comment.Style.ColorsAndLines.LineTransparency < 1) - stroke.Opacity = - Math.Round(Convert.ToDouble(c.Comment.Style.ColorsAndLines.LineTransparency), 2).ToString( - CultureInfo.InvariantCulture); - return stroke; - } - - private static void AddPictureAnchor(WorksheetPart worksheetPart, Drawings.IXLPicture picture) - { - var drawingsPart = worksheetPart.DrawingsPart ?? - worksheetPart.AddNewPart( - GeneratePartId(picture.Name, worksheetPart)); - - if (drawingsPart.WorksheetDrawing == null) - { - drawingsPart.WorksheetDrawing = new Xdr.WorksheetDrawing(); - } - - var worksheetDrawing = drawingsPart.WorksheetDrawing; - - var imagePart = drawingsPart.AddImagePart(picture.GetImagePartType(), - GeneratePartId(picture.Name, drawingsPart)); - - using (Stream stream = new MemoryStream()) - { - picture.ImageStream.CopyTo(stream); - stream.Seek(0, SeekOrigin.Begin); - imagePart.FeedData(stream); - } - - var extentsCx = picture.Width; - var extentsCy = picture.Height; - - var nvps = worksheetDrawing.Descendants(); - var nvpId = nvps.Count() > 0 ? - (UInt32Value)worksheetDrawing.Descendants().Max(p => p.Id.Value) + 1 : - 1U; - if (picture.IsAbsolute) - { - Xdr.AbsoluteAnchor absoluteAnchor; - absoluteAnchor = new Xdr.AbsoluteAnchor( - new Xdr.Position - { - X = picture.OffsetX, - Y = picture.OffsetY - }, - new Xdr.Extent - { - Cx = extentsCx, - Cy = extentsCy - }, - new Xdr.Picture( - new Xdr.NonVisualPictureProperties( - new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = picture.Name }, - new Xdr.NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true, NoMove = true, NoResize = true }) - ), - new Xdr.BlipFill( - new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, - new Stretch(new FillRectangle()) - ), - new Xdr.ShapeProperties( - new Transform2D( - new Offset { X = 0, Y = 0 }, - new Extents { Cx = extentsCx, Cy = extentsCy } - ), - new PresetGeometry { Preset = ShapeTypeValues.Rectangle } - ) - ), - new Xdr.ClientData() - ); - - worksheetDrawing.Append(absoluteAnchor); - } - else - { - var markers = picture.GetMarkers(); - Xdr.FromMarker fMark; - Xdr.ToMarker tMark; - if (markers.Count == 2) - { - fMark = new Xdr.FromMarker - { - ColumnId = new Xdr.ColumnId(markers[0].GetZeroBasedColumn().ToString()), - RowId = new Xdr.RowId(markers[0].GetZeroBasedRow().ToString()), - ColumnOffset = new Xdr.ColumnOffset((markers[0].ColumnOffset + picture.OffsetX).ToString()), - RowOffset = new Xdr.RowOffset((markers[0].RowOffset + picture.OffsetY).ToString()) - }; - tMark = new Xdr.ToMarker - { - ColumnId = new Xdr.ColumnId(markers[1].GetZeroBasedColumn().ToString()), - RowId = new Xdr.RowId(markers[1].GetZeroBasedRow().ToString()), - ColumnOffset = new Xdr.ColumnOffset((markers[1].ColumnOffset + picture.OffsetX).ToString()), - RowOffset = new Xdr.RowOffset((markers[1].RowOffset + picture.OffsetY).ToString()) - }; - - Xdr.TwoCellAnchor cellAnchor; - cellAnchor = new Xdr.TwoCellAnchor( - fMark, - tMark, - new Xdr.Picture( - new Xdr.NonVisualPictureProperties( - new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = picture.Name }, - new Xdr.NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true, NoMove = true, NoResize = true }) - ), - new Xdr.BlipFill( - new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, - new Stretch(new FillRectangle()) - ), - new Xdr.ShapeProperties( - new Transform2D( - new Offset { X = 0, Y = 0 }, - new Extents { Cx = extentsCx, Cy = extentsCy } - ), - new PresetGeometry { Preset = ShapeTypeValues.Rectangle } - ) - ), - new Xdr.ClientData() - ); - - worksheetDrawing.Append(cellAnchor); - } - else if (markers.Count == 1) - { - fMark = new Xdr.FromMarker - { - ColumnId = new Xdr.ColumnId(markers[0].GetZeroBasedColumn().ToString()), - RowId = new Xdr.RowId(markers[0].GetZeroBasedRow().ToString()), - ColumnOffset = new Xdr.ColumnOffset((markers[0].ColumnOffset + picture.OffsetX).ToString()), - RowOffset = new Xdr.RowOffset((markers[0].RowOffset + picture.OffsetY).ToString()) - }; - - Xdr.OneCellAnchor cellAnchor; - cellAnchor = new Xdr.OneCellAnchor( - fMark, - new Xdr.Extent - { - Cx = extentsCx, - Cy = extentsCy - }, - new Xdr.Picture( - new Xdr.NonVisualPictureProperties( - new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = picture.Name }, - new Xdr.NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true, NoMove = true, NoResize = true }) - ), - new Xdr.BlipFill( - new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, - new Stretch(new FillRectangle()) - ), - new Xdr.ShapeProperties( - new Transform2D( - new Offset { X = 0, Y = 0 }, - new Extents { Cx = extentsCx, Cy = extentsCy } - ), - new PresetGeometry { Preset = ShapeTypeValues.Rectangle } - ) - ), - new Xdr.ClientData() - ); - - worksheetDrawing.Append(cellAnchor); - } - } - } - - private static Regex embedRegex = new Regex("[^a-zA-Z0-9]"); - - public static string GeneratePartId(string name, OpenXmlPart oxp) - { - var partId = name ?? "rId1"; - partId = embedRegex.Replace(partId, ""); - - // We guarantee the id uniqueness based off the name - try - { - oxp.GetPartById(partId); - } - catch(ArgumentOutOfRangeException) - { - return partId; - } - - partId += "c"; - return GeneratePartId(partId, oxp); - } - - private static Vml.TextBox GetTextBox(IXLDrawingStyle ds) - { - var sb = new StringBuilder(); - var a = ds.Alignment; - - if (a.Direction == XLDrawingTextDirection.Context) - sb.Append("mso-direction-alt:auto;"); - else if (a.Direction == XLDrawingTextDirection.RightToLeft) - sb.Append("direction:RTL;"); - - if (a.Orientation != XLDrawingTextOrientation.LeftToRight) - { - sb.Append("layout-flow:vertical;"); - if (a.Orientation == XLDrawingTextOrientation.BottomToTop) - sb.Append("mso-layout-flow-alt:bottom-to-top;"); - else if (a.Orientation == XLDrawingTextOrientation.Vertical) - sb.Append("mso-layout-flow-alt:top-to-bottom;"); - } - if (a.AutomaticSize) - sb.Append("mso-fit-shape-to-text:t;"); - var retVal = new Vml.TextBox { Style = sb.ToString() }; - var dm = ds.Margins; - if (!dm.Automatic) - retVal.Inset = String.Format("{0}in,{1}in,{2}in,{3}in", - dm.Left.ToInvariantString(), - dm.Top.ToInvariantString(), - dm.Right.ToInvariantString(), - dm.Bottom.ToInvariantString()); - - return retVal; - } - - private static Anchor GetAnchor(XLCell cell) - { - var c = cell.Comment; - var cWidth = c.Style.Size.Width; - var fcNumber = c.Position.Column - 1; - var fcOffset = Convert.ToInt32(c.Position.ColumnOffset * 7.5); - var widthFromColumns = cell.Worksheet.Column(c.Position.Column).Width - c.Position.ColumnOffset; - var lastCell = cell.CellRight(c.Position.Column - cell.Address.ColumnNumber); - while (widthFromColumns <= cWidth) - { - lastCell = lastCell.CellRight(); - widthFromColumns += lastCell.WorksheetColumn().Width; - } - - var lcNumber = lastCell.WorksheetColumn().ColumnNumber() - 1; - var lcOffset = Convert.ToInt32((lastCell.WorksheetColumn().Width - (widthFromColumns - cWidth)) * 7.5); - - var cHeight = c.Style.Size.Height; //c.Style.Size.Height * 72.0; - var frNumber = c.Position.Row - 1; - var frOffset = Convert.ToInt32(c.Position.RowOffset); - var heightFromRows = cell.Worksheet.Row(c.Position.Row).Height - c.Position.RowOffset; - lastCell = cell.CellBelow(c.Position.Row - cell.Address.RowNumber); - while (heightFromRows <= cHeight) - { - lastCell = lastCell.CellBelow(); - heightFromRows += lastCell.WorksheetRow().Height; - } - - var lrNumber = lastCell.WorksheetRow().RowNumber() - 1; - var lrOffset = Convert.ToInt32(lastCell.WorksheetRow().Height - (heightFromRows - cHeight)); - return new Anchor - { - Text = string.Format("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}", - fcNumber, fcOffset, - frNumber, frOffset, - lcNumber, lcOffset, - lrNumber, lrOffset - ) - }; - } - - private static StringValue GetCommentStyle(XLCell cell) - { - var c = cell.Comment; - var sb = new StringBuilder("position:absolute; "); - - sb.Append("visibility:"); - sb.Append(c.Visible ? "visible" : "hidden"); - sb.Append(";"); - - sb.Append("width:"); - sb.Append(Math.Round(c.Style.Size.Width * 7.5, 2).ToInvariantString()); - sb.Append("pt;"); - sb.Append("height:"); - sb.Append(Math.Round(c.Style.Size.Height, 2).ToInvariantString()); - sb.Append("pt;"); - - sb.Append("z-index:"); - sb.Append(c.ZOrder.ToString()); - - - return sb.ToString(); - } - - #region GenerateWorkbookStylesPartContent - - private void GenerateWorkbookStylesPartContent(WorkbookStylesPart workbookStylesPart, SaveContext context) - { - var defaultStyle = new XLStyle(null, DefaultStyle); - var defaultStyleId = GetStyleId(defaultStyle); - if (!context.SharedFonts.ContainsKey(defaultStyle.Font)) - context.SharedFonts.Add(defaultStyle.Font, new FontInfo { FontId = 0, Font = defaultStyle.Font as XLFont }); - - var sharedFills = new Dictionary - {{defaultStyle.Fill, new FillInfo {FillId = 2, Fill = defaultStyle.Fill as XLFill}}}; - - var sharedBorders = new Dictionary - {{defaultStyle.Border, new BorderInfo {BorderId = 0, Border = defaultStyle.Border as XLBorder}}}; - - var sharedNumberFormats = new Dictionary - { - { - defaultStyle.NumberFormat, - new NumberFormatInfo - {NumberFormatId = 0, NumberFormat = defaultStyle.NumberFormat} - } - }; - - //Dictionary sharedAlignments = new Dictionary(); - //sharedAlignments.Add(defaultStyle.Alignment.ToString(), new AlignmentInfo() { AlignmentId = 0, Alignment = defaultStyle.Alignment }); - - if (workbookStylesPart.Stylesheet == null) - workbookStylesPart.Stylesheet = new Stylesheet(); - - // Cell styles = Named styles - if (workbookStylesPart.Stylesheet.CellStyles == null) - workbookStylesPart.Stylesheet.CellStyles = new CellStyles(); - - // To determine the default workbook style, we look for the style with builtInId = 0 (I hope that is the correct approach) - UInt32 defaultFormatId; - if (workbookStylesPart.Stylesheet.CellStyles.Elements().Any(c => c.BuiltinId != null && c.BuiltinId.HasValue && c.BuiltinId.Value == 0)) - { - // Possible to have duplicate default cell styles - occurs when file gets saved under different cultures. - // We prefer the style that is named Normal - var normalCellStyles = workbookStylesPart.Stylesheet.CellStyles.Elements() - .Where(c => c.BuiltinId != null && c.BuiltinId.HasValue && c.BuiltinId.Value == 0) - .OrderBy(c => c.Name != null && c.Name.HasValue && c.Name.Value == "Normal"); - - defaultFormatId = normalCellStyles.Last().FormatId.Value; - } - else if (workbookStylesPart.Stylesheet.CellStyles.Elements().Any()) - defaultFormatId = workbookStylesPart.Stylesheet.CellStyles.Elements().Max(c => c.FormatId.Value) + 1; - else - defaultFormatId = 0; - - context.SharedStyles.Add(defaultStyleId, - new StyleInfo - { - StyleId = defaultFormatId, - Style = defaultStyle, - FontId = 0, - FillId = 0, - BorderId = 0, - NumberFormatId = 0 - //AlignmentId = 0 - }); - - UInt32 styleCount = 1; - UInt32 fontCount = 1; - UInt32 fillCount = 3; - UInt32 borderCount = 1; - var numberFormatCount = 1; - var xlStyles = new HashSet(); - var pivotTableNumberFormats = new HashSet(); - - foreach (var worksheet in WorksheetsInternal) - { - foreach (var s in worksheet.GetStyleIds().Where(s => !xlStyles.Contains(s))) - xlStyles.Add(s); - - foreach ( - var s in - worksheet.Internals.ColumnsCollection.Select(kp => kp.Value.GetStyleId()).Where( - s => !xlStyles.Contains(s))) - xlStyles.Add(s); - - foreach ( - var s in - worksheet.Internals.RowsCollection.Select(kp => kp.Value.GetStyleId()).Where( - s => !xlStyles.Contains(s)) - ) - xlStyles.Add(s); - - foreach (var ptnf in worksheet.PivotTables.SelectMany(pt => pt.Values.Select(ptv => ptv.NumberFormat)).Distinct().Where(nf => !pivotTableNumberFormats.Contains(nf))) - pivotTableNumberFormats.Add(ptnf); - } - - foreach (var numberFormat in pivotTableNumberFormats) - { - if (numberFormat.NumberFormatId != -1 - || sharedNumberFormats.ContainsKey(numberFormat)) - continue; - - sharedNumberFormats.Add(numberFormat, - new NumberFormatInfo - { - NumberFormatId = XLConstants.NumberOfBuiltInStyles + numberFormatCount, - NumberFormat = numberFormat - }); - numberFormatCount++; - } - - foreach (var xlStyle in xlStyles.Select(GetStyleById)) - { - if (!context.SharedFonts.ContainsKey(xlStyle.Font)) - context.SharedFonts.Add(xlStyle.Font, - new FontInfo { FontId = fontCount++, Font = xlStyle.Font as XLFont }); - - if (!sharedFills.ContainsKey(xlStyle.Fill)) - sharedFills.Add(xlStyle.Fill, new FillInfo { FillId = fillCount++, Fill = xlStyle.Fill as XLFill }); - - if (!sharedBorders.ContainsKey(xlStyle.Border)) - sharedBorders.Add(xlStyle.Border, - new BorderInfo { BorderId = borderCount++, Border = xlStyle.Border as XLBorder }); - - if (xlStyle.NumberFormat.NumberFormatId != -1 - || sharedNumberFormats.ContainsKey(xlStyle.NumberFormat)) - continue; - - sharedNumberFormats.Add(xlStyle.NumberFormat, - new NumberFormatInfo - { - NumberFormatId = XLConstants.NumberOfBuiltInStyles + numberFormatCount, - NumberFormat = xlStyle.NumberFormat - }); - numberFormatCount++; - } - - var allSharedNumberFormats = ResolveNumberFormats(workbookStylesPart, sharedNumberFormats, defaultFormatId); - foreach (var nf in allSharedNumberFormats) - { - context.SharedNumberFormats.Add(nf.Value.NumberFormatId, nf.Value); - } - - ResolveFonts(workbookStylesPart, context); - var allSharedFills = ResolveFills(workbookStylesPart, sharedFills); - var allSharedBorders = ResolveBorders(workbookStylesPart, sharedBorders); - - foreach (var id in xlStyles) - { - var xlStyle = GetStyleById(id); - if (context.SharedStyles.ContainsKey(id)) continue; - - var numberFormatId = xlStyle.NumberFormat.NumberFormatId >= 0 - ? xlStyle.NumberFormat.NumberFormatId - : allSharedNumberFormats[xlStyle.NumberFormat].NumberFormatId; - - context.SharedStyles.Add(id, - new StyleInfo - { - StyleId = styleCount++, - Style = xlStyle, - FontId = context.SharedFonts[xlStyle.Font].FontId, - FillId = allSharedFills[xlStyle.Fill].FillId, - BorderId = allSharedBorders[xlStyle.Border].BorderId, - NumberFormatId = numberFormatId - }); - } - - ResolveCellStyleFormats(workbookStylesPart, context); - ResolveRest(workbookStylesPart, context); - - if (!workbookStylesPart.Stylesheet.CellStyles.Elements().Any(c => c.BuiltinId != null && c.BuiltinId.HasValue && c.BuiltinId.Value == 0U)) - workbookStylesPart.Stylesheet.CellStyles.AppendChild(new CellStyle { Name = "Normal", FormatId = defaultFormatId, BuiltinId = 0U }); - - workbookStylesPart.Stylesheet.CellStyles.Count = (UInt32)workbookStylesPart.Stylesheet.CellStyles.Count(); - - var newSharedStyles = new Dictionary(); - foreach (var ss in context.SharedStyles) - { - var styleId = -1; - foreach (CellFormat f in workbookStylesPart.Stylesheet.CellFormats) - { - styleId++; - if (CellFormatsAreEqual(f, ss.Value)) - break; - } - if (styleId == -1) - styleId = 0; - var si = ss.Value; - si.StyleId = (UInt32)styleId; - newSharedStyles.Add(ss.Key, si); - } - context.SharedStyles.Clear(); - newSharedStyles.ForEach(kp => context.SharedStyles.Add(kp.Key, kp.Value)); - - AddDifferentialFormats(workbookStylesPart, context); - } - - private void AddDifferentialFormats(WorkbookStylesPart workbookStylesPart, SaveContext context) - { - if (workbookStylesPart.Stylesheet.DifferentialFormats == null) - workbookStylesPart.Stylesheet.DifferentialFormats = new DifferentialFormats(); - - - var differentialFormats = workbookStylesPart.Stylesheet.DifferentialFormats; - - FillDifferentialFormatsCollection(differentialFormats, context.DifferentialFormats); - - - foreach (var ws in Worksheets) - { - foreach (var cf in ws.ConditionalFormats) - { - if (!context.DifferentialFormats.ContainsKey(cf.Style)) - AddDifferentialFormat(workbookStylesPart.Stylesheet.DifferentialFormats, cf, context); - } - } - - differentialFormats.Count = (UInt32)differentialFormats.Count(); - if (differentialFormats.Count == 0) - workbookStylesPart.Stylesheet.DifferentialFormats = null; - } - - private void FillDifferentialFormatsCollection(DifferentialFormats differentialFormats, - Dictionary dictionary) - { - dictionary.Clear(); - var id = 0; - foreach (var df in differentialFormats.Elements()) - { - var style = new XLStyle(new XLStylizedEmpty(DefaultStyle), DefaultStyle); - LoadFont(df.Font, style.Font); - LoadBorder(df.Border, style.Border); - LoadNumberFormat(df.NumberingFormat, style.NumberFormat); - LoadFill(df.Fill, style.Fill); - if (!dictionary.ContainsKey(style)) - dictionary.Add(style, ++id); - } - } - - private static void AddDifferentialFormat(DifferentialFormats differentialFormats, IXLConditionalFormat cf, - SaveContext context) - { - var differentialFormat = new DifferentialFormat(); - differentialFormat.Append(GetNewFont(new FontInfo { Font = cf.Style.Font as XLFont }, false)); - if (!XLHelper.IsNullOrWhiteSpace(cf.Style.NumberFormat.Format)) - { - var numberFormat = new NumberingFormat - { - NumberFormatId = (UInt32)(XLConstants.NumberOfBuiltInStyles + differentialFormats.Count()), - FormatCode = cf.Style.NumberFormat.Format - }; - differentialFormat.Append(numberFormat); - } - differentialFormat.Append(GetNewFill(new FillInfo { Fill = cf.Style.Fill as XLFill }, false)); - differentialFormat.Append(GetNewBorder(new BorderInfo { Border = cf.Style.Border as XLBorder }, false)); - - differentialFormats.Append(differentialFormat); - - context.DifferentialFormats.Add(cf.Style, differentialFormats.Count() - 1); - } - - private static void ResolveRest(WorkbookStylesPart workbookStylesPart, SaveContext context) - { - if (workbookStylesPart.Stylesheet.CellFormats == null) - workbookStylesPart.Stylesheet.CellFormats = new CellFormats(); - - foreach (var styleInfo in context.SharedStyles.Values) - { - var info = styleInfo; - var foundOne = - workbookStylesPart.Stylesheet.CellFormats.Cast().Any(f => CellFormatsAreEqual(f, info)); - - if (foundOne) continue; - - var cellFormat = GetCellFormat(styleInfo); - cellFormat.FormatId = 0; - var alignment = new Alignment - { - Horizontal = styleInfo.Style.Alignment.Horizontal.ToOpenXml(), - Vertical = styleInfo.Style.Alignment.Vertical.ToOpenXml(), - Indent = (UInt32)styleInfo.Style.Alignment.Indent, - ReadingOrder = (UInt32)styleInfo.Style.Alignment.ReadingOrder, - WrapText = styleInfo.Style.Alignment.WrapText, - TextRotation = (UInt32)styleInfo.Style.Alignment.TextRotation, - ShrinkToFit = styleInfo.Style.Alignment.ShrinkToFit, - RelativeIndent = styleInfo.Style.Alignment.RelativeIndent, - JustifyLastLine = styleInfo.Style.Alignment.JustifyLastLine - }; - cellFormat.AppendChild(alignment); - - if (cellFormat.ApplyProtection.Value) - cellFormat.AppendChild(GetProtection(styleInfo)); - - workbookStylesPart.Stylesheet.CellFormats.AppendChild(cellFormat); - } - workbookStylesPart.Stylesheet.CellFormats.Count = (UInt32)workbookStylesPart.Stylesheet.CellFormats.Count(); - } - - private static void ResolveCellStyleFormats(WorkbookStylesPart workbookStylesPart, - SaveContext context) - { - if (workbookStylesPart.Stylesheet.CellStyleFormats == null) - workbookStylesPart.Stylesheet.CellStyleFormats = new CellStyleFormats(); - - foreach (var styleInfo in context.SharedStyles.Values) - { - var info = styleInfo; - var foundOne = - workbookStylesPart.Stylesheet.CellStyleFormats.Cast().Any( - f => CellFormatsAreEqual(f, info)); - - if (foundOne) continue; - - var cellStyleFormat = GetCellFormat(styleInfo); - - if (cellStyleFormat.ApplyProtection.Value) - cellStyleFormat.AppendChild(GetProtection(styleInfo)); - - workbookStylesPart.Stylesheet.CellStyleFormats.AppendChild(cellStyleFormat); - } - workbookStylesPart.Stylesheet.CellStyleFormats.Count = - (UInt32)workbookStylesPart.Stylesheet.CellStyleFormats.Count(); - } - - private static bool ApplyFill(StyleInfo styleInfo) - { - return styleInfo.Style.Fill.PatternType.ToOpenXml() == PatternValues.None; - } - - private static bool ApplyBorder(StyleInfo styleInfo) - { - var opBorder = styleInfo.Style.Border; - return (opBorder.BottomBorder.ToOpenXml() != BorderStyleValues.None - || opBorder.DiagonalBorder.ToOpenXml() != BorderStyleValues.None - || opBorder.RightBorder.ToOpenXml() != BorderStyleValues.None - || opBorder.LeftBorder.ToOpenXml() != BorderStyleValues.None - || opBorder.TopBorder.ToOpenXml() != BorderStyleValues.None); - } - - private static bool ApplyProtection(StyleInfo styleInfo) - { - return styleInfo.Style.Protection != null; - } - - private static CellFormat GetCellFormat(StyleInfo styleInfo) - { - var cellFormat = new CellFormat - { - NumberFormatId = (UInt32)styleInfo.NumberFormatId, - FontId = styleInfo.FontId, - FillId = styleInfo.FillId, - BorderId = styleInfo.BorderId, - ApplyNumberFormat = true, - ApplyAlignment = true, - ApplyFill = ApplyFill(styleInfo), - ApplyBorder = ApplyBorder(styleInfo), - ApplyProtection = ApplyProtection(styleInfo) - }; - return cellFormat; - } - - private static Protection GetProtection(StyleInfo styleInfo) - { - return new Protection - { - Locked = styleInfo.Style.Protection.Locked, - Hidden = styleInfo.Style.Protection.Hidden - }; - } - - private static bool CellFormatsAreEqual(CellFormat f, StyleInfo styleInfo) - { - return - f.BorderId != null && styleInfo.BorderId == f.BorderId - && f.FillId != null && styleInfo.FillId == f.FillId - && f.FontId != null && styleInfo.FontId == f.FontId - && f.NumberFormatId != null && styleInfo.NumberFormatId == f.NumberFormatId - && f.ApplyFill != null && f.ApplyFill == ApplyFill(styleInfo) - && f.ApplyBorder != null && f.ApplyBorder == ApplyBorder(styleInfo) - && AlignmentsAreEqual(f.Alignment, styleInfo.Style.Alignment) - && ProtectionsAreEqual(f.Protection, styleInfo.Style.Protection) - ; - } - - private static bool ProtectionsAreEqual(Protection protection, IXLProtection xlProtection) - { - var p = new XLProtection(); - if (protection != null) - { - if (protection.Locked != null) - p.Locked = protection.Locked.Value; - if (protection.Hidden != null) - p.Hidden = protection.Hidden.Value; - } - return p.Equals(xlProtection); - } - - private static bool AlignmentsAreEqual(Alignment alignment, IXLAlignment xlAlignment) - { - var a = new XLAlignment(); - if (alignment != null) - { - if (alignment.Indent != null) - a.Indent = (Int32)alignment.Indent.Value; - - if (alignment.Horizontal != null) - a.Horizontal = alignment.Horizontal.Value.ToClosedXml(); - if (alignment.Vertical != null) - a.Vertical = alignment.Vertical.Value.ToClosedXml(); - - if (alignment.ReadingOrder != null) - a.ReadingOrder = alignment.ReadingOrder.Value.ToClosedXml(); - if (alignment.WrapText != null) - a.WrapText = alignment.WrapText.Value; - if (alignment.TextRotation != null) - a.TextRotation = (Int32)alignment.TextRotation.Value; - if (alignment.ShrinkToFit != null) - a.ShrinkToFit = alignment.ShrinkToFit.Value; - if (alignment.RelativeIndent != null) - a.RelativeIndent = alignment.RelativeIndent.Value; - if (alignment.JustifyLastLine != null) - a.JustifyLastLine = alignment.JustifyLastLine.Value; - } - return a.Equals(xlAlignment); - } - - private Dictionary ResolveBorders(WorkbookStylesPart workbookStylesPart, - Dictionary sharedBorders) - { - if (workbookStylesPart.Stylesheet.Borders == null) - workbookStylesPart.Stylesheet.Borders = new Borders(); - - var allSharedBorders = new Dictionary(); - foreach (var borderInfo in sharedBorders.Values) - { - var borderId = 0; - var foundOne = false; - foreach (Border f in workbookStylesPart.Stylesheet.Borders) - { - if (BordersAreEqual(f, borderInfo.Border)) - { - foundOne = true; - break; - } - borderId++; - } - if (!foundOne) - { - var border = GetNewBorder(borderInfo); - workbookStylesPart.Stylesheet.Borders.AppendChild(border); - } - allSharedBorders.Add(borderInfo.Border, - new BorderInfo { Border = borderInfo.Border, BorderId = (UInt32)borderId }); - } - workbookStylesPart.Stylesheet.Borders.Count = (UInt32)workbookStylesPart.Stylesheet.Borders.Count(); - return allSharedBorders; - } - - private static Border GetNewBorder(BorderInfo borderInfo, Boolean ignoreMod = true) - { - var border = new Border(); - if (borderInfo.Border.DiagonalUpModified || ignoreMod) - border.DiagonalUp = borderInfo.Border.DiagonalUp; - - if (borderInfo.Border.DiagonalDownModified || ignoreMod) - border.DiagonalDown = borderInfo.Border.DiagonalDown; - - if (borderInfo.Border.LeftBorderModified || borderInfo.Border.LeftBorderColorModified || ignoreMod) - { - var leftBorder = new LeftBorder { Style = borderInfo.Border.LeftBorder.ToOpenXml() }; - if (borderInfo.Border.LeftBorderColorModified || ignoreMod) - { - var leftBorderColor = GetNewColor(borderInfo.Border.LeftBorderColor); - leftBorder.AppendChild(leftBorderColor); - } - border.AppendChild(leftBorder); - } - - if (borderInfo.Border.RightBorderModified || borderInfo.Border.RightBorderColorModified || ignoreMod) - { - var rightBorder = new RightBorder { Style = borderInfo.Border.RightBorder.ToOpenXml() }; - if (borderInfo.Border.RightBorderColorModified || ignoreMod) - { - var rightBorderColor = GetNewColor(borderInfo.Border.RightBorderColor); - rightBorder.AppendChild(rightBorderColor); - } - border.AppendChild(rightBorder); - } - - if (borderInfo.Border.TopBorderModified || borderInfo.Border.TopBorderColorModified || ignoreMod) - { - var topBorder = new TopBorder { Style = borderInfo.Border.TopBorder.ToOpenXml() }; - if (borderInfo.Border.TopBorderColorModified || ignoreMod) - { - var topBorderColor = GetNewColor(borderInfo.Border.TopBorderColor); - topBorder.AppendChild(topBorderColor); - } - border.AppendChild(topBorder); - } - - if (borderInfo.Border.BottomBorderModified || borderInfo.Border.BottomBorderColorModified || ignoreMod) - { - var bottomBorder = new BottomBorder { Style = borderInfo.Border.BottomBorder.ToOpenXml() }; - if (borderInfo.Border.BottomBorderColorModified || ignoreMod) - { - var bottomBorderColor = GetNewColor(borderInfo.Border.BottomBorderColor); - bottomBorder.AppendChild(bottomBorderColor); - } - border.AppendChild(bottomBorder); - } - - if (borderInfo.Border.DiagonalBorderModified || borderInfo.Border.DiagonalBorderColorModified || ignoreMod) - { - var DiagonalBorder = new DiagonalBorder { Style = borderInfo.Border.DiagonalBorder.ToOpenXml() }; - if (borderInfo.Border.DiagonalBorderColorModified || ignoreMod) - { - var DiagonalBorderColor = GetNewColor(borderInfo.Border.DiagonalBorderColor); - DiagonalBorder.AppendChild(DiagonalBorderColor); - } - border.AppendChild(DiagonalBorder); - } - - return border; - } - - private bool BordersAreEqual(Border b, IXLBorder xlBorder) - { - var nb = new XLBorder(); - if (b.DiagonalUp != null) - nb.DiagonalUp = b.DiagonalUp.Value; - - if (b.DiagonalDown != null) - nb.DiagonalDown = b.DiagonalDown.Value; - - if (b.LeftBorder != null) - { - if (b.LeftBorder.Style != null) - nb.LeftBorder = b.LeftBorder.Style.Value.ToClosedXml(); - var bColor = GetColor(b.LeftBorder.Color); - if (bColor.HasValue) - nb.LeftBorderColor = bColor; - } - - if (b.RightBorder != null) - { - if (b.RightBorder.Style != null) - nb.RightBorder = b.RightBorder.Style.Value.ToClosedXml(); - var bColor = GetColor(b.RightBorder.Color); - if (bColor.HasValue) - nb.RightBorderColor = bColor; - } - - if (b.TopBorder != null) - { - if (b.TopBorder.Style != null) - nb.TopBorder = b.TopBorder.Style.Value.ToClosedXml(); - var bColor = GetColor(b.TopBorder.Color); - if (bColor.HasValue) - nb.TopBorderColor = bColor; - } - - if (b.BottomBorder != null) - { - if (b.BottomBorder.Style != null) - nb.BottomBorder = b.BottomBorder.Style.Value.ToClosedXml(); - var bColor = GetColor(b.BottomBorder.Color); - if (bColor.HasValue) - nb.BottomBorderColor = bColor; - } - - return nb.Equals(xlBorder); - - - } - - private Dictionary ResolveFills(WorkbookStylesPart workbookStylesPart, - Dictionary sharedFills) - { - if (workbookStylesPart.Stylesheet.Fills == null) - workbookStylesPart.Stylesheet.Fills = new Fills(); - - ResolveFillWithPattern(workbookStylesPart.Stylesheet.Fills, PatternValues.None); - ResolveFillWithPattern(workbookStylesPart.Stylesheet.Fills, PatternValues.Gray125); - - var allSharedFills = new Dictionary(); - foreach (var fillInfo in sharedFills.Values) - { - var fillId = 0; - var foundOne = false; - foreach (Fill f in workbookStylesPart.Stylesheet.Fills) - { - if (FillsAreEqual(f, fillInfo.Fill)) - { - foundOne = true; - break; - } - fillId++; - } - if (!foundOne) - { - var fill = GetNewFill(fillInfo); - workbookStylesPart.Stylesheet.Fills.AppendChild(fill); - } - allSharedFills.Add(fillInfo.Fill, new FillInfo { Fill = fillInfo.Fill, FillId = (UInt32)fillId }); - } - - workbookStylesPart.Stylesheet.Fills.Count = (UInt32)workbookStylesPart.Stylesheet.Fills.Count(); - return allSharedFills; - } - - private static void ResolveFillWithPattern(Fills fills, PatternValues patternValues) - { - if (fills.Elements().Any(f => - f.PatternFill.PatternType == patternValues - && f.PatternFill.ForegroundColor == null - && f.PatternFill.BackgroundColor == null - )) return; - - var fill1 = new Fill(); - var patternFill1 = new PatternFill { PatternType = patternValues }; - fill1.AppendChild(patternFill1); - fills.AppendChild(fill1); - } - - private static Fill GetNewFill(FillInfo fillInfo, Boolean ignoreMod = true) - { - var fill = new Fill(); - - var patternFill = new PatternFill(); - if (fillInfo.Fill.PatternTypeModified || ignoreMod) - patternFill.PatternType = fillInfo.Fill.PatternType.ToOpenXml(); - - if (fillInfo.Fill.PatternColorModified || ignoreMod) - { - var foregroundColor = new ForegroundColor(); - if (fillInfo.Fill.PatternColor.ColorType == XLColorType.Color) - foregroundColor.Rgb = fillInfo.Fill.PatternColor.Color.ToHex(); - else if (fillInfo.Fill.PatternColor.ColorType == XLColorType.Indexed) - foregroundColor.Indexed = (UInt32)fillInfo.Fill.PatternColor.Indexed; - else - { - foregroundColor.Theme = (UInt32)fillInfo.Fill.PatternColor.ThemeColor; - if (fillInfo.Fill.PatternColor.ThemeTint != 0) - foregroundColor.Tint = fillInfo.Fill.PatternColor.ThemeTint; - } - patternFill.AppendChild(foregroundColor); - } - - if (fillInfo.Fill.PatternBackgroundColorModified || ignoreMod) - { - var backgroundColor = new BackgroundColor(); - if (fillInfo.Fill.PatternBackgroundColor.ColorType == XLColorType.Color) - backgroundColor.Rgb = fillInfo.Fill.PatternBackgroundColor.Color.ToHex(); - else if (fillInfo.Fill.PatternBackgroundColor.ColorType == XLColorType.Indexed) - backgroundColor.Indexed = (UInt32)fillInfo.Fill.PatternBackgroundColor.Indexed; - else - { - backgroundColor.Theme = (UInt32)fillInfo.Fill.PatternBackgroundColor.ThemeColor; - if (fillInfo.Fill.PatternBackgroundColor.ThemeTint != 0) - backgroundColor.Tint = fillInfo.Fill.PatternBackgroundColor.ThemeTint; - } - patternFill.AppendChild(backgroundColor); - } - - fill.AppendChild(patternFill); - - return fill; - } - - private bool FillsAreEqual(Fill f, IXLFill xlFill) - { - var nF = new XLFill(); - if (f.PatternFill != null) - { - if (f.PatternFill.PatternType != null) - nF.PatternType = f.PatternFill.PatternType.Value.ToClosedXml(); - - var fColor = GetColor(f.PatternFill.ForegroundColor); - if (fColor.HasValue) - nF.PatternColor = fColor; - - var bColor = GetColor(f.PatternFill.BackgroundColor); - if (bColor.HasValue) - nF.PatternBackgroundColor = bColor; - } - return nF.Equals(xlFill); - } - - private void ResolveFonts(WorkbookStylesPart workbookStylesPart, SaveContext context) - { - if (workbookStylesPart.Stylesheet.Fonts == null) - workbookStylesPart.Stylesheet.Fonts = new Fonts(); - - var newFonts = new Dictionary(); - foreach (var fontInfo in context.SharedFonts.Values) - { - var fontId = 0; - var foundOne = false; - foreach (Font f in workbookStylesPart.Stylesheet.Fonts) - { - if (FontsAreEqual(f, fontInfo.Font)) - { - foundOne = true; - break; - } - fontId++; - } - if (!foundOne) - { - var font = GetNewFont(fontInfo); - workbookStylesPart.Stylesheet.Fonts.AppendChild(font); - } - newFonts.Add(fontInfo.Font, new FontInfo { Font = fontInfo.Font, FontId = (UInt32)fontId }); - } - context.SharedFonts.Clear(); - foreach (var kp in newFonts) - context.SharedFonts.Add(kp.Key, kp.Value); - - workbookStylesPart.Stylesheet.Fonts.Count = (UInt32)workbookStylesPart.Stylesheet.Fonts.Count(); - } - - private static Font GetNewFont(FontInfo fontInfo, Boolean ignoreMod = true) - { - var font = new Font(); - var bold = (fontInfo.Font.BoldModified || ignoreMod) && fontInfo.Font.Bold ? new Bold() : null; - var italic = (fontInfo.Font.ItalicModified || ignoreMod) && fontInfo.Font.Italic ? new Italic() : null; - var underline = (fontInfo.Font.UnderlineModified || ignoreMod) && - fontInfo.Font.Underline != XLFontUnderlineValues.None - ? new Underline { Val = fontInfo.Font.Underline.ToOpenXml() } - : null; - var strike = (fontInfo.Font.StrikethroughModified || ignoreMod) && fontInfo.Font.Strikethrough - ? new Strike() - : null; - var verticalAlignment = fontInfo.Font.VerticalAlignmentModified || ignoreMod - ? new VerticalTextAlignment { Val = fontInfo.Font.VerticalAlignment.ToOpenXml() } - : null; - var shadow = (fontInfo.Font.ShadowModified || ignoreMod) && fontInfo.Font.Shadow ? new Shadow() : null; - var fontSize = fontInfo.Font.FontSizeModified || ignoreMod - ? new FontSize { Val = fontInfo.Font.FontSize } - : null; - var color = fontInfo.Font.FontColorModified || ignoreMod ? GetNewColor(fontInfo.Font.FontColor) : null; - - var fontName = fontInfo.Font.FontNameModified || ignoreMod - ? new FontName { Val = fontInfo.Font.FontName } - : null; - var fontFamilyNumbering = fontInfo.Font.FontFamilyNumberingModified || ignoreMod - ? new FontFamilyNumbering { Val = (Int32)fontInfo.Font.FontFamilyNumbering } - : null; - - if (bold != null) - font.AppendChild(bold); - if (italic != null) - font.AppendChild(italic); - if (underline != null) - font.AppendChild(underline); - if (strike != null) - font.AppendChild(strike); - if (verticalAlignment != null) - font.AppendChild(verticalAlignment); - if (shadow != null) - font.AppendChild(shadow); - if (fontSize != null) - font.AppendChild(fontSize); - if (color != null) - font.AppendChild(color); - if (fontName != null) - font.AppendChild(fontName); - if (fontFamilyNumbering != null) - font.AppendChild(fontFamilyNumbering); - - return font; - } - - private static Color GetNewColor(XLColor xlColor) - { - var color = new Color(); - if (xlColor.ColorType == XLColorType.Color) - color.Rgb = xlColor.Color.ToHex(); - else if (xlColor.ColorType == XLColorType.Indexed) - color.Indexed = (UInt32)xlColor.Indexed; - else - { - color.Theme = (UInt32)xlColor.ThemeColor; - if (xlColor.ThemeTint != 0) - color.Tint = xlColor.ThemeTint; - } - return color; - } - - private static TabColor GetTabColor(XLColor xlColor) - { - var color = new TabColor(); - if (xlColor.ColorType == XLColorType.Color) - color.Rgb = xlColor.Color.ToHex(); - else if (xlColor.ColorType == XLColorType.Indexed) - color.Indexed = (UInt32)xlColor.Indexed; - else - { - color.Theme = (UInt32)xlColor.ThemeColor; - if (xlColor.ThemeTint != 0) - color.Tint = xlColor.ThemeTint; - } - return color; - } - - private bool FontsAreEqual(Font f, IXLFont xlFont) - { - var nf = new XLFont { Bold = f.Bold != null, Italic = f.Italic != null }; - if (f.Underline != null) - { - nf.Underline = f.Underline.Val != null - ? f.Underline.Val.Value.ToClosedXml() - : XLFontUnderlineValues.Single; - } - nf.Strikethrough = f.Strike != null; - if (f.VerticalTextAlignment != null) - { - nf.VerticalAlignment = f.VerticalTextAlignment.Val != null - ? f.VerticalTextAlignment.Val.Value.ToClosedXml() - : XLFontVerticalTextAlignmentValues.Baseline; - } - nf.Shadow = f.Shadow != null; - if (f.FontSize != null) - nf.FontSize = f.FontSize.Val; - var fColor = GetColor(f.Color); - if (fColor.HasValue) - nf.FontColor = fColor; - if (f.FontName != null) - nf.FontName = f.FontName.Val; - if (f.FontFamilyNumbering != null) - nf.FontFamilyNumbering = (XLFontFamilyNumberingValues)f.FontFamilyNumbering.Val.Value; - - return nf.Equals(xlFont); - } - - private static Dictionary ResolveNumberFormats( - WorkbookStylesPart workbookStylesPart, - Dictionary sharedNumberFormats, - UInt32 defaultFormatId) - { - if (workbookStylesPart.Stylesheet.NumberingFormats == null) - { - workbookStylesPart.Stylesheet.NumberingFormats = new NumberingFormats(); - workbookStylesPart.Stylesheet.NumberingFormats.AppendChild(new NumberingFormat() - { - NumberFormatId = 0, - FormatCode = "" - }); - } - - var allSharedNumberFormats = new Dictionary(); - foreach (var numberFormatInfo in sharedNumberFormats.Values.Where(nf => nf.NumberFormatId != defaultFormatId)) - { - var numberingFormatId = XLConstants.NumberOfBuiltInStyles + 1; - var foundOne = false; - foreach (NumberingFormat nf in workbookStylesPart.Stylesheet.NumberingFormats) - { - if (NumberFormatsAreEqual(nf, numberFormatInfo.NumberFormat)) - { - foundOne = true; - numberingFormatId = (Int32)nf.NumberFormatId.Value; - break; - } - numberingFormatId++; - } - if (!foundOne) - { - var numberingFormat = new NumberingFormat - { - NumberFormatId = (UInt32)numberingFormatId, - FormatCode = numberFormatInfo.NumberFormat.Format - }; - workbookStylesPart.Stylesheet.NumberingFormats.AppendChild(numberingFormat); - } - allSharedNumberFormats.Add(numberFormatInfo.NumberFormat, - new NumberFormatInfo - { - NumberFormat = numberFormatInfo.NumberFormat, - NumberFormatId = numberingFormatId - }); - } - workbookStylesPart.Stylesheet.NumberingFormats.Count = - (UInt32)workbookStylesPart.Stylesheet.NumberingFormats.Count(); - return allSharedNumberFormats; - } - - private static bool NumberFormatsAreEqual(NumberingFormat nf, IXLNumberFormatBase xlNumberFormat) - { - var newXLNumberFormat = new XLNumberFormat(); - - if (nf.FormatCode != null && !XLHelper.IsNullOrWhiteSpace(nf.FormatCode.Value)) - newXLNumberFormat.Format = nf.FormatCode.Value; - else if (nf.NumberFormatId != null) - newXLNumberFormat.NumberFormatId = (Int32)nf.NumberFormatId.Value; - - return newXLNumberFormat.Equals(xlNumberFormat); - } - - #endregion - - #region GenerateWorksheetPartContent - - private static void GenerateWorksheetPartContent(WorksheetPart worksheetPart, XLWorksheet xlWorksheet, - SaveContext context) - { - #region Worksheet - - if (worksheetPart.Worksheet == null) - worksheetPart.Worksheet = new Worksheet(); - - GenerateTables(xlWorksheet, worksheetPart, context); - - if ( - !worksheetPart.Worksheet.NamespaceDeclarations.Contains(new KeyValuePair("r", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships"))) - { - worksheetPart.Worksheet.AddNamespaceDeclaration("r", - "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); - } - - #endregion - - var cm = new XLWSContentManager(worksheetPart.Worksheet); - - #region SheetProperties - - if (worksheetPart.Worksheet.SheetProperties == null) - worksheetPart.Worksheet.SheetProperties = new SheetProperties(); - - worksheetPart.Worksheet.SheetProperties.TabColor = xlWorksheet.TabColor.HasValue - ? GetTabColor(xlWorksheet.TabColor) - : null; - - cm.SetElement(XLWSContentManager.XLWSContents.SheetProperties, worksheetPart.Worksheet.SheetProperties); - - if (worksheetPart.Worksheet.SheetProperties.OutlineProperties == null) - worksheetPart.Worksheet.SheetProperties.OutlineProperties = new OutlineProperties(); - - worksheetPart.Worksheet.SheetProperties.OutlineProperties.SummaryBelow = - (xlWorksheet.Outline.SummaryVLocation == - XLOutlineSummaryVLocation.Bottom); - worksheetPart.Worksheet.SheetProperties.OutlineProperties.SummaryRight = - (xlWorksheet.Outline.SummaryHLocation == - XLOutlineSummaryHLocation.Right); - - if (worksheetPart.Worksheet.SheetProperties.PageSetupProperties == null - && (xlWorksheet.PageSetup.PagesTall > 0 || xlWorksheet.PageSetup.PagesWide > 0)) - worksheetPart.Worksheet.SheetProperties.PageSetupProperties = new PageSetupProperties { FitToPage = true }; - - #endregion - - var maxColumn = 0; - - var sheetDimensionReference = "A1"; - if (xlWorksheet.Internals.CellsCollection.Count > 0) - { - maxColumn = xlWorksheet.Internals.CellsCollection.MaxColumnUsed; - var maxRow = xlWorksheet.Internals.CellsCollection.MaxRowUsed; - sheetDimensionReference = "A1:" + XLHelper.GetColumnLetterFromNumber(maxColumn) + - maxRow.ToInvariantString(); - } - - if (xlWorksheet.Internals.ColumnsCollection.Count > 0) - { - var maxColCollection = xlWorksheet.Internals.ColumnsCollection.Keys.Max(); - if (maxColCollection > maxColumn) - maxColumn = maxColCollection; - } - - #region SheetViews - - if (worksheetPart.Worksheet.SheetDimension == null) - worksheetPart.Worksheet.SheetDimension = new SheetDimension { Reference = sheetDimensionReference }; - - cm.SetElement(XLWSContentManager.XLWSContents.SheetDimension, worksheetPart.Worksheet.SheetDimension); - - if (worksheetPart.Worksheet.SheetViews == null) - worksheetPart.Worksheet.SheetViews = new SheetViews(); - - cm.SetElement(XLWSContentManager.XLWSContents.SheetViews, worksheetPart.Worksheet.SheetViews); - - var sheetView = (SheetView)worksheetPart.Worksheet.SheetViews.FirstOrDefault(); - if (sheetView == null) - { - sheetView = new SheetView { WorkbookViewId = 0U }; - worksheetPart.Worksheet.SheetViews.AppendChild(sheetView); - } - - if (xlWorksheet.TabSelected) - sheetView.TabSelected = true; - else - sheetView.TabSelected = null; - - if (xlWorksheet.RightToLeft) - sheetView.RightToLeft = true; - else - sheetView.RightToLeft = null; - - if (xlWorksheet.ShowFormulas) - sheetView.ShowFormulas = true; - else - sheetView.ShowFormulas = null; - - if (xlWorksheet.ShowGridLines) - sheetView.ShowGridLines = null; - else - sheetView.ShowGridLines = false; - - if (xlWorksheet.ShowOutlineSymbols) - sheetView.ShowOutlineSymbols = null; - else - sheetView.ShowOutlineSymbols = false; - - if (xlWorksheet.ShowRowColHeaders) - sheetView.ShowRowColHeaders = null; - else - sheetView.ShowRowColHeaders = false; - - if (xlWorksheet.ShowRuler) - sheetView.ShowRuler = null; - else - sheetView.ShowRuler = false; - - if (xlWorksheet.ShowWhiteSpace) - sheetView.ShowWhiteSpace = null; - else - sheetView.ShowWhiteSpace = false; - - if (xlWorksheet.ShowZeros) - sheetView.ShowZeros = null; - else - sheetView.ShowZeros = false; - - if (xlWorksheet.RightToLeft) - sheetView.RightToLeft = true; - else - sheetView.RightToLeft = null; - - if (xlWorksheet.SheetView.View == XLSheetViewOptions.Normal) - sheetView.View = null; - else - sheetView.View = xlWorksheet.SheetView.View.ToOpenXml(); - - var pane = sheetView.Elements().FirstOrDefault(); - if (pane == null) - { - pane = new Pane(); - sheetView.AppendChild(pane); - } - - - pane.State = PaneStateValues.FrozenSplit; - Double hSplit = xlWorksheet.SheetView.SplitColumn; - Double ySplit = xlWorksheet.SheetView.SplitRow; - - - pane.HorizontalSplit = hSplit; - pane.VerticalSplit = ySplit; - - pane.TopLeftCell = XLHelper.GetColumnLetterFromNumber(xlWorksheet.SheetView.SplitColumn + 1) - + (xlWorksheet.SheetView.SplitRow + 1); - - if (hSplit == 0 && ySplit == 0) - sheetView.RemoveAllChildren(); - - if (xlWorksheet.SelectedRanges.Any() || xlWorksheet.ActiveCell != null) - { - sheetView.RemoveAllChildren(); - - var firstSelection = xlWorksheet.SelectedRanges.FirstOrDefault(); - var selection = new Selection(); - if (xlWorksheet.ActiveCell != null) - selection.ActiveCell = xlWorksheet.ActiveCell.Address.ToStringRelative(false); - else if (firstSelection != null) - selection.ActiveCell = firstSelection.RangeAddress.FirstAddress.ToStringRelative(false); - - - var seqRef = new List { selection.ActiveCell.Value }; - seqRef.AddRange(xlWorksheet.SelectedRanges - .Select(range => range.RangeAddress.ToStringRelative(false))); - - - selection.SequenceOfReferences = new ListValue { InnerText = String.Join(" ", seqRef.Distinct().ToArray()) }; - - sheetView.Append(selection); - } - - if (xlWorksheet.SheetView.ZoomScale == 100) - sheetView.ZoomScale = null; - else - sheetView.ZoomScale = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScale)); - - if (xlWorksheet.SheetView.ZoomScaleNormal == 100) - sheetView.ZoomScaleNormal = null; - else - sheetView.ZoomScaleNormal = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScaleNormal)); - - if (xlWorksheet.SheetView.ZoomScalePageLayoutView == 100) - sheetView.ZoomScalePageLayoutView = null; - else - sheetView.ZoomScalePageLayoutView = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScalePageLayoutView)); - - if (xlWorksheet.SheetView.ZoomScaleSheetLayoutView == 100) - sheetView.ZoomScaleSheetLayoutView = null; - else - sheetView.ZoomScaleSheetLayoutView = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScaleSheetLayoutView)); - - #endregion - - var maxOutlineColumn = 0; - if (xlWorksheet.ColumnCount() > 0) - maxOutlineColumn = xlWorksheet.GetMaxColumnOutline(); - - var maxOutlineRow = 0; - if (xlWorksheet.RowCount() > 0) - maxOutlineRow = xlWorksheet.GetMaxRowOutline(); - - #region SheetFormatProperties - - if (worksheetPart.Worksheet.SheetFormatProperties == null) - worksheetPart.Worksheet.SheetFormatProperties = new SheetFormatProperties(); - - cm.SetElement(XLWSContentManager.XLWSContents.SheetFormatProperties, - worksheetPart.Worksheet.SheetFormatProperties); - - worksheetPart.Worksheet.SheetFormatProperties.DefaultRowHeight = xlWorksheet.RowHeight.SaveRound(); - - if (xlWorksheet.RowHeightChanged) - worksheetPart.Worksheet.SheetFormatProperties.CustomHeight = true; - else - worksheetPart.Worksheet.SheetFormatProperties.CustomHeight = null; - - - var worksheetColumnWidth = GetColumnWidth(xlWorksheet.ColumnWidth).SaveRound(); - if (xlWorksheet.ColumnWidthChanged) - worksheetPart.Worksheet.SheetFormatProperties.DefaultColumnWidth = worksheetColumnWidth; - else - worksheetPart.Worksheet.SheetFormatProperties.DefaultColumnWidth = null; - - - if (maxOutlineColumn > 0) - worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelColumn = (byte)maxOutlineColumn; - else - worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelColumn = null; - - if (maxOutlineRow > 0) - worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelRow = (byte)maxOutlineRow; - else - worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelRow = null; - - #endregion - - #region Columns - - if (xlWorksheet.Internals.CellsCollection.Count == 0 && - xlWorksheet.Internals.ColumnsCollection.Count == 0 - && xlWorksheet.Style.Equals(DefaultStyle)) - worksheetPart.Worksheet.RemoveAllChildren(); - else - { - if (!worksheetPart.Worksheet.Elements().Any()) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.Columns); - worksheetPart.Worksheet.InsertAfter(new Columns(), previousElement); - } - - var columns = worksheetPart.Worksheet.Elements().First(); - cm.SetElement(XLWSContentManager.XLWSContents.Columns, columns); - - var sheetColumnsByMin = columns.Elements().ToDictionary(c => c.Min.Value, c => c); - //Dictionary sheetColumnsByMax = columns.Elements().ToDictionary(c => c.Max.Value, c => c); - - Int32 minInColumnsCollection; - Int32 maxInColumnsCollection; - if (xlWorksheet.Internals.ColumnsCollection.Count > 0) - { - minInColumnsCollection = xlWorksheet.Internals.ColumnsCollection.Keys.Min(); - maxInColumnsCollection = xlWorksheet.Internals.ColumnsCollection.Keys.Max(); - } - else - { - minInColumnsCollection = 1; - maxInColumnsCollection = 0; - } - - var worksheetStyleId = context.SharedStyles[xlWorksheet.GetStyleId()].StyleId; - if (minInColumnsCollection > 1) - { - UInt32Value min = 1; - UInt32Value max = (UInt32)(minInColumnsCollection - 1); - - - for (var co = min; co <= max; co++) - { - var column = new Column - { - Min = co, - Max = co, - Style = worksheetStyleId, - Width = worksheetColumnWidth, - CustomWidth = true - }; - - UpdateColumn(column, columns, sheetColumnsByMin); //, sheetColumnsByMax); - } - } - - for (var co = minInColumnsCollection; co <= maxInColumnsCollection; co++) - { - UInt32 styleId; - Double columnWidth; - var isHidden = false; - var collapsed = false; - var outlineLevel = 0; - if (xlWorksheet.Internals.ColumnsCollection.ContainsKey(co)) - { - styleId = context.SharedStyles[xlWorksheet.Internals.ColumnsCollection[co].GetStyleId()].StyleId; - columnWidth = GetColumnWidth(xlWorksheet.Internals.ColumnsCollection[co].Width).SaveRound(); - isHidden = xlWorksheet.Internals.ColumnsCollection[co].IsHidden; - collapsed = xlWorksheet.Internals.ColumnsCollection[co].Collapsed; - outlineLevel = xlWorksheet.Internals.ColumnsCollection[co].OutlineLevel; - } - else - { - styleId = context.SharedStyles[xlWorksheet.GetStyleId()].StyleId; - columnWidth = worksheetColumnWidth; - } - - var column = new Column - { - Min = (UInt32)co, - Max = (UInt32)co, - Style = styleId, - Width = columnWidth, - CustomWidth = true - }; - - if (isHidden) - column.Hidden = true; - if (collapsed) - column.Collapsed = true; - if (outlineLevel > 0) - column.OutlineLevel = (byte)outlineLevel; - - UpdateColumn(column, columns, sheetColumnsByMin); //, sheetColumnsByMax); - } - - var collection = maxInColumnsCollection; - foreach ( - var col in - columns.Elements().Where(c => c.Min > (UInt32)(collection)).OrderBy( - c => c.Min.Value)) - { - col.Style = worksheetStyleId; - col.Width = worksheetColumnWidth; - col.CustomWidth = true; - - if ((Int32)col.Max.Value > maxInColumnsCollection) - maxInColumnsCollection = (Int32)col.Max.Value; - } - - if (maxInColumnsCollection < XLHelper.MaxColumnNumber && !xlWorksheet.Style.Equals(DefaultStyle)) - { - var column = new Column - { - Min = (UInt32)(maxInColumnsCollection + 1), - Max = (UInt32)(XLHelper.MaxColumnNumber), - Style = worksheetStyleId, - Width = worksheetColumnWidth, - CustomWidth = true - }; - columns.AppendChild(column); - } - - CollapseColumns(columns, sheetColumnsByMin); - - if (!columns.Any()) - { - worksheetPart.Worksheet.RemoveAllChildren(); - cm.SetElement(XLWSContentManager.XLWSContents.Columns, null); - } - } - - #endregion - - #region SheetData - - if (!worksheetPart.Worksheet.Elements().Any()) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.SheetData); - worksheetPart.Worksheet.InsertAfter(new SheetData(), previousElement); - } - - var sheetData = worksheetPart.Worksheet.Elements().First(); - cm.SetElement(XLWSContentManager.XLWSContents.SheetData, sheetData); - - var lastRow = 0; - var sheetDataRows = - sheetData.Elements().ToDictionary(r => r.RowIndex == null ? ++lastRow : (Int32)r.RowIndex.Value, - r => r); - foreach ( - var r in - xlWorksheet.Internals.RowsCollection.Deleted.Where(r => sheetDataRows.ContainsKey(r.Key))) - { - sheetData.RemoveChild(sheetDataRows[r.Key]); - sheetDataRows.Remove(r.Key); - xlWorksheet.Internals.CellsCollection.deleted.Remove(r.Key); - } - - var distinctRows = xlWorksheet.Internals.CellsCollection.RowsCollection.Keys.Union(xlWorksheet.Internals.RowsCollection.Keys); - var noRows = !sheetData.Elements().Any(); - foreach (var distinctRow in distinctRows.OrderBy(r => r)) - { - Row row; - if (sheetDataRows.ContainsKey(distinctRow)) - row = sheetDataRows[distinctRow]; - else - { - row = new Row { RowIndex = (UInt32)distinctRow }; - if (noRows) - { - sheetData.AppendChild(row); - noRows = false; - } - else - { - if (sheetDataRows.Any(r => r.Key > row.RowIndex.Value)) - { - var minRow = sheetDataRows.Where(r => r.Key > (Int32)row.RowIndex.Value).Min(r => r.Key); - var rowBeforeInsert = sheetDataRows[minRow]; - sheetData.InsertBefore(row, rowBeforeInsert); - } - else - sheetData.AppendChild(row); - } - } - - if (maxColumn > 0) - row.Spans = new ListValue { InnerText = "1:" + maxColumn.ToInvariantString() }; - - row.Height = null; - row.CustomHeight = null; - row.Hidden = null; - row.StyleIndex = null; - row.CustomFormat = null; - row.Collapsed = null; - if (xlWorksheet.Internals.RowsCollection.ContainsKey(distinctRow)) - { - var thisRow = xlWorksheet.Internals.RowsCollection[distinctRow]; - if (thisRow.HeightChanged) - { - row.Height = thisRow.Height.SaveRound(); - row.CustomHeight = true; - row.CustomFormat = true; - } - - if (thisRow.GetStyleId() != xlWorksheet.GetStyleId()) - { - row.StyleIndex = context.SharedStyles[thisRow.GetStyleId()].StyleId; - row.CustomFormat = true; - } - - if (thisRow.IsHidden) - row.Hidden = true; - if (thisRow.Collapsed) - row.Collapsed = true; - if (thisRow.OutlineLevel > 0) - row.OutlineLevel = (byte)thisRow.OutlineLevel; - } - - var lastCell = 0; - var cellsByReference = row.Elements().ToDictionary(c => c.CellReference == null - ? XLHelper.GetColumnLetterFromNumber( - ++lastCell) + distinctRow - : c.CellReference.Value, c => c); - - foreach (var kpDel in xlWorksheet.Internals.CellsCollection.deleted.ToList()) - { - foreach (var delCo in kpDel.Value.ToList()) - { - var key = XLHelper.GetColumnLetterFromNumber(delCo) + kpDel.Key.ToInvariantString(); - if (!cellsByReference.ContainsKey(key)) continue; - row.RemoveChild(cellsByReference[key]); - kpDel.Value.Remove(delCo); - } - if (kpDel.Value.Count == 0) - xlWorksheet.Internals.CellsCollection.deleted.Remove(kpDel.Key); - } - - - if (!xlWorksheet.Internals.CellsCollection.RowsCollection.ContainsKey(distinctRow)) continue; - - var isNewRow = !row.Elements().Any(); - lastCell = 0; - var mRows = row.Elements().ToDictionary(c => XLHelper.GetColumnNumberFromAddress(c.CellReference == null - ? (XLHelper.GetColumnLetterFromNumber(++lastCell) + distinctRow) : c.CellReference.Value), c => c); - foreach (var opCell in xlWorksheet.Internals.CellsCollection.RowsCollection[distinctRow].Values - .OrderBy(c => c.Address.ColumnNumber) - .Select(c => c)) - { - var styleId = context.SharedStyles[opCell.GetStyleId()].StyleId; - - var dataType = opCell.DataType; - var cellReference = (opCell.Address).GetTrimmedAddress(); - - var isEmpty = opCell.IsEmpty(true); - - Cell cell = null; - if (cellsByReference.ContainsKey(cellReference)) - { - cell = cellsByReference[cellReference]; - if (isEmpty) - { - cell.Remove(); - } - } - - if (!isEmpty) - { - if (cell == null) - { - cell = new Cell(); - cell.CellReference = new StringValue(cellReference); - - if (isNewRow) - row.AppendChild(cell); - else - { - var newColumn = XLHelper.GetColumnNumberFromAddress(cellReference); - - Cell cellBeforeInsert = null; - int[] lastCo = { Int32.MaxValue }; - foreach (var c in mRows.Where(kp => kp.Key > newColumn).Where(c => lastCo[0] > c.Key)) - { - cellBeforeInsert = c.Value; - lastCo[0] = c.Key; - } - if (cellBeforeInsert == null) - row.AppendChild(cell); - else - row.InsertBefore(cell, cellBeforeInsert); - } - } - - cell.StyleIndex = styleId; - var formula = opCell.FormulaA1; - if (opCell.HasFormula) - { - if (formula.StartsWith("{")) - { - formula = formula.Substring(1, formula.Length - 2); - var f = new CellFormula { FormulaType = CellFormulaValues.Array }; - - if (opCell.FormulaReference == null) - opCell.FormulaReference = opCell.AsRange().RangeAddress; - if (opCell.FormulaReference.FirstAddress.Equals(opCell.Address)) - { - f.Text = formula; - f.Reference = opCell.FormulaReference.ToStringRelative(); - } - - cell.CellFormula = f; - } - else - { - cell.CellFormula = new CellFormula(); - cell.CellFormula.Text = formula; - } - - cell.CellValue = null; - } - else - { - cell.CellFormula = null; - - cell.DataType = opCell.DataType == XLCellValues.DateTime ? null : GetCellValue(opCell); - - if (dataType == XLCellValues.Text) - { - if (opCell.InnerText.Length == 0) - cell.CellValue = null; - else - { - if (opCell.ShareString) - { - var cellValue = new CellValue(); - cellValue.Text = opCell.SharedStringId.ToString(); - cell.CellValue = cellValue; - } - else - { - var text = opCell.GetString(); - var t = new Text(text); - if (text.PreserveSpaces()) - t.Space = SpaceProcessingModeValues.Preserve; - - cell.InlineString = new InlineString { Text = t }; - } - } - } - else if (dataType == XLCellValues.TimeSpan) - { - var timeSpan = opCell.GetTimeSpan(); - var cellValue = new CellValue(); - cellValue.Text = - XLCell.BaseDate.Add(timeSpan).ToOADate().ToInvariantString(); - cell.CellValue = cellValue; - } - else if (dataType == XLCellValues.DateTime || dataType == XLCellValues.Number) - { - if (!XLHelper.IsNullOrWhiteSpace(opCell.InnerText)) - { - var cellValue = new CellValue(); - cellValue.Text = Double.Parse(opCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture).ToInvariantString(); - cell.CellValue = cellValue; - } - } - else - { - var cellValue = new CellValue(); - cellValue.Text = opCell.InnerText; - cell.CellValue = cellValue; - } - } - } - } - xlWorksheet.Internals.CellsCollection.deleted.Remove(distinctRow); - } - foreach ( - var r in - xlWorksheet.Internals.CellsCollection.deleted.Keys.Where( - sheetDataRows.ContainsKey)) - { - sheetData.RemoveChild(sheetDataRows[r]); - sheetDataRows.Remove(r); - } - - #endregion - - #region SheetProtection - - if (xlWorksheet.Protection.Protected) - { - if (!worksheetPart.Worksheet.Elements().Any()) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.SheetProtection); - worksheetPart.Worksheet.InsertAfter(new SheetProtection(), previousElement); - } - - var sheetProtection = worksheetPart.Worksheet.Elements().First(); - cm.SetElement(XLWSContentManager.XLWSContents.SheetProtection, sheetProtection); - - var protection = xlWorksheet.Protection; - sheetProtection.Sheet = protection.Protected; - if (!XLHelper.IsNullOrWhiteSpace(protection.PasswordHash)) - sheetProtection.Password = protection.PasswordHash; - sheetProtection.FormatCells = GetBooleanValue(!protection.FormatCells, true); - sheetProtection.FormatColumns = GetBooleanValue(!protection.FormatColumns, true); - sheetProtection.FormatRows = GetBooleanValue(!protection.FormatRows, true); - sheetProtection.InsertColumns = GetBooleanValue(!protection.InsertColumns, true); - sheetProtection.InsertHyperlinks = GetBooleanValue(!protection.InsertHyperlinks, true); - sheetProtection.InsertRows = GetBooleanValue(!protection.InsertRows, true); - sheetProtection.DeleteColumns = GetBooleanValue(!protection.DeleteColumns, true); - sheetProtection.DeleteRows = GetBooleanValue(!protection.DeleteRows, true); - sheetProtection.AutoFilter = GetBooleanValue(!protection.AutoFilter, true); - sheetProtection.PivotTables = GetBooleanValue(!protection.PivotTables, true); - sheetProtection.Sort = GetBooleanValue(!protection.Sort, true); - sheetProtection.SelectLockedCells = GetBooleanValue(!protection.SelectLockedCells, false); - sheetProtection.SelectUnlockedCells = GetBooleanValue(!protection.SelectUnlockedCells, false); - } - else - { - worksheetPart.Worksheet.RemoveAllChildren(); - cm.SetElement(XLWSContentManager.XLWSContents.SheetProtection, null); - } - - #endregion - - #region AutoFilter - - worksheetPart.Worksheet.RemoveAllChildren(); - if (xlWorksheet.AutoFilter.Enabled) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.AutoFilter); - worksheetPart.Worksheet.InsertAfter(new AutoFilter(), previousElement); - - - var autoFilter = worksheetPart.Worksheet.Elements().First(); - cm.SetElement(XLWSContentManager.XLWSContents.AutoFilter, autoFilter); - - PopulateAutoFilter(xlWorksheet.AutoFilter, autoFilter); - } - else - { - cm.SetElement(XLWSContentManager.XLWSContents.AutoFilter, null); - } - - #endregion - - #region MergeCells - - if ((xlWorksheet).Internals.MergedRanges.Any()) - { - if (!worksheetPart.Worksheet.Elements().Any()) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.MergeCells); - worksheetPart.Worksheet.InsertAfter(new MergeCells(), previousElement); - } - - var mergeCells = worksheetPart.Worksheet.Elements().First(); - cm.SetElement(XLWSContentManager.XLWSContents.MergeCells, mergeCells); - mergeCells.RemoveAllChildren(); - - foreach (var mergeCell in (xlWorksheet).Internals.MergedRanges.Select( - m => m.RangeAddress.FirstAddress.ToString() + ":" + m.RangeAddress.LastAddress.ToString()).Select( - merged => new MergeCell { Reference = merged })) - mergeCells.AppendChild(mergeCell); - - mergeCells.Count = (UInt32)mergeCells.Count(); - } - else - { - worksheetPart.Worksheet.RemoveAllChildren(); - cm.SetElement(XLWSContentManager.XLWSContents.MergeCells, null); - } - - #endregion - - #region Conditional Formatting - - if (!xlWorksheet.ConditionalFormats.Any()) - { - worksheetPart.Worksheet.RemoveAllChildren(); - cm.SetElement(XLWSContentManager.XLWSContents.ConditionalFormatting, null); - } - else - { - worksheetPart.Worksheet.RemoveAllChildren(); - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.ConditionalFormatting); - - var priority = 1; // priority is 1 origin in Microsoft Excel - foreach (var cfGroup in xlWorksheet.ConditionalFormats - .GroupBy( - c => c.Range.RangeAddress.ToStringRelative(false), - c => c, - (key, g) => new { RangeId = key, CfList = g.ToList() } - ) - ) - { - var conditionalFormatting = new ConditionalFormatting - { - SequenceOfReferences = - new ListValue { InnerText = cfGroup.RangeId } - }; - foreach (var cf in cfGroup.CfList) - { - conditionalFormatting.Append(XLCFConverters.Convert(cf, priority, context)); - priority++; - } - worksheetPart.Worksheet.InsertAfter(conditionalFormatting, previousElement); - previousElement = conditionalFormatting; - cm.SetElement(XLWSContentManager.XLWSContents.ConditionalFormatting, conditionalFormatting); - } - } - - #endregion - - #region DataValidations - - if (!xlWorksheet.DataValidations.Any(d => d.IsDirty())) - { - worksheetPart.Worksheet.RemoveAllChildren(); - cm.SetElement(XLWSContentManager.XLWSContents.DataValidations, null); - } - else - { - if (!worksheetPart.Worksheet.Elements().Any()) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.DataValidations); - worksheetPart.Worksheet.InsertAfter(new DataValidations(), previousElement); - } - - var dataValidations = worksheetPart.Worksheet.Elements().First(); - cm.SetElement(XLWSContentManager.XLWSContents.DataValidations, dataValidations); - dataValidations.RemoveAllChildren(); - foreach (var dv in xlWorksheet.DataValidations) - { - var sequence = dv.Ranges.Aggregate(String.Empty, (current, r) => current + (r.RangeAddress + " ")); - - if (sequence.Length > 0) - sequence = sequence.Substring(0, sequence.Length - 1); - - var dataValidation = new DataValidation - { - AllowBlank = dv.IgnoreBlanks, - Formula1 = new Formula1(dv.MinValue), - Formula2 = new Formula2(dv.MaxValue), - Type = dv.AllowedValues.ToOpenXml(), - ShowErrorMessage = dv.ShowErrorMessage, - Prompt = dv.InputMessage, - PromptTitle = dv.InputTitle, - ErrorTitle = dv.ErrorTitle, - Error = dv.ErrorMessage, - ShowDropDown = !dv.InCellDropdown, - ShowInputMessage = dv.ShowInputMessage, - ErrorStyle = dv.ErrorStyle.ToOpenXml(), - Operator = dv.Operator.ToOpenXml(), - SequenceOfReferences = - new ListValue { InnerText = sequence } - }; - - dataValidations.AppendChild(dataValidation); - } - dataValidations.Count = (UInt32)xlWorksheet.DataValidations.Count(); - } - - #endregion - - #region Hyperlinks - - var relToRemove = worksheetPart.HyperlinkRelationships.ToList(); - relToRemove.ForEach(worksheetPart.DeleteReferenceRelationship); - if (!xlWorksheet.Hyperlinks.Any()) - { - worksheetPart.Worksheet.RemoveAllChildren(); - cm.SetElement(XLWSContentManager.XLWSContents.Hyperlinks, null); - } - else - { - if (!worksheetPart.Worksheet.Elements().Any()) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.Hyperlinks); - worksheetPart.Worksheet.InsertAfter(new Hyperlinks(), previousElement); - } - - var hyperlinks = worksheetPart.Worksheet.Elements().First(); - cm.SetElement(XLWSContentManager.XLWSContents.Hyperlinks, hyperlinks); - hyperlinks.RemoveAllChildren(); - foreach (var hl in xlWorksheet.Hyperlinks) - { - Hyperlink hyperlink; - if (hl.IsExternal) - { - var rId = context.RelIdGenerator.GetNext(RelType.Workbook); - hyperlink = new Hyperlink { Reference = hl.Cell.Address.ToString(), Id = rId }; - worksheetPart.AddHyperlinkRelationship(hl.ExternalAddress, true, rId); - } - else - { - hyperlink = new Hyperlink - { - Reference = hl.Cell.Address.ToString(), - Location = hl.InternalAddress, - Display = hl.Cell.GetFormattedString() - }; - } - if (!XLHelper.IsNullOrWhiteSpace(hl.Tooltip)) - hyperlink.Tooltip = hl.Tooltip; - hyperlinks.AppendChild(hyperlink); - } - } - - #endregion - - #region PrintOptions - - if (!worksheetPart.Worksheet.Elements().Any()) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.PrintOptions); - worksheetPart.Worksheet.InsertAfter(new PrintOptions(), previousElement); - } - - var printOptions = worksheetPart.Worksheet.Elements().First(); - cm.SetElement(XLWSContentManager.XLWSContents.PrintOptions, printOptions); - - printOptions.HorizontalCentered = xlWorksheet.PageSetup.CenterHorizontally; - printOptions.VerticalCentered = xlWorksheet.PageSetup.CenterVertically; - printOptions.Headings = xlWorksheet.PageSetup.ShowRowAndColumnHeadings; - printOptions.GridLines = xlWorksheet.PageSetup.ShowGridlines; - - #endregion - - #region PageMargins - - if (!worksheetPart.Worksheet.Elements().Any()) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.PageMargins); - worksheetPart.Worksheet.InsertAfter(new PageMargins(), previousElement); - } - - var pageMargins = worksheetPart.Worksheet.Elements().First(); - cm.SetElement(XLWSContentManager.XLWSContents.PageMargins, pageMargins); - pageMargins.Left = xlWorksheet.PageSetup.Margins.Left; - pageMargins.Right = xlWorksheet.PageSetup.Margins.Right; - pageMargins.Top = xlWorksheet.PageSetup.Margins.Top; - pageMargins.Bottom = xlWorksheet.PageSetup.Margins.Bottom; - pageMargins.Header = xlWorksheet.PageSetup.Margins.Header; - pageMargins.Footer = xlWorksheet.PageSetup.Margins.Footer; - - #endregion - - #region PageSetup - - if (!worksheetPart.Worksheet.Elements().Any()) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.PageSetup); - worksheetPart.Worksheet.InsertAfter(new PageSetup(), previousElement); - } - - var pageSetup = worksheetPart.Worksheet.Elements().First(); - cm.SetElement(XLWSContentManager.XLWSContents.PageSetup, pageSetup); - - pageSetup.Orientation = xlWorksheet.PageSetup.PageOrientation.ToOpenXml(); - pageSetup.PaperSize = (UInt32)xlWorksheet.PageSetup.PaperSize; - pageSetup.BlackAndWhite = xlWorksheet.PageSetup.BlackAndWhite; - pageSetup.Draft = xlWorksheet.PageSetup.DraftQuality; - pageSetup.PageOrder = xlWorksheet.PageSetup.PageOrder.ToOpenXml(); - pageSetup.CellComments = xlWorksheet.PageSetup.ShowComments.ToOpenXml(); - pageSetup.Errors = xlWorksheet.PageSetup.PrintErrorValue.ToOpenXml(); - - if (xlWorksheet.PageSetup.FirstPageNumber > 0) - { - pageSetup.FirstPageNumber = (UInt32)xlWorksheet.PageSetup.FirstPageNumber; - pageSetup.UseFirstPageNumber = true; - } - else - { - pageSetup.FirstPageNumber = null; - pageSetup.UseFirstPageNumber = null; - } - - if (xlWorksheet.PageSetup.HorizontalDpi > 0) - pageSetup.HorizontalDpi = (UInt32)xlWorksheet.PageSetup.HorizontalDpi; - else - pageSetup.HorizontalDpi = null; - - if (xlWorksheet.PageSetup.VerticalDpi > 0) - pageSetup.VerticalDpi = (UInt32)xlWorksheet.PageSetup.VerticalDpi; - else - pageSetup.VerticalDpi = null; - - if (xlWorksheet.PageSetup.Scale > 0) - { - pageSetup.Scale = (UInt32)xlWorksheet.PageSetup.Scale; - pageSetup.FitToWidth = null; - pageSetup.FitToHeight = null; - } - else - { - pageSetup.Scale = null; - - if (xlWorksheet.PageSetup.PagesWide >= 0 && xlWorksheet.PageSetup.PagesWide != 1) - pageSetup.FitToWidth = (UInt32)xlWorksheet.PageSetup.PagesWide; - - if (xlWorksheet.PageSetup.PagesTall >= 0 && xlWorksheet.PageSetup.PagesTall != 1) - pageSetup.FitToHeight = (UInt32)xlWorksheet.PageSetup.PagesTall; - } - - #endregion - - #region HeaderFooter - - var headerFooter = worksheetPart.Worksheet.Elements().FirstOrDefault(); - if (headerFooter == null) - headerFooter = new HeaderFooter(); - else - worksheetPart.Worksheet.RemoveAllChildren(); - - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.HeaderFooter); - worksheetPart.Worksheet.InsertAfter(headerFooter, previousElement); - cm.SetElement(XLWSContentManager.XLWSContents.HeaderFooter, headerFooter); - } - if (((XLHeaderFooter)xlWorksheet.PageSetup.Header).Changed - || ((XLHeaderFooter)xlWorksheet.PageSetup.Footer).Changed) - { - //var headerFooter = worksheetPart.Worksheet.Elements().First(); - - headerFooter.RemoveAllChildren(); - - headerFooter.ScaleWithDoc = xlWorksheet.PageSetup.ScaleHFWithDocument; - headerFooter.AlignWithMargins = xlWorksheet.PageSetup.AlignHFWithMargins; - headerFooter.DifferentFirst = xlWorksheet.PageSetup.DifferentFirstPageOnHF; - headerFooter.DifferentOddEven = xlWorksheet.PageSetup.DifferentOddEvenPagesOnHF; - - var oddHeader = new OddHeader(xlWorksheet.PageSetup.Header.GetText(XLHFOccurrence.OddPages)); - headerFooter.AppendChild(oddHeader); - var oddFooter = new OddFooter(xlWorksheet.PageSetup.Footer.GetText(XLHFOccurrence.OddPages)); - headerFooter.AppendChild(oddFooter); - - var evenHeader = new EvenHeader(xlWorksheet.PageSetup.Header.GetText(XLHFOccurrence.EvenPages)); - headerFooter.AppendChild(evenHeader); - var evenFooter = new EvenFooter(xlWorksheet.PageSetup.Footer.GetText(XLHFOccurrence.EvenPages)); - headerFooter.AppendChild(evenFooter); - - var firstHeader = new FirstHeader(xlWorksheet.PageSetup.Header.GetText(XLHFOccurrence.FirstPage)); - headerFooter.AppendChild(firstHeader); - var firstFooter = new FirstFooter(xlWorksheet.PageSetup.Footer.GetText(XLHFOccurrence.FirstPage)); - headerFooter.AppendChild(firstFooter); - } - - #endregion - - #region RowBreaks - - if (!worksheetPart.Worksheet.Elements().Any()) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.RowBreaks); - worksheetPart.Worksheet.InsertAfter(new RowBreaks(), previousElement); - } - - var rowBreaks = worksheetPart.Worksheet.Elements().First(); - - var rowBreakCount = xlWorksheet.PageSetup.RowBreaks.Count; - if (rowBreakCount > 0) - { - rowBreaks.Count = (UInt32)rowBreakCount; - rowBreaks.ManualBreakCount = (UInt32)rowBreakCount; - var lastRowNum = (UInt32)xlWorksheet.RangeAddress.LastAddress.RowNumber; - foreach (var break1 in xlWorksheet.PageSetup.RowBreaks.Select(rb => new Break - { - Id = (UInt32)rb, - Max = lastRowNum, - ManualPageBreak = true - })) - rowBreaks.AppendChild(break1); - cm.SetElement(XLWSContentManager.XLWSContents.RowBreaks, rowBreaks); - } - else - { - worksheetPart.Worksheet.RemoveAllChildren(); - cm.SetElement(XLWSContentManager.XLWSContents.RowBreaks, null); - } - - #endregion - - #region ColumnBreaks - - if (!worksheetPart.Worksheet.Elements().Any()) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.ColumnBreaks); - worksheetPart.Worksheet.InsertAfter(new ColumnBreaks(), previousElement); - } - - var columnBreaks = worksheetPart.Worksheet.Elements().First(); - - var columnBreakCount = xlWorksheet.PageSetup.ColumnBreaks.Count; - if (columnBreakCount > 0) - { - columnBreaks.Count = (UInt32)columnBreakCount; - columnBreaks.ManualBreakCount = (UInt32)columnBreakCount; - var maxColumnNumber = (UInt32)xlWorksheet.RangeAddress.LastAddress.ColumnNumber; - foreach (var break1 in xlWorksheet.PageSetup.ColumnBreaks.Select(cb => new Break - { - Id = (UInt32)cb, - Max = maxColumnNumber, - ManualPageBreak = true - })) - columnBreaks.AppendChild(break1); - cm.SetElement(XLWSContentManager.XLWSContents.ColumnBreaks, columnBreaks); - } - else - { - worksheetPart.Worksheet.RemoveAllChildren(); - cm.SetElement(XLWSContentManager.XLWSContents.ColumnBreaks, null); - } - - #endregion - - #region Tables - - worksheetPart.Worksheet.RemoveAllChildren(); - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.TableParts); - worksheetPart.Worksheet.InsertAfter(new TableParts(), previousElement); - } - - var tableParts = worksheetPart.Worksheet.Elements().First(); - cm.SetElement(XLWSContentManager.XLWSContents.TableParts, tableParts); - - tableParts.Count = (UInt32)xlWorksheet.Tables.Count(); - foreach ( - var tablePart in - from XLTable xlTable in xlWorksheet.Tables select new TablePart { Id = xlTable.RelId }) - tableParts.AppendChild(tablePart); - - #endregion - - #region Drawings - - var pics = xlWorksheet.Pictures(); - if (pics != null) - { - foreach (Drawings.IXLPicture pic in pics) - { - AddPictureAnchor(worksheetPart, pic); - } - } - - if (xlWorksheet.Pictures() != null && xlWorksheet.Pictures().Count > 0) - { - Drawing worksheetDrawing = new Drawing { Id = worksheetPart.GetIdOfPart(worksheetPart.DrawingsPart) }; - worksheetDrawing.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); - worksheetPart.Worksheet.InsertBefore(worksheetDrawing, tableParts); - } - - #endregion - - #region LegacyDrawing - - if (xlWorksheet.LegacyDrawingIsNew) - { - worksheetPart.Worksheet.RemoveAllChildren(); - { - if (!XLHelper.IsNullOrWhiteSpace(xlWorksheet.LegacyDrawingId)) - { - var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.LegacyDrawing); - worksheetPart.Worksheet.InsertAfter(new LegacyDrawing { Id = xlWorksheet.LegacyDrawingId }, - previousElement); - } - } - } - - #endregion - - #region LegacyDrawingHeaderFooter - - //LegacyDrawingHeaderFooter legacyHeaderFooter = worksheetPart.Worksheet.Elements().FirstOrDefault(); - //if (legacyHeaderFooter != null) - //{ - // worksheetPart.Worksheet.RemoveAllChildren(); - // { - // var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.LegacyDrawingHeaderFooter); - // worksheetPart.Worksheet.InsertAfter(new LegacyDrawingHeaderFooter { Id = xlWorksheet.LegacyDrawingId }, - // previousElement); - // } - //} - - #endregion - } - - private static void PopulateAutoFilter(XLAutoFilter xlAutoFilter, AutoFilter autoFilter) - { - var filterRange = xlAutoFilter.Range; - autoFilter.Reference = filterRange.RangeAddress.ToString(); - - foreach (var kp in xlAutoFilter.Filters) - { - var filterColumn = new FilterColumn { ColumnId = (UInt32)kp.Key - 1 }; - var xlFilterColumn = xlAutoFilter.Column(kp.Key); - var filterType = xlFilterColumn.FilterType; - if (filterType == XLFilterType.Custom) - { - var customFilters = new CustomFilters(); - foreach (var filter in kp.Value) - { - var customFilter = new CustomFilter { Val = filter.Value.ToString() }; - - if (filter.Operator != XLFilterOperator.Equal) - customFilter.Operator = filter.Operator.ToOpenXml(); - - if (filter.Connector == XLConnector.And) - customFilters.And = true; - - customFilters.Append(customFilter); - } - filterColumn.Append(customFilters); - } - else if (filterType == XLFilterType.TopBottom) - { - var top101 = new Top10 { Val = (double)xlFilterColumn.TopBottomValue }; - if (xlFilterColumn.TopBottomType == XLTopBottomType.Percent) - top101.Percent = true; - if (xlFilterColumn.TopBottomPart == XLTopBottomPart.Bottom) - top101.Top = false; - - filterColumn.Append(top101); - } - else if (filterType == XLFilterType.Dynamic) - { - var dynamicFilter = new DynamicFilter - { Type = xlFilterColumn.DynamicType.ToOpenXml(), Val = xlFilterColumn.DynamicValue }; - filterColumn.Append(dynamicFilter); - } - else - { - var filters = new Filters(); - foreach (var filter in kp.Value) - { - filters.Append(new Filter { Val = filter.Value.ToString() }); - } - - filterColumn.Append(filters); - } - autoFilter.Append(filterColumn); - } - - - if (xlAutoFilter.Sorted) - { - var sortState = new SortState - { - Reference = - filterRange.Range(filterRange.FirstCell().CellBelow(), filterRange.LastCell()).RangeAddress. - ToString() - }; - var sortCondition = new SortCondition - { - Reference = - filterRange.Range(1, xlAutoFilter.SortColumn, filterRange.RowCount(), - xlAutoFilter.SortColumn).RangeAddress.ToString() - }; - if (xlAutoFilter.SortOrder == XLSortOrder.Descending) - sortCondition.Descending = true; - - sortState.Append(sortCondition); - autoFilter.Append(sortState); - } - } - - private static BooleanValue GetBooleanValue(bool value, bool defaultValue) - { - return value == defaultValue ? null : new BooleanValue(value); - } - - private static void CollapseColumns(Columns columns, Dictionary sheetColumns) - { - UInt32 lastMin = 1; - var count = sheetColumns.Count; - var arr = sheetColumns.OrderBy(kp => kp.Key).ToArray(); - // sheetColumns[kp.Key + 1] - //Int32 i = 0; - //foreach (KeyValuePair kp in arr - // //.Where(kp => !(kp.Key < count && ColumnsAreEqual(kp.Value, ))) - // ) - for (var i = 0; i < count; i++) - { - var kp = arr[i]; - if (i + 1 != count && ColumnsAreEqual(kp.Value, arr[i + 1].Value)) continue; - - var newColumn = (Column)kp.Value.CloneNode(true); - newColumn.Min = lastMin; - var newColumnMax = newColumn.Max.Value; - var columnsToRemove = - columns.Elements().Where(co => co.Min >= lastMin && co.Max <= newColumnMax). - Select(co => co).ToList(); - columnsToRemove.ForEach(c => columns.RemoveChild(c)); - - columns.AppendChild(newColumn); - lastMin = kp.Key + 1; - //i++; - } - } - - private static double GetColumnWidth(double columnWidth) - { - return Math.Min(255.0, Math.Max(0.0, columnWidth + ColumnWidthOffset)); - } - - private static void UpdateColumn(Column column, Columns columns, Dictionary sheetColumnsByMin) - { - var co = column.Min.Value; - Column newColumn; - if (!sheetColumnsByMin.ContainsKey(co)) - { - newColumn = (Column)column.CloneNode(true); - columns.AppendChild(newColumn); - sheetColumnsByMin.Add(co, newColumn); - } - else - { - var existingColumn = sheetColumnsByMin[column.Min.Value]; - newColumn = (Column)existingColumn.CloneNode(true); - newColumn.Min = column.Min; - newColumn.Max = column.Max; - newColumn.Style = column.Style; - newColumn.Width = column.Width.SaveRound(); - newColumn.CustomWidth = column.CustomWidth; - - if (column.Hidden != null) - newColumn.Hidden = true; - else - newColumn.Hidden = null; - - if (column.Collapsed != null) - newColumn.Collapsed = true; - else - newColumn.Collapsed = null; - - if (column.OutlineLevel != null && column.OutlineLevel > 0) - newColumn.OutlineLevel = (byte)column.OutlineLevel; - else - newColumn.OutlineLevel = null; - - sheetColumnsByMin.Remove(column.Min.Value); - if (existingColumn.Min + 1 > existingColumn.Max) - { - //existingColumn.Min = existingColumn.Min + 1; - //columns.InsertBefore(existingColumn, newColumn); - //existingColumn.Remove(); - columns.RemoveChild(existingColumn); - columns.AppendChild(newColumn); - sheetColumnsByMin.Add(newColumn.Min.Value, newColumn); - } - else - { - //columns.InsertBefore(existingColumn, newColumn); - columns.AppendChild(newColumn); - sheetColumnsByMin.Add(newColumn.Min.Value, newColumn); - existingColumn.Min = existingColumn.Min + 1; - sheetColumnsByMin.Add(existingColumn.Min.Value, existingColumn); - } - } - } - - private static bool ColumnsAreEqual(Column left, Column right) - { - return - ((left.Style == null && right.Style == null) - || (left.Style != null && right.Style != null && left.Style.Value == right.Style.Value)) - && ((left.Width == null && right.Width == null) - || (left.Width != null && right.Width != null && left.Width.Value == right.Width.Value)) - && ((left.Hidden == null && right.Hidden == null) - || (left.Hidden != null && right.Hidden != null && left.Hidden.Value == right.Hidden.Value)) - && ((left.Collapsed == null && right.Collapsed == null) - || - (left.Collapsed != null && right.Collapsed != null && left.Collapsed.Value == right.Collapsed.Value)) - && ((left.OutlineLevel == null && right.OutlineLevel == null) - || - (left.OutlineLevel != null && right.OutlineLevel != null && - left.OutlineLevel.Value == right.OutlineLevel.Value)); - } - - #endregion - } -} +using ClosedXML.Extensions; +using ClosedXML.Utils; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.CustomProperties; +using DocumentFormat.OpenXml.Drawing; +using DocumentFormat.OpenXml.ExtendedProperties; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using DocumentFormat.OpenXml.Validation; +using DocumentFormat.OpenXml.VariantTypes; +using DocumentFormat.OpenXml.Vml.Office; +using DocumentFormat.OpenXml.Vml.Spreadsheet; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Xml; +using System.Xml.Linq; +using Anchor = DocumentFormat.OpenXml.Vml.Spreadsheet.Anchor; +using BackgroundColor = DocumentFormat.OpenXml.Spreadsheet.BackgroundColor; +using BottomBorder = DocumentFormat.OpenXml.Spreadsheet.BottomBorder; +using Break = DocumentFormat.OpenXml.Spreadsheet.Break; +using Field = DocumentFormat.OpenXml.Spreadsheet.Field; +using Fill = DocumentFormat.OpenXml.Spreadsheet.Fill; +using Fonts = DocumentFormat.OpenXml.Spreadsheet.Fonts; +using FontScheme = DocumentFormat.OpenXml.Drawing.FontScheme; +using ForegroundColor = DocumentFormat.OpenXml.Spreadsheet.ForegroundColor; +using GradientFill = DocumentFormat.OpenXml.Drawing.GradientFill; +using GradientStop = DocumentFormat.OpenXml.Drawing.GradientStop; +using Hyperlink = DocumentFormat.OpenXml.Spreadsheet.Hyperlink; +using LeftBorder = DocumentFormat.OpenXml.Spreadsheet.LeftBorder; +using Outline = DocumentFormat.OpenXml.Drawing.Outline; +using Path = System.IO.Path; +using PatternFill = DocumentFormat.OpenXml.Spreadsheet.PatternFill; +using Properties = DocumentFormat.OpenXml.ExtendedProperties.Properties; +using RightBorder = DocumentFormat.OpenXml.Spreadsheet.RightBorder; +using Run = DocumentFormat.OpenXml.Spreadsheet.Run; +using RunProperties = DocumentFormat.OpenXml.Spreadsheet.RunProperties; +using Table = DocumentFormat.OpenXml.Spreadsheet.Table; +using Text = DocumentFormat.OpenXml.Spreadsheet.Text; +using TopBorder = DocumentFormat.OpenXml.Spreadsheet.TopBorder; +using Underline = DocumentFormat.OpenXml.Spreadsheet.Underline; +using VerticalTextAlignment = DocumentFormat.OpenXml.Spreadsheet.VerticalTextAlignment; +using Vml = DocumentFormat.OpenXml.Vml; +using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet; + +namespace ClosedXML.Excel +{ + public partial class XLWorkbook + { + private const Double ColumnWidthOffset = 0.710625; + + //private Dictionary sharedStrings; + //private Dictionary context.SharedStyles; + + private static readonly EnumValue CvSharedString = new EnumValue(CellValues.SharedString); + private static readonly EnumValue CvInlineString = new EnumValue(CellValues.InlineString); + private static readonly EnumValue CvNumber = new EnumValue(CellValues.Number); + private static readonly EnumValue CvDate = new EnumValue(CellValues.Date); + private static readonly EnumValue CvBoolean = new EnumValue(CellValues.Boolean); + + private static EnumValue GetCellValue(XLCell xlCell) + { + switch (xlCell.DataType) + { + case XLCellValues.Text: + { + return xlCell.ShareString ? CvSharedString : CvInlineString; + } + case XLCellValues.Number: + return CvNumber; + + case XLCellValues.DateTime: + return CvDate; + + case XLCellValues.Boolean: + return CvBoolean; + + case XLCellValues.TimeSpan: + return CvNumber; + + default: + throw new NotImplementedException(); + } + } + + private bool Validate(SpreadsheetDocument package) + { + var backupCulture = Thread.CurrentThread.CurrentCulture; + + IEnumerable errors; + try + { + Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; + var validator = new OpenXmlValidator(); + errors = validator.Validate(package); + } + finally + { + Thread.CurrentThread.CurrentCulture = backupCulture; + } + + if (errors.Any()) + { + var message = string.Join("\r\n", errors.Select(e => string.Format("{0} in {1}", e.Description, e.Path.XPath)).ToArray()); + throw new ApplicationException(message); + } + return true; + } + + private void CreatePackage(String filePath, SpreadsheetDocumentType spreadsheetDocumentType, bool validate) + { + PathHelper.CreateDirectory(Path.GetDirectoryName(filePath)); + var package = File.Exists(filePath) + ? SpreadsheetDocument.Open(filePath, true) + : SpreadsheetDocument.Create(filePath, spreadsheetDocumentType); + + using (package) + { + CreateParts(package); + if (validate) Validate(package); + } + } + + private void CreatePackage(Stream stream, bool newStream, SpreadsheetDocumentType spreadsheetDocumentType, bool validate) + { + var package = newStream + ? SpreadsheetDocument.Create(stream, spreadsheetDocumentType) + : SpreadsheetDocument.Open(stream, true); + + using (package) + { + CreateParts(package); + if (validate) Validate(package); + } + } + + // http://blogs.msdn.com/b/vsod/archive/2010/02/05/how-to-delete-a-worksheet-from-excel-using-open-xml-sdk-2-0.aspx + private void DeleteSheetAndDependencies(WorkbookPart wbPart, string sheetId) + { + //Get the SheetToDelete from workbook.xml + Sheet worksheet = wbPart.Workbook.Descendants().Where(s => s.Id == sheetId).FirstOrDefault(); + if (worksheet == null) + { } + + string sheetName = worksheet.Name; + // Get the pivot Table Parts + IEnumerable pvtTableCacheParts = wbPart.PivotTableCacheDefinitionParts; + Dictionary pvtTableCacheDefinationPart = new Dictionary(); + foreach (PivotTableCacheDefinitionPart Item in pvtTableCacheParts) + { + PivotCacheDefinition pvtCacheDef = Item.PivotCacheDefinition; + //Check if this CacheSource is linked to SheetToDelete + var pvtCahce = pvtCacheDef.Descendants().Where(s => s.WorksheetSource.Sheet == sheetName); + if (pvtCahce.Count() > 0) + { + pvtTableCacheDefinationPart.Add(Item, Item.ToString()); + } + } + foreach (var Item in pvtTableCacheDefinationPart) + { + wbPart.DeletePart(Item.Key); + } + + // Remove the sheet reference from the workbook. + WorksheetPart worksheetPart = (WorksheetPart)(wbPart.GetPartById(sheetId)); + worksheet.Remove(); + + // Delete the worksheet part. + wbPart.DeletePart(worksheetPart); + + //Get the DefinedNames + var definedNames = wbPart.Workbook.Descendants().FirstOrDefault(); + if (definedNames != null) + { + List defNamesToDelete = new List(); + + foreach (DefinedName Item in definedNames) + { + // This condition checks to delete only those names which are part of Sheet in question + if (Item.Text.Contains(worksheet.Name + "!")) + defNamesToDelete.Add(Item); + } + + foreach (DefinedName Item in defNamesToDelete) + { + Item.Remove(); + } + } + // Get the CalculationChainPart + //Note: An instance of this part type contains an ordered set of references to all cells in all worksheets in the + //workbook whose value is calculated from any formula + + CalculationChainPart calChainPart; + calChainPart = wbPart.CalculationChainPart; + if (calChainPart != null) + { + var calChainEntries = calChainPart.CalculationChain.Descendants().Where(c => c.SheetId == sheetId); + List calcsToDelete = new List(); + foreach (CalculationCell Item in calChainEntries) + { + calcsToDelete.Add(Item); + } + + foreach (CalculationCell Item in calcsToDelete) + { + Item.Remove(); + } + + if (calChainPart.CalculationChain.Count() == 0) + { + wbPart.DeletePart(calChainPart); + } + } + } + + // Adds child parts and generates content of the specified part. + private void CreateParts(SpreadsheetDocument document) + { + var context = new SaveContext(); + + var workbookPart = document.WorkbookPart ?? document.AddWorkbookPart(); + + var worksheets = WorksheetsInternal; + + var partsToRemove = workbookPart.Parts.Where(s => worksheets.Deleted.Contains(s.RelationshipId)).ToList(); + + var pivotCacheDefinitionsToRemove = partsToRemove.SelectMany(s => ((WorksheetPart)s.OpenXmlPart).PivotTableParts.Select(pt => pt.PivotTableCacheDefinitionPart)).Distinct().ToList(); + pivotCacheDefinitionsToRemove.ForEach(c => workbookPart.DeletePart(c)); + + if (workbookPart.Workbook != null && workbookPart.Workbook.PivotCaches != null) + { + var pivotCachesToRemove = workbookPart.Workbook.PivotCaches.Where(pc => pivotCacheDefinitionsToRemove.Select(pcd => workbookPart.GetIdOfPart(pcd)).ToList().Contains(((PivotCache)pc).Id)).Distinct().ToList(); + pivotCachesToRemove.ForEach(c => workbookPart.Workbook.PivotCaches.RemoveChild(c)); + } + + worksheets.Deleted.ToList().ForEach(ws => DeleteSheetAndDependencies(workbookPart, ws)); + + // Ensure all RelId's have been added to the context + context.RelIdGenerator.AddValues(workbookPart.Parts.Select(p => p.RelationshipId), RelType.Workbook); + context.RelIdGenerator.AddValues(WorksheetsInternal.Cast().Where(ws => !XLHelper.IsNullOrWhiteSpace(ws.RelId)).Select(ws => ws.RelId), RelType.Workbook); + context.RelIdGenerator.AddValues(WorksheetsInternal.Cast().Where(ws => !XLHelper.IsNullOrWhiteSpace(ws.LegacyDrawingId)).Select(ws => ws.LegacyDrawingId), RelType.Workbook); + context.RelIdGenerator.AddValues(WorksheetsInternal + .Cast() + .SelectMany(ws => ws.Tables.Cast()) + .Where(t => !XLHelper.IsNullOrWhiteSpace(t.RelId)) + .Select(t => t.RelId), RelType.Workbook); + + var extendedFilePropertiesPart = document.ExtendedFilePropertiesPart ?? + document.AddNewPart( + context.RelIdGenerator.GetNext(RelType.Workbook)); + + GenerateExtendedFilePropertiesPartContent(extendedFilePropertiesPart); + + GenerateWorkbookPartContent(workbookPart, context); + + var sharedStringTablePart = workbookPart.SharedStringTablePart ?? + workbookPart.AddNewPart( + context.RelIdGenerator.GetNext(RelType.Workbook)); + + GenerateSharedStringTablePartContent(sharedStringTablePart, context); + + var workbookStylesPart = workbookPart.WorkbookStylesPart ?? + workbookPart.AddNewPart( + context.RelIdGenerator.GetNext(RelType.Workbook)); + + GenerateWorkbookStylesPartContent(workbookStylesPart, context); + + foreach (var worksheet in WorksheetsInternal.Cast().OrderBy(w => w.Position)) + { + //context.RelIdGenerator.Reset(RelType.); + WorksheetPart worksheetPart; + var wsRelId = worksheet.RelId; + if (workbookPart.Parts.Any(p => p.RelationshipId == wsRelId)) + { + worksheetPart = (WorksheetPart)workbookPart.GetPartById(wsRelId); + var wsPartsToRemove = worksheetPart.TableDefinitionParts.ToList(); + wsPartsToRemove.ForEach(tdp => worksheetPart.DeletePart(tdp)); + } + else + worksheetPart = workbookPart.AddNewPart(wsRelId); + + context.RelIdGenerator.AddValues(worksheetPart.HyperlinkRelationships.Select(hr => hr.Id), RelType.Workbook); + context.RelIdGenerator.AddValues(worksheetPart.Parts.Select(p => p.RelationshipId), RelType.Workbook); + if (worksheetPart.DrawingsPart != null) + context.RelIdGenerator.AddValues(worksheetPart.DrawingsPart.Parts.Select(p => p.RelationshipId), RelType.Workbook); + + // delete comment related parts (todo: review) + DeleteComments(worksheetPart, worksheet, context); + + if (worksheet.Internals.CellsCollection.GetCells(c => c.HasComment).Any()) + { + var id = context.RelIdGenerator.GetNext(RelType.Workbook); + var worksheetCommentsPart = + worksheetPart.AddNewPart(id); + + GenerateWorksheetCommentsPartContent(worksheetCommentsPart, worksheet); + + //VmlDrawingPart vmlDrawingPart = worksheetPart.AddNewPart(worksheet.LegacyDrawingId); + var vmlDrawingPart = worksheetPart.VmlDrawingParts.FirstOrDefault(); + if (vmlDrawingPart == null) + { + if (XLHelper.IsNullOrWhiteSpace(worksheet.LegacyDrawingId)) + { + worksheet.LegacyDrawingId = context.RelIdGenerator.GetNext(RelType.Workbook); + worksheet.LegacyDrawingIsNew = true; + } + + vmlDrawingPart = worksheetPart.AddNewPart(worksheet.LegacyDrawingId); + } + GenerateVmlDrawingPartContent(vmlDrawingPart, worksheet, context); + } + + GenerateWorksheetPartContent(worksheetPart, worksheet, context); + + if (worksheet.PivotTables.Any()) + { + GeneratePivotTables(workbookPart, worksheetPart, worksheet, context); + } + + // Remove any orphaned references - maybe more types? + foreach (var orphan in worksheetPart.Worksheet.OfType().Where(lg => !worksheetPart.Parts.Any(p => p.RelationshipId == lg.Id))) + worksheetPart.Worksheet.RemoveChild(orphan); + + foreach (var orphan in worksheetPart.Worksheet.OfType().Where(d => !worksheetPart.Parts.Any(p => p.RelationshipId == d.Id))) + worksheetPart.Worksheet.RemoveChild(orphan); + } + + // Remove empty pivot cache part + if (workbookPart.Workbook.PivotCaches != null && !workbookPart.Workbook.PivotCaches.Any()) + workbookPart.Workbook.RemoveChild(workbookPart.Workbook.PivotCaches); + + GenerateCalculationChainPartContent(workbookPart, context); + + if (workbookPart.ThemePart == null) + { + var themePart = workbookPart.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); + GenerateThemePartContent(themePart); + } + + if (CustomProperties.Any()) + { + document.GetPartsOfType().ToList().ForEach(p => document.DeletePart(p)); + var customFilePropertiesPart = + document.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); + + GenerateCustomFilePropertiesPartContent(customFilePropertiesPart); + } + SetPackageProperties(document); + } + + private void DeleteComments(WorksheetPart worksheetPart, XLWorksheet worksheet, SaveContext context) + { + // We have the comments so we can delete the comments part + worksheetPart.DeletePart(worksheetPart.WorksheetCommentsPart); + var vmlDrawingPart = worksheetPart.VmlDrawingParts.FirstOrDefault(); + + // Only delete the VmlDrawingParts for comments. + if (vmlDrawingPart != null) + { + var xdoc = XDocumentExtensions.Load(vmlDrawingPart.GetStream(FileMode.Open)); + //xdoc.Root.Elements().Where(e => e.Name.LocalName == "shapelayout").Remove(); + xdoc.Root.Elements().Where( + e => e.Name.LocalName == "shapetype" && (string)e.Attribute("id") == @"_x0000_t202").Remove(); + xdoc.Root.Elements().Where( + e => e.Name.LocalName == "shape" && (string)e.Attribute("type") == @"#_x0000_t202").Remove(); + var imageParts = vmlDrawingPart.ImageParts.ToList(); + var legacyParts = vmlDrawingPart.LegacyDiagramTextParts.ToList(); + var rId = worksheetPart.GetIdOfPart(vmlDrawingPart); + worksheet.LegacyDrawingId = rId; + worksheetPart.ChangeIdOfPart(vmlDrawingPart, "xxRRxx"); // Anything will do for the new relationship id + // we just want it alive enough to create the copy + + var hasShapes = xdoc.Root.Elements().Any(e => e.Name.LocalName == "shape" || e.Name.LocalName == "group"); + + VmlDrawingPart vmlDrawingPartNew = null; + var hasNewPart = (imageParts.Count > 0 || legacyParts.Count > 0 || hasShapes); + if (hasNewPart) + { + vmlDrawingPartNew = worksheetPart.AddNewPart(rId); + + using (var writer = new XmlTextWriter(vmlDrawingPartNew.GetStream(FileMode.Create), Encoding.UTF8)) + { + writer.WriteRaw(xdoc.ToString()); + } + + imageParts.ForEach(p => vmlDrawingPartNew.AddPart(p, vmlDrawingPart.GetIdOfPart(p))); + legacyParts.ForEach(p => vmlDrawingPartNew.AddPart(p, vmlDrawingPart.GetIdOfPart(p))); + } + + worksheetPart.DeletePart(vmlDrawingPart); + + if (hasNewPart && rId != worksheetPart.GetIdOfPart(vmlDrawingPartNew)) + worksheetPart.ChangeIdOfPart(vmlDrawingPartNew, rId); + } + } + + private static void GenerateTables(XLWorksheet worksheet, WorksheetPart worksheetPart, SaveContext context) + { + worksheetPart.Worksheet.RemoveAllChildren(); + + if (!worksheet.Tables.Any()) return; + + foreach (var table in worksheet.Tables) + { + var tableRelId = context.RelIdGenerator.GetNext(RelType.Workbook); + + var xlTable = (XLTable)table; + xlTable.RelId = tableRelId; + + var tableDefinitionPart = worksheetPart.AddNewPart(tableRelId); + GenerateTableDefinitionPartContent(tableDefinitionPart, xlTable, context); + } + } + + private void GenerateExtendedFilePropertiesPartContent(ExtendedFilePropertiesPart extendedFilePropertiesPart) + { + if (extendedFilePropertiesPart.Properties == null) + extendedFilePropertiesPart.Properties = new Properties(); + + var properties = extendedFilePropertiesPart.Properties; + if ( + !properties.NamespaceDeclarations.Contains(new KeyValuePair("vt", + "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"))) + { + properties.AddNamespaceDeclaration("vt", + "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); + } + + if (properties.Application == null) + properties.AppendChild(new Application { Text = "Microsoft Excel" }); + + if (properties.DocumentSecurity == null) + properties.AppendChild(new DocumentSecurity { Text = "0" }); + + if (properties.ScaleCrop == null) + properties.AppendChild(new ScaleCrop { Text = "false" }); + + if (properties.HeadingPairs == null) + properties.HeadingPairs = new HeadingPairs(); + + if (properties.TitlesOfParts == null) + properties.TitlesOfParts = new TitlesOfParts(); + + properties.HeadingPairs.VTVector = new VTVector { BaseType = VectorBaseValues.Variant }; + + properties.TitlesOfParts.VTVector = new VTVector { BaseType = VectorBaseValues.Lpstr }; + + var vTVectorOne = properties.HeadingPairs.VTVector; + + var vTVectorTwo = properties.TitlesOfParts.VTVector; + + var modifiedWorksheets = + ((IEnumerable)WorksheetsInternal).Select(w => new { w.Name, Order = w.Position }).ToList(); + var modifiedNamedRanges = GetModifiedNamedRanges(); + var modifiedWorksheetsCount = modifiedWorksheets.Count; + var modifiedNamedRangesCount = modifiedNamedRanges.Count; + + InsertOnVtVector(vTVectorOne, "Worksheets", 0, modifiedWorksheetsCount.ToString()); + InsertOnVtVector(vTVectorOne, "Named Ranges", 2, modifiedNamedRangesCount.ToString()); + + vTVectorTwo.Size = (UInt32)(modifiedNamedRangesCount + modifiedWorksheetsCount); + + foreach ( + var vTlpstr3 in modifiedWorksheets.OrderBy(w => w.Order).Select(w => new VTLPSTR { Text = w.Name })) + vTVectorTwo.AppendChild(vTlpstr3); + + foreach (var vTlpstr7 in modifiedNamedRanges.Select(nr => new VTLPSTR { Text = nr })) + vTVectorTwo.AppendChild(vTlpstr7); + + if (Properties.Manager != null) + { + if (!XLHelper.IsNullOrWhiteSpace(Properties.Manager)) + { + if (properties.Manager == null) + properties.Manager = new Manager(); + + properties.Manager.Text = Properties.Manager; + } + else + properties.Manager = null; + } + + if (Properties.Company == null) return; + + if (!XLHelper.IsNullOrWhiteSpace(Properties.Company)) + { + if (properties.Company == null) + properties.Company = new Company(); + + properties.Company.Text = Properties.Company; + } + else + properties.Company = null; + } + + private static void InsertOnVtVector(VTVector vTVector, String property, Int32 index, String text) + { + var m = from e1 in vTVector.Elements() + where e1.Elements().Any(e2 => e2.Text == property) + select e1; + if (!m.Any()) + { + if (vTVector.Size == null) + vTVector.Size = new UInt32Value(0U); + + vTVector.Size += 2U; + var variant1 = new Variant(); + var vTlpstr1 = new VTLPSTR { Text = property }; + variant1.AppendChild(vTlpstr1); + vTVector.InsertAt(variant1, index); + + var variant2 = new Variant(); + var vTInt321 = new VTInt32(); + variant2.AppendChild(vTInt321); + vTVector.InsertAt(variant2, index + 1); + } + + var targetIndex = 0; + foreach (var e in vTVector.Elements()) + { + if (e.Elements().Any(e2 => e2.Text == property)) + { + vTVector.ElementAt(targetIndex + 1).GetFirstChild().Text = text; + break; + } + targetIndex++; + } + } + + private List GetModifiedNamedRanges() + { + var namedRanges = new List(); + foreach (var w in WorksheetsInternal) + { + var wName = w.Name; + namedRanges.AddRange(w.NamedRanges.Select(n => wName + "!" + n.Name)); + namedRanges.Add(w.Name + "!Print_Area"); + namedRanges.Add(w.Name + "!Print_Titles"); + } + namedRanges.AddRange(NamedRanges.Select(n => n.Name)); + return namedRanges; + } + + private void GenerateWorkbookPartContent(WorkbookPart workbookPart, SaveContext context) + { + if (workbookPart.Workbook == null) + workbookPart.Workbook = new Workbook(); + + var workbook = workbookPart.Workbook; + if ( + !workbook.NamespaceDeclarations.Contains(new KeyValuePair("r", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships"))) + { + workbook.AddNamespaceDeclaration("r", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + } + + #region WorkbookProperties + + if (workbook.WorkbookProperties == null) + workbook.WorkbookProperties = new WorkbookProperties(); + + if (workbook.WorkbookProperties.CodeName == null) + workbook.WorkbookProperties.CodeName = "ThisWorkbook"; + + if (Use1904DateSystem) + workbook.WorkbookProperties.Date1904 = true; + + #endregion WorkbookProperties + + if (LockStructure || LockWindows) + { + if (workbook.WorkbookProtection == null) + workbook.WorkbookProtection = new WorkbookProtection(); + + workbook.WorkbookProtection.LockStructure = LockStructure; + workbook.WorkbookProtection.LockWindows = LockWindows; + } + else + { + workbook.WorkbookProtection = null; + } + + if (workbook.BookViews == null) + workbook.BookViews = new BookViews(); + + if (workbook.Sheets == null) + workbook.Sheets = new Sheets(); + + var worksheets = WorksheetsInternal; + workbook.Sheets.Elements().Where(s => worksheets.Deleted.Contains(s.Id)).ToList().ForEach( + s => s.Remove()); + + foreach (var sheet in workbook.Sheets.Elements()) + { + var sheetId = (Int32)sheet.SheetId.Value; + + if (WorksheetsInternal.All(w => w.SheetId != sheetId)) continue; + + var wks = WorksheetsInternal.Single(w => w.SheetId == sheetId); + wks.RelId = sheet.Id; + sheet.Name = wks.Name; + } + + foreach (var xlSheet in WorksheetsInternal.Cast().OrderBy(w => w.Position)) + { + string rId; + if (xlSheet.SheetId == 0 && XLHelper.IsNullOrWhiteSpace(xlSheet.RelId)) + { + rId = context.RelIdGenerator.GetNext(RelType.Workbook); + + while (WorksheetsInternal.Cast().Any(w => w.SheetId == Int32.Parse(rId.Substring(3)))) + rId = context.RelIdGenerator.GetNext(RelType.Workbook); + + xlSheet.SheetId = Int32.Parse(rId.Substring(3)); + xlSheet.RelId = rId; + } + else + { + if (XLHelper.IsNullOrWhiteSpace(xlSheet.RelId)) + { + rId = String.Format("rId{0}", xlSheet.SheetId); + context.RelIdGenerator.AddValues(new List { rId }, RelType.Workbook); + } + else + rId = xlSheet.RelId; + } + + if (!workbook.Sheets.Cast().Any(s => s.Id == rId)) + { + var newSheet = new Sheet + { + Name = xlSheet.Name, + Id = rId, + SheetId = (UInt32)xlSheet.SheetId + }; + + workbook.Sheets.AppendChild(newSheet); + } + } + + var sheetElements = from sheet in workbook.Sheets.Elements() + join worksheet in ((IEnumerable)WorksheetsInternal) on sheet.Id.Value + equals worksheet.RelId + orderby worksheet.Position + select sheet; + + UInt32 firstSheetVisible = 0; + var activeTab = + (from us in UnsupportedSheets where us.IsActive select (UInt32)us.Position - 1).FirstOrDefault(); + var foundVisible = false; + + var totalSheets = sheetElements.Count() + UnsupportedSheets.Count; + for (var p = 1; p <= totalSheets; p++) + { + if (UnsupportedSheets.All(us => us.Position != p)) + { + var sheet = sheetElements.ElementAt(p - UnsupportedSheets.Count(us => us.Position <= p) - 1); + workbook.Sheets.RemoveChild(sheet); + workbook.Sheets.AppendChild(sheet); + var xlSheet = Worksheet(sheet.Name); + if (xlSheet.Visibility != XLWorksheetVisibility.Visible) + sheet.State = xlSheet.Visibility.ToOpenXml(); + + if (foundVisible) continue; + + if (sheet.State == null || sheet.State == SheetStateValues.Visible) + foundVisible = true; + else + firstSheetVisible++; + } + else + { + var sheetId = UnsupportedSheets.First(us => us.Position == p).SheetId; + var sheet = workbook.Sheets.Elements().First(s => s.SheetId == sheetId); + workbook.Sheets.RemoveChild(sheet); + workbook.Sheets.AppendChild(sheet); + } + } + + var workbookView = workbook.BookViews.Elements().FirstOrDefault(); + + if (activeTab == 0) + { + activeTab = firstSheetVisible; + foreach (var ws in worksheets) + { + if (!ws.TabActive) continue; + + activeTab = (UInt32)(ws.Position - 1); + break; + } + } + + if (workbookView == null) + { + workbookView = new WorkbookView { ActiveTab = activeTab, FirstSheet = firstSheetVisible }; + workbook.BookViews.AppendChild(workbookView); + } + else + { + workbookView.ActiveTab = activeTab; + workbookView.FirstSheet = firstSheetVisible; + } + + var definedNames = new DefinedNames(); + foreach (var worksheet in WorksheetsInternal) + { + var wsSheetId = (UInt32)worksheet.SheetId; + UInt32 sheetId = 0; + foreach (var s in workbook.Sheets.Elements().TakeWhile(s => s.SheetId != wsSheetId)) + { + sheetId++; + } + + if (worksheet.PageSetup.PrintAreas.Any()) + { + var definedName = new DefinedName { Name = "_xlnm.Print_Area", LocalSheetId = sheetId }; + var worksheetName = worksheet.Name; + var definedNameText = worksheet.PageSetup.PrintAreas.Aggregate(String.Empty, + (current, printArea) => + current + + ("'" + worksheetName + "'!" + + printArea.RangeAddress. + FirstAddress.ToStringFixed( + XLReferenceStyle.A1) + + ":" + + printArea.RangeAddress. + LastAddress.ToStringFixed( + XLReferenceStyle.A1) + + ",")); + definedName.Text = definedNameText.Substring(0, definedNameText.Length - 1); + definedNames.AppendChild(definedName); + } + + if (worksheet.AutoFilter.Enabled) + { + var definedName = new DefinedName + { + Name = "_xlnm._FilterDatabase", + LocalSheetId = sheetId, + Text = "'" + worksheet.Name + "'!" + + worksheet.AutoFilter.Range.RangeAddress.FirstAddress.ToStringFixed( + XLReferenceStyle.A1) + + ":" + + worksheet.AutoFilter.Range.RangeAddress.LastAddress.ToStringFixed( + XLReferenceStyle.A1), + Hidden = BooleanValue.FromBoolean(true) + }; + definedNames.AppendChild(definedName); + } + + foreach (var nr in worksheet.NamedRanges.Where(n => n.Name != "_xlnm._FilterDatabase")) + { + var definedName = new DefinedName + { + Name = nr.Name, + LocalSheetId = sheetId, + Text = nr.ToString() + }; + + if (!nr.Visible) + definedName.Hidden = BooleanValue.FromBoolean(true); + + if (!XLHelper.IsNullOrWhiteSpace(nr.Comment)) + definedName.Comment = nr.Comment; + definedNames.AppendChild(definedName); + } + + var definedNameTextRow = String.Empty; + var definedNameTextColumn = String.Empty; + if (worksheet.PageSetup.FirstRowToRepeatAtTop > 0) + { + definedNameTextRow = "'" + worksheet.Name + "'!" + worksheet.PageSetup.FirstRowToRepeatAtTop + + ":" + worksheet.PageSetup.LastRowToRepeatAtTop; + } + if (worksheet.PageSetup.FirstColumnToRepeatAtLeft > 0) + { + var minColumn = worksheet.PageSetup.FirstColumnToRepeatAtLeft; + var maxColumn = worksheet.PageSetup.LastColumnToRepeatAtLeft; + definedNameTextColumn = "'" + worksheet.Name + "'!" + + XLHelper.GetColumnLetterFromNumber(minColumn) + + ":" + XLHelper.GetColumnLetterFromNumber(maxColumn); + } + + string titles; + if (definedNameTextColumn.Length > 0) + { + titles = definedNameTextColumn; + if (definedNameTextRow.Length > 0) + titles += "," + definedNameTextRow; + } + else + titles = definedNameTextRow; + + if (titles.Length <= 0) continue; + + var definedName2 = new DefinedName + { + Name = "_xlnm.Print_Titles", + LocalSheetId = sheetId, + Text = titles + }; + + definedNames.AppendChild(definedName2); + } + + foreach (var nr in NamedRanges) + { + var definedName = new DefinedName + { + Name = nr.Name, + Text = nr.ToString() + }; + + if (!nr.Visible) + definedName.Hidden = BooleanValue.FromBoolean(true); + + if (!XLHelper.IsNullOrWhiteSpace(nr.Comment)) + definedName.Comment = nr.Comment; + definedNames.AppendChild(definedName); + } + + workbook.DefinedNames = definedNames; + + if (workbook.CalculationProperties == null) + workbook.CalculationProperties = new CalculationProperties { CalculationId = 125725U }; + + if (CalculateMode == XLCalculateMode.Default) + workbook.CalculationProperties.CalculationMode = null; + else + workbook.CalculationProperties.CalculationMode = CalculateMode.ToOpenXml(); + + if (ReferenceStyle == XLReferenceStyle.Default) + workbook.CalculationProperties.ReferenceMode = null; + else + workbook.CalculationProperties.ReferenceMode = ReferenceStyle.ToOpenXml(); + + if (CalculationOnSave) workbook.CalculationProperties.CalculationOnSave = CalculationOnSave; + if (ForceFullCalculation) workbook.CalculationProperties.ForceFullCalculation = ForceFullCalculation; + if (FullCalculationOnLoad) workbook.CalculationProperties.FullCalculationOnLoad = FullCalculationOnLoad; + if (FullPrecision) workbook.CalculationProperties.FullPrecision = FullPrecision; + } + + private void GenerateSharedStringTablePartContent(SharedStringTablePart sharedStringTablePart, + SaveContext context) + { + // Call all table headers to make sure their names are filled + var x = 0; + Worksheets.ForEach(w => w.Tables.ForEach(t => x = (t as XLTable).FieldNames.Count)); + + sharedStringTablePart.SharedStringTable = new SharedStringTable { Count = 0, UniqueCount = 0 }; + + var stringId = 0; + + var newStrings = new Dictionary(); + var newRichStrings = new Dictionary(); + foreach ( + var c in + Worksheets.Cast().SelectMany( + w => + w.Internals.CellsCollection.GetCells( + c => ((c.DataType == XLCellValues.Text && c.ShareString) || c.HasRichText) + && (c as XLCell).InnerText.Length > 0 + && XLHelper.IsNullOrWhiteSpace(c.FormulaA1) + ))) + { + c.DataType = XLCellValues.Text; + if (c.HasRichText) + { + if (newRichStrings.ContainsKey(c.RichText)) + c.SharedStringId = newRichStrings[c.RichText]; + else + { + var sharedStringItem = new SharedStringItem(); + foreach (var rt in c.RichText.Where(r => !String.IsNullOrEmpty(r.Text))) + { + sharedStringItem.Append(GetRun(rt)); + } + + if (c.RichText.HasPhonetics) + { + foreach (var p in c.RichText.Phonetics) + { + var phoneticRun = new PhoneticRun + { + BaseTextStartIndex = (UInt32)p.Start, + EndingBaseIndex = (UInt32)p.End + }; + + var text = new Text { Text = p.Text }; + if (p.Text.PreserveSpaces()) + text.Space = SpaceProcessingModeValues.Preserve; + + phoneticRun.Append(text); + sharedStringItem.Append(phoneticRun); + } + var f = new XLFont(null, c.RichText.Phonetics); + if (!context.SharedFonts.ContainsKey(f)) + context.SharedFonts.Add(f, new FontInfo { Font = f }); + + var phoneticProperties = new PhoneticProperties + { + FontId = + context.SharedFonts[ + new XLFont(null, c.RichText.Phonetics)]. + FontId + }; + if (c.RichText.Phonetics.Alignment != XLPhoneticAlignment.Left) + phoneticProperties.Alignment = c.RichText.Phonetics.Alignment.ToOpenXml(); + if (c.RichText.Phonetics.Type != XLPhoneticType.FullWidthKatakana) + phoneticProperties.Type = c.RichText.Phonetics.Type.ToOpenXml(); + + sharedStringItem.Append(phoneticProperties); + } + + sharedStringTablePart.SharedStringTable.Append(sharedStringItem); + sharedStringTablePart.SharedStringTable.Count += 1; + sharedStringTablePart.SharedStringTable.UniqueCount += 1; + + newRichStrings.Add(c.RichText, stringId); + c.SharedStringId = stringId; + + stringId++; + } + } + else + { + if (newStrings.ContainsKey(c.Value.ToString())) + c.SharedStringId = newStrings[c.Value.ToString()]; + else + { + var s = c.Value.ToString(); + var sharedStringItem = new SharedStringItem(); + var text = new Text { Text = XmlEncoder.EncodeString(s) }; + if (!s.Trim().Equals(s)) + text.Space = SpaceProcessingModeValues.Preserve; + sharedStringItem.Append(text); + sharedStringTablePart.SharedStringTable.Append(sharedStringItem); + sharedStringTablePart.SharedStringTable.Count += 1; + sharedStringTablePart.SharedStringTable.UniqueCount += 1; + + newStrings.Add(c.Value.ToString(), stringId); + c.SharedStringId = stringId; + + stringId++; + } + } + } + } + + private static Run GetRun(IXLRichString rt) + { + var run = new Run(); + + var runProperties = new RunProperties(); + + var bold = rt.Bold ? new Bold() : null; + var italic = rt.Italic ? new Italic() : null; + var underline = rt.Underline != XLFontUnderlineValues.None + ? new Underline { Val = rt.Underline.ToOpenXml() } + : null; + var strike = rt.Strikethrough ? new Strike() : null; + var verticalAlignment = new VerticalTextAlignment + { Val = rt.VerticalAlignment.ToOpenXml() }; + var shadow = rt.Shadow ? new Shadow() : null; + var fontSize = new FontSize { Val = rt.FontSize }; + var color = GetNewColor(rt.FontColor); + var fontName = new RunFont { Val = rt.FontName }; + var fontFamilyNumbering = new FontFamily { Val = (Int32)rt.FontFamilyNumbering }; + + if (bold != null) runProperties.Append(bold); + if (italic != null) runProperties.Append(italic); + + if (strike != null) runProperties.Append(strike); + if (shadow != null) runProperties.Append(shadow); + if (underline != null) runProperties.Append(underline); + runProperties.Append(verticalAlignment); + + runProperties.Append(fontSize); + runProperties.Append(color); + runProperties.Append(fontName); + runProperties.Append(fontFamilyNumbering); + + var text = new Text { Text = rt.Text }; + if (rt.Text.PreserveSpaces()) + text.Space = SpaceProcessingModeValues.Preserve; + + run.Append(runProperties); + run.Append(text); + return run; + } + + private void GenerateCalculationChainPartContent(WorkbookPart workbookPart, SaveContext context) + { + var thisRelId = context.RelIdGenerator.GetNext(RelType.Workbook); + if (workbookPart.CalculationChainPart == null) + workbookPart.AddNewPart(thisRelId); + + if (workbookPart.CalculationChainPart.CalculationChain == null) + workbookPart.CalculationChainPart.CalculationChain = new CalculationChain(); + + var calculationChain = workbookPart.CalculationChainPart.CalculationChain; + calculationChain.RemoveAllChildren(); + + foreach (var worksheet in WorksheetsInternal) + { + var cellsWithoutFormulas = new HashSet(); + foreach (var c in worksheet.Internals.CellsCollection.GetCells()) + { + if (XLHelper.IsNullOrWhiteSpace(c.FormulaA1)) + cellsWithoutFormulas.Add(c.Address.ToStringRelative()); + else + { + if (c.FormulaA1.StartsWith("{")) + { + var cc = new CalculationCell + { + CellReference = c.Address.ToString(), + SheetId = worksheet.SheetId + }; + + if (c.FormulaReference == null) + c.FormulaReference = c.AsRange().RangeAddress; + if (c.FormulaReference.FirstAddress.Equals(c.Address)) + { + cc.Array = true; + calculationChain.AppendChild(cc); + calculationChain.AppendChild(new CalculationCell { CellReference = c.Address.ToString(), InChildChain = true }); + } + else + { + calculationChain.AppendChild(cc); + } + } + else + { + calculationChain.AppendChild(new CalculationCell + { + CellReference = c.Address.ToString(), + SheetId = worksheet.SheetId + }); + } + } + } + + //var cCellsToRemove = new List(); + var m = from cc in calculationChain.Elements() + where !(cc.SheetId != null || cc.InChildChain != null) + && calculationChain.Elements() + .Where(c1 => c1.SheetId != null) + .Select(c1 => c1.CellReference.Value) + .Contains(cc.CellReference.Value) + || cellsWithoutFormulas.Contains(cc.CellReference.Value) + select cc; + //m.ToList().ForEach(cc => cCellsToRemove.Add(cc)); + m.ToList().ForEach(cc => calculationChain.RemoveChild(cc)); + } + + if (!calculationChain.Any()) + workbookPart.DeletePart(workbookPart.CalculationChainPart); + } + + private void GenerateThemePartContent(ThemePart themePart) + { + var theme1 = new Theme { Name = "Office Theme" }; + theme1.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main"); + + var themeElements1 = new ThemeElements(); + + var colorScheme1 = new ColorScheme { Name = "Office" }; + + var dark1Color1 = new Dark1Color(); + var systemColor1 = new SystemColor + { + Val = SystemColorValues.WindowText, + LastColor = Theme.Text1.Color.ToHex().Substring(2) + }; + + dark1Color1.AppendChild(systemColor1); + + var light1Color1 = new Light1Color(); + var systemColor2 = new SystemColor + { + Val = SystemColorValues.Window, + LastColor = Theme.Background1.Color.ToHex().Substring(2) + }; + + light1Color1.AppendChild(systemColor2); + + var dark2Color1 = new Dark2Color(); + var rgbColorModelHex1 = new RgbColorModelHex { Val = Theme.Text2.Color.ToHex().Substring(2) }; + + dark2Color1.AppendChild(rgbColorModelHex1); + + var light2Color1 = new Light2Color(); + var rgbColorModelHex2 = new RgbColorModelHex { Val = Theme.Background2.Color.ToHex().Substring(2) }; + + light2Color1.AppendChild(rgbColorModelHex2); + + var accent1Color1 = new Accent1Color(); + var rgbColorModelHex3 = new RgbColorModelHex { Val = Theme.Accent1.Color.ToHex().Substring(2) }; + + accent1Color1.AppendChild(rgbColorModelHex3); + + var accent2Color1 = new Accent2Color(); + var rgbColorModelHex4 = new RgbColorModelHex { Val = Theme.Accent2.Color.ToHex().Substring(2) }; + + accent2Color1.AppendChild(rgbColorModelHex4); + + var accent3Color1 = new Accent3Color(); + var rgbColorModelHex5 = new RgbColorModelHex { Val = Theme.Accent3.Color.ToHex().Substring(2) }; + + accent3Color1.AppendChild(rgbColorModelHex5); + + var accent4Color1 = new Accent4Color(); + var rgbColorModelHex6 = new RgbColorModelHex { Val = Theme.Accent4.Color.ToHex().Substring(2) }; + + accent4Color1.AppendChild(rgbColorModelHex6); + + var accent5Color1 = new Accent5Color(); + var rgbColorModelHex7 = new RgbColorModelHex { Val = Theme.Accent5.Color.ToHex().Substring(2) }; + + accent5Color1.AppendChild(rgbColorModelHex7); + + var accent6Color1 = new Accent6Color(); + var rgbColorModelHex8 = new RgbColorModelHex { Val = Theme.Accent6.Color.ToHex().Substring(2) }; + + accent6Color1.AppendChild(rgbColorModelHex8); + + var hyperlink1 = new DocumentFormat.OpenXml.Drawing.Hyperlink(); + var rgbColorModelHex9 = new RgbColorModelHex { Val = Theme.Hyperlink.Color.ToHex().Substring(2) }; + + hyperlink1.AppendChild(rgbColorModelHex9); + + var followedHyperlinkColor1 = new FollowedHyperlinkColor(); + var rgbColorModelHex10 = new RgbColorModelHex { Val = Theme.FollowedHyperlink.Color.ToHex().Substring(2) }; + + followedHyperlinkColor1.AppendChild(rgbColorModelHex10); + + colorScheme1.AppendChild(dark1Color1); + colorScheme1.AppendChild(light1Color1); + colorScheme1.AppendChild(dark2Color1); + colorScheme1.AppendChild(light2Color1); + colorScheme1.AppendChild(accent1Color1); + colorScheme1.AppendChild(accent2Color1); + colorScheme1.AppendChild(accent3Color1); + colorScheme1.AppendChild(accent4Color1); + colorScheme1.AppendChild(accent5Color1); + colorScheme1.AppendChild(accent6Color1); + colorScheme1.AppendChild(hyperlink1); + colorScheme1.AppendChild(followedHyperlinkColor1); + + var fontScheme2 = new FontScheme { Name = "Office" }; + + var majorFont1 = new MajorFont(); + var latinFont1 = new LatinFont { Typeface = "Cambria" }; + var eastAsianFont1 = new EastAsianFont { Typeface = "" }; + var complexScriptFont1 = new ComplexScriptFont { Typeface = "" }; + var supplementalFont1 = new SupplementalFont { Script = "Jpan", Typeface = "MS Pゴシック" }; + var supplementalFont2 = new SupplementalFont { Script = "Hang", Typeface = "맑은 고딕" }; + var supplementalFont3 = new SupplementalFont { Script = "Hans", Typeface = "宋体" }; + var supplementalFont4 = new SupplementalFont { Script = "Hant", Typeface = "新細明體" }; + var supplementalFont5 = new SupplementalFont { Script = "Arab", Typeface = "Times New Roman" }; + var supplementalFont6 = new SupplementalFont { Script = "Hebr", Typeface = "Times New Roman" }; + var supplementalFont7 = new SupplementalFont { Script = "Thai", Typeface = "Tahoma" }; + var supplementalFont8 = new SupplementalFont { Script = "Ethi", Typeface = "Nyala" }; + var supplementalFont9 = new SupplementalFont { Script = "Beng", Typeface = "Vrinda" }; + var supplementalFont10 = new SupplementalFont { Script = "Gujr", Typeface = "Shruti" }; + var supplementalFont11 = new SupplementalFont { Script = "Khmr", Typeface = "MoolBoran" }; + var supplementalFont12 = new SupplementalFont { Script = "Knda", Typeface = "Tunga" }; + var supplementalFont13 = new SupplementalFont { Script = "Guru", Typeface = "Raavi" }; + var supplementalFont14 = new SupplementalFont { Script = "Cans", Typeface = "Euphemia" }; + var supplementalFont15 = new SupplementalFont { Script = "Cher", Typeface = "Plantagenet Cherokee" }; + var supplementalFont16 = new SupplementalFont { Script = "Yiii", Typeface = "Microsoft Yi Baiti" }; + var supplementalFont17 = new SupplementalFont { Script = "Tibt", Typeface = "Microsoft Himalaya" }; + var supplementalFont18 = new SupplementalFont { Script = "Thaa", Typeface = "MV Boli" }; + var supplementalFont19 = new SupplementalFont { Script = "Deva", Typeface = "Mangal" }; + var supplementalFont20 = new SupplementalFont { Script = "Telu", Typeface = "Gautami" }; + var supplementalFont21 = new SupplementalFont { Script = "Taml", Typeface = "Latha" }; + var supplementalFont22 = new SupplementalFont { Script = "Syrc", Typeface = "Estrangelo Edessa" }; + var supplementalFont23 = new SupplementalFont { Script = "Orya", Typeface = "Kalinga" }; + var supplementalFont24 = new SupplementalFont { Script = "Mlym", Typeface = "Kartika" }; + var supplementalFont25 = new SupplementalFont { Script = "Laoo", Typeface = "DokChampa" }; + var supplementalFont26 = new SupplementalFont { Script = "Sinh", Typeface = "Iskoola Pota" }; + var supplementalFont27 = new SupplementalFont { Script = "Mong", Typeface = "Mongolian Baiti" }; + var supplementalFont28 = new SupplementalFont { Script = "Viet", Typeface = "Times New Roman" }; + var supplementalFont29 = new SupplementalFont { Script = "Uigh", Typeface = "Microsoft Uighur" }; + + majorFont1.AppendChild(latinFont1); + majorFont1.AppendChild(eastAsianFont1); + majorFont1.AppendChild(complexScriptFont1); + majorFont1.AppendChild(supplementalFont1); + majorFont1.AppendChild(supplementalFont2); + majorFont1.AppendChild(supplementalFont3); + majorFont1.AppendChild(supplementalFont4); + majorFont1.AppendChild(supplementalFont5); + majorFont1.AppendChild(supplementalFont6); + majorFont1.AppendChild(supplementalFont7); + majorFont1.AppendChild(supplementalFont8); + majorFont1.AppendChild(supplementalFont9); + majorFont1.AppendChild(supplementalFont10); + majorFont1.AppendChild(supplementalFont11); + majorFont1.AppendChild(supplementalFont12); + majorFont1.AppendChild(supplementalFont13); + majorFont1.AppendChild(supplementalFont14); + majorFont1.AppendChild(supplementalFont15); + majorFont1.AppendChild(supplementalFont16); + majorFont1.AppendChild(supplementalFont17); + majorFont1.AppendChild(supplementalFont18); + majorFont1.AppendChild(supplementalFont19); + majorFont1.AppendChild(supplementalFont20); + majorFont1.AppendChild(supplementalFont21); + majorFont1.AppendChild(supplementalFont22); + majorFont1.AppendChild(supplementalFont23); + majorFont1.AppendChild(supplementalFont24); + majorFont1.AppendChild(supplementalFont25); + majorFont1.AppendChild(supplementalFont26); + majorFont1.AppendChild(supplementalFont27); + majorFont1.AppendChild(supplementalFont28); + majorFont1.AppendChild(supplementalFont29); + + var minorFont1 = new MinorFont(); + var latinFont2 = new LatinFont { Typeface = "Calibri" }; + var eastAsianFont2 = new EastAsianFont { Typeface = "" }; + var complexScriptFont2 = new ComplexScriptFont { Typeface = "" }; + var supplementalFont30 = new SupplementalFont { Script = "Jpan", Typeface = "MS Pゴシック" }; + var supplementalFont31 = new SupplementalFont { Script = "Hang", Typeface = "맑은 고딕" }; + var supplementalFont32 = new SupplementalFont { Script = "Hans", Typeface = "宋体" }; + var supplementalFont33 = new SupplementalFont { Script = "Hant", Typeface = "新細明體" }; + var supplementalFont34 = new SupplementalFont { Script = "Arab", Typeface = "Arial" }; + var supplementalFont35 = new SupplementalFont { Script = "Hebr", Typeface = "Arial" }; + var supplementalFont36 = new SupplementalFont { Script = "Thai", Typeface = "Tahoma" }; + var supplementalFont37 = new SupplementalFont { Script = "Ethi", Typeface = "Nyala" }; + var supplementalFont38 = new SupplementalFont { Script = "Beng", Typeface = "Vrinda" }; + var supplementalFont39 = new SupplementalFont { Script = "Gujr", Typeface = "Shruti" }; + var supplementalFont40 = new SupplementalFont { Script = "Khmr", Typeface = "DaunPenh" }; + var supplementalFont41 = new SupplementalFont { Script = "Knda", Typeface = "Tunga" }; + var supplementalFont42 = new SupplementalFont { Script = "Guru", Typeface = "Raavi" }; + var supplementalFont43 = new SupplementalFont { Script = "Cans", Typeface = "Euphemia" }; + var supplementalFont44 = new SupplementalFont { Script = "Cher", Typeface = "Plantagenet Cherokee" }; + var supplementalFont45 = new SupplementalFont { Script = "Yiii", Typeface = "Microsoft Yi Baiti" }; + var supplementalFont46 = new SupplementalFont { Script = "Tibt", Typeface = "Microsoft Himalaya" }; + var supplementalFont47 = new SupplementalFont { Script = "Thaa", Typeface = "MV Boli" }; + var supplementalFont48 = new SupplementalFont { Script = "Deva", Typeface = "Mangal" }; + var supplementalFont49 = new SupplementalFont { Script = "Telu", Typeface = "Gautami" }; + var supplementalFont50 = new SupplementalFont { Script = "Taml", Typeface = "Latha" }; + var supplementalFont51 = new SupplementalFont { Script = "Syrc", Typeface = "Estrangelo Edessa" }; + var supplementalFont52 = new SupplementalFont { Script = "Orya", Typeface = "Kalinga" }; + var supplementalFont53 = new SupplementalFont { Script = "Mlym", Typeface = "Kartika" }; + var supplementalFont54 = new SupplementalFont { Script = "Laoo", Typeface = "DokChampa" }; + var supplementalFont55 = new SupplementalFont { Script = "Sinh", Typeface = "Iskoola Pota" }; + var supplementalFont56 = new SupplementalFont { Script = "Mong", Typeface = "Mongolian Baiti" }; + var supplementalFont57 = new SupplementalFont { Script = "Viet", Typeface = "Arial" }; + var supplementalFont58 = new SupplementalFont { Script = "Uigh", Typeface = "Microsoft Uighur" }; + + minorFont1.AppendChild(latinFont2); + minorFont1.AppendChild(eastAsianFont2); + minorFont1.AppendChild(complexScriptFont2); + minorFont1.AppendChild(supplementalFont30); + minorFont1.AppendChild(supplementalFont31); + minorFont1.AppendChild(supplementalFont32); + minorFont1.AppendChild(supplementalFont33); + minorFont1.AppendChild(supplementalFont34); + minorFont1.AppendChild(supplementalFont35); + minorFont1.AppendChild(supplementalFont36); + minorFont1.AppendChild(supplementalFont37); + minorFont1.AppendChild(supplementalFont38); + minorFont1.AppendChild(supplementalFont39); + minorFont1.AppendChild(supplementalFont40); + minorFont1.AppendChild(supplementalFont41); + minorFont1.AppendChild(supplementalFont42); + minorFont1.AppendChild(supplementalFont43); + minorFont1.AppendChild(supplementalFont44); + minorFont1.AppendChild(supplementalFont45); + minorFont1.AppendChild(supplementalFont46); + minorFont1.AppendChild(supplementalFont47); + minorFont1.AppendChild(supplementalFont48); + minorFont1.AppendChild(supplementalFont49); + minorFont1.AppendChild(supplementalFont50); + minorFont1.AppendChild(supplementalFont51); + minorFont1.AppendChild(supplementalFont52); + minorFont1.AppendChild(supplementalFont53); + minorFont1.AppendChild(supplementalFont54); + minorFont1.AppendChild(supplementalFont55); + minorFont1.AppendChild(supplementalFont56); + minorFont1.AppendChild(supplementalFont57); + minorFont1.AppendChild(supplementalFont58); + + fontScheme2.AppendChild(majorFont1); + fontScheme2.AppendChild(minorFont1); + + var formatScheme1 = new FormatScheme { Name = "Office" }; + + var fillStyleList1 = new FillStyleList(); + + var solidFill1 = new SolidFill(); + var schemeColor1 = new SchemeColor { Val = SchemeColorValues.PhColor }; + + solidFill1.AppendChild(schemeColor1); + + var gradientFill1 = new GradientFill { RotateWithShape = true }; + + var gradientStopList1 = new GradientStopList(); + + var gradientStop1 = new GradientStop { Position = 0 }; + + var schemeColor2 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint1 = new Tint { Val = 50000 }; + var saturationModulation1 = new SaturationModulation { Val = 300000 }; + + schemeColor2.AppendChild(tint1); + schemeColor2.AppendChild(saturationModulation1); + + gradientStop1.AppendChild(schemeColor2); + + var gradientStop2 = new GradientStop { Position = 35000 }; + + var schemeColor3 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint2 = new Tint { Val = 37000 }; + var saturationModulation2 = new SaturationModulation { Val = 300000 }; + + schemeColor3.AppendChild(tint2); + schemeColor3.AppendChild(saturationModulation2); + + gradientStop2.AppendChild(schemeColor3); + + var gradientStop3 = new GradientStop { Position = 100000 }; + + var schemeColor4 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint3 = new Tint { Val = 15000 }; + var saturationModulation3 = new SaturationModulation { Val = 350000 }; + + schemeColor4.AppendChild(tint3); + schemeColor4.AppendChild(saturationModulation3); + + gradientStop3.AppendChild(schemeColor4); + + gradientStopList1.AppendChild(gradientStop1); + gradientStopList1.AppendChild(gradientStop2); + gradientStopList1.AppendChild(gradientStop3); + var linearGradientFill1 = new LinearGradientFill { Angle = 16200000, Scaled = true }; + + gradientFill1.AppendChild(gradientStopList1); + gradientFill1.AppendChild(linearGradientFill1); + + var gradientFill2 = new GradientFill { RotateWithShape = true }; + + var gradientStopList2 = new GradientStopList(); + + var gradientStop4 = new GradientStop { Position = 0 }; + + var schemeColor5 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade1 = new Shade { Val = 51000 }; + var saturationModulation4 = new SaturationModulation { Val = 130000 }; + + schemeColor5.AppendChild(shade1); + schemeColor5.AppendChild(saturationModulation4); + + gradientStop4.AppendChild(schemeColor5); + + var gradientStop5 = new GradientStop { Position = 80000 }; + + var schemeColor6 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade2 = new Shade { Val = 93000 }; + var saturationModulation5 = new SaturationModulation { Val = 130000 }; + + schemeColor6.AppendChild(shade2); + schemeColor6.AppendChild(saturationModulation5); + + gradientStop5.AppendChild(schemeColor6); + + var gradientStop6 = new GradientStop { Position = 100000 }; + + var schemeColor7 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade3 = new Shade { Val = 94000 }; + var saturationModulation6 = new SaturationModulation { Val = 135000 }; + + schemeColor7.AppendChild(shade3); + schemeColor7.AppendChild(saturationModulation6); + + gradientStop6.AppendChild(schemeColor7); + + gradientStopList2.AppendChild(gradientStop4); + gradientStopList2.AppendChild(gradientStop5); + gradientStopList2.AppendChild(gradientStop6); + var linearGradientFill2 = new LinearGradientFill { Angle = 16200000, Scaled = false }; + + gradientFill2.AppendChild(gradientStopList2); + gradientFill2.AppendChild(linearGradientFill2); + + fillStyleList1.AppendChild(solidFill1); + fillStyleList1.AppendChild(gradientFill1); + fillStyleList1.AppendChild(gradientFill2); + + var lineStyleList1 = new LineStyleList(); + + var outline1 = new Outline + { + Width = 9525, + CapType = LineCapValues.Flat, + CompoundLineType = CompoundLineValues.Single, + Alignment = PenAlignmentValues.Center + }; + + var solidFill2 = new SolidFill(); + + var schemeColor8 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade4 = new Shade { Val = 95000 }; + var saturationModulation7 = new SaturationModulation { Val = 105000 }; + + schemeColor8.AppendChild(shade4); + schemeColor8.AppendChild(saturationModulation7); + + solidFill2.AppendChild(schemeColor8); + var presetDash1 = new PresetDash { Val = PresetLineDashValues.Solid }; + + outline1.AppendChild(solidFill2); + outline1.AppendChild(presetDash1); + + var outline2 = new Outline + { + Width = 25400, + CapType = LineCapValues.Flat, + CompoundLineType = CompoundLineValues.Single, + Alignment = PenAlignmentValues.Center + }; + + var solidFill3 = new SolidFill(); + var schemeColor9 = new SchemeColor { Val = SchemeColorValues.PhColor }; + + solidFill3.AppendChild(schemeColor9); + var presetDash2 = new PresetDash { Val = PresetLineDashValues.Solid }; + + outline2.AppendChild(solidFill3); + outline2.AppendChild(presetDash2); + + var outline3 = new Outline + { + Width = 38100, + CapType = LineCapValues.Flat, + CompoundLineType = CompoundLineValues.Single, + Alignment = PenAlignmentValues.Center + }; + + var solidFill4 = new SolidFill(); + var schemeColor10 = new SchemeColor { Val = SchemeColorValues.PhColor }; + + solidFill4.AppendChild(schemeColor10); + var presetDash3 = new PresetDash { Val = PresetLineDashValues.Solid }; + + outline3.AppendChild(solidFill4); + outline3.AppendChild(presetDash3); + + lineStyleList1.AppendChild(outline1); + lineStyleList1.AppendChild(outline2); + lineStyleList1.AppendChild(outline3); + + var effectStyleList1 = new EffectStyleList(); + + var effectStyle1 = new EffectStyle(); + + var effectList1 = new EffectList(); + + var outerShadow1 = new OuterShadow + { + BlurRadius = 40000L, + Distance = 20000L, + Direction = 5400000, + RotateWithShape = false + }; + + var rgbColorModelHex11 = new RgbColorModelHex { Val = "000000" }; + var alpha1 = new Alpha { Val = 38000 }; + + rgbColorModelHex11.AppendChild(alpha1); + + outerShadow1.AppendChild(rgbColorModelHex11); + + effectList1.AppendChild(outerShadow1); + + effectStyle1.AppendChild(effectList1); + + var effectStyle2 = new EffectStyle(); + + var effectList2 = new EffectList(); + + var outerShadow2 = new OuterShadow + { + BlurRadius = 40000L, + Distance = 23000L, + Direction = 5400000, + RotateWithShape = false + }; + + var rgbColorModelHex12 = new RgbColorModelHex { Val = "000000" }; + var alpha2 = new Alpha { Val = 35000 }; + + rgbColorModelHex12.AppendChild(alpha2); + + outerShadow2.AppendChild(rgbColorModelHex12); + + effectList2.AppendChild(outerShadow2); + + effectStyle2.AppendChild(effectList2); + + var effectStyle3 = new EffectStyle(); + + var effectList3 = new EffectList(); + + var outerShadow3 = new OuterShadow + { + BlurRadius = 40000L, + Distance = 23000L, + Direction = 5400000, + RotateWithShape = false + }; + + var rgbColorModelHex13 = new RgbColorModelHex { Val = "000000" }; + var alpha3 = new Alpha { Val = 35000 }; + + rgbColorModelHex13.AppendChild(alpha3); + + outerShadow3.AppendChild(rgbColorModelHex13); + + effectList3.AppendChild(outerShadow3); + + var scene3DType1 = new Scene3DType(); + + var camera1 = new Camera { Preset = PresetCameraValues.OrthographicFront }; + var rotation1 = new Rotation { Latitude = 0, Longitude = 0, Revolution = 0 }; + + camera1.AppendChild(rotation1); + + var lightRig1 = new LightRig { Rig = LightRigValues.ThreePoints, Direction = LightRigDirectionValues.Top }; + var rotation2 = new Rotation { Latitude = 0, Longitude = 0, Revolution = 1200000 }; + + lightRig1.AppendChild(rotation2); + + scene3DType1.AppendChild(camera1); + scene3DType1.AppendChild(lightRig1); + + var shape3DType1 = new Shape3DType(); + var bevelTop1 = new BevelTop { Width = 63500L, Height = 25400L }; + + shape3DType1.AppendChild(bevelTop1); + + effectStyle3.AppendChild(effectList3); + effectStyle3.AppendChild(scene3DType1); + effectStyle3.AppendChild(shape3DType1); + + effectStyleList1.AppendChild(effectStyle1); + effectStyleList1.AppendChild(effectStyle2); + effectStyleList1.AppendChild(effectStyle3); + + var backgroundFillStyleList1 = new BackgroundFillStyleList(); + + var solidFill5 = new SolidFill(); + var schemeColor11 = new SchemeColor { Val = SchemeColorValues.PhColor }; + + solidFill5.AppendChild(schemeColor11); + + var gradientFill3 = new GradientFill { RotateWithShape = true }; + + var gradientStopList3 = new GradientStopList(); + + var gradientStop7 = new GradientStop { Position = 0 }; + + var schemeColor12 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint4 = new Tint { Val = 40000 }; + var saturationModulation8 = new SaturationModulation { Val = 350000 }; + + schemeColor12.AppendChild(tint4); + schemeColor12.AppendChild(saturationModulation8); + + gradientStop7.AppendChild(schemeColor12); + + var gradientStop8 = new GradientStop { Position = 40000 }; + + var schemeColor13 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint5 = new Tint { Val = 45000 }; + var shade5 = new Shade { Val = 99000 }; + var saturationModulation9 = new SaturationModulation { Val = 350000 }; + + schemeColor13.AppendChild(tint5); + schemeColor13.AppendChild(shade5); + schemeColor13.AppendChild(saturationModulation9); + + gradientStop8.AppendChild(schemeColor13); + + var gradientStop9 = new GradientStop { Position = 100000 }; + + var schemeColor14 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade6 = new Shade { Val = 20000 }; + var saturationModulation10 = new SaturationModulation { Val = 255000 }; + + schemeColor14.AppendChild(shade6); + schemeColor14.AppendChild(saturationModulation10); + + gradientStop9.AppendChild(schemeColor14); + + gradientStopList3.AppendChild(gradientStop7); + gradientStopList3.AppendChild(gradientStop8); + gradientStopList3.AppendChild(gradientStop9); + + var pathGradientFill1 = new PathGradientFill { Path = PathShadeValues.Circle }; + var fillToRectangle1 = new FillToRectangle { Left = 50000, Top = -80000, Right = 50000, Bottom = 180000 }; + + pathGradientFill1.AppendChild(fillToRectangle1); + + gradientFill3.AppendChild(gradientStopList3); + gradientFill3.AppendChild(pathGradientFill1); + + var gradientFill4 = new GradientFill { RotateWithShape = true }; + + var gradientStopList4 = new GradientStopList(); + + var gradientStop10 = new GradientStop { Position = 0 }; + + var schemeColor15 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var tint6 = new Tint { Val = 80000 }; + var saturationModulation11 = new SaturationModulation { Val = 300000 }; + + schemeColor15.AppendChild(tint6); + schemeColor15.AppendChild(saturationModulation11); + + gradientStop10.AppendChild(schemeColor15); + + var gradientStop11 = new GradientStop { Position = 100000 }; + + var schemeColor16 = new SchemeColor { Val = SchemeColorValues.PhColor }; + var shade7 = new Shade { Val = 30000 }; + var saturationModulation12 = new SaturationModulation { Val = 200000 }; + + schemeColor16.AppendChild(shade7); + schemeColor16.AppendChild(saturationModulation12); + + gradientStop11.AppendChild(schemeColor16); + + gradientStopList4.AppendChild(gradientStop10); + gradientStopList4.AppendChild(gradientStop11); + + var pathGradientFill2 = new PathGradientFill { Path = PathShadeValues.Circle }; + var fillToRectangle2 = new FillToRectangle { Left = 50000, Top = 50000, Right = 50000, Bottom = 50000 }; + + pathGradientFill2.AppendChild(fillToRectangle2); + + gradientFill4.AppendChild(gradientStopList4); + gradientFill4.AppendChild(pathGradientFill2); + + backgroundFillStyleList1.AppendChild(solidFill5); + backgroundFillStyleList1.AppendChild(gradientFill3); + backgroundFillStyleList1.AppendChild(gradientFill4); + + formatScheme1.AppendChild(fillStyleList1); + formatScheme1.AppendChild(lineStyleList1); + formatScheme1.AppendChild(effectStyleList1); + formatScheme1.AppendChild(backgroundFillStyleList1); + + themeElements1.AppendChild(colorScheme1); + themeElements1.AppendChild(fontScheme2); + themeElements1.AppendChild(formatScheme1); + var objectDefaults1 = new ObjectDefaults(); + var extraColorSchemeList1 = new ExtraColorSchemeList(); + + theme1.AppendChild(themeElements1); + theme1.AppendChild(objectDefaults1); + theme1.AppendChild(extraColorSchemeList1); + + themePart.Theme = theme1; + } + + private void GenerateCustomFilePropertiesPartContent(CustomFilePropertiesPart customFilePropertiesPart1) + { + var properties2 = new DocumentFormat.OpenXml.CustomProperties.Properties(); + properties2.AddNamespaceDeclaration("vt", + "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); + var propertyId = 1; + foreach (var p in CustomProperties) + { + propertyId++; + var customDocumentProperty = new CustomDocumentProperty + { + FormatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}", + PropertyId = propertyId, + Name = p.Name + }; + if (p.Type == XLCustomPropertyType.Text) + { + var vTlpwstr1 = new VTLPWSTR { Text = p.GetValue() }; + customDocumentProperty.AppendChild(vTlpwstr1); + } + else if (p.Type == XLCustomPropertyType.Date) + { + var vTFileTime1 = new VTFileTime + { + Text = + p.GetValue().ToUniversalTime().ToString( + "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'") + }; + customDocumentProperty.AppendChild(vTFileTime1); + } + else if (p.Type == XLCustomPropertyType.Number) + { + var vTDouble1 = new VTDouble + { + Text = p.GetValue().ToInvariantString() + }; + customDocumentProperty.AppendChild(vTDouble1); + } + else + { + var vTBool1 = new VTBool { Text = p.GetValue().ToString().ToLower() }; + customDocumentProperty.AppendChild(vTBool1); + } + properties2.AppendChild(customDocumentProperty); + } + + customFilePropertiesPart1.Properties = properties2; + } + + private void SetPackageProperties(OpenXmlPackage document) + { + var created = Properties.Created == DateTime.MinValue ? DateTime.Now : Properties.Created; + var modified = Properties.Modified == DateTime.MinValue ? DateTime.Now : Properties.Modified; + document.PackageProperties.Created = created; + document.PackageProperties.Modified = modified; + document.PackageProperties.LastModifiedBy = Properties.LastModifiedBy; + + document.PackageProperties.Creator = Properties.Author; + document.PackageProperties.Title = Properties.Title; + document.PackageProperties.Subject = Properties.Subject; + document.PackageProperties.Category = Properties.Category; + document.PackageProperties.Keywords = Properties.Keywords; + document.PackageProperties.Description = Properties.Comments; + document.PackageProperties.ContentStatus = Properties.Status; + } + + private static string GetTableName(String originalTableName, SaveContext context) + { + var tableName = originalTableName.RemoveSpecialCharacters(); + var name = tableName; + if (context.TableNames.Contains(name)) + { + var i = 1; + name = tableName + i.ToInvariantString(); + while (context.TableNames.Contains(name)) + { + i++; + name = tableName + i.ToInvariantString(); + } + } + + context.TableNames.Add(name); + return name; + } + + private static void GenerateTableDefinitionPartContent(TableDefinitionPart tableDefinitionPart, XLTable xlTable, + SaveContext context) + { + context.TableId++; + var reference = xlTable.RangeAddress.FirstAddress + ":" + xlTable.RangeAddress.LastAddress; + var tableName = GetTableName(xlTable.Name, context); + var table = new Table + { + Id = context.TableId, + Name = tableName, + DisplayName = tableName, + Reference = reference + }; + + if (!xlTable.ShowHeaderRow) + table.HeaderRowCount = 0; + + if (xlTable.ShowTotalsRow) + table.TotalsRowCount = 1; + else + table.TotalsRowShown = false; + + var tableColumns1 = new TableColumns { Count = (UInt32)xlTable.ColumnCount() }; + + UInt32 columnId = 0; + foreach (var xlField in xlTable.Fields) + { + columnId++; + var fieldName = xlField.Name; + var tableColumn1 = new TableColumn + { + Id = columnId, + Name = fieldName.Replace("_x000a_", "_x005f_x000a_").Replace(Environment.NewLine, "_x000a_") + }; + if (xlTable.ShowTotalsRow) + { + if (xlField.TotalsRowFunction != XLTotalsRowFunction.None) + { + tableColumn1.TotalsRowFunction = xlField.TotalsRowFunction.ToOpenXml(); + + if (xlField.TotalsRowFunction == XLTotalsRowFunction.Custom) + tableColumn1.TotalsRowFormula = new TotalsRowFormula(xlField.TotalsRowFormulaA1); + } + + if (!XLHelper.IsNullOrWhiteSpace(xlField.TotalsRowLabel)) + tableColumn1.TotalsRowLabel = xlField.TotalsRowLabel; + } + tableColumns1.AppendChild(tableColumn1); + } + + var tableStyleInfo1 = new TableStyleInfo + { + ShowFirstColumn = xlTable.EmphasizeFirstColumn, + ShowLastColumn = xlTable.EmphasizeLastColumn, + ShowRowStripes = xlTable.ShowRowStripes, + ShowColumnStripes = xlTable.ShowColumnStripes + }; + + if (xlTable.Theme != XLTableTheme.None) + tableStyleInfo1.Name = xlTable.Theme.Name; + + if (xlTable.ShowAutoFilter) + { + var autoFilter1 = new AutoFilter(); + if (xlTable.ShowTotalsRow) + { + xlTable.AutoFilter.Range = xlTable.Worksheet.Range( + xlTable.RangeAddress.FirstAddress.RowNumber, xlTable.RangeAddress.FirstAddress.ColumnNumber, + xlTable.RangeAddress.LastAddress.RowNumber - 1, xlTable.RangeAddress.LastAddress.ColumnNumber); + } + else + xlTable.AutoFilter.Range = xlTable.Worksheet.Range(xlTable.RangeAddress); + + PopulateAutoFilter(xlTable.AutoFilter, autoFilter1); + + table.AppendChild(autoFilter1); + } + + table.AppendChild(tableColumns1); + table.AppendChild(tableStyleInfo1); + + tableDefinitionPart.Table = table; + } + + private static void GeneratePivotTables(WorkbookPart workbookPart, WorksheetPart worksheetPart, + XLWorksheet xlWorksheet, + SaveContext context) + { + PivotCaches pivotCaches; + uint cacheId = 0; + if (workbookPart.Workbook.PivotCaches == null) + pivotCaches = workbookPart.Workbook.InsertAfter(new PivotCaches(), workbookPart.Workbook.CalculationProperties); + else + { + pivotCaches = workbookPart.Workbook.PivotCaches; + if (pivotCaches.Any()) + cacheId = pivotCaches.Cast().Max(pc => pc.CacheId.Value) + 1; + } + + foreach (var pt in xlWorksheet.PivotTables.Cast()) + { + // TODO: Avoid duplicate pivot caches of same source range + + var workbookCacheRelId = pt.WorkbookCacheRelId; + PivotCache pivotCache; + PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart; + if (!XLHelper.IsNullOrWhiteSpace(pt.WorkbookCacheRelId)) + { + pivotCache = pivotCaches.Cast().Single(pc => pc.Id.Value == pt.WorkbookCacheRelId); + pivotTableCacheDefinitionPart = workbookPart.GetPartById(pt.WorkbookCacheRelId) as PivotTableCacheDefinitionPart; + } + else + { + workbookCacheRelId = context.RelIdGenerator.GetNext(RelType.Workbook); + pivotCache = new PivotCache { CacheId = cacheId++, Id = workbookCacheRelId }; + pivotTableCacheDefinitionPart = workbookPart.AddNewPart(workbookCacheRelId); + } + + GeneratePivotTableCacheDefinitionPartContent(pivotTableCacheDefinitionPart, pt); + + if (XLHelper.IsNullOrWhiteSpace(pt.WorkbookCacheRelId)) + pivotCaches.AppendChild(pivotCache); + + PivotTablePart pivotTablePart; + if (XLHelper.IsNullOrWhiteSpace(pt.RelId)) + pivotTablePart = worksheetPart.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); + else + pivotTablePart = worksheetPart.GetPartById(pt.RelId) as PivotTablePart; + + GeneratePivotTablePartContent(pivotTablePart, pt, pivotCache.CacheId, context); + + if (XLHelper.IsNullOrWhiteSpace(pt.RelId)) + pivotTablePart.AddPart(pivotTableCacheDefinitionPart, context.RelIdGenerator.GetNext(RelType.Workbook)); + } + } + + // Generates content of pivotTableCacheDefinitionPart + private static void GeneratePivotTableCacheDefinitionPartContent( + PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart, IXLPivotTable pt) + { + var source = pt.SourceRange; + + var pivotCacheDefinition = new PivotCacheDefinition + { + Id = "rId1", + SaveData = pt.SaveSourceData, + RefreshOnLoad = true //pt.RefreshDataOnOpen + }; + if (pt.ItemsToRetainPerField == XLItemsToRetain.None) + pivotCacheDefinition.MissingItemsLimit = 0U; + else if (pt.ItemsToRetainPerField == XLItemsToRetain.Max) + pivotCacheDefinition.MissingItemsLimit = XLHelper.MaxRowNumber; + + pivotCacheDefinition.AddNamespaceDeclaration("r", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + + var cacheSource = new CacheSource { Type = SourceValues.Worksheet }; + cacheSource.AppendChild(new WorksheetSource { Name = source.ToString() }); + + var cacheFields = new CacheFields(); + + foreach (var c in source.Columns()) + { + var columnNumber = c.ColumnNumber(); + var columnName = c.FirstCell().Value.ToString(); + var xlpf = pt.Fields.Add(columnName); + + var field = + pt.RowLabels.Union(pt.ColumnLabels).Union(pt.ReportFilters).FirstOrDefault(f => f.SourceName == columnName); + if (field != null) + { + xlpf.CustomName = field.CustomName; + xlpf.Subtotals.AddRange(field.Subtotals); + } + + var sharedItems = new SharedItems(); + + var onlyNumbers = + !source.Cells().Any( + cell => + cell.Address.ColumnNumber == columnNumber && + cell.Address.RowNumber > source.FirstRow().RowNumber() && cell.DataType != XLCellValues.Number); + if (onlyNumbers) + { + sharedItems = new SharedItems + { ContainsSemiMixedTypes = false, ContainsString = false, ContainsNumber = true }; + } + else + { + foreach (var cellValue in source.Cells() + .Where(cell => cell.Address.ColumnNumber == columnNumber && cell.Address.RowNumber > source.FirstRow().RowNumber()) + .Select(cell => cell.Value.ToString()) + .Where(cellValue => !xlpf.SharedStrings.Select(ss => ss.ToLower()).Contains(cellValue.ToLower()))) + { + xlpf.SharedStrings.Add(cellValue); + } + + foreach (var li in xlpf.SharedStrings) + { + sharedItems.AppendChild(new StringItem { Val = li }); + } + } + + var cacheField = new CacheField { Name = xlpf.SourceName }; + cacheField.AppendChild(sharedItems); + cacheFields.AppendChild(cacheField); + } + + pivotCacheDefinition.AppendChild(cacheSource); + pivotCacheDefinition.AppendChild(cacheFields); + + pivotTableCacheDefinitionPart.PivotCacheDefinition = pivotCacheDefinition; + + var pivotTableCacheRecordsPart = pivotTableCacheDefinitionPart.GetPartsOfType().Any() ? + pivotTableCacheDefinitionPart.GetPartsOfType().First() : + pivotTableCacheDefinitionPart.AddNewPart("rId1"); + + var pivotCacheRecords = new PivotCacheRecords(); + pivotCacheRecords.AddNamespaceDeclaration("r", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + pivotTableCacheRecordsPart.PivotCacheRecords = pivotCacheRecords; + } + + // Generates content of pivotTablePart + private static void GeneratePivotTablePartContent(PivotTablePart pivotTablePart, IXLPivotTable pt, uint cacheId, SaveContext context) + { + var pivotTableDefinition = new PivotTableDefinition + { + Name = pt.Name, + CacheId = cacheId, + DataCaption = "Values", + MergeItem = GetBooleanValue(pt.MergeAndCenterWithLabels, true), + Indent = Convert.ToUInt32(pt.RowLabelIndent), + PageOverThenDown = (pt.FilterAreaOrder == XLFilterAreaOrder.OverThenDown), + PageWrap = Convert.ToUInt32(pt.FilterFieldsPageWrap), + ShowError = String.IsNullOrEmpty(pt.ErrorValueReplacement), + UseAutoFormatting = GetBooleanValue(pt.AutofitColumns, true), + PreserveFormatting = GetBooleanValue(pt.PreserveCellFormatting, true), + RowGrandTotals = GetBooleanValue(pt.ShowGrandTotalsRows, true), + ColumnGrandTotals = GetBooleanValue(pt.ShowGrandTotalsColumns, true), + SubtotalHiddenItems = GetBooleanValue(pt.FilteredItemsInSubtotals, true), + MultipleFieldFilters = GetBooleanValue(pt.AllowMultipleFilters, true), + CustomListSort = GetBooleanValue(pt.UseCustomListsForSorting, true), + ShowDrill = GetBooleanValue(pt.ShowExpandCollapseButtons, true), + ShowDataTips = GetBooleanValue(pt.ShowContextualTooltips, true), + ShowMemberPropertyTips = GetBooleanValue(pt.ShowPropertiesInTooltips, true), + ShowHeaders = GetBooleanValue(pt.DisplayCaptionsAndDropdowns, true), + GridDropZones = GetBooleanValue(pt.ClassicPivotTableLayout, false), + ShowEmptyRow = GetBooleanValue(pt.ShowEmptyItemsOnRows, true), + ShowEmptyColumn = GetBooleanValue(pt.ShowEmptyItemsOnColumns, true), + ShowItems = GetBooleanValue(pt.DisplayItemLabels, true), + FieldListSortAscending = GetBooleanValue(pt.SortFieldsAtoZ, true), + PrintDrill = GetBooleanValue(pt.PrintExpandCollapsedButtons, true), + ItemPrintTitles = GetBooleanValue(pt.RepeatRowLabels, true), + FieldPrintTitles = GetBooleanValue(pt.PrintTitles, true), + EnableDrill = GetBooleanValue(pt.EnableShowDetails, true) + }; + + if (pt.EmptyCellReplacement != null) + { + pivotTableDefinition.ShowMissing = true; + pivotTableDefinition.MissingCaption = pt.EmptyCellReplacement; + } + else + { + pivotTableDefinition.ShowMissing = false; + } + + if (pt.ErrorValueReplacement != null) + { + pivotTableDefinition.ShowError = true; + pivotTableDefinition.ErrorCaption = pt.ErrorValueReplacement; + } + else + { + pivotTableDefinition.ShowError = false; + } + + var location = new Location + { + Reference = pt.TargetCell.Address.ToString(), + FirstHeaderRow = 1U, + FirstDataRow = 1U, + FirstDataColumn = 1U + }; + + var rowFields = new RowFields(); + var columnFields = new ColumnFields(); + var rowItems = new RowItems(); + var columnItems = new ColumnItems(); + var pageFields = new PageFields { Count = (uint)pt.ReportFilters.Count() }; + var pivotFields = new PivotFields { Count = Convert.ToUInt32(pt.SourceRange.ColumnCount()) }; + + foreach (var xlpf in pt.Fields.OrderBy(f => pt.RowLabels.Any(p => p.SourceName == f.SourceName) ? pt.RowLabels.IndexOf(f) : Int32.MaxValue)) + { + if (pt.RowLabels.Any(p => p.SourceName == xlpf.SourceName)) + { + var f = new Field { Index = pt.Fields.IndexOf(xlpf) }; + rowFields.AppendChild(f); + + for (var i = 0; i < xlpf.SharedStrings.Count; i++) + { + var rowItem = new RowItem(); + rowItem.AppendChild(new MemberPropertyIndex { Val = i }); + rowItems.AppendChild(rowItem); + } + + var rowItemTotal = new RowItem { ItemType = ItemValues.Grand }; + rowItemTotal.AppendChild(new MemberPropertyIndex()); + rowItems.AppendChild(rowItemTotal); + } + else if (pt.ColumnLabels.Any(p => p.SourceName == xlpf.SourceName)) + { + var f = new Field { Index = pt.Fields.IndexOf(xlpf) }; + columnFields.AppendChild(f); + + for (var i = 0; i < xlpf.SharedStrings.Count; i++) + { + var rowItem = new RowItem(); + rowItem.AppendChild(new MemberPropertyIndex { Val = i }); + columnItems.AppendChild(rowItem); + } + + var rowItemTotal = new RowItem { ItemType = ItemValues.Grand }; + rowItemTotal.AppendChild(new MemberPropertyIndex()); + columnItems.AppendChild(rowItemTotal); + } + } + + if (pt.Values.Count() > 1) + { + // -2 is the sentinal value for "Values" + if (pt.ColumnLabels.Any(cl => cl.SourceName == XLConstants.PivotTableValuesSentinalLabel)) + columnFields.AppendChild(new Field { Index = -2 }); + else if (pt.RowLabels.Any(rl => rl.SourceName == XLConstants.PivotTableValuesSentinalLabel)) + { + pivotTableDefinition.DataOnRows = true; + rowFields.AppendChild(new Field { Index = -2 }); + } + } + + foreach (var xlpf in pt.Fields) + { + IXLPivotField labelField = null; + var pf = new PivotField { ShowAll = false, Name = xlpf.CustomName }; + + if (pt.RowLabels.Any(p => p.SourceName == xlpf.SourceName)) + { + labelField = pt.RowLabels.Single(p => p.SourceName == xlpf.SourceName); + pf.Axis = PivotTableAxisValues.AxisRow; + } + else if (pt.ColumnLabels.Any(p => p.SourceName == xlpf.SourceName)) + { + labelField = pt.ColumnLabels.Single(p => p.SourceName == xlpf.SourceName); + pf.Axis = PivotTableAxisValues.AxisColumn; + } + else if (pt.ReportFilters.Any(p => p.SourceName == xlpf.SourceName)) + { + location.ColumnsPerPage = 1; + location.RowPageCount = 1; + pf.Axis = PivotTableAxisValues.AxisPage; + pageFields.AppendChild(new PageField { Hierarchy = -1, Field = pt.Fields.IndexOf(xlpf) }); + } + + if (pt.Values.Any(p => p.SourceName == xlpf.SourceName)) + pf.DataField = true; + + var fieldItems = new Items(); + + if (xlpf.SharedStrings.Count > 0) + { + for (uint i = 0; i < xlpf.SharedStrings.Count; i++) + { + var item = new Item { Index = i }; + if (labelField != null && labelField.Collapsed) + item.HideDetails = BooleanValue.FromBoolean(false); + fieldItems.AppendChild(item); + } + } + + if (xlpf.Subtotals.Count > 0) + { + foreach (var subtotal in xlpf.Subtotals) + { + var itemSubtotal = new Item(); + switch (subtotal) + { + case XLSubtotalFunction.Average: + pf.AverageSubTotal = true; + itemSubtotal.ItemType = ItemValues.Average; + break; + + case XLSubtotalFunction.Count: + pf.CountASubtotal = true; + itemSubtotal.ItemType = ItemValues.CountA; + break; + + case XLSubtotalFunction.CountNumbers: + pf.CountSubtotal = true; + itemSubtotal.ItemType = ItemValues.Count; + break; + + case XLSubtotalFunction.Maximum: + pf.MaxSubtotal = true; + itemSubtotal.ItemType = ItemValues.Maximum; + break; + + case XLSubtotalFunction.Minimum: + pf.MinSubtotal = true; + itemSubtotal.ItemType = ItemValues.Minimum; + break; + + case XLSubtotalFunction.PopulationStandardDeviation: + pf.ApplyStandardDeviationPInSubtotal = true; + itemSubtotal.ItemType = ItemValues.StandardDeviationP; + break; + + case XLSubtotalFunction.PopulationVariance: + pf.ApplyVariancePInSubtotal = true; + itemSubtotal.ItemType = ItemValues.VarianceP; + break; + + case XLSubtotalFunction.Product: + pf.ApplyProductInSubtotal = true; + itemSubtotal.ItemType = ItemValues.Product; + break; + + case XLSubtotalFunction.StandardDeviation: + pf.ApplyStandardDeviationInSubtotal = true; + itemSubtotal.ItemType = ItemValues.StandardDeviation; + break; + + case XLSubtotalFunction.Sum: + pf.SumSubtotal = true; + itemSubtotal.ItemType = ItemValues.Sum; + break; + + case XLSubtotalFunction.Variance: + pf.ApplyVarianceInSubtotal = true; + itemSubtotal.ItemType = ItemValues.Variance; + break; + } + fieldItems.AppendChild(itemSubtotal); + } + } + else + { + fieldItems.AppendChild(new Item { ItemType = ItemValues.Default }); + } + + fieldItems.Count = Convert.ToUInt32(fieldItems.Count()); + pf.AppendChild(fieldItems); + pivotFields.AppendChild(pf); + } + + pivotTableDefinition.AppendChild(location); + pivotTableDefinition.AppendChild(pivotFields); + + if (pt.RowLabels.Any()) + { + rowFields.Count = Convert.ToUInt32(rowFields.Count()); + pivotTableDefinition.AppendChild(rowFields); + } + else + { + rowItems.AppendChild(new RowItem()); + } + + rowItems.Count = Convert.ToUInt32(rowItems.Count()); + pivotTableDefinition.AppendChild(rowItems); + + if (!pt.ColumnLabels.Any(cl => cl.CustomName != XLConstants.PivotTableValuesSentinalLabel)) + { + for (int i = 0; i < pt.Values.Count(); i++) + { + var rowItem = new RowItem(); + rowItem.Index = Convert.ToUInt32(i); + rowItem.AppendChild(new MemberPropertyIndex() { Val = i }); + columnItems.AppendChild(rowItem); + } + } + + if (columnFields.Any()) + { + columnFields.Count = Convert.ToUInt32(columnFields.Count()); + pivotTableDefinition.AppendChild(columnFields); + } + + if (columnItems.Any()) + { + columnItems.Count = Convert.ToUInt32(columnItems.Count()); + pivotTableDefinition.AppendChild(columnItems); + } + + if (pt.ReportFilters.Any()) + { + pageFields.Count = Convert.ToUInt32(pageFields.Count()); + pivotTableDefinition.AppendChild(pageFields); + } + + var dataFields = new DataFields(); + foreach (var value in pt.Values) + { + var sourceColumn = + pt.SourceRange.Columns().FirstOrDefault(c => c.Cell(1).Value.ToString() == value.SourceName); + if (sourceColumn == null) continue; + + UInt32 numberFormatId = 0; + if (value.NumberFormat.NumberFormatId != -1 || context.SharedNumberFormats.ContainsKey(value.NumberFormat.NumberFormatId)) + numberFormatId = (UInt32)value.NumberFormat.NumberFormatId; + else if (context.SharedNumberFormats.Any(snf => snf.Value.NumberFormat.Format == value.NumberFormat.Format)) + numberFormatId = (UInt32)context.SharedNumberFormats.First(snf => snf.Value.NumberFormat.Format == value.NumberFormat.Format).Key; + + var df = new DataField + { + Name = value.CustomName, + Field = (UInt32)sourceColumn.ColumnNumber() - 1, + Subtotal = value.SummaryFormula.ToOpenXml(), + ShowDataAs = value.Calculation.ToOpenXml(), + NumberFormatId = numberFormatId + }; + + if (!String.IsNullOrEmpty(value.BaseField)) + { + var baseField = pt.SourceRange.Columns().FirstOrDefault(c => c.Cell(1).Value.ToString() == value.BaseField); + if (baseField != null) + { + df.BaseField = baseField.ColumnNumber() - 1; + + var items = baseField.CellsUsed() + .Select(c => c.Value) + .Skip(1) // Skip header column + .Distinct().ToList(); + + if (items.Any(i => i.Equals(value.BaseItem))) + df.BaseItem = Convert.ToUInt32(items.IndexOf(value.BaseItem)); + } + } + else + { + df.BaseField = 0; + } + + if (value.CalculationItem == XLPivotCalculationItem.Previous) + df.BaseItem = 1048828U; + else if (value.CalculationItem == XLPivotCalculationItem.Next) + df.BaseItem = 1048829U; + else if (df.BaseItem == null || !df.BaseItem.HasValue) + df.BaseItem = 0U; + + dataFields.AppendChild(df); + } + + dataFields.Count = Convert.ToUInt32(dataFields.Count()); + pivotTableDefinition.AppendChild(dataFields); + + pivotTableDefinition.AppendChild(new PivotTableStyle + { + Name = Enum.GetName(typeof(XLPivotTableTheme), pt.Theme), + ShowRowHeaders = pt.ShowRowHeaders, + ShowColumnHeaders = pt.ShowColumnHeaders, + ShowRowStripes = pt.ShowRowStripes, + ShowColumnStripes = pt.ShowColumnStripes + }); + + #region Excel 2010 Features + + var pivotTableDefinitionExtensionList = new PivotTableDefinitionExtensionList(); + + var pivotTableDefinitionExtension = new PivotTableDefinitionExtension + { Uri = "{962EF5D1-5CA2-4c93-8EF4-DBF5C05439D2}" }; + pivotTableDefinitionExtension.AddNamespaceDeclaration("x14", + "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main"); + + var pivotTableDefinition2 = new DocumentFormat.OpenXml.Office2010.Excel.PivotTableDefinition + { EnableEdit = pt.EnableCellEditing, HideValuesRow = !pt.ShowValuesRow }; + pivotTableDefinition2.AddNamespaceDeclaration("xm", "http://schemas.microsoft.com/office/excel/2006/main"); + + pivotTableDefinitionExtension.AppendChild(pivotTableDefinition2); + + pivotTableDefinitionExtensionList.AppendChild(pivotTableDefinitionExtension); + pivotTableDefinition.AppendChild(pivotTableDefinitionExtensionList); + + #endregion Excel 2010 Features + + pivotTablePart.PivotTableDefinition = pivotTableDefinition; + } + + private static void GenerateWorksheetCommentsPartContent(WorksheetCommentsPart worksheetCommentsPart, + XLWorksheet xlWorksheet) + { + var comments = new Comments(); + var commentList = new CommentList(); + var authorsDict = new Dictionary(); + foreach (var c in xlWorksheet.Internals.CellsCollection.GetCells(c => c.HasComment)) + { + var comment = new Comment { Reference = c.Address.ToStringRelative() }; + var authorName = c.Comment.Author; + + Int32 authorId; + if (!authorsDict.TryGetValue(authorName, out authorId)) + { + authorId = authorsDict.Count; + authorsDict.Add(authorName, authorId); + } + comment.AuthorId = (UInt32)authorId; + + var commentText = new CommentText(); + foreach (var rt in c.Comment) + { + commentText.Append(GetRun(rt)); + } + + comment.Append(commentText); + commentList.Append(comment); + } + + var authors = new Authors(); + foreach (var author in authorsDict.Select(a => new Author { Text = a.Key })) + { + authors.Append(author); + } + comments.Append(authors); + comments.Append(commentList); + + worksheetCommentsPart.Comments = comments; + } + + // Generates content of vmlDrawingPart1. + private static void GenerateVmlDrawingPartContent(VmlDrawingPart vmlDrawingPart, XLWorksheet xlWorksheet, + SaveContext context) + { + var ms = new MemoryStream(); + CopyStream(vmlDrawingPart.GetStream(FileMode.OpenOrCreate), ms); + ms.Position = 0; + var writer = new XmlTextWriter(vmlDrawingPart.GetStream(FileMode.Create), Encoding.UTF8); + + writer.WriteStartElement("xml"); + + const string shapeTypeId = "_x0000_t202"; // arbitrary, assigned by office + + new Vml.Shapetype( + new Vml.Stroke { JoinStyle = Vml.StrokeJoinStyleValues.Miter }, + new Vml.Path { AllowGradientShape = true, ConnectionPointType = ConnectValues.Rectangle } + ) + { + Id = shapeTypeId, + CoordinateSize = "21600,21600", + OptionalNumber = 202, + EdgePath = "m,l,21600r21600,l21600,xe", + } + .WriteTo(writer); + + var cellWithComments = xlWorksheet.Internals.CellsCollection.GetCells().Where(c => c.HasComment); + + foreach (var c in cellWithComments) + { + GenerateShape(c, shapeTypeId).WriteTo(writer); + } + + if (ms.Length > 0) + { + ms.Position = 0; + var xdoc = XDocumentExtensions.Load(ms); + xdoc.Root.Elements().ForEach(e => writer.WriteRaw(e.ToString())); + } + + writer.WriteEndElement(); + writer.Flush(); + writer.Close(); + } + + // VML Shape for Comment + private static Vml.Shape GenerateShape(XLCell c, string shapeTypeId) + { + var rowNumber = c.Address.RowNumber; + var columnNumber = c.Address.ColumnNumber; + + var shapeId = String.Format("_x0000_s{0}", c.Comment.ShapeId); + // Unique per cell (workbook?), e.g.: "_x0000_s1026" + var anchor = GetAnchor(c); + var textBox = GetTextBox(c.Comment.Style); + var fill = new Vml.Fill { Color2 = "#" + c.Comment.Style.ColorsAndLines.FillColor.Color.ToHex().Substring(2) }; + if (c.Comment.Style.ColorsAndLines.FillTransparency < 1) + fill.Opacity = + Math.Round(Convert.ToDouble(c.Comment.Style.ColorsAndLines.FillTransparency), 2).ToString( + CultureInfo.InvariantCulture); + var stroke = GetStroke(c); + var shape = new Vml.Shape( + fill, + stroke, + new Vml.Shadow { On = true, Color = "black", Obscured = true }, + new Vml.Path { ConnectionPointType = ConnectValues.None }, + textBox, + new ClientData( + new MoveWithCells(c.Comment.Style.Properties.Positioning == XLDrawingAnchor.Absolute + ? "True" + : "False"), // Counterintuitive + new ResizeWithCells(c.Comment.Style.Properties.Positioning == XLDrawingAnchor.MoveAndSizeWithCells + ? "False" + : "True"), // Counterintuitive + anchor, + new HorizontalTextAlignment(c.Comment.Style.Alignment.Horizontal.ToString().ToCamel()), + new Vml.Spreadsheet.VerticalTextAlignment(c.Comment.Style.Alignment.Vertical.ToString().ToCamel()), + new AutoFill("False"), + new CommentRowTarget { Text = (rowNumber - 1).ToString() }, + new CommentColumnTarget { Text = (columnNumber - 1).ToString() }, + new Locked(c.Comment.Style.Protection.Locked ? "True" : "False"), + new LockText(c.Comment.Style.Protection.LockText ? "True" : "False"), + new Visible(c.Comment.Visible ? "True" : "False") + ) + { ObjectType = ObjectValues.Note } + ) + { + Id = shapeId, + Type = "#" + shapeTypeId, + Style = GetCommentStyle(c), + FillColor = "#" + c.Comment.Style.ColorsAndLines.FillColor.Color.ToHex().Substring(2), + StrokeColor = "#" + c.Comment.Style.ColorsAndLines.LineColor.Color.ToHex().Substring(2), + StrokeWeight = String.Format(CultureInfo.InvariantCulture, "{0}pt", c.Comment.Style.ColorsAndLines.LineWeight), + InsetMode = c.Comment.Style.Margins.Automatic ? InsetMarginValues.Auto : InsetMarginValues.Custom + }; + if (!XLHelper.IsNullOrWhiteSpace(c.Comment.Style.Web.AlternateText)) + shape.Alternate = c.Comment.Style.Web.AlternateText; + + return shape; + } + + private static Vml.Stroke GetStroke(XLCell c) + { + var lineDash = c.Comment.Style.ColorsAndLines.LineDash; + var stroke = new Vml.Stroke + { + LineStyle = c.Comment.Style.ColorsAndLines.LineStyle.ToOpenXml(), + DashStyle = + lineDash == XLDashStyle.RoundDot || lineDash == XLDashStyle.SquareDot + ? "shortDot" + : lineDash.ToString().ToCamel() + }; + if (lineDash == XLDashStyle.RoundDot) + stroke.EndCap = Vml.StrokeEndCapValues.Round; + if (c.Comment.Style.ColorsAndLines.LineTransparency < 1) + stroke.Opacity = + Math.Round(Convert.ToDouble(c.Comment.Style.ColorsAndLines.LineTransparency), 2).ToString( + CultureInfo.InvariantCulture); + return stroke; + } + + // http://polymathprogrammer.com/2009/10/22/english-metric-units-and-open-xml/ + // http://archive.oreilly.com/pub/post/what_is_an_emu.html + // https://en.wikipedia.org/wiki/Office_Open_XML_file_formats#DrawingML + private static Int64 ConvertToEnglishMetricUnits(Int32 pixels, Double resolution) + { + return Convert.ToInt64(914400 * pixels / resolution); + } + + private static void AddPictureAnchor(WorksheetPart worksheetPart, Drawings.IXLPicture picture, SaveContext context) + { + var pic = picture as Drawings.XLPicture; + var drawingsPart = worksheetPart.DrawingsPart ?? + worksheetPart.AddNewPart(context.RelIdGenerator.GetNext(RelType.Workbook)); + + if (drawingsPart.WorksheetDrawing == null) + drawingsPart.WorksheetDrawing = new Xdr.WorksheetDrawing(); + + var worksheetDrawing = drawingsPart.WorksheetDrawing; + + // Add namespaces + if (!worksheetDrawing.NamespaceDeclarations.Any(nd => nd.Value.Equals("http://schemas.openxmlformats.org/drawingml/2006/main"))) + worksheetDrawing.AddNamespaceDeclaration("a", "http://schemas.openxmlformats.org/drawingml/2006/main"); + + if (!worksheetDrawing.NamespaceDeclarations.Any(nd => nd.Value.Equals("http://schemas.openxmlformats.org/officeDocument/2006/relationships"))) + worksheetDrawing.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + ///////// + + // Overwrite actual image binary data + ImagePart imagePart; + if (drawingsPart.HasPartWithId(pic.RelId)) + imagePart = drawingsPart.GetPartById(pic.RelId) as ImagePart; + else + imagePart = drawingsPart.AddImagePart(pic.Format.ToOpenXml(), context.RelIdGenerator.GetNext(RelType.Workbook)); + + using (var stream = new MemoryStream()) + { + pic.ImageStream.CopyTo(stream); + stream.Seek(0, SeekOrigin.Begin); + imagePart.FeedData(stream); + } + ///////// + + // Clear current anchors + var existingAnchor = GetAnchorFromImageId(worksheetPart, pic.RelId); + if (existingAnchor != null) + worksheetDrawing.RemoveChild(existingAnchor); + + var extentsCx = ConvertToEnglishMetricUnits(pic.Width, GraphicsUtils.Graphics.DpiX); + var extentsCy = ConvertToEnglishMetricUnits(pic.Height, GraphicsUtils.Graphics.DpiY); + + var nvps = worksheetDrawing.Descendants(); + var nvpId = nvps.Any() ? + (UInt32Value)worksheetDrawing.Descendants().Max(p => p.Id.Value) + 1 : + 1U; + + Xdr.FromMarker fMark; + Xdr.ToMarker tMark; + switch (pic.Placement) + { + case Drawings.XLPicturePlacement.FreeFloating: + var absoluteAnchor = new Xdr.AbsoluteAnchor( + new Xdr.Position + { + X = ConvertToEnglishMetricUnits(pic.Left, GraphicsUtils.Graphics.DpiX), + Y = ConvertToEnglishMetricUnits(pic.Top, GraphicsUtils.Graphics.DpiY) + }, + new Xdr.Extent + { + Cx = extentsCx, + Cy = extentsCy + }, + new Xdr.Picture( + new Xdr.NonVisualPictureProperties( + new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = pic.Name }, + new Xdr.NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true }) + ), + new Xdr.BlipFill( + new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, + new Stretch(new FillRectangle()) + ), + new Xdr.ShapeProperties( + new Transform2D( + new Offset { X = 0, Y = 0 }, + new Extents { Cx = extentsCx, Cy = extentsCy } + ), + new PresetGeometry { Preset = ShapeTypeValues.Rectangle } + ) + ), + new Xdr.ClientData() + ); + + worksheetDrawing.Append(absoluteAnchor); + break; + + case Drawings.XLPicturePlacement.MoveAndSize: + var moveAndSizeFromMarker = pic.Markers[Drawings.XLMarkerPosition.TopLeft]; + fMark = new Xdr.FromMarker + { + ColumnId = new Xdr.ColumnId((moveAndSizeFromMarker.Address.ColumnNumber - 1).ToString()), + RowId = new Xdr.RowId((moveAndSizeFromMarker.Address.RowNumber - 1).ToString()), + ColumnOffset = new Xdr.ColumnOffset(ConvertToEnglishMetricUnits(moveAndSizeFromMarker.Offset.X, GraphicsUtils.Graphics.DpiX).ToString()), + RowOffset = new Xdr.RowOffset(ConvertToEnglishMetricUnits(moveAndSizeFromMarker.Offset.Y, GraphicsUtils.Graphics.DpiY).ToString()) + }; + + var moveAndSizeToMarker = pic.Markers[Drawings.XLMarkerPosition.BottomRight]; + tMark = new Xdr.ToMarker + { + ColumnId = new Xdr.ColumnId((moveAndSizeToMarker.Address.ColumnNumber - 1).ToString()), + RowId = new Xdr.RowId((moveAndSizeToMarker.Address.RowNumber - 1).ToString()), + ColumnOffset = new Xdr.ColumnOffset(ConvertToEnglishMetricUnits(moveAndSizeToMarker.Offset.X, GraphicsUtils.Graphics.DpiX).ToString()), + RowOffset = new Xdr.RowOffset(ConvertToEnglishMetricUnits(moveAndSizeToMarker.Offset.Y, GraphicsUtils.Graphics.DpiY).ToString()) + }; + + var twoCellAnchor = new Xdr.TwoCellAnchor( + fMark, + tMark, + new Xdr.Picture( + new Xdr.NonVisualPictureProperties( + new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = pic.Name }, + new Xdr.NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true }) + ), + new Xdr.BlipFill( + new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, + new Stretch(new FillRectangle()) + ), + new Xdr.ShapeProperties( + new Transform2D( + new Offset { X = 0, Y = 0 }, + new Extents { Cx = extentsCx, Cy = extentsCy } + ), + new PresetGeometry { Preset = ShapeTypeValues.Rectangle } + ) + ), + new Xdr.ClientData() + ); + + worksheetDrawing.Append(twoCellAnchor); + break; + + case Drawings.XLPicturePlacement.Move: + var moveFromMarker = pic.Markers[Drawings.XLMarkerPosition.TopLeft]; + fMark = new Xdr.FromMarker + { + ColumnId = new Xdr.ColumnId((moveFromMarker.Address.ColumnNumber - 1).ToString()), + RowId = new Xdr.RowId((moveFromMarker.Address.RowNumber - 1).ToString()), + ColumnOffset = new Xdr.ColumnOffset(ConvertToEnglishMetricUnits(moveFromMarker.Offset.X, GraphicsUtils.Graphics.DpiX).ToString()), + RowOffset = new Xdr.RowOffset(ConvertToEnglishMetricUnits(moveFromMarker.Offset.Y, GraphicsUtils.Graphics.DpiY).ToString()) + }; + + var oneCellAnchor = new Xdr.OneCellAnchor( + fMark, + new Xdr.Extent + { + Cx = extentsCx, + Cy = extentsCy + }, + new Xdr.Picture( + new Xdr.NonVisualPictureProperties( + new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = pic.Name }, + new Xdr.NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true }) + ), + new Xdr.BlipFill( + new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, + new Stretch(new FillRectangle()) + ), + new Xdr.ShapeProperties( + new Transform2D( + new Offset { X = 0, Y = 0 }, + new Extents { Cx = extentsCx, Cy = extentsCy } + ), + new PresetGeometry { Preset = ShapeTypeValues.Rectangle } + ) + ), + new Xdr.ClientData() + ); + + worksheetDrawing.Append(oneCellAnchor); + break; + } + } + + private static void RebasePictureIds(WorksheetPart worksheetPart) + { + for (var i = 0; i < worksheetPart.DrawingsPart.WorksheetDrawing.ChildElements.Count; i++) + { + var anchor = worksheetPart.DrawingsPart.WorksheetDrawing.ElementAt(i); + var props = GetPropertiesFromAnchor(anchor); + props.Id = Convert.ToUInt32(i + 1); + } + } + + private static Vml.TextBox GetTextBox(IXLDrawingStyle ds) + { + var sb = new StringBuilder(); + var a = ds.Alignment; + + if (a.Direction == XLDrawingTextDirection.Context) + sb.Append("mso-direction-alt:auto;"); + else if (a.Direction == XLDrawingTextDirection.RightToLeft) + sb.Append("direction:RTL;"); + + if (a.Orientation != XLDrawingTextOrientation.LeftToRight) + { + sb.Append("layout-flow:vertical;"); + if (a.Orientation == XLDrawingTextOrientation.BottomToTop) + sb.Append("mso-layout-flow-alt:bottom-to-top;"); + else if (a.Orientation == XLDrawingTextOrientation.Vertical) + sb.Append("mso-layout-flow-alt:top-to-bottom;"); + } + if (a.AutomaticSize) + sb.Append("mso-fit-shape-to-text:t;"); + var retVal = new Vml.TextBox { Style = sb.ToString() }; + var dm = ds.Margins; + if (!dm.Automatic) + retVal.Inset = String.Format("{0}in,{1}in,{2}in,{3}in", + dm.Left.ToInvariantString(), + dm.Top.ToInvariantString(), + dm.Right.ToInvariantString(), + dm.Bottom.ToInvariantString()); + + return retVal; + } + + private static Anchor GetAnchor(XLCell cell) + { + var c = cell.Comment; + var cWidth = c.Style.Size.Width; + var fcNumber = c.Position.Column - 1; + var fcOffset = Convert.ToInt32(c.Position.ColumnOffset * 7.5); + var widthFromColumns = cell.Worksheet.Column(c.Position.Column).Width - c.Position.ColumnOffset; + var lastCell = cell.CellRight(c.Position.Column - cell.Address.ColumnNumber); + while (widthFromColumns <= cWidth) + { + lastCell = lastCell.CellRight(); + widthFromColumns += lastCell.WorksheetColumn().Width; + } + + var lcNumber = lastCell.WorksheetColumn().ColumnNumber() - 1; + var lcOffset = Convert.ToInt32((lastCell.WorksheetColumn().Width - (widthFromColumns - cWidth)) * 7.5); + + var cHeight = c.Style.Size.Height; //c.Style.Size.Height * 72.0; + var frNumber = c.Position.Row - 1; + var frOffset = Convert.ToInt32(c.Position.RowOffset); + var heightFromRows = cell.Worksheet.Row(c.Position.Row).Height - c.Position.RowOffset; + lastCell = cell.CellBelow(c.Position.Row - cell.Address.RowNumber); + while (heightFromRows <= cHeight) + { + lastCell = lastCell.CellBelow(); + heightFromRows += lastCell.WorksheetRow().Height; + } + + var lrNumber = lastCell.WorksheetRow().RowNumber() - 1; + var lrOffset = Convert.ToInt32(lastCell.WorksheetRow().Height - (heightFromRows - cHeight)); + return new Anchor + { + Text = string.Format("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}", + fcNumber, fcOffset, + frNumber, frOffset, + lcNumber, lcOffset, + lrNumber, lrOffset + ) + }; + } + + private static StringValue GetCommentStyle(XLCell cell) + { + var c = cell.Comment; + var sb = new StringBuilder("position:absolute; "); + + sb.Append("visibility:"); + sb.Append(c.Visible ? "visible" : "hidden"); + sb.Append(";"); + + sb.Append("width:"); + sb.Append(Math.Round(c.Style.Size.Width * 7.5, 2).ToInvariantString()); + sb.Append("pt;"); + sb.Append("height:"); + sb.Append(Math.Round(c.Style.Size.Height, 2).ToInvariantString()); + sb.Append("pt;"); + + sb.Append("z-index:"); + sb.Append(c.ZOrder.ToString()); + + return sb.ToString(); + } + + #region GenerateWorkbookStylesPartContent + + private void GenerateWorkbookStylesPartContent(WorkbookStylesPart workbookStylesPart, SaveContext context) + { + var defaultStyle = new XLStyle(null, DefaultStyle); + var defaultStyleId = GetStyleId(defaultStyle); + if (!context.SharedFonts.ContainsKey(defaultStyle.Font)) + context.SharedFonts.Add(defaultStyle.Font, new FontInfo { FontId = 0, Font = defaultStyle.Font as XLFont }); + + var sharedFills = new Dictionary + {{defaultStyle.Fill, new FillInfo {FillId = 2, Fill = defaultStyle.Fill as XLFill}}}; + + var sharedBorders = new Dictionary + {{defaultStyle.Border, new BorderInfo {BorderId = 0, Border = defaultStyle.Border as XLBorder}}}; + + var sharedNumberFormats = new Dictionary + { + { + defaultStyle.NumberFormat, + new NumberFormatInfo + {NumberFormatId = 0, NumberFormat = defaultStyle.NumberFormat} + } + }; + + //Dictionary sharedAlignments = new Dictionary(); + //sharedAlignments.Add(defaultStyle.Alignment.ToString(), new AlignmentInfo() { AlignmentId = 0, Alignment = defaultStyle.Alignment }); + + if (workbookStylesPart.Stylesheet == null) + workbookStylesPart.Stylesheet = new Stylesheet(); + + // Cell styles = Named styles + if (workbookStylesPart.Stylesheet.CellStyles == null) + workbookStylesPart.Stylesheet.CellStyles = new CellStyles(); + + // To determine the default workbook style, we look for the style with builtInId = 0 (I hope that is the correct approach) + UInt32 defaultFormatId; + if (workbookStylesPart.Stylesheet.CellStyles.Elements().Any(c => c.BuiltinId != null && c.BuiltinId.HasValue && c.BuiltinId.Value == 0)) + { + // Possible to have duplicate default cell styles - occurs when file gets saved under different cultures. + // We prefer the style that is named Normal + var normalCellStyles = workbookStylesPart.Stylesheet.CellStyles.Elements() + .Where(c => c.BuiltinId != null && c.BuiltinId.HasValue && c.BuiltinId.Value == 0) + .OrderBy(c => c.Name != null && c.Name.HasValue && c.Name.Value == "Normal"); + + defaultFormatId = normalCellStyles.Last().FormatId.Value; + } + else if (workbookStylesPart.Stylesheet.CellStyles.Elements().Any()) + defaultFormatId = workbookStylesPart.Stylesheet.CellStyles.Elements().Max(c => c.FormatId.Value) + 1; + else + defaultFormatId = 0; + + context.SharedStyles.Add(defaultStyleId, + new StyleInfo + { + StyleId = defaultFormatId, + Style = defaultStyle, + FontId = 0, + FillId = 0, + BorderId = 0, + NumberFormatId = 0 + //AlignmentId = 0 + }); + + UInt32 styleCount = 1; + UInt32 fontCount = 1; + UInt32 fillCount = 3; + UInt32 borderCount = 1; + var numberFormatCount = 1; + var xlStyles = new HashSet(); + var pivotTableNumberFormats = new HashSet(); + + foreach (var worksheet in WorksheetsInternal) + { + foreach (var s in worksheet.GetStyleIds().Where(s => !xlStyles.Contains(s))) + xlStyles.Add(s); + + foreach ( + var s in + worksheet.Internals.ColumnsCollection.Select(kp => kp.Value.GetStyleId()).Where( + s => !xlStyles.Contains(s))) + xlStyles.Add(s); + + foreach ( + var s in + worksheet.Internals.RowsCollection.Select(kp => kp.Value.GetStyleId()).Where( + s => !xlStyles.Contains(s)) + ) + xlStyles.Add(s); + + foreach (var ptnf in worksheet.PivotTables.SelectMany(pt => pt.Values.Select(ptv => ptv.NumberFormat)).Distinct().Where(nf => !pivotTableNumberFormats.Contains(nf))) + pivotTableNumberFormats.Add(ptnf); + } + + foreach (var numberFormat in pivotTableNumberFormats) + { + if (numberFormat.NumberFormatId != -1 + || sharedNumberFormats.ContainsKey(numberFormat)) + continue; + + sharedNumberFormats.Add(numberFormat, + new NumberFormatInfo + { + NumberFormatId = XLConstants.NumberOfBuiltInStyles + numberFormatCount, + NumberFormat = numberFormat + }); + numberFormatCount++; + } + + foreach (var xlStyle in xlStyles.Select(GetStyleById)) + { + if (!context.SharedFonts.ContainsKey(xlStyle.Font)) + context.SharedFonts.Add(xlStyle.Font, + new FontInfo { FontId = fontCount++, Font = xlStyle.Font as XLFont }); + + if (!sharedFills.ContainsKey(xlStyle.Fill)) + sharedFills.Add(xlStyle.Fill, new FillInfo { FillId = fillCount++, Fill = xlStyle.Fill as XLFill }); + + if (!sharedBorders.ContainsKey(xlStyle.Border)) + sharedBorders.Add(xlStyle.Border, + new BorderInfo { BorderId = borderCount++, Border = xlStyle.Border as XLBorder }); + + if (xlStyle.NumberFormat.NumberFormatId != -1 + || sharedNumberFormats.ContainsKey(xlStyle.NumberFormat)) + continue; + + sharedNumberFormats.Add(xlStyle.NumberFormat, + new NumberFormatInfo + { + NumberFormatId = XLConstants.NumberOfBuiltInStyles + numberFormatCount, + NumberFormat = xlStyle.NumberFormat + }); + numberFormatCount++; + } + + var allSharedNumberFormats = ResolveNumberFormats(workbookStylesPart, sharedNumberFormats, defaultFormatId); + foreach (var nf in allSharedNumberFormats) + { + context.SharedNumberFormats.Add(nf.Value.NumberFormatId, nf.Value); + } + + ResolveFonts(workbookStylesPart, context); + var allSharedFills = ResolveFills(workbookStylesPart, sharedFills); + var allSharedBorders = ResolveBorders(workbookStylesPart, sharedBorders); + + foreach (var id in xlStyles) + { + var xlStyle = GetStyleById(id); + if (context.SharedStyles.ContainsKey(id)) continue; + + var numberFormatId = xlStyle.NumberFormat.NumberFormatId >= 0 + ? xlStyle.NumberFormat.NumberFormatId + : allSharedNumberFormats[xlStyle.NumberFormat].NumberFormatId; + + context.SharedStyles.Add(id, + new StyleInfo + { + StyleId = styleCount++, + Style = xlStyle, + FontId = context.SharedFonts[xlStyle.Font].FontId, + FillId = allSharedFills[xlStyle.Fill].FillId, + BorderId = allSharedBorders[xlStyle.Border].BorderId, + NumberFormatId = numberFormatId + }); + } + + ResolveCellStyleFormats(workbookStylesPart, context); + ResolveRest(workbookStylesPart, context); + + if (!workbookStylesPart.Stylesheet.CellStyles.Elements().Any(c => c.BuiltinId != null && c.BuiltinId.HasValue && c.BuiltinId.Value == 0U)) + workbookStylesPart.Stylesheet.CellStyles.AppendChild(new CellStyle { Name = "Normal", FormatId = defaultFormatId, BuiltinId = 0U }); + + workbookStylesPart.Stylesheet.CellStyles.Count = (UInt32)workbookStylesPart.Stylesheet.CellStyles.Count(); + + var newSharedStyles = new Dictionary(); + foreach (var ss in context.SharedStyles) + { + var styleId = -1; + foreach (CellFormat f in workbookStylesPart.Stylesheet.CellFormats) + { + styleId++; + if (CellFormatsAreEqual(f, ss.Value)) + break; + } + if (styleId == -1) + styleId = 0; + var si = ss.Value; + si.StyleId = (UInt32)styleId; + newSharedStyles.Add(ss.Key, si); + } + context.SharedStyles.Clear(); + newSharedStyles.ForEach(kp => context.SharedStyles.Add(kp.Key, kp.Value)); + + AddDifferentialFormats(workbookStylesPart, context); + } + + private void AddDifferentialFormats(WorkbookStylesPart workbookStylesPart, SaveContext context) + { + if (workbookStylesPart.Stylesheet.DifferentialFormats == null) + workbookStylesPart.Stylesheet.DifferentialFormats = new DifferentialFormats(); + + var differentialFormats = workbookStylesPart.Stylesheet.DifferentialFormats; + + FillDifferentialFormatsCollection(differentialFormats, context.DifferentialFormats); + + foreach (var ws in Worksheets) + { + foreach (var cf in ws.ConditionalFormats) + { + if (!context.DifferentialFormats.ContainsKey(cf.Style)) + AddDifferentialFormat(workbookStylesPart.Stylesheet.DifferentialFormats, cf, context); + } + } + + differentialFormats.Count = (UInt32)differentialFormats.Count(); + if (differentialFormats.Count == 0) + workbookStylesPart.Stylesheet.DifferentialFormats = null; + } + + private void FillDifferentialFormatsCollection(DifferentialFormats differentialFormats, + Dictionary dictionary) + { + dictionary.Clear(); + var id = 0; + foreach (var df in differentialFormats.Elements()) + { + var style = new XLStyle(new XLStylizedEmpty(DefaultStyle), DefaultStyle); + LoadFont(df.Font, style.Font); + LoadBorder(df.Border, style.Border); + LoadNumberFormat(df.NumberingFormat, style.NumberFormat); + LoadFill(df.Fill, style.Fill); + if (!dictionary.ContainsKey(style)) + dictionary.Add(style, ++id); + } + } + + private static void AddDifferentialFormat(DifferentialFormats differentialFormats, IXLConditionalFormat cf, + SaveContext context) + { + var differentialFormat = new DifferentialFormat(); + differentialFormat.Append(GetNewFont(new FontInfo { Font = cf.Style.Font as XLFont }, false)); + if (!XLHelper.IsNullOrWhiteSpace(cf.Style.NumberFormat.Format)) + { + var numberFormat = new NumberingFormat + { + NumberFormatId = (UInt32)(XLConstants.NumberOfBuiltInStyles + differentialFormats.Count()), + FormatCode = cf.Style.NumberFormat.Format + }; + differentialFormat.Append(numberFormat); + } + differentialFormat.Append(GetNewFill(new FillInfo { Fill = cf.Style.Fill as XLFill }, false)); + differentialFormat.Append(GetNewBorder(new BorderInfo { Border = cf.Style.Border as XLBorder }, false)); + + differentialFormats.Append(differentialFormat); + + context.DifferentialFormats.Add(cf.Style, differentialFormats.Count() - 1); + } + + private static void ResolveRest(WorkbookStylesPart workbookStylesPart, SaveContext context) + { + if (workbookStylesPart.Stylesheet.CellFormats == null) + workbookStylesPart.Stylesheet.CellFormats = new CellFormats(); + + foreach (var styleInfo in context.SharedStyles.Values) + { + var info = styleInfo; + var foundOne = + workbookStylesPart.Stylesheet.CellFormats.Cast().Any(f => CellFormatsAreEqual(f, info)); + + if (foundOne) continue; + + var cellFormat = GetCellFormat(styleInfo); + cellFormat.FormatId = 0; + var alignment = new Alignment + { + Horizontal = styleInfo.Style.Alignment.Horizontal.ToOpenXml(), + Vertical = styleInfo.Style.Alignment.Vertical.ToOpenXml(), + Indent = (UInt32)styleInfo.Style.Alignment.Indent, + ReadingOrder = (UInt32)styleInfo.Style.Alignment.ReadingOrder, + WrapText = styleInfo.Style.Alignment.WrapText, + TextRotation = (UInt32)styleInfo.Style.Alignment.TextRotation, + ShrinkToFit = styleInfo.Style.Alignment.ShrinkToFit, + RelativeIndent = styleInfo.Style.Alignment.RelativeIndent, + JustifyLastLine = styleInfo.Style.Alignment.JustifyLastLine + }; + cellFormat.AppendChild(alignment); + + if (cellFormat.ApplyProtection.Value) + cellFormat.AppendChild(GetProtection(styleInfo)); + + workbookStylesPart.Stylesheet.CellFormats.AppendChild(cellFormat); + } + workbookStylesPart.Stylesheet.CellFormats.Count = (UInt32)workbookStylesPart.Stylesheet.CellFormats.Count(); + } + + private static void ResolveCellStyleFormats(WorkbookStylesPart workbookStylesPart, + SaveContext context) + { + if (workbookStylesPart.Stylesheet.CellStyleFormats == null) + workbookStylesPart.Stylesheet.CellStyleFormats = new CellStyleFormats(); + + foreach (var styleInfo in context.SharedStyles.Values) + { + var info = styleInfo; + var foundOne = + workbookStylesPart.Stylesheet.CellStyleFormats.Cast().Any( + f => CellFormatsAreEqual(f, info)); + + if (foundOne) continue; + + var cellStyleFormat = GetCellFormat(styleInfo); + + if (cellStyleFormat.ApplyProtection.Value) + cellStyleFormat.AppendChild(GetProtection(styleInfo)); + + workbookStylesPart.Stylesheet.CellStyleFormats.AppendChild(cellStyleFormat); + } + workbookStylesPart.Stylesheet.CellStyleFormats.Count = + (UInt32)workbookStylesPart.Stylesheet.CellStyleFormats.Count(); + } + + private static bool ApplyFill(StyleInfo styleInfo) + { + return styleInfo.Style.Fill.PatternType.ToOpenXml() == PatternValues.None; + } + + private static bool ApplyBorder(StyleInfo styleInfo) + { + var opBorder = styleInfo.Style.Border; + return (opBorder.BottomBorder.ToOpenXml() != BorderStyleValues.None + || opBorder.DiagonalBorder.ToOpenXml() != BorderStyleValues.None + || opBorder.RightBorder.ToOpenXml() != BorderStyleValues.None + || opBorder.LeftBorder.ToOpenXml() != BorderStyleValues.None + || opBorder.TopBorder.ToOpenXml() != BorderStyleValues.None); + } + + private static bool ApplyProtection(StyleInfo styleInfo) + { + return styleInfo.Style.Protection != null; + } + + private static CellFormat GetCellFormat(StyleInfo styleInfo) + { + var cellFormat = new CellFormat + { + NumberFormatId = (UInt32)styleInfo.NumberFormatId, + FontId = styleInfo.FontId, + FillId = styleInfo.FillId, + BorderId = styleInfo.BorderId, + ApplyNumberFormat = true, + ApplyAlignment = true, + ApplyFill = ApplyFill(styleInfo), + ApplyBorder = ApplyBorder(styleInfo), + ApplyProtection = ApplyProtection(styleInfo) + }; + return cellFormat; + } + + private static Protection GetProtection(StyleInfo styleInfo) + { + return new Protection + { + Locked = styleInfo.Style.Protection.Locked, + Hidden = styleInfo.Style.Protection.Hidden + }; + } + + private static bool CellFormatsAreEqual(CellFormat f, StyleInfo styleInfo) + { + return + f.BorderId != null && styleInfo.BorderId == f.BorderId + && f.FillId != null && styleInfo.FillId == f.FillId + && f.FontId != null && styleInfo.FontId == f.FontId + && f.NumberFormatId != null && styleInfo.NumberFormatId == f.NumberFormatId + && f.ApplyFill != null && f.ApplyFill == ApplyFill(styleInfo) + && f.ApplyBorder != null && f.ApplyBorder == ApplyBorder(styleInfo) + && AlignmentsAreEqual(f.Alignment, styleInfo.Style.Alignment) + && ProtectionsAreEqual(f.Protection, styleInfo.Style.Protection) + ; + } + + private static bool ProtectionsAreEqual(Protection protection, IXLProtection xlProtection) + { + var p = new XLProtection(); + if (protection != null) + { + if (protection.Locked != null) + p.Locked = protection.Locked.Value; + if (protection.Hidden != null) + p.Hidden = protection.Hidden.Value; + } + return p.Equals(xlProtection); + } + + private static bool AlignmentsAreEqual(Alignment alignment, IXLAlignment xlAlignment) + { + var a = new XLAlignment(); + if (alignment != null) + { + if (alignment.Indent != null) + a.Indent = (Int32)alignment.Indent.Value; + + if (alignment.Horizontal != null) + a.Horizontal = alignment.Horizontal.Value.ToClosedXml(); + if (alignment.Vertical != null) + a.Vertical = alignment.Vertical.Value.ToClosedXml(); + + if (alignment.ReadingOrder != null) + a.ReadingOrder = alignment.ReadingOrder.Value.ToClosedXml(); + if (alignment.WrapText != null) + a.WrapText = alignment.WrapText.Value; + if (alignment.TextRotation != null) + a.TextRotation = (Int32)alignment.TextRotation.Value; + if (alignment.ShrinkToFit != null) + a.ShrinkToFit = alignment.ShrinkToFit.Value; + if (alignment.RelativeIndent != null) + a.RelativeIndent = alignment.RelativeIndent.Value; + if (alignment.JustifyLastLine != null) + a.JustifyLastLine = alignment.JustifyLastLine.Value; + } + return a.Equals(xlAlignment); + } + + private Dictionary ResolveBorders(WorkbookStylesPart workbookStylesPart, + Dictionary sharedBorders) + { + if (workbookStylesPart.Stylesheet.Borders == null) + workbookStylesPart.Stylesheet.Borders = new Borders(); + + var allSharedBorders = new Dictionary(); + foreach (var borderInfo in sharedBorders.Values) + { + var borderId = 0; + var foundOne = false; + foreach (Border f in workbookStylesPart.Stylesheet.Borders) + { + if (BordersAreEqual(f, borderInfo.Border)) + { + foundOne = true; + break; + } + borderId++; + } + if (!foundOne) + { + var border = GetNewBorder(borderInfo); + workbookStylesPart.Stylesheet.Borders.AppendChild(border); + } + allSharedBorders.Add(borderInfo.Border, + new BorderInfo { Border = borderInfo.Border, BorderId = (UInt32)borderId }); + } + workbookStylesPart.Stylesheet.Borders.Count = (UInt32)workbookStylesPart.Stylesheet.Borders.Count(); + return allSharedBorders; + } + + private static Border GetNewBorder(BorderInfo borderInfo, Boolean ignoreMod = true) + { + var border = new Border(); + if (borderInfo.Border.DiagonalUpModified || ignoreMod) + border.DiagonalUp = borderInfo.Border.DiagonalUp; + + if (borderInfo.Border.DiagonalDownModified || ignoreMod) + border.DiagonalDown = borderInfo.Border.DiagonalDown; + + if (borderInfo.Border.LeftBorderModified || borderInfo.Border.LeftBorderColorModified || ignoreMod) + { + var leftBorder = new LeftBorder { Style = borderInfo.Border.LeftBorder.ToOpenXml() }; + if (borderInfo.Border.LeftBorderColorModified || ignoreMod) + { + var leftBorderColor = GetNewColor(borderInfo.Border.LeftBorderColor); + leftBorder.AppendChild(leftBorderColor); + } + border.AppendChild(leftBorder); + } + + if (borderInfo.Border.RightBorderModified || borderInfo.Border.RightBorderColorModified || ignoreMod) + { + var rightBorder = new RightBorder { Style = borderInfo.Border.RightBorder.ToOpenXml() }; + if (borderInfo.Border.RightBorderColorModified || ignoreMod) + { + var rightBorderColor = GetNewColor(borderInfo.Border.RightBorderColor); + rightBorder.AppendChild(rightBorderColor); + } + border.AppendChild(rightBorder); + } + + if (borderInfo.Border.TopBorderModified || borderInfo.Border.TopBorderColorModified || ignoreMod) + { + var topBorder = new TopBorder { Style = borderInfo.Border.TopBorder.ToOpenXml() }; + if (borderInfo.Border.TopBorderColorModified || ignoreMod) + { + var topBorderColor = GetNewColor(borderInfo.Border.TopBorderColor); + topBorder.AppendChild(topBorderColor); + } + border.AppendChild(topBorder); + } + + if (borderInfo.Border.BottomBorderModified || borderInfo.Border.BottomBorderColorModified || ignoreMod) + { + var bottomBorder = new BottomBorder { Style = borderInfo.Border.BottomBorder.ToOpenXml() }; + if (borderInfo.Border.BottomBorderColorModified || ignoreMod) + { + var bottomBorderColor = GetNewColor(borderInfo.Border.BottomBorderColor); + bottomBorder.AppendChild(bottomBorderColor); + } + border.AppendChild(bottomBorder); + } + + if (borderInfo.Border.DiagonalBorderModified || borderInfo.Border.DiagonalBorderColorModified || ignoreMod) + { + var DiagonalBorder = new DiagonalBorder { Style = borderInfo.Border.DiagonalBorder.ToOpenXml() }; + if (borderInfo.Border.DiagonalBorderColorModified || ignoreMod) + { + var DiagonalBorderColor = GetNewColor(borderInfo.Border.DiagonalBorderColor); + DiagonalBorder.AppendChild(DiagonalBorderColor); + } + border.AppendChild(DiagonalBorder); + } + + return border; + } + + private bool BordersAreEqual(Border b, IXLBorder xlBorder) + { + var nb = new XLBorder(); + if (b.DiagonalUp != null) + nb.DiagonalUp = b.DiagonalUp.Value; + + if (b.DiagonalDown != null) + nb.DiagonalDown = b.DiagonalDown.Value; + + if (b.LeftBorder != null) + { + if (b.LeftBorder.Style != null) + nb.LeftBorder = b.LeftBorder.Style.Value.ToClosedXml(); + var bColor = GetColor(b.LeftBorder.Color); + if (bColor.HasValue) + nb.LeftBorderColor = bColor; + } + + if (b.RightBorder != null) + { + if (b.RightBorder.Style != null) + nb.RightBorder = b.RightBorder.Style.Value.ToClosedXml(); + var bColor = GetColor(b.RightBorder.Color); + if (bColor.HasValue) + nb.RightBorderColor = bColor; + } + + if (b.TopBorder != null) + { + if (b.TopBorder.Style != null) + nb.TopBorder = b.TopBorder.Style.Value.ToClosedXml(); + var bColor = GetColor(b.TopBorder.Color); + if (bColor.HasValue) + nb.TopBorderColor = bColor; + } + + if (b.BottomBorder != null) + { + if (b.BottomBorder.Style != null) + nb.BottomBorder = b.BottomBorder.Style.Value.ToClosedXml(); + var bColor = GetColor(b.BottomBorder.Color); + if (bColor.HasValue) + nb.BottomBorderColor = bColor; + } + + return nb.Equals(xlBorder); + } + + private Dictionary ResolveFills(WorkbookStylesPart workbookStylesPart, + Dictionary sharedFills) + { + if (workbookStylesPart.Stylesheet.Fills == null) + workbookStylesPart.Stylesheet.Fills = new Fills(); + + ResolveFillWithPattern(workbookStylesPart.Stylesheet.Fills, PatternValues.None); + ResolveFillWithPattern(workbookStylesPart.Stylesheet.Fills, PatternValues.Gray125); + + var allSharedFills = new Dictionary(); + foreach (var fillInfo in sharedFills.Values) + { + var fillId = 0; + var foundOne = false; + foreach (Fill f in workbookStylesPart.Stylesheet.Fills) + { + if (FillsAreEqual(f, fillInfo.Fill)) + { + foundOne = true; + break; + } + fillId++; + } + if (!foundOne) + { + var fill = GetNewFill(fillInfo); + workbookStylesPart.Stylesheet.Fills.AppendChild(fill); + } + allSharedFills.Add(fillInfo.Fill, new FillInfo { Fill = fillInfo.Fill, FillId = (UInt32)fillId }); + } + + workbookStylesPart.Stylesheet.Fills.Count = (UInt32)workbookStylesPart.Stylesheet.Fills.Count(); + return allSharedFills; + } + + private static void ResolveFillWithPattern(Fills fills, PatternValues patternValues) + { + if (fills.Elements().Any(f => + f.PatternFill.PatternType == patternValues + && f.PatternFill.ForegroundColor == null + && f.PatternFill.BackgroundColor == null + )) return; + + var fill1 = new Fill(); + var patternFill1 = new PatternFill { PatternType = patternValues }; + fill1.AppendChild(patternFill1); + fills.AppendChild(fill1); + } + + private static Fill GetNewFill(FillInfo fillInfo, Boolean ignoreMod = true) + { + var fill = new Fill(); + + var patternFill = new PatternFill(); + if (fillInfo.Fill.PatternTypeModified || ignoreMod) + patternFill.PatternType = fillInfo.Fill.PatternType.ToOpenXml(); + + if (fillInfo.Fill.PatternColorModified || ignoreMod) + { + var foregroundColor = new ForegroundColor(); + if (fillInfo.Fill.PatternColor.ColorType == XLColorType.Color) + foregroundColor.Rgb = fillInfo.Fill.PatternColor.Color.ToHex(); + else if (fillInfo.Fill.PatternColor.ColorType == XLColorType.Indexed) + foregroundColor.Indexed = (UInt32)fillInfo.Fill.PatternColor.Indexed; + else + { + foregroundColor.Theme = (UInt32)fillInfo.Fill.PatternColor.ThemeColor; + if (fillInfo.Fill.PatternColor.ThemeTint != 0) + foregroundColor.Tint = fillInfo.Fill.PatternColor.ThemeTint; + } + patternFill.AppendChild(foregroundColor); + } + + if (fillInfo.Fill.PatternBackgroundColorModified || ignoreMod) + { + var backgroundColor = new BackgroundColor(); + if (fillInfo.Fill.PatternBackgroundColor.ColorType == XLColorType.Color) + backgroundColor.Rgb = fillInfo.Fill.PatternBackgroundColor.Color.ToHex(); + else if (fillInfo.Fill.PatternBackgroundColor.ColorType == XLColorType.Indexed) + backgroundColor.Indexed = (UInt32)fillInfo.Fill.PatternBackgroundColor.Indexed; + else + { + backgroundColor.Theme = (UInt32)fillInfo.Fill.PatternBackgroundColor.ThemeColor; + if (fillInfo.Fill.PatternBackgroundColor.ThemeTint != 0) + backgroundColor.Tint = fillInfo.Fill.PatternBackgroundColor.ThemeTint; + } + patternFill.AppendChild(backgroundColor); + } + + fill.AppendChild(patternFill); + + return fill; + } + + private bool FillsAreEqual(Fill f, IXLFill xlFill) + { + var nF = new XLFill(); + if (f.PatternFill != null) + { + if (f.PatternFill.PatternType != null) + nF.PatternType = f.PatternFill.PatternType.Value.ToClosedXml(); + + var fColor = GetColor(f.PatternFill.ForegroundColor); + if (fColor.HasValue) + nF.PatternColor = fColor; + + var bColor = GetColor(f.PatternFill.BackgroundColor); + if (bColor.HasValue) + nF.PatternBackgroundColor = bColor; + } + return nF.Equals(xlFill); + } + + private void ResolveFonts(WorkbookStylesPart workbookStylesPart, SaveContext context) + { + if (workbookStylesPart.Stylesheet.Fonts == null) + workbookStylesPart.Stylesheet.Fonts = new Fonts(); + + var newFonts = new Dictionary(); + foreach (var fontInfo in context.SharedFonts.Values) + { + var fontId = 0; + var foundOne = false; + foreach (Font f in workbookStylesPart.Stylesheet.Fonts) + { + if (FontsAreEqual(f, fontInfo.Font)) + { + foundOne = true; + break; + } + fontId++; + } + if (!foundOne) + { + var font = GetNewFont(fontInfo); + workbookStylesPart.Stylesheet.Fonts.AppendChild(font); + } + newFonts.Add(fontInfo.Font, new FontInfo { Font = fontInfo.Font, FontId = (UInt32)fontId }); + } + context.SharedFonts.Clear(); + foreach (var kp in newFonts) + context.SharedFonts.Add(kp.Key, kp.Value); + + workbookStylesPart.Stylesheet.Fonts.Count = (UInt32)workbookStylesPart.Stylesheet.Fonts.Count(); + } + + private static Font GetNewFont(FontInfo fontInfo, Boolean ignoreMod = true) + { + var font = new Font(); + var bold = (fontInfo.Font.BoldModified || ignoreMod) && fontInfo.Font.Bold ? new Bold() : null; + var italic = (fontInfo.Font.ItalicModified || ignoreMod) && fontInfo.Font.Italic ? new Italic() : null; + var underline = (fontInfo.Font.UnderlineModified || ignoreMod) && + fontInfo.Font.Underline != XLFontUnderlineValues.None + ? new Underline { Val = fontInfo.Font.Underline.ToOpenXml() } + : null; + var strike = (fontInfo.Font.StrikethroughModified || ignoreMod) && fontInfo.Font.Strikethrough + ? new Strike() + : null; + var verticalAlignment = fontInfo.Font.VerticalAlignmentModified || ignoreMod + ? new VerticalTextAlignment { Val = fontInfo.Font.VerticalAlignment.ToOpenXml() } + : null; + var shadow = (fontInfo.Font.ShadowModified || ignoreMod) && fontInfo.Font.Shadow ? new Shadow() : null; + var fontSize = fontInfo.Font.FontSizeModified || ignoreMod + ? new FontSize { Val = fontInfo.Font.FontSize } + : null; + var color = fontInfo.Font.FontColorModified || ignoreMod ? GetNewColor(fontInfo.Font.FontColor) : null; + + var fontName = fontInfo.Font.FontNameModified || ignoreMod + ? new FontName { Val = fontInfo.Font.FontName } + : null; + var fontFamilyNumbering = fontInfo.Font.FontFamilyNumberingModified || ignoreMod + ? new FontFamilyNumbering { Val = (Int32)fontInfo.Font.FontFamilyNumbering } + : null; + + if (bold != null) + font.AppendChild(bold); + if (italic != null) + font.AppendChild(italic); + if (underline != null) + font.AppendChild(underline); + if (strike != null) + font.AppendChild(strike); + if (verticalAlignment != null) + font.AppendChild(verticalAlignment); + if (shadow != null) + font.AppendChild(shadow); + if (fontSize != null) + font.AppendChild(fontSize); + if (color != null) + font.AppendChild(color); + if (fontName != null) + font.AppendChild(fontName); + if (fontFamilyNumbering != null) + font.AppendChild(fontFamilyNumbering); + + return font; + } + + private static Color GetNewColor(XLColor xlColor) + { + var color = new Color(); + if (xlColor.ColorType == XLColorType.Color) + color.Rgb = xlColor.Color.ToHex(); + else if (xlColor.ColorType == XLColorType.Indexed) + color.Indexed = (UInt32)xlColor.Indexed; + else + { + color.Theme = (UInt32)xlColor.ThemeColor; + if (xlColor.ThemeTint != 0) + color.Tint = xlColor.ThemeTint; + } + return color; + } + + private static TabColor GetTabColor(XLColor xlColor) + { + var color = new TabColor(); + if (xlColor.ColorType == XLColorType.Color) + color.Rgb = xlColor.Color.ToHex(); + else if (xlColor.ColorType == XLColorType.Indexed) + color.Indexed = (UInt32)xlColor.Indexed; + else + { + color.Theme = (UInt32)xlColor.ThemeColor; + if (xlColor.ThemeTint != 0) + color.Tint = xlColor.ThemeTint; + } + return color; + } + + private bool FontsAreEqual(Font f, IXLFont xlFont) + { + var nf = new XLFont { Bold = f.Bold != null, Italic = f.Italic != null }; + if (f.Underline != null) + { + nf.Underline = f.Underline.Val != null + ? f.Underline.Val.Value.ToClosedXml() + : XLFontUnderlineValues.Single; + } + nf.Strikethrough = f.Strike != null; + if (f.VerticalTextAlignment != null) + { + nf.VerticalAlignment = f.VerticalTextAlignment.Val != null + ? f.VerticalTextAlignment.Val.Value.ToClosedXml() + : XLFontVerticalTextAlignmentValues.Baseline; + } + nf.Shadow = f.Shadow != null; + if (f.FontSize != null) + nf.FontSize = f.FontSize.Val; + var fColor = GetColor(f.Color); + if (fColor.HasValue) + nf.FontColor = fColor; + if (f.FontName != null) + nf.FontName = f.FontName.Val; + if (f.FontFamilyNumbering != null) + nf.FontFamilyNumbering = (XLFontFamilyNumberingValues)f.FontFamilyNumbering.Val.Value; + + return nf.Equals(xlFont); + } + + private static Dictionary ResolveNumberFormats( + WorkbookStylesPart workbookStylesPart, + Dictionary sharedNumberFormats, + UInt32 defaultFormatId) + { + if (workbookStylesPart.Stylesheet.NumberingFormats == null) + { + workbookStylesPart.Stylesheet.NumberingFormats = new NumberingFormats(); + workbookStylesPart.Stylesheet.NumberingFormats.AppendChild(new NumberingFormat() + { + NumberFormatId = 0, + FormatCode = "" + }); + } + + var allSharedNumberFormats = new Dictionary(); + foreach (var numberFormatInfo in sharedNumberFormats.Values.Where(nf => nf.NumberFormatId != defaultFormatId)) + { + var numberingFormatId = XLConstants.NumberOfBuiltInStyles + 1; + var foundOne = false; + foreach (NumberingFormat nf in workbookStylesPart.Stylesheet.NumberingFormats) + { + if (NumberFormatsAreEqual(nf, numberFormatInfo.NumberFormat)) + { + foundOne = true; + numberingFormatId = (Int32)nf.NumberFormatId.Value; + break; + } + numberingFormatId++; + } + if (!foundOne) + { + var numberingFormat = new NumberingFormat + { + NumberFormatId = (UInt32)numberingFormatId, + FormatCode = numberFormatInfo.NumberFormat.Format + }; + workbookStylesPart.Stylesheet.NumberingFormats.AppendChild(numberingFormat); + } + allSharedNumberFormats.Add(numberFormatInfo.NumberFormat, + new NumberFormatInfo + { + NumberFormat = numberFormatInfo.NumberFormat, + NumberFormatId = numberingFormatId + }); + } + workbookStylesPart.Stylesheet.NumberingFormats.Count = + (UInt32)workbookStylesPart.Stylesheet.NumberingFormats.Count(); + return allSharedNumberFormats; + } + + private static bool NumberFormatsAreEqual(NumberingFormat nf, IXLNumberFormatBase xlNumberFormat) + { + var newXLNumberFormat = new XLNumberFormat(); + + if (nf.FormatCode != null && !XLHelper.IsNullOrWhiteSpace(nf.FormatCode.Value)) + newXLNumberFormat.Format = nf.FormatCode.Value; + else if (nf.NumberFormatId != null) + newXLNumberFormat.NumberFormatId = (Int32)nf.NumberFormatId.Value; + + return newXLNumberFormat.Equals(xlNumberFormat); + } + + #endregion GenerateWorkbookStylesPartContent + + #region GenerateWorksheetPartContent + + private static void GenerateWorksheetPartContent(WorksheetPart worksheetPart, XLWorksheet xlWorksheet, + SaveContext context) + { + #region Worksheet + + if (worksheetPart.Worksheet == null) + worksheetPart.Worksheet = new Worksheet(); + + GenerateTables(xlWorksheet, worksheetPart, context); + + if ( + !worksheetPart.Worksheet.NamespaceDeclarations.Contains(new KeyValuePair("r", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships"))) + { + worksheetPart.Worksheet.AddNamespaceDeclaration("r", + "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + } + + #endregion Worksheet + + var cm = new XLWSContentManager(worksheetPart.Worksheet); + + #region SheetProperties + + if (worksheetPart.Worksheet.SheetProperties == null) + worksheetPart.Worksheet.SheetProperties = new SheetProperties(); + + worksheetPart.Worksheet.SheetProperties.TabColor = xlWorksheet.TabColor.HasValue + ? GetTabColor(xlWorksheet.TabColor) + : null; + + cm.SetElement(XLWSContentManager.XLWSContents.SheetProperties, worksheetPart.Worksheet.SheetProperties); + + if (worksheetPart.Worksheet.SheetProperties.OutlineProperties == null) + worksheetPart.Worksheet.SheetProperties.OutlineProperties = new OutlineProperties(); + + worksheetPart.Worksheet.SheetProperties.OutlineProperties.SummaryBelow = + (xlWorksheet.Outline.SummaryVLocation == + XLOutlineSummaryVLocation.Bottom); + worksheetPart.Worksheet.SheetProperties.OutlineProperties.SummaryRight = + (xlWorksheet.Outline.SummaryHLocation == + XLOutlineSummaryHLocation.Right); + + if (worksheetPart.Worksheet.SheetProperties.PageSetupProperties == null + && (xlWorksheet.PageSetup.PagesTall > 0 || xlWorksheet.PageSetup.PagesWide > 0)) + worksheetPart.Worksheet.SheetProperties.PageSetupProperties = new PageSetupProperties { FitToPage = true }; + + #endregion SheetProperties + + var maxColumn = 0; + + var sheetDimensionReference = "A1"; + if (xlWorksheet.Internals.CellsCollection.Count > 0) + { + maxColumn = xlWorksheet.Internals.CellsCollection.MaxColumnUsed; + var maxRow = xlWorksheet.Internals.CellsCollection.MaxRowUsed; + sheetDimensionReference = "A1:" + XLHelper.GetColumnLetterFromNumber(maxColumn) + + maxRow.ToInvariantString(); + } + + if (xlWorksheet.Internals.ColumnsCollection.Count > 0) + { + var maxColCollection = xlWorksheet.Internals.ColumnsCollection.Keys.Max(); + if (maxColCollection > maxColumn) + maxColumn = maxColCollection; + } + + #region SheetViews + + if (worksheetPart.Worksheet.SheetDimension == null) + worksheetPart.Worksheet.SheetDimension = new SheetDimension { Reference = sheetDimensionReference }; + + cm.SetElement(XLWSContentManager.XLWSContents.SheetDimension, worksheetPart.Worksheet.SheetDimension); + + if (worksheetPart.Worksheet.SheetViews == null) + worksheetPart.Worksheet.SheetViews = new SheetViews(); + + cm.SetElement(XLWSContentManager.XLWSContents.SheetViews, worksheetPart.Worksheet.SheetViews); + + var sheetView = (SheetView)worksheetPart.Worksheet.SheetViews.FirstOrDefault(); + if (sheetView == null) + { + sheetView = new SheetView { WorkbookViewId = 0U }; + worksheetPart.Worksheet.SheetViews.AppendChild(sheetView); + } + + if (xlWorksheet.TabSelected) + sheetView.TabSelected = true; + else + sheetView.TabSelected = null; + + if (xlWorksheet.RightToLeft) + sheetView.RightToLeft = true; + else + sheetView.RightToLeft = null; + + if (xlWorksheet.ShowFormulas) + sheetView.ShowFormulas = true; + else + sheetView.ShowFormulas = null; + + if (xlWorksheet.ShowGridLines) + sheetView.ShowGridLines = null; + else + sheetView.ShowGridLines = false; + + if (xlWorksheet.ShowOutlineSymbols) + sheetView.ShowOutlineSymbols = null; + else + sheetView.ShowOutlineSymbols = false; + + if (xlWorksheet.ShowRowColHeaders) + sheetView.ShowRowColHeaders = null; + else + sheetView.ShowRowColHeaders = false; + + if (xlWorksheet.ShowRuler) + sheetView.ShowRuler = null; + else + sheetView.ShowRuler = false; + + if (xlWorksheet.ShowWhiteSpace) + sheetView.ShowWhiteSpace = null; + else + sheetView.ShowWhiteSpace = false; + + if (xlWorksheet.ShowZeros) + sheetView.ShowZeros = null; + else + sheetView.ShowZeros = false; + + if (xlWorksheet.RightToLeft) + sheetView.RightToLeft = true; + else + sheetView.RightToLeft = null; + + if (xlWorksheet.SheetView.View == XLSheetViewOptions.Normal) + sheetView.View = null; + else + sheetView.View = xlWorksheet.SheetView.View.ToOpenXml(); + + var pane = sheetView.Elements().FirstOrDefault(); + if (pane == null) + { + pane = new Pane(); + sheetView.AppendChild(pane); + } + + pane.State = PaneStateValues.FrozenSplit; + Double hSplit = xlWorksheet.SheetView.SplitColumn; + Double ySplit = xlWorksheet.SheetView.SplitRow; + + pane.HorizontalSplit = hSplit; + pane.VerticalSplit = ySplit; + + pane.TopLeftCell = XLHelper.GetColumnLetterFromNumber(xlWorksheet.SheetView.SplitColumn + 1) + + (xlWorksheet.SheetView.SplitRow + 1); + + if (hSplit == 0 && ySplit == 0) + sheetView.RemoveAllChildren(); + + if (xlWorksheet.SelectedRanges.Any() || xlWorksheet.ActiveCell != null) + { + sheetView.RemoveAllChildren(); + + var firstSelection = xlWorksheet.SelectedRanges.FirstOrDefault(); + var selection = new Selection(); + if (xlWorksheet.ActiveCell != null) + selection.ActiveCell = xlWorksheet.ActiveCell.Address.ToStringRelative(false); + else if (firstSelection != null) + selection.ActiveCell = firstSelection.RangeAddress.FirstAddress.ToStringRelative(false); + + var seqRef = new List { selection.ActiveCell.Value }; + seqRef.AddRange(xlWorksheet.SelectedRanges + .Select(range => range.RangeAddress.ToStringRelative(false))); + + selection.SequenceOfReferences = new ListValue { InnerText = String.Join(" ", seqRef.Distinct().ToArray()) }; + + sheetView.Append(selection); + } + + if (xlWorksheet.SheetView.ZoomScale == 100) + sheetView.ZoomScale = null; + else + sheetView.ZoomScale = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScale)); + + if (xlWorksheet.SheetView.ZoomScaleNormal == 100) + sheetView.ZoomScaleNormal = null; + else + sheetView.ZoomScaleNormal = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScaleNormal)); + + if (xlWorksheet.SheetView.ZoomScalePageLayoutView == 100) + sheetView.ZoomScalePageLayoutView = null; + else + sheetView.ZoomScalePageLayoutView = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScalePageLayoutView)); + + if (xlWorksheet.SheetView.ZoomScaleSheetLayoutView == 100) + sheetView.ZoomScaleSheetLayoutView = null; + else + sheetView.ZoomScaleSheetLayoutView = (UInt32)Math.Max(10, Math.Min(400, xlWorksheet.SheetView.ZoomScaleSheetLayoutView)); + + #endregion SheetViews + + var maxOutlineColumn = 0; + if (xlWorksheet.ColumnCount() > 0) + maxOutlineColumn = xlWorksheet.GetMaxColumnOutline(); + + var maxOutlineRow = 0; + if (xlWorksheet.RowCount() > 0) + maxOutlineRow = xlWorksheet.GetMaxRowOutline(); + + #region SheetFormatProperties + + if (worksheetPart.Worksheet.SheetFormatProperties == null) + worksheetPart.Worksheet.SheetFormatProperties = new SheetFormatProperties(); + + cm.SetElement(XLWSContentManager.XLWSContents.SheetFormatProperties, + worksheetPart.Worksheet.SheetFormatProperties); + + worksheetPart.Worksheet.SheetFormatProperties.DefaultRowHeight = xlWorksheet.RowHeight.SaveRound(); + + if (xlWorksheet.RowHeightChanged) + worksheetPart.Worksheet.SheetFormatProperties.CustomHeight = true; + else + worksheetPart.Worksheet.SheetFormatProperties.CustomHeight = null; + + var worksheetColumnWidth = GetColumnWidth(xlWorksheet.ColumnWidth).SaveRound(); + if (xlWorksheet.ColumnWidthChanged) + worksheetPart.Worksheet.SheetFormatProperties.DefaultColumnWidth = worksheetColumnWidth; + else + worksheetPart.Worksheet.SheetFormatProperties.DefaultColumnWidth = null; + + if (maxOutlineColumn > 0) + worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelColumn = (byte)maxOutlineColumn; + else + worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelColumn = null; + + if (maxOutlineRow > 0) + worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelRow = (byte)maxOutlineRow; + else + worksheetPart.Worksheet.SheetFormatProperties.OutlineLevelRow = null; + + #endregion SheetFormatProperties + + #region Columns + + if (xlWorksheet.Internals.CellsCollection.Count == 0 && + xlWorksheet.Internals.ColumnsCollection.Count == 0 + && xlWorksheet.Style.Equals(DefaultStyle)) + worksheetPart.Worksheet.RemoveAllChildren(); + else + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.Columns); + worksheetPart.Worksheet.InsertAfter(new Columns(), previousElement); + } + + var columns = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWSContentManager.XLWSContents.Columns, columns); + + var sheetColumnsByMin = columns.Elements().ToDictionary(c => c.Min.Value, c => c); + //Dictionary sheetColumnsByMax = columns.Elements().ToDictionary(c => c.Max.Value, c => c); + + Int32 minInColumnsCollection; + Int32 maxInColumnsCollection; + if (xlWorksheet.Internals.ColumnsCollection.Count > 0) + { + minInColumnsCollection = xlWorksheet.Internals.ColumnsCollection.Keys.Min(); + maxInColumnsCollection = xlWorksheet.Internals.ColumnsCollection.Keys.Max(); + } + else + { + minInColumnsCollection = 1; + maxInColumnsCollection = 0; + } + + var worksheetStyleId = context.SharedStyles[xlWorksheet.GetStyleId()].StyleId; + if (minInColumnsCollection > 1) + { + UInt32Value min = 1; + UInt32Value max = (UInt32)(minInColumnsCollection - 1); + + for (var co = min; co <= max; co++) + { + var column = new Column + { + Min = co, + Max = co, + Style = worksheetStyleId, + Width = worksheetColumnWidth, + CustomWidth = true + }; + + UpdateColumn(column, columns, sheetColumnsByMin); //, sheetColumnsByMax); + } + } + + for (var co = minInColumnsCollection; co <= maxInColumnsCollection; co++) + { + UInt32 styleId; + Double columnWidth; + var isHidden = false; + var collapsed = false; + var outlineLevel = 0; + if (xlWorksheet.Internals.ColumnsCollection.ContainsKey(co)) + { + styleId = context.SharedStyles[xlWorksheet.Internals.ColumnsCollection[co].GetStyleId()].StyleId; + columnWidth = GetColumnWidth(xlWorksheet.Internals.ColumnsCollection[co].Width).SaveRound(); + isHidden = xlWorksheet.Internals.ColumnsCollection[co].IsHidden; + collapsed = xlWorksheet.Internals.ColumnsCollection[co].Collapsed; + outlineLevel = xlWorksheet.Internals.ColumnsCollection[co].OutlineLevel; + } + else + { + styleId = context.SharedStyles[xlWorksheet.GetStyleId()].StyleId; + columnWidth = worksheetColumnWidth; + } + + var column = new Column + { + Min = (UInt32)co, + Max = (UInt32)co, + Style = styleId, + Width = columnWidth, + CustomWidth = true + }; + + if (isHidden) + column.Hidden = true; + if (collapsed) + column.Collapsed = true; + if (outlineLevel > 0) + column.OutlineLevel = (byte)outlineLevel; + + UpdateColumn(column, columns, sheetColumnsByMin); //, sheetColumnsByMax); + } + + var collection = maxInColumnsCollection; + foreach ( + var col in + columns.Elements().Where(c => c.Min > (UInt32)(collection)).OrderBy( + c => c.Min.Value)) + { + col.Style = worksheetStyleId; + col.Width = worksheetColumnWidth; + col.CustomWidth = true; + + if ((Int32)col.Max.Value > maxInColumnsCollection) + maxInColumnsCollection = (Int32)col.Max.Value; + } + + if (maxInColumnsCollection < XLHelper.MaxColumnNumber && !xlWorksheet.Style.Equals(DefaultStyle)) + { + var column = new Column + { + Min = (UInt32)(maxInColumnsCollection + 1), + Max = (UInt32)(XLHelper.MaxColumnNumber), + Style = worksheetStyleId, + Width = worksheetColumnWidth, + CustomWidth = true + }; + columns.AppendChild(column); + } + + CollapseColumns(columns, sheetColumnsByMin); + + if (!columns.Any()) + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWSContentManager.XLWSContents.Columns, null); + } + } + + #endregion Columns + + #region SheetData + + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.SheetData); + worksheetPart.Worksheet.InsertAfter(new SheetData(), previousElement); + } + + var sheetData = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWSContentManager.XLWSContents.SheetData, sheetData); + + var lastRow = 0; + var sheetDataRows = + sheetData.Elements().ToDictionary(r => r.RowIndex == null ? ++lastRow : (Int32)r.RowIndex.Value, + r => r); + foreach ( + var r in + xlWorksheet.Internals.RowsCollection.Deleted.Where(r => sheetDataRows.ContainsKey(r.Key))) + { + sheetData.RemoveChild(sheetDataRows[r.Key]); + sheetDataRows.Remove(r.Key); + xlWorksheet.Internals.CellsCollection.deleted.Remove(r.Key); + } + + var distinctRows = xlWorksheet.Internals.CellsCollection.RowsCollection.Keys.Union(xlWorksheet.Internals.RowsCollection.Keys); + var noRows = !sheetData.Elements().Any(); + foreach (var distinctRow in distinctRows.OrderBy(r => r)) + { + Row row; + if (sheetDataRows.ContainsKey(distinctRow)) + row = sheetDataRows[distinctRow]; + else + { + row = new Row { RowIndex = (UInt32)distinctRow }; + if (noRows) + { + sheetData.AppendChild(row); + noRows = false; + } + else + { + if (sheetDataRows.Any(r => r.Key > row.RowIndex.Value)) + { + var minRow = sheetDataRows.Where(r => r.Key > (Int32)row.RowIndex.Value).Min(r => r.Key); + var rowBeforeInsert = sheetDataRows[minRow]; + sheetData.InsertBefore(row, rowBeforeInsert); + } + else + sheetData.AppendChild(row); + } + } + + if (maxColumn > 0) + row.Spans = new ListValue { InnerText = "1:" + maxColumn.ToInvariantString() }; + + row.Height = null; + row.CustomHeight = null; + row.Hidden = null; + row.StyleIndex = null; + row.CustomFormat = null; + row.Collapsed = null; + if (xlWorksheet.Internals.RowsCollection.ContainsKey(distinctRow)) + { + var thisRow = xlWorksheet.Internals.RowsCollection[distinctRow]; + if (thisRow.HeightChanged) + { + row.Height = thisRow.Height.SaveRound(); + row.CustomHeight = true; + row.CustomFormat = true; + } + + if (thisRow.GetStyleId() != xlWorksheet.GetStyleId()) + { + row.StyleIndex = context.SharedStyles[thisRow.GetStyleId()].StyleId; + row.CustomFormat = true; + } + + if (thisRow.IsHidden) + row.Hidden = true; + if (thisRow.Collapsed) + row.Collapsed = true; + if (thisRow.OutlineLevel > 0) + row.OutlineLevel = (byte)thisRow.OutlineLevel; + } + + var lastCell = 0; + var cellsByReference = row.Elements().ToDictionary(c => c.CellReference == null + ? XLHelper.GetColumnLetterFromNumber( + ++lastCell) + distinctRow + : c.CellReference.Value, c => c); + + foreach (var kpDel in xlWorksheet.Internals.CellsCollection.deleted.ToList()) + { + foreach (var delCo in kpDel.Value.ToList()) + { + var key = XLHelper.GetColumnLetterFromNumber(delCo) + kpDel.Key.ToInvariantString(); + if (!cellsByReference.ContainsKey(key)) continue; + row.RemoveChild(cellsByReference[key]); + kpDel.Value.Remove(delCo); + } + if (kpDel.Value.Count == 0) + xlWorksheet.Internals.CellsCollection.deleted.Remove(kpDel.Key); + } + + if (!xlWorksheet.Internals.CellsCollection.RowsCollection.ContainsKey(distinctRow)) continue; + + var isNewRow = !row.Elements().Any(); + lastCell = 0; + var mRows = row.Elements().ToDictionary(c => XLHelper.GetColumnNumberFromAddress(c.CellReference == null + ? (XLHelper.GetColumnLetterFromNumber(++lastCell) + distinctRow) : c.CellReference.Value), c => c); + foreach (var opCell in xlWorksheet.Internals.CellsCollection.RowsCollection[distinctRow].Values + .OrderBy(c => c.Address.ColumnNumber) + .Select(c => c)) + { + var styleId = context.SharedStyles[opCell.GetStyleId()].StyleId; + + var dataType = opCell.DataType; + var cellReference = (opCell.Address).GetTrimmedAddress(); + + var isEmpty = opCell.IsEmpty(true); + + Cell cell = null; + if (cellsByReference.ContainsKey(cellReference)) + { + cell = cellsByReference[cellReference]; + if (isEmpty) + { + cell.Remove(); + } + } + + if (!isEmpty) + { + if (cell == null) + { + cell = new Cell(); + cell.CellReference = new StringValue(cellReference); + + if (isNewRow) + row.AppendChild(cell); + else + { + var newColumn = XLHelper.GetColumnNumberFromAddress(cellReference); + + Cell cellBeforeInsert = null; + int[] lastCo = { Int32.MaxValue }; + foreach (var c in mRows.Where(kp => kp.Key > newColumn).Where(c => lastCo[0] > c.Key)) + { + cellBeforeInsert = c.Value; + lastCo[0] = c.Key; + } + if (cellBeforeInsert == null) + row.AppendChild(cell); + else + row.InsertBefore(cell, cellBeforeInsert); + } + } + + cell.StyleIndex = styleId; + var formula = opCell.FormulaA1; + if (opCell.HasFormula) + { + if (formula.StartsWith("{")) + { + formula = formula.Substring(1, formula.Length - 2); + var f = new CellFormula { FormulaType = CellFormulaValues.Array }; + + if (opCell.FormulaReference == null) + opCell.FormulaReference = opCell.AsRange().RangeAddress; + if (opCell.FormulaReference.FirstAddress.Equals(opCell.Address)) + { + f.Text = formula; + f.Reference = opCell.FormulaReference.ToStringRelative(); + } + + cell.CellFormula = f; + } + else + { + cell.CellFormula = new CellFormula(); + cell.CellFormula.Text = formula; + } + + cell.CellValue = null; + } + else + { + cell.CellFormula = null; + + cell.DataType = opCell.DataType == XLCellValues.DateTime ? null : GetCellValue(opCell); + + if (dataType == XLCellValues.Text) + { + if (opCell.InnerText.Length == 0) + cell.CellValue = null; + else + { + if (opCell.ShareString) + { + var cellValue = new CellValue(); + cellValue.Text = opCell.SharedStringId.ToString(); + cell.CellValue = cellValue; + } + else + { + var text = opCell.GetString(); + var t = new Text(text); + if (text.PreserveSpaces()) + t.Space = SpaceProcessingModeValues.Preserve; + + cell.InlineString = new InlineString { Text = t }; + } + } + } + else if (dataType == XLCellValues.TimeSpan) + { + var timeSpan = opCell.GetTimeSpan(); + var cellValue = new CellValue(); + cellValue.Text = + XLCell.BaseDate.Add(timeSpan).ToOADate().ToInvariantString(); + cell.CellValue = cellValue; + } + else if (dataType == XLCellValues.DateTime || dataType == XLCellValues.Number) + { + if (!XLHelper.IsNullOrWhiteSpace(opCell.InnerText)) + { + var cellValue = new CellValue(); + cellValue.Text = Double.Parse(opCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture).ToInvariantString(); + cell.CellValue = cellValue; + } + } + else + { + var cellValue = new CellValue(); + cellValue.Text = opCell.InnerText; + cell.CellValue = cellValue; + } + } + } + } + xlWorksheet.Internals.CellsCollection.deleted.Remove(distinctRow); + } + foreach ( + var r in + xlWorksheet.Internals.CellsCollection.deleted.Keys.Where( + sheetDataRows.ContainsKey)) + { + sheetData.RemoveChild(sheetDataRows[r]); + sheetDataRows.Remove(r); + } + + #endregion SheetData + + #region SheetProtection + + if (xlWorksheet.Protection.Protected) + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.SheetProtection); + worksheetPart.Worksheet.InsertAfter(new SheetProtection(), previousElement); + } + + var sheetProtection = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWSContentManager.XLWSContents.SheetProtection, sheetProtection); + + var protection = xlWorksheet.Protection; + sheetProtection.Sheet = protection.Protected; + if (!XLHelper.IsNullOrWhiteSpace(protection.PasswordHash)) + sheetProtection.Password = protection.PasswordHash; + sheetProtection.FormatCells = GetBooleanValue(!protection.FormatCells, true); + sheetProtection.FormatColumns = GetBooleanValue(!protection.FormatColumns, true); + sheetProtection.FormatRows = GetBooleanValue(!protection.FormatRows, true); + sheetProtection.InsertColumns = GetBooleanValue(!protection.InsertColumns, true); + sheetProtection.InsertHyperlinks = GetBooleanValue(!protection.InsertHyperlinks, true); + sheetProtection.InsertRows = GetBooleanValue(!protection.InsertRows, true); + sheetProtection.DeleteColumns = GetBooleanValue(!protection.DeleteColumns, true); + sheetProtection.DeleteRows = GetBooleanValue(!protection.DeleteRows, true); + sheetProtection.AutoFilter = GetBooleanValue(!protection.AutoFilter, true); + sheetProtection.PivotTables = GetBooleanValue(!protection.PivotTables, true); + sheetProtection.Sort = GetBooleanValue(!protection.Sort, true); + sheetProtection.SelectLockedCells = GetBooleanValue(!protection.SelectLockedCells, false); + sheetProtection.SelectUnlockedCells = GetBooleanValue(!protection.SelectUnlockedCells, false); + } + else + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWSContentManager.XLWSContents.SheetProtection, null); + } + + #endregion SheetProtection + + #region AutoFilter + + worksheetPart.Worksheet.RemoveAllChildren(); + if (xlWorksheet.AutoFilter.Enabled) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.AutoFilter); + worksheetPart.Worksheet.InsertAfter(new AutoFilter(), previousElement); + + var autoFilter = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWSContentManager.XLWSContents.AutoFilter, autoFilter); + + PopulateAutoFilter(xlWorksheet.AutoFilter, autoFilter); + } + else + { + cm.SetElement(XLWSContentManager.XLWSContents.AutoFilter, null); + } + + #endregion AutoFilter + + #region MergeCells + + if ((xlWorksheet).Internals.MergedRanges.Any()) + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.MergeCells); + worksheetPart.Worksheet.InsertAfter(new MergeCells(), previousElement); + } + + var mergeCells = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWSContentManager.XLWSContents.MergeCells, mergeCells); + mergeCells.RemoveAllChildren(); + + foreach (var mergeCell in (xlWorksheet).Internals.MergedRanges.Select( + m => m.RangeAddress.FirstAddress.ToString() + ":" + m.RangeAddress.LastAddress.ToString()).Select( + merged => new MergeCell { Reference = merged })) + mergeCells.AppendChild(mergeCell); + + mergeCells.Count = (UInt32)mergeCells.Count(); + } + else + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWSContentManager.XLWSContents.MergeCells, null); + } + + #endregion MergeCells + + #region Conditional Formatting + + if (!xlWorksheet.ConditionalFormats.Any()) + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWSContentManager.XLWSContents.ConditionalFormatting, null); + } + else + { + worksheetPart.Worksheet.RemoveAllChildren(); + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.ConditionalFormatting); + + var priority = 1; // priority is 1 origin in Microsoft Excel + foreach (var cfGroup in xlWorksheet.ConditionalFormats + .GroupBy( + c => c.Range.RangeAddress.ToStringRelative(false), + c => c, + (key, g) => new { RangeId = key, CfList = g.ToList() } + ) + ) + { + var conditionalFormatting = new ConditionalFormatting + { + SequenceOfReferences = + new ListValue { InnerText = cfGroup.RangeId } + }; + foreach (var cf in cfGroup.CfList) + { + conditionalFormatting.Append(XLCFConverters.Convert(cf, priority, context)); + priority++; + } + worksheetPart.Worksheet.InsertAfter(conditionalFormatting, previousElement); + previousElement = conditionalFormatting; + cm.SetElement(XLWSContentManager.XLWSContents.ConditionalFormatting, conditionalFormatting); + } + } + + #endregion Conditional Formatting + + #region DataValidations + + if (!xlWorksheet.DataValidations.Any(d => d.IsDirty())) + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWSContentManager.XLWSContents.DataValidations, null); + } + else + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.DataValidations); + worksheetPart.Worksheet.InsertAfter(new DataValidations(), previousElement); + } + + var dataValidations = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWSContentManager.XLWSContents.DataValidations, dataValidations); + dataValidations.RemoveAllChildren(); + foreach (var dv in xlWorksheet.DataValidations) + { + var sequence = dv.Ranges.Aggregate(String.Empty, (current, r) => current + (r.RangeAddress + " ")); + + if (sequence.Length > 0) + sequence = sequence.Substring(0, sequence.Length - 1); + + var dataValidation = new DataValidation + { + AllowBlank = dv.IgnoreBlanks, + Formula1 = new Formula1(dv.MinValue), + Formula2 = new Formula2(dv.MaxValue), + Type = dv.AllowedValues.ToOpenXml(), + ShowErrorMessage = dv.ShowErrorMessage, + Prompt = dv.InputMessage, + PromptTitle = dv.InputTitle, + ErrorTitle = dv.ErrorTitle, + Error = dv.ErrorMessage, + ShowDropDown = !dv.InCellDropdown, + ShowInputMessage = dv.ShowInputMessage, + ErrorStyle = dv.ErrorStyle.ToOpenXml(), + Operator = dv.Operator.ToOpenXml(), + SequenceOfReferences = + new ListValue { InnerText = sequence } + }; + + dataValidations.AppendChild(dataValidation); + } + dataValidations.Count = (UInt32)xlWorksheet.DataValidations.Count(); + } + + #endregion DataValidations + + #region Hyperlinks + + var relToRemove = worksheetPart.HyperlinkRelationships.ToList(); + relToRemove.ForEach(worksheetPart.DeleteReferenceRelationship); + if (!xlWorksheet.Hyperlinks.Any()) + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWSContentManager.XLWSContents.Hyperlinks, null); + } + else + { + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.Hyperlinks); + worksheetPart.Worksheet.InsertAfter(new Hyperlinks(), previousElement); + } + + var hyperlinks = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWSContentManager.XLWSContents.Hyperlinks, hyperlinks); + hyperlinks.RemoveAllChildren(); + foreach (var hl in xlWorksheet.Hyperlinks) + { + Hyperlink hyperlink; + if (hl.IsExternal) + { + var rId = context.RelIdGenerator.GetNext(RelType.Workbook); + hyperlink = new Hyperlink { Reference = hl.Cell.Address.ToString(), Id = rId }; + worksheetPart.AddHyperlinkRelationship(hl.ExternalAddress, true, rId); + } + else + { + hyperlink = new Hyperlink + { + Reference = hl.Cell.Address.ToString(), + Location = hl.InternalAddress, + Display = hl.Cell.GetFormattedString() + }; + } + if (!XLHelper.IsNullOrWhiteSpace(hl.Tooltip)) + hyperlink.Tooltip = hl.Tooltip; + hyperlinks.AppendChild(hyperlink); + } + } + + #endregion Hyperlinks + + #region PrintOptions + + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.PrintOptions); + worksheetPart.Worksheet.InsertAfter(new PrintOptions(), previousElement); + } + + var printOptions = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWSContentManager.XLWSContents.PrintOptions, printOptions); + + printOptions.HorizontalCentered = xlWorksheet.PageSetup.CenterHorizontally; + printOptions.VerticalCentered = xlWorksheet.PageSetup.CenterVertically; + printOptions.Headings = xlWorksheet.PageSetup.ShowRowAndColumnHeadings; + printOptions.GridLines = xlWorksheet.PageSetup.ShowGridlines; + + #endregion PrintOptions + + #region PageMargins + + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.PageMargins); + worksheetPart.Worksheet.InsertAfter(new PageMargins(), previousElement); + } + + var pageMargins = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWSContentManager.XLWSContents.PageMargins, pageMargins); + pageMargins.Left = xlWorksheet.PageSetup.Margins.Left; + pageMargins.Right = xlWorksheet.PageSetup.Margins.Right; + pageMargins.Top = xlWorksheet.PageSetup.Margins.Top; + pageMargins.Bottom = xlWorksheet.PageSetup.Margins.Bottom; + pageMargins.Header = xlWorksheet.PageSetup.Margins.Header; + pageMargins.Footer = xlWorksheet.PageSetup.Margins.Footer; + + #endregion PageMargins + + #region PageSetup + + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.PageSetup); + worksheetPart.Worksheet.InsertAfter(new PageSetup(), previousElement); + } + + var pageSetup = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWSContentManager.XLWSContents.PageSetup, pageSetup); + + pageSetup.Orientation = xlWorksheet.PageSetup.PageOrientation.ToOpenXml(); + pageSetup.PaperSize = (UInt32)xlWorksheet.PageSetup.PaperSize; + pageSetup.BlackAndWhite = xlWorksheet.PageSetup.BlackAndWhite; + pageSetup.Draft = xlWorksheet.PageSetup.DraftQuality; + pageSetup.PageOrder = xlWorksheet.PageSetup.PageOrder.ToOpenXml(); + pageSetup.CellComments = xlWorksheet.PageSetup.ShowComments.ToOpenXml(); + pageSetup.Errors = xlWorksheet.PageSetup.PrintErrorValue.ToOpenXml(); + + if (xlWorksheet.PageSetup.FirstPageNumber > 0) + { + pageSetup.FirstPageNumber = (UInt32)xlWorksheet.PageSetup.FirstPageNumber; + pageSetup.UseFirstPageNumber = true; + } + else + { + pageSetup.FirstPageNumber = null; + pageSetup.UseFirstPageNumber = null; + } + + if (xlWorksheet.PageSetup.HorizontalDpi > 0) + pageSetup.HorizontalDpi = (UInt32)xlWorksheet.PageSetup.HorizontalDpi; + else + pageSetup.HorizontalDpi = null; + + if (xlWorksheet.PageSetup.VerticalDpi > 0) + pageSetup.VerticalDpi = (UInt32)xlWorksheet.PageSetup.VerticalDpi; + else + pageSetup.VerticalDpi = null; + + if (xlWorksheet.PageSetup.Scale > 0) + { + pageSetup.Scale = (UInt32)xlWorksheet.PageSetup.Scale; + pageSetup.FitToWidth = null; + pageSetup.FitToHeight = null; + } + else + { + pageSetup.Scale = null; + + if (xlWorksheet.PageSetup.PagesWide >= 0 && xlWorksheet.PageSetup.PagesWide != 1) + pageSetup.FitToWidth = (UInt32)xlWorksheet.PageSetup.PagesWide; + + if (xlWorksheet.PageSetup.PagesTall >= 0 && xlWorksheet.PageSetup.PagesTall != 1) + pageSetup.FitToHeight = (UInt32)xlWorksheet.PageSetup.PagesTall; + } + + #endregion PageSetup + + #region HeaderFooter + + var headerFooter = worksheetPart.Worksheet.Elements().FirstOrDefault(); + if (headerFooter == null) + headerFooter = new HeaderFooter(); + else + worksheetPart.Worksheet.RemoveAllChildren(); + + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.HeaderFooter); + worksheetPart.Worksheet.InsertAfter(headerFooter, previousElement); + cm.SetElement(XLWSContentManager.XLWSContents.HeaderFooter, headerFooter); + } + if (((XLHeaderFooter)xlWorksheet.PageSetup.Header).Changed + || ((XLHeaderFooter)xlWorksheet.PageSetup.Footer).Changed) + { + //var headerFooter = worksheetPart.Worksheet.Elements().First(); + + headerFooter.RemoveAllChildren(); + + headerFooter.ScaleWithDoc = xlWorksheet.PageSetup.ScaleHFWithDocument; + headerFooter.AlignWithMargins = xlWorksheet.PageSetup.AlignHFWithMargins; + headerFooter.DifferentFirst = xlWorksheet.PageSetup.DifferentFirstPageOnHF; + headerFooter.DifferentOddEven = xlWorksheet.PageSetup.DifferentOddEvenPagesOnHF; + + var oddHeader = new OddHeader(xlWorksheet.PageSetup.Header.GetText(XLHFOccurrence.OddPages)); + headerFooter.AppendChild(oddHeader); + var oddFooter = new OddFooter(xlWorksheet.PageSetup.Footer.GetText(XLHFOccurrence.OddPages)); + headerFooter.AppendChild(oddFooter); + + var evenHeader = new EvenHeader(xlWorksheet.PageSetup.Header.GetText(XLHFOccurrence.EvenPages)); + headerFooter.AppendChild(evenHeader); + var evenFooter = new EvenFooter(xlWorksheet.PageSetup.Footer.GetText(XLHFOccurrence.EvenPages)); + headerFooter.AppendChild(evenFooter); + + var firstHeader = new FirstHeader(xlWorksheet.PageSetup.Header.GetText(XLHFOccurrence.FirstPage)); + headerFooter.AppendChild(firstHeader); + var firstFooter = new FirstFooter(xlWorksheet.PageSetup.Footer.GetText(XLHFOccurrence.FirstPage)); + headerFooter.AppendChild(firstFooter); + } + + #endregion HeaderFooter + + #region RowBreaks + + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.RowBreaks); + worksheetPart.Worksheet.InsertAfter(new RowBreaks(), previousElement); + } + + var rowBreaks = worksheetPart.Worksheet.Elements().First(); + + var rowBreakCount = xlWorksheet.PageSetup.RowBreaks.Count; + if (rowBreakCount > 0) + { + rowBreaks.Count = (UInt32)rowBreakCount; + rowBreaks.ManualBreakCount = (UInt32)rowBreakCount; + var lastRowNum = (UInt32)xlWorksheet.RangeAddress.LastAddress.RowNumber; + foreach (var break1 in xlWorksheet.PageSetup.RowBreaks.Select(rb => new Break + { + Id = (UInt32)rb, + Max = lastRowNum, + ManualPageBreak = true + })) + rowBreaks.AppendChild(break1); + cm.SetElement(XLWSContentManager.XLWSContents.RowBreaks, rowBreaks); + } + else + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWSContentManager.XLWSContents.RowBreaks, null); + } + + #endregion RowBreaks + + #region ColumnBreaks + + if (!worksheetPart.Worksheet.Elements().Any()) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.ColumnBreaks); + worksheetPart.Worksheet.InsertAfter(new ColumnBreaks(), previousElement); + } + + var columnBreaks = worksheetPart.Worksheet.Elements().First(); + + var columnBreakCount = xlWorksheet.PageSetup.ColumnBreaks.Count; + if (columnBreakCount > 0) + { + columnBreaks.Count = (UInt32)columnBreakCount; + columnBreaks.ManualBreakCount = (UInt32)columnBreakCount; + var maxColumnNumber = (UInt32)xlWorksheet.RangeAddress.LastAddress.ColumnNumber; + foreach (var break1 in xlWorksheet.PageSetup.ColumnBreaks.Select(cb => new Break + { + Id = (UInt32)cb, + Max = maxColumnNumber, + ManualPageBreak = true + })) + columnBreaks.AppendChild(break1); + cm.SetElement(XLWSContentManager.XLWSContents.ColumnBreaks, columnBreaks); + } + else + { + worksheetPart.Worksheet.RemoveAllChildren(); + cm.SetElement(XLWSContentManager.XLWSContents.ColumnBreaks, null); + } + + #endregion ColumnBreaks + + #region Tables + + worksheetPart.Worksheet.RemoveAllChildren(); + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.TableParts); + worksheetPart.Worksheet.InsertAfter(new TableParts(), previousElement); + } + + var tableParts = worksheetPart.Worksheet.Elements().First(); + cm.SetElement(XLWSContentManager.XLWSContents.TableParts, tableParts); + + tableParts.Count = (UInt32)xlWorksheet.Tables.Count(); + foreach ( + var tablePart in + from XLTable xlTable in xlWorksheet.Tables select new TablePart { Id = xlTable.RelId }) + tableParts.AppendChild(tablePart); + + #endregion Tables + + #region Drawings + + foreach (var pic in xlWorksheet.Pictures) + { + AddPictureAnchor(worksheetPart, pic, context); + } + + if (xlWorksheet.Pictures.Any()) + RebasePictureIds(worksheetPart); + + if (xlWorksheet.Pictures.Any() && !worksheetPart.Worksheet.OfType().Any()) + { + var worksheetDrawing = new Drawing { Id = worksheetPart.GetIdOfPart(worksheetPart.DrawingsPart) }; + worksheetDrawing.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + worksheetPart.Worksheet.InsertBefore(worksheetDrawing, tableParts); + } + + #endregion Drawings + + #region LegacyDrawing + + if (xlWorksheet.LegacyDrawingIsNew) + { + worksheetPart.Worksheet.RemoveAllChildren(); + { + if (!XLHelper.IsNullOrWhiteSpace(xlWorksheet.LegacyDrawingId)) + { + var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.LegacyDrawing); + worksheetPart.Worksheet.InsertAfter(new LegacyDrawing { Id = xlWorksheet.LegacyDrawingId }, + previousElement); + } + } + } + + #endregion LegacyDrawing + + #region LegacyDrawingHeaderFooter + + //LegacyDrawingHeaderFooter legacyHeaderFooter = worksheetPart.Worksheet.Elements().FirstOrDefault(); + //if (legacyHeaderFooter != null) + //{ + // worksheetPart.Worksheet.RemoveAllChildren(); + // { + // var previousElement = cm.GetPreviousElementFor(XLWSContentManager.XLWSContents.LegacyDrawingHeaderFooter); + // worksheetPart.Worksheet.InsertAfter(new LegacyDrawingHeaderFooter { Id = xlWorksheet.LegacyDrawingId }, + // previousElement); + // } + //} + + #endregion LegacyDrawingHeaderFooter + } + + private static void PopulateAutoFilter(XLAutoFilter xlAutoFilter, AutoFilter autoFilter) + { + var filterRange = xlAutoFilter.Range; + autoFilter.Reference = filterRange.RangeAddress.ToString(); + + foreach (var kp in xlAutoFilter.Filters) + { + var filterColumn = new FilterColumn { ColumnId = (UInt32)kp.Key - 1 }; + var xlFilterColumn = xlAutoFilter.Column(kp.Key); + var filterType = xlFilterColumn.FilterType; + if (filterType == XLFilterType.Custom) + { + var customFilters = new CustomFilters(); + foreach (var filter in kp.Value) + { + var customFilter = new CustomFilter { Val = filter.Value.ToString() }; + + if (filter.Operator != XLFilterOperator.Equal) + customFilter.Operator = filter.Operator.ToOpenXml(); + + if (filter.Connector == XLConnector.And) + customFilters.And = true; + + customFilters.Append(customFilter); + } + filterColumn.Append(customFilters); + } + else if (filterType == XLFilterType.TopBottom) + { + var top101 = new Top10 { Val = (double)xlFilterColumn.TopBottomValue }; + if (xlFilterColumn.TopBottomType == XLTopBottomType.Percent) + top101.Percent = true; + if (xlFilterColumn.TopBottomPart == XLTopBottomPart.Bottom) + top101.Top = false; + + filterColumn.Append(top101); + } + else if (filterType == XLFilterType.Dynamic) + { + var dynamicFilter = new DynamicFilter + { Type = xlFilterColumn.DynamicType.ToOpenXml(), Val = xlFilterColumn.DynamicValue }; + filterColumn.Append(dynamicFilter); + } + else + { + var filters = new Filters(); + foreach (var filter in kp.Value) + { + filters.Append(new Filter { Val = filter.Value.ToString() }); + } + + filterColumn.Append(filters); + } + autoFilter.Append(filterColumn); + } + + if (xlAutoFilter.Sorted) + { + var sortState = new SortState + { + Reference = + filterRange.Range(filterRange.FirstCell().CellBelow(), filterRange.LastCell()).RangeAddress. + ToString() + }; + var sortCondition = new SortCondition + { + Reference = + filterRange.Range(1, xlAutoFilter.SortColumn, filterRange.RowCount(), + xlAutoFilter.SortColumn).RangeAddress.ToString() + }; + if (xlAutoFilter.SortOrder == XLSortOrder.Descending) + sortCondition.Descending = true; + + sortState.Append(sortCondition); + autoFilter.Append(sortState); + } + } + + private static BooleanValue GetBooleanValue(bool value, bool defaultValue) + { + return value == defaultValue ? null : new BooleanValue(value); + } + + private static void CollapseColumns(Columns columns, Dictionary sheetColumns) + { + UInt32 lastMin = 1; + var count = sheetColumns.Count; + var arr = sheetColumns.OrderBy(kp => kp.Key).ToArray(); + // sheetColumns[kp.Key + 1] + //Int32 i = 0; + //foreach (KeyValuePair kp in arr + // //.Where(kp => !(kp.Key < count && ColumnsAreEqual(kp.Value, ))) + // ) + for (var i = 0; i < count; i++) + { + var kp = arr[i]; + if (i + 1 != count && ColumnsAreEqual(kp.Value, arr[i + 1].Value)) continue; + + var newColumn = (Column)kp.Value.CloneNode(true); + newColumn.Min = lastMin; + var newColumnMax = newColumn.Max.Value; + var columnsToRemove = + columns.Elements().Where(co => co.Min >= lastMin && co.Max <= newColumnMax). + Select(co => co).ToList(); + columnsToRemove.ForEach(c => columns.RemoveChild(c)); + + columns.AppendChild(newColumn); + lastMin = kp.Key + 1; + //i++; + } + } + + private static double GetColumnWidth(double columnWidth) + { + return Math.Min(255.0, Math.Max(0.0, columnWidth + ColumnWidthOffset)); + } + + private static void UpdateColumn(Column column, Columns columns, Dictionary sheetColumnsByMin) + { + var co = column.Min.Value; + Column newColumn; + if (!sheetColumnsByMin.ContainsKey(co)) + { + newColumn = (Column)column.CloneNode(true); + columns.AppendChild(newColumn); + sheetColumnsByMin.Add(co, newColumn); + } + else + { + var existingColumn = sheetColumnsByMin[column.Min.Value]; + newColumn = (Column)existingColumn.CloneNode(true); + newColumn.Min = column.Min; + newColumn.Max = column.Max; + newColumn.Style = column.Style; + newColumn.Width = column.Width.SaveRound(); + newColumn.CustomWidth = column.CustomWidth; + + if (column.Hidden != null) + newColumn.Hidden = true; + else + newColumn.Hidden = null; + + if (column.Collapsed != null) + newColumn.Collapsed = true; + else + newColumn.Collapsed = null; + + if (column.OutlineLevel != null && column.OutlineLevel > 0) + newColumn.OutlineLevel = (byte)column.OutlineLevel; + else + newColumn.OutlineLevel = null; + + sheetColumnsByMin.Remove(column.Min.Value); + if (existingColumn.Min + 1 > existingColumn.Max) + { + //existingColumn.Min = existingColumn.Min + 1; + //columns.InsertBefore(existingColumn, newColumn); + //existingColumn.Remove(); + columns.RemoveChild(existingColumn); + columns.AppendChild(newColumn); + sheetColumnsByMin.Add(newColumn.Min.Value, newColumn); + } + else + { + //columns.InsertBefore(existingColumn, newColumn); + columns.AppendChild(newColumn); + sheetColumnsByMin.Add(newColumn.Min.Value, newColumn); + existingColumn.Min = existingColumn.Min + 1; + sheetColumnsByMin.Add(existingColumn.Min.Value, existingColumn); + } + } + } + + private static bool ColumnsAreEqual(Column left, Column right) + { + return + ((left.Style == null && right.Style == null) + || (left.Style != null && right.Style != null && left.Style.Value == right.Style.Value)) + && ((left.Width == null && right.Width == null) + || (left.Width != null && right.Width != null && left.Width.Value == right.Width.Value)) + && ((left.Hidden == null && right.Hidden == null) + || (left.Hidden != null && right.Hidden != null && left.Hidden.Value == right.Hidden.Value)) + && ((left.Collapsed == null && right.Collapsed == null) + || + (left.Collapsed != null && right.Collapsed != null && left.Collapsed.Value == right.Collapsed.Value)) + && ((left.OutlineLevel == null && right.OutlineLevel == null) + || + (left.OutlineLevel != null && right.OutlineLevel != null && + left.OutlineLevel.Value == right.OutlineLevel.Value)); + } + + #endregion GenerateWorksheetPartContent + } +} diff --git a/ClosedXML/Excel/XLWorksheet.cs b/ClosedXML/Excel/XLWorksheet.cs index 132ec9d..6579424 100644 --- a/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/Excel/XLWorksheet.cs @@ -1,1510 +1,1571 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using ClosedXML.Excel.CalcEngine; -using ClosedXML.Excel.Misc; - - -namespace ClosedXML.Excel -{ - internal class XLWorksheet : XLRangeBase, IXLWorksheet - { - #region Constants - - #endregion - - #region Events - - public XLReentrantEnumerableSet RangeShiftedRows; - public XLReentrantEnumerableSet RangeShiftedColumns; - - #endregion - - #region Fields - - private readonly Dictionary _columnOutlineCount = new Dictionary(); - private readonly Dictionary _rowOutlineCount = new Dictionary(); - internal Int32 ZOrder = 1; - private String _name; - internal Int32 _position; - - private Double _rowHeight; - private Boolean _tabActive; - internal Boolean EventTrackingEnabled; - #endregion - - #region Constructor - - public XLWorksheet(String sheetName, XLWorkbook workbook) - : base( - new XLRangeAddress( - new XLAddress(null, XLHelper.MinRowNumber, XLHelper.MinColumnNumber, false, false), - new XLAddress(null, XLHelper.MaxRowNumber, XLHelper.MaxColumnNumber, false, false))) - { - EventTrackingEnabled = workbook.EventTracking == XLEventTracking.Enabled; - - RangeShiftedRows = new XLReentrantEnumerableSet(); - RangeShiftedColumns = new XLReentrantEnumerableSet(); - - RangeAddress.Worksheet = this; - RangeAddress.FirstAddress.Worksheet = this; - RangeAddress.LastAddress.Worksheet = this; - - NamedRanges = new XLNamedRanges(workbook); - SheetView = new XLSheetView(); - Tables = new XLTables(); - Hyperlinks = new XLHyperlinks(); - DataValidations = new XLDataValidations(); - PivotTables = new XLPivotTables(); - Protection = new XLSheetProtection(); - AutoFilter = new XLAutoFilter(); - ConditionalFormats = new XLConditionalFormats(); - Workbook = workbook; - SetStyle(workbook.Style); - Internals = new XLWorksheetInternals(new XLCellsCollection(), new XLColumnsCollection(), - new XLRowsCollection(), new XLRanges()); - PageSetup = new XLPageSetup((XLPageSetup)workbook.PageOptions, this); - Outline = new XLOutline(workbook.Outline); - _columnWidth = workbook.ColumnWidth; - _rowHeight = workbook.RowHeight; - RowHeightChanged = Math.Abs(workbook.RowHeight - XLWorkbook.DefaultRowHeight) > XLHelper.Epsilon; - Name = sheetName; - SubscribeToShiftedRows((range, rowsShifted) => this.WorksheetRangeShiftedRows(range, rowsShifted)); - SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); - Charts = new XLCharts(); - ShowFormulas = workbook.ShowFormulas; - ShowGridLines = workbook.ShowGridLines; - ShowOutlineSymbols = workbook.ShowOutlineSymbols; - ShowRowColHeaders = workbook.ShowRowColHeaders; - ShowRuler = workbook.ShowRuler; - ShowWhiteSpace = workbook.ShowWhiteSpace; - ShowZeros = workbook.ShowZeros; - RightToLeft = workbook.RightToLeft; - TabColor = XLColor.NoColor; - SelectedRanges = new XLRanges(); - - Author = workbook.Author; - } - - #endregion - - //private IXLStyle _style; - private const String InvalidNameChars = @":\/?*[]"; - public string LegacyDrawingId; - public Boolean LegacyDrawingIsNew; - private Double _columnWidth; - public XLWorksheetInternals Internals { get; private set; } - private List pictures; - - public override IEnumerable Styles - { - get - { - UpdatingStyle = true; - yield return GetStyle(); - foreach (XLCell c in Internals.CellsCollection.GetCells()) - yield return c.Style; - UpdatingStyle = false; - } - } - - public override Boolean UpdatingStyle { get; set; } - - public override IXLStyle InnerStyle - { - get { return GetStyle(); } - set { SetStyle(value); } - } - - internal Boolean RowHeightChanged { get; set; } - internal Boolean ColumnWidthChanged { get; set; } - - public Int32 SheetId { get; set; } - internal String RelId { get; set; } - public XLDataValidations DataValidations { get; private set; } - public IXLCharts Charts { get; private set; } - public XLSheetProtection Protection { get; private set; } - public XLAutoFilter AutoFilter { get; private set; } - - #region IXLWorksheet Members - - public XLWorkbook Workbook { get; private set; } - - public override IXLStyle Style - { - get - { - return GetStyle(); - } - set - { - SetStyle(value); - foreach (XLCell cell in Internals.CellsCollection.GetCells()) - cell.Style = value; - } - } - - public Double ColumnWidth - { - get { return _columnWidth; } - set - { - ColumnWidthChanged = true; - _columnWidth = value; - } - } - - public Double RowHeight - { - get { return _rowHeight; } - set - { - RowHeightChanged = true; - _rowHeight = value; - } - } - - public String Name - { - get { return _name; } - set - { - if (value.IndexOfAny(InvalidNameChars.ToCharArray()) != -1) - throw new ArgumentException("Worksheet names cannot contain any of the following characters: " + - InvalidNameChars); - - if (XLHelper.IsNullOrWhiteSpace(value)) - throw new ArgumentException("Worksheet names cannot be empty"); - - if (value.Length > 31) - throw new ArgumentException("Worksheet names cannot be more than 31 characters"); - - Workbook.WorksheetsInternal.Rename(_name, value); - _name = value; - } - } - - public Int32 Position - { - get { return _position; } - set - { - if (value > Workbook.WorksheetsInternal.Count + Workbook.UnsupportedSheets.Count + 1) - throw new IndexOutOfRangeException("Index must be equal or less than the number of worksheets + 1."); - - if (value < _position) - { - Workbook.WorksheetsInternal - .Where(w => w.Position >= value && w.Position < _position) - .ForEach(w => w._position += 1); - } - - if (value > _position) - { - Workbook.WorksheetsInternal - .Where(w => w.Position <= value && w.Position > _position) - .ForEach(w => (w)._position -= 1); - } - - _position = value; - } - } - - public IXLPageSetup PageSetup { get; private set; } - public IXLOutline Outline { get; private set; } - - IXLRow IXLWorksheet.FirstRowUsed() - { - return FirstRowUsed(); - } - - IXLRow IXLWorksheet.FirstRowUsed(Boolean includeFormats) - { - return FirstRowUsed(includeFormats); - } - - IXLRow IXLWorksheet.LastRowUsed() - { - return LastRowUsed(); - } - - IXLRow IXLWorksheet.LastRowUsed(Boolean includeFormats) - { - return LastRowUsed(includeFormats); - } - - IXLColumn IXLWorksheet.LastColumn() - { - return LastColumn(); - } - - IXLColumn IXLWorksheet.FirstColumn() - { - return FirstColumn(); - } - - IXLRow IXLWorksheet.FirstRow() - { - return FirstRow(); - } - - IXLRow IXLWorksheet.LastRow() - { - return LastRow(); - } - - IXLColumn IXLWorksheet.FirstColumnUsed() - { - return FirstColumnUsed(); - } - - IXLColumn IXLWorksheet.FirstColumnUsed(Boolean includeFormats) - { - return FirstColumnUsed(includeFormats); - } - - IXLColumn IXLWorksheet.LastColumnUsed() - { - return LastColumnUsed(); - } - - IXLColumn IXLWorksheet.LastColumnUsed(Boolean includeFormats) - { - return LastColumnUsed(includeFormats); - } - - - public IXLColumns Columns() - { - var retVal = new XLColumns(this); - var columnList = new List(); - - if (Internals.CellsCollection.Count > 0) - columnList.AddRange(Internals.CellsCollection.ColumnsUsed.Keys); - - if (Internals.ColumnsCollection.Count > 0) - columnList.AddRange(Internals.ColumnsCollection.Keys.Where(c => !columnList.Contains(c))); - - foreach (int c in columnList) - retVal.Add(Column(c)); - - return retVal; - } - - public IXLColumns Columns(String columns) - { - var retVal = new XLColumns(null); - var columnPairs = columns.Split(','); - foreach (string tPair in columnPairs.Select(pair => pair.Trim())) - { - String firstColumn; - String lastColumn; - if (tPair.Contains(':') || tPair.Contains('-')) - { - var columnRange = XLHelper.SplitRange(tPair); - firstColumn = columnRange[0]; - lastColumn = columnRange[1]; - } - else - { - firstColumn = tPair; - lastColumn = tPair; - } - - Int32 tmp; - if (Int32.TryParse(firstColumn, out tmp)) - { - foreach (IXLColumn col in Columns(Int32.Parse(firstColumn), Int32.Parse(lastColumn))) - retVal.Add((XLColumn)col); - } - else - { - foreach (IXLColumn col in Columns(firstColumn, lastColumn)) - retVal.Add((XLColumn)col); - } - } - return retVal; - } - - public IXLColumns Columns(String firstColumn, String lastColumn) - { - return Columns(XLHelper.GetColumnNumberFromLetter(firstColumn), - XLHelper.GetColumnNumberFromLetter(lastColumn)); - } - - public IXLColumns Columns(Int32 firstColumn, Int32 lastColumn) - { - var retVal = new XLColumns(null); - - for (int co = firstColumn; co <= lastColumn; co++) - retVal.Add(Column(co)); - return retVal; - } - - public IXLRows Rows() - { - var retVal = new XLRows(this); - var rowList = new List(); - - if (Internals.CellsCollection.Count > 0) - rowList.AddRange(Internals.CellsCollection.RowsUsed.Keys); - - if (Internals.RowsCollection.Count > 0) - rowList.AddRange(Internals.RowsCollection.Keys.Where(r => !rowList.Contains(r))); - - foreach (int r in rowList) - retVal.Add(Row(r)); - - return retVal; - } - - public IXLRows Rows(String rows) - { - var retVal = new XLRows(null); - var rowPairs = rows.Split(','); - foreach (string tPair in rowPairs.Select(pair => pair.Trim())) - { - String firstRow; - String lastRow; - if (tPair.Contains(':') || tPair.Contains('-')) - { - var rowRange = XLHelper.SplitRange(tPair); - firstRow = rowRange[0]; - lastRow = rowRange[1]; - } - else - { - firstRow = tPair; - lastRow = tPair; - } - foreach (IXLRow row in Rows(Int32.Parse(firstRow), Int32.Parse(lastRow))) - retVal.Add((XLRow)row); - } - return retVal; - } - - public IXLRows Rows(Int32 firstRow, Int32 lastRow) - { - var retVal = new XLRows(null); - - for (int ro = firstRow; ro <= lastRow; ro++) - retVal.Add(Row(ro)); - return retVal; - } - - IXLRow IXLWorksheet.Row(Int32 row) - { - return Row(row); - } - - IXLColumn IXLWorksheet.Column(Int32 column) - { - return Column(column); - } - - IXLColumn IXLWorksheet.Column(String column) - { - return Column(column); - } - - IXLCell IXLWorksheet.Cell(int row, int column) - { - return Cell(row, column); - } - - IXLCell IXLWorksheet.Cell(string cellAddressInRange) - { - return Cell(cellAddressInRange); - } - - IXLCell IXLWorksheet.Cell(int row, string column) - { - return Cell(row, column); - } - - IXLCell IXLWorksheet.Cell(IXLAddress cellAddressInRange) - { - return Cell(cellAddressInRange); - } - - IXLRange IXLWorksheet.Range(IXLRangeAddress rangeAddress) - { - return Range(rangeAddress); - } - - IXLRange IXLWorksheet.Range(string rangeAddress) - { - return Range(rangeAddress); - } - - IXLRange IXLWorksheet.Range(IXLCell firstCell, IXLCell lastCell) - { - return Range(firstCell, lastCell); - } - - IXLRange IXLWorksheet.Range(string firstCellAddress, string lastCellAddress) - { - return Range(firstCellAddress, lastCellAddress); - } - - IXLRange IXLWorksheet.Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress) - { - return Range(firstCellAddress, lastCellAddress); - } - - IXLRange IXLWorksheet.Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn) - { - return Range(firstCellRow, firstCellColumn, lastCellRow, lastCellColumn); - } - - public IXLWorksheet CollapseRows() - { - Enumerable.Range(1, 8).ForEach(i => CollapseRows(i)); - return this; - } - - public IXLWorksheet CollapseColumns() - { - Enumerable.Range(1, 8).ForEach(i => CollapseColumns(i)); - return this; - } - - public IXLWorksheet ExpandRows() - { - Enumerable.Range(1, 8).ForEach(i => ExpandRows(i)); - return this; - } - - public IXLWorksheet ExpandColumns() - { - Enumerable.Range(1, 8).ForEach(i => ExpandRows(i)); - return this; - } - - public IXLWorksheet CollapseRows(Int32 outlineLevel) - { - if (outlineLevel < 1 || outlineLevel > 8) - throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); - - Internals.RowsCollection.Values.Where(r => r.OutlineLevel == outlineLevel).ForEach(r => r.Collapse()); - return this; - } - - public IXLWorksheet CollapseColumns(Int32 outlineLevel) - { - if (outlineLevel < 1 || outlineLevel > 8) - throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); - - Internals.ColumnsCollection.Values.Where(c => c.OutlineLevel == outlineLevel).ForEach(c => c.Collapse()); - return this; - } - - public IXLWorksheet ExpandRows(Int32 outlineLevel) - { - if (outlineLevel < 1 || outlineLevel > 8) - throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); - - Internals.RowsCollection.Values.Where(r => r.OutlineLevel == outlineLevel).ForEach(r => r.Expand()); - return this; - } - - public IXLWorksheet ExpandColumns(Int32 outlineLevel) - { - if (outlineLevel < 1 || outlineLevel > 8) - throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); - - Internals.ColumnsCollection.Values.Where(c => c.OutlineLevel == outlineLevel).ForEach(c => c.Expand()); - return this; - } - - public void Delete() - { - Workbook.WorksheetsInternal.Delete(Name); - } - - public IXLNamedRanges NamedRanges { get; private set; } - - public IXLNamedRange NamedRange(String rangeName) - { - return NamedRanges.NamedRange(rangeName); - } - - public IXLSheetView SheetView { get; private set; } - public IXLTables Tables { get; private set; } - - public IXLTable Table(Int32 index) - { - return Tables.Table(index); - } - - public IXLTable Table(String name) - { - return Tables.Table(name); - } - - public IXLWorksheet CopyTo(String newSheetName) - { - return CopyTo(Workbook, newSheetName, Workbook.WorksheetsInternal.Count + 1); - } - - public IXLWorksheet CopyTo(String newSheetName, Int32 position) - { - return CopyTo(Workbook, newSheetName, position); - } - - public IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName) - { - return CopyTo(workbook, newSheetName, workbook.WorksheetsInternal.Count + 1); - } - - public IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName, Int32 position) - { - var targetSheet = (XLWorksheet)workbook.WorksheetsInternal.Add(newSheetName, position); - Internals.ColumnsCollection.ForEach(kp => targetSheet.Internals.ColumnsCollection.Add(kp.Key, new XLColumn(kp.Value))); - Internals.RowsCollection.ForEach(kp => targetSheet.Internals.RowsCollection.Add(kp.Key, new XLRow(kp.Value))); - Internals.CellsCollection.GetCells().ForEach(c => targetSheet.Cell(c.Address).CopyFrom(c, false)); - DataValidations.ForEach(dv => targetSheet.DataValidations.Add(new XLDataValidation(dv))); - targetSheet.Visibility = Visibility; - targetSheet.ColumnWidth = ColumnWidth; - targetSheet.ColumnWidthChanged = ColumnWidthChanged; - targetSheet.RowHeight = RowHeight; - targetSheet.RowHeightChanged = RowHeightChanged; - targetSheet.SetStyle(Style); - targetSheet.PageSetup = new XLPageSetup((XLPageSetup)PageSetup, targetSheet); - (targetSheet.PageSetup.Header as XLHeaderFooter).Changed = true; - (targetSheet.PageSetup.Footer as XLHeaderFooter).Changed = true; - targetSheet.Outline = new XLOutline(Outline); - targetSheet.SheetView = new XLSheetView(SheetView); - Internals.MergedRanges.ForEach( - kp => targetSheet.Internals.MergedRanges.Add(targetSheet.Range(kp.RangeAddress.ToString()))); - - foreach (IXLNamedRange r in NamedRanges) - { - var ranges = new XLRanges(); - r.Ranges.ForEach(ranges.Add); - targetSheet.NamedRanges.Add(r.Name, ranges); - } - - foreach (XLTable t in Tables.Cast()) - { - String tableName = t.Name; - var table = targetSheet.Tables.Any(tt => tt.Name == tableName) - ? new XLTable(targetSheet.Range(t.RangeAddress.ToString()), true) - : new XLTable(targetSheet.Range(t.RangeAddress.ToString()), tableName, true); - - table.RelId = t.RelId; - table.EmphasizeFirstColumn = t.EmphasizeFirstColumn; - table.EmphasizeLastColumn = t.EmphasizeLastColumn; - table.ShowRowStripes = t.ShowRowStripes; - table.ShowColumnStripes = t.ShowColumnStripes; - table.ShowAutoFilter = t.ShowAutoFilter; - table.Theme = t.Theme; - table._showTotalsRow = t.ShowTotalsRow; - table._uniqueNames.Clear(); - - t._uniqueNames.ForEach(n => table._uniqueNames.Add(n)); - Int32 fieldCount = t.ColumnCount(); - for (Int32 f = 0; f < fieldCount; f++) - { - var tableField = table.Field(f) as XLTableField; - var tField = t.Field(f) as XLTableField; - tableField.Index = tField.Index; - tableField.Name = tField.Name; - tableField.totalsRowLabel = tField.totalsRowLabel; - tableField.totalsRowFunction = tField.totalsRowFunction; - } - } - - if (AutoFilter.Enabled) - targetSheet.Range(AutoFilter.Range.RangeAddress).SetAutoFilter(); - - return targetSheet; - } - - private String ReplaceRelativeSheet(string newSheetName, String value) - { - if (XLHelper.IsNullOrWhiteSpace(value)) return value; - - var newValue = new StringBuilder(); - var addresses = value.Split(','); - foreach (var address in addresses) - { - var pair = address.Split('!'); - if (pair.Length == 2) - { - String sheetName = pair[0]; - if (sheetName.StartsWith("'")) - sheetName = sheetName.Substring(1, sheetName.Length - 2); - - String name = sheetName.ToLower().Equals(Name.ToLower()) - ? newSheetName - : sheetName; - newValue.Append(String.Format("'{0}'!{1}", name, pair[1])); - } - else - { - newValue.Append(address); - } - } - return newValue.ToString(); - } - - public new IXLHyperlinks Hyperlinks { get; private set; } - - IXLDataValidations IXLWorksheet.DataValidations - { - get { return DataValidations; } - } - - private XLWorksheetVisibility _visibility; - public XLWorksheetVisibility Visibility - { - get { return _visibility; } - set - { - if (value != XLWorksheetVisibility.Visible) - TabSelected = false; - - _visibility = value; - } - } - - public IXLWorksheet Hide() - { - Visibility = XLWorksheetVisibility.Hidden; - return this; - } - - public IXLWorksheet Unhide() - { - Visibility = XLWorksheetVisibility.Visible; - return this; - } - - IXLSheetProtection IXLWorksheet.Protection - { - get { return Protection; } - } - - public IXLSheetProtection Protect() - { - return Protection.Protect(); - } - - public IXLSheetProtection Protect(String password) - { - return Protection.Protect(password); - } - - public IXLSheetProtection Unprotect() - { - return Protection.Unprotect(); - } - - public IXLSheetProtection Unprotect(String password) - { - return Protection.Unprotect(password); - } - - - public new IXLRange Sort() - { - return GetRangeForSort().Sort(); - } - - public new IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, - Boolean matchCase = false, Boolean ignoreBlanks = true) - { - return GetRangeForSort().Sort(columnsToSortBy, sortOrder, matchCase, ignoreBlanks); - } - - public new IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, - Boolean matchCase = false, Boolean ignoreBlanks = true) - { - return GetRangeForSort().Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks); - } - - public new IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, - Boolean ignoreBlanks = true) - { - return GetRangeForSort().SortLeftToRight(sortOrder, matchCase, ignoreBlanks); - } - - public Boolean ShowFormulas { get; set; } - public Boolean ShowGridLines { get; set; } - public Boolean ShowOutlineSymbols { get; set; } - public Boolean ShowRowColHeaders { get; set; } - public Boolean ShowRuler { get; set; } - public Boolean ShowWhiteSpace { get; set; } - public Boolean ShowZeros { get; set; } - - public IXLWorksheet SetShowFormulas() - { - ShowFormulas = true; - return this; - } - - public IXLWorksheet SetShowFormulas(Boolean value) - { - ShowFormulas = value; - return this; - } - - public IXLWorksheet SetShowGridLines() - { - ShowGridLines = true; - return this; - } - - public IXLWorksheet SetShowGridLines(Boolean value) - { - ShowGridLines = value; - return this; - } - - public IXLWorksheet SetShowOutlineSymbols() - { - ShowOutlineSymbols = true; - return this; - } - - public IXLWorksheet SetShowOutlineSymbols(Boolean value) - { - ShowOutlineSymbols = value; - return this; - } - - public IXLWorksheet SetShowRowColHeaders() - { - ShowRowColHeaders = true; - return this; - } - - public IXLWorksheet SetShowRowColHeaders(Boolean value) - { - ShowRowColHeaders = value; - return this; - } - - public IXLWorksheet SetShowRuler() - { - ShowRuler = true; - return this; - } - - public IXLWorksheet SetShowRuler(Boolean value) - { - ShowRuler = value; - return this; - } - - public IXLWorksheet SetShowWhiteSpace() - { - ShowWhiteSpace = true; - return this; - } - - public IXLWorksheet SetShowWhiteSpace(Boolean value) - { - ShowWhiteSpace = value; - return this; - } - - public IXLWorksheet SetShowZeros() - { - ShowZeros = true; - return this; - } - - public IXLWorksheet SetShowZeros(Boolean value) - { - ShowZeros = value; - return this; - } - - public XLColor TabColor { get; set; } - - public IXLWorksheet SetTabColor(XLColor color) - { - TabColor = color; - return this; - } - - public Boolean TabSelected { get; set; } - - public Boolean TabActive - { - get { return _tabActive; } - set - { - if (value && !_tabActive) - { - foreach (XLWorksheet ws in Worksheet.Workbook.WorksheetsInternal) - ws._tabActive = false; - } - _tabActive = value; - } - } - - public IXLWorksheet SetTabSelected() - { - TabSelected = true; - return this; - } - - public IXLWorksheet SetTabSelected(Boolean value) - { - TabSelected = value; - return this; - } - - public IXLWorksheet SetTabActive() - { - TabActive = true; - return this; - } - - public IXLWorksheet SetTabActive(Boolean value) - { - TabActive = value; - return this; - } - - IXLPivotTable IXLWorksheet.PivotTable(String name) - { - return PivotTable(name); - } - - public IXLPivotTables PivotTables { get; private set; } - - public Boolean RightToLeft { get; set; } - - public IXLWorksheet SetRightToLeft() - { - RightToLeft = true; - return this; - } - - public IXLWorksheet SetRightToLeft(Boolean value) - { - RightToLeft = value; - return this; - } - - public new IXLRanges Ranges(String ranges) - { - var retVal = new XLRanges(); - foreach (string rangeAddressStr in ranges.Split(',').Select(s => s.Trim())) - { - if (XLHelper.IsValidRangeAddress(rangeAddressStr)) - retVal.Add(Range(new XLRangeAddress(Worksheet, rangeAddressStr))); - else if (NamedRanges.Any(n => String.Compare(n.Name, rangeAddressStr, true) == 0)) - NamedRange(rangeAddressStr).Ranges.ForEach(retVal.Add); - else - { - Workbook.NamedRanges.First(n => - String.Compare(n.Name, rangeAddressStr, true) == 0 - && n.Ranges.First().Worksheet == this) - .Ranges.ForEach(retVal.Add); - } - } - return retVal; - } - - IXLBaseAutoFilter IXLWorksheet.AutoFilter - { - get { return AutoFilter; } - } - - public IXLRows RowsUsed(Boolean includeFormats = false, Func predicate = null) - { - var rows = new XLRows(Worksheet); - var rowsUsed = new HashSet(); - Internals.RowsCollection.Keys.ForEach(r => rowsUsed.Add(r)); - Internals.CellsCollection.RowsUsed.Keys.ForEach(r => rowsUsed.Add(r)); - foreach (var rowNum in rowsUsed) - { - var row = Row(rowNum); - if (!row.IsEmpty(includeFormats) && (predicate == null || predicate(row))) - rows.Add(row); - else - row.Dispose(); - } - return rows; - } - public IXLRows RowsUsed(Func predicate = null) - { - return RowsUsed(false, predicate); - } - - public IXLColumns ColumnsUsed(Boolean includeFormats = false, Func predicate = null) - { - var columns = new XLColumns(Worksheet); - var columnsUsed = new HashSet(); - Internals.ColumnsCollection.Keys.ForEach(r => columnsUsed.Add(r)); - Internals.CellsCollection.ColumnsUsed.Keys.ForEach(r => columnsUsed.Add(r)); - foreach (var columnNum in columnsUsed) - { - var column = Column(columnNum); - if (!column.IsEmpty(includeFormats) && (predicate == null || predicate(column))) - columns.Add(column); - else - column.Dispose(); - } - return columns; - } - public IXLColumns ColumnsUsed(Func predicate = null) - { - return ColumnsUsed(false, predicate); - } - - public new void Dispose() - { - if (AutoFilter != null) - AutoFilter.Dispose(); - - Internals.Dispose(); - - base.Dispose(); - } - - #endregion - - #region Outlines - - public void IncrementColumnOutline(Int32 level) - { - if (level <= 0) return; - if (!_columnOutlineCount.ContainsKey(level)) - _columnOutlineCount.Add(level, 0); - - _columnOutlineCount[level]++; - } - - public void DecrementColumnOutline(Int32 level) - { - if (level <= 0) return; - if (!_columnOutlineCount.ContainsKey(level)) - _columnOutlineCount.Add(level, 0); - - if (_columnOutlineCount[level] > 0) - _columnOutlineCount[level]--; - } - - public Int32 GetMaxColumnOutline() - { - var list = _columnOutlineCount.Where(kp => kp.Value > 0).ToList(); - return list.Count == 0 ? 0 : list.Max(kp => kp.Key); - } - - public void IncrementRowOutline(Int32 level) - { - if (level <= 0) return; - if (!_rowOutlineCount.ContainsKey(level)) - _rowOutlineCount.Add(level, 0); - - _rowOutlineCount[level]++; - } - - public void DecrementRowOutline(Int32 level) - { - if (level <= 0) return; - if (!_rowOutlineCount.ContainsKey(level)) - _rowOutlineCount.Add(level, 0); - - if (_rowOutlineCount[level] > 0) - _rowOutlineCount[level]--; - } - - public Int32 GetMaxRowOutline() - { - return _rowOutlineCount.Count == 0 ? 0 : _rowOutlineCount.Where(kp => kp.Value > 0).Max(kp => kp.Key); - } - - #endregion - - public HashSet GetStyleIds() - { - return Internals.CellsCollection.GetStyleIds(GetStyleId()); - } - - public XLRow FirstRowUsed() - { - return FirstRowUsed(false); - } - - public XLRow FirstRowUsed(Boolean includeFormats) - { - using (var asRange = AsRange()) - using (var rngRow = asRange.FirstRowUsed(includeFormats)) - return rngRow != null ? Row(rngRow.RangeAddress.FirstAddress.RowNumber) : null; - } - - public XLRow LastRowUsed() - { - return LastRowUsed(false); - } - - public XLRow LastRowUsed(Boolean includeFormats) - { - using (var asRange = AsRange()) - using (var rngRow = asRange.LastRowUsed(includeFormats)) - return rngRow != null ? Row(rngRow.RangeAddress.LastAddress.RowNumber) : null; - } - - public XLColumn LastColumn() - { - return Column(XLHelper.MaxColumnNumber); - } - - public XLColumn FirstColumn() - { - return Column(1); - } - - public XLRow FirstRow() - { - return Row(1); - } - - public XLRow LastRow() - { - return Row(XLHelper.MaxRowNumber); - } - - public XLColumn FirstColumnUsed() - { - return FirstColumnUsed(false); - } - - public XLColumn FirstColumnUsed(Boolean includeFormats) - { - using (var asRange = AsRange()) - using (var rngColumn = asRange.FirstColumnUsed(includeFormats)) - return rngColumn != null ? Column(rngColumn.RangeAddress.FirstAddress.ColumnNumber) : null; - } - - public XLColumn LastColumnUsed() - { - return LastColumnUsed(false); - } - - public XLColumn LastColumnUsed(Boolean includeFormats) - { - using (var asRange = AsRange()) - using (var rngColumn = asRange.LastColumnUsed(includeFormats)) - return rngColumn != null ? Column(rngColumn.RangeAddress.LastAddress.ColumnNumber) : null; - } - - public XLRow Row(Int32 row) - { - return Row(row, true); - } - - public XLColumn Column(Int32 column) - { - if (column <= 0 || column > XLHelper.MaxColumnNumber) - throw new IndexOutOfRangeException(String.Format("Column number must be between 1 and {0}", - XLHelper.MaxColumnNumber)); - - Int32 thisStyleId = GetStyleId(); - if (!Internals.ColumnsCollection.ContainsKey(column)) - { - // This is a new row so we're going to reference all - // cells in this row to preserve their formatting - Internals.RowsCollection.Keys.ForEach(r => Cell(r, column)); - Internals.ColumnsCollection.Add(column, - new XLColumn(column, new XLColumnParameters(this, thisStyleId, false))); - } - - return new XLColumn(column, new XLColumnParameters(this, thisStyleId, true)); - } - - public IXLColumn Column(String column) - { - return Column(XLHelper.GetColumnNumberFromLetter(column)); - } - - public override XLRange AsRange() - { - return Range(1, 1, XLHelper.MaxRowNumber, XLHelper.MaxColumnNumber); - } - - public void Clear() - { - Internals.CellsCollection.Clear(); - Internals.ColumnsCollection.Clear(); - Internals.MergedRanges.Clear(); - Internals.RowsCollection.Clear(); - } - - private void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) - { - var newMerge = new XLRanges(); - foreach (IXLRange rngMerged in Internals.MergedRanges) - { - if (range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.RangeAddress.FirstAddress.ColumnNumber - && rngMerged.RangeAddress.FirstAddress.RowNumber >= range.RangeAddress.FirstAddress.RowNumber - && rngMerged.RangeAddress.LastAddress.RowNumber <= range.RangeAddress.LastAddress.RowNumber) - { - var newRng = Range( - rngMerged.RangeAddress.FirstAddress.RowNumber, - rngMerged.RangeAddress.FirstAddress.ColumnNumber + columnsShifted, - rngMerged.RangeAddress.LastAddress.RowNumber, - rngMerged.RangeAddress.LastAddress.ColumnNumber + columnsShifted); - newMerge.Add(newRng); - } - else if ( - !(range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.RangeAddress.FirstAddress.ColumnNumber - && range.RangeAddress.FirstAddress.RowNumber <= rngMerged.RangeAddress.LastAddress.RowNumber)) - newMerge.Add(rngMerged); - } - Internals.MergedRanges = newMerge; - - Workbook.Worksheets.ForEach(ws => MoveNamedRangesColumns(range, columnsShifted, ws.NamedRanges)); - MoveNamedRangesColumns(range, columnsShifted, Workbook.NamedRanges); - ShiftConditionalFormattingColumns(range, columnsShifted); - ShiftPageBreaksColumns(range, columnsShifted); - } - - private void ShiftPageBreaksColumns(XLRange range, int columnsShifted) - { - for (var i = 0; i < PageSetup.ColumnBreaks.Count; i++) - { - int br = PageSetup.ColumnBreaks[i]; - if (range.RangeAddress.FirstAddress.ColumnNumber <= br) - { - PageSetup.ColumnBreaks[i] = br + columnsShifted; - } - } - } - - private void ShiftConditionalFormattingColumns(XLRange range, int columnsShifted) - { - Int32 firstColumn = range.RangeAddress.FirstAddress.ColumnNumber; - if (firstColumn == 1) return; - - Int32 lastColumn = range.RangeAddress.FirstAddress.ColumnNumber + columnsShifted - 1; - Int32 firstRow = range.RangeAddress.FirstAddress.RowNumber; - Int32 lastRow = range.RangeAddress.LastAddress.RowNumber; - var insertedRange = Range(firstRow, firstColumn, lastRow, lastColumn); - var fc = insertedRange.FirstColumn(); - var model = fc.ColumnLeft(); - Int32 modelFirstRow = model.RangeAddress.FirstAddress.RowNumber; - if (ConditionalFormats.Any(cf => cf.Range.Intersects(model))) - { - for (Int32 ro = firstRow; ro <= lastRow; ro++) - { - var cellModel = model.Cell(ro - modelFirstRow + 1); - foreach (var cf in ConditionalFormats.Where(cf => cf.Range.Intersects(cellModel.AsRange())).ToList()) - { - Range(ro, firstColumn, ro, lastColumn).AddConditionalFormat(cf); - } - } - } - insertedRange.Dispose(); - model.Dispose(); - fc.Dispose(); - } - - private void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) - { - var newMerge = new XLRanges(); - foreach (IXLRange rngMerged in Internals.MergedRanges) - { - if (range.RangeAddress.FirstAddress.RowNumber <= rngMerged.RangeAddress.FirstAddress.RowNumber - && rngMerged.RangeAddress.FirstAddress.ColumnNumber >= range.RangeAddress.FirstAddress.ColumnNumber - && rngMerged.RangeAddress.LastAddress.ColumnNumber <= range.RangeAddress.LastAddress.ColumnNumber) - { - var newRng = Range( - rngMerged.RangeAddress.FirstAddress.RowNumber + rowsShifted, - rngMerged.RangeAddress.FirstAddress.ColumnNumber, - rngMerged.RangeAddress.LastAddress.RowNumber + rowsShifted, - rngMerged.RangeAddress.LastAddress.ColumnNumber); - newMerge.Add(newRng); - } - else if (!(range.RangeAddress.FirstAddress.RowNumber <= rngMerged.RangeAddress.FirstAddress.RowNumber - && range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.RangeAddress.LastAddress.ColumnNumber)) - newMerge.Add(rngMerged); - } - Internals.MergedRanges = newMerge; - - Workbook.Worksheets.ForEach(ws => MoveNamedRangesRows(range, rowsShifted, ws.NamedRanges)); - MoveNamedRangesRows(range, rowsShifted, Workbook.NamedRanges); - ShiftConditionalFormattingRows(range, rowsShifted); - ShiftPageBreaksRows(range, rowsShifted); - } - - private void ShiftPageBreaksRows(XLRange range, int rowsShifted) - { - for (var i = 0; i < PageSetup.RowBreaks.Count; i++) - { - int br = PageSetup.RowBreaks[i]; - if (range.RangeAddress.FirstAddress.RowNumber <= br) - { - PageSetup.RowBreaks[i] = br + rowsShifted; - } - } - } - - private void ShiftConditionalFormattingRows(XLRange range, int rowsShifted) - { - Int32 firstRow = range.RangeAddress.FirstAddress.RowNumber; - if (firstRow == 1) return; - - SuspendEvents(); - var rangeUsed = range.Worksheet.RangeUsed(true); - IXLRangeAddress usedAddress; - if (rangeUsed == null) - usedAddress = range.RangeAddress; - else - usedAddress = rangeUsed.RangeAddress; - ResumeEvents(); - - if (firstRow < usedAddress.FirstAddress.RowNumber) firstRow = usedAddress.FirstAddress.RowNumber; - - Int32 lastRow = range.RangeAddress.FirstAddress.RowNumber + rowsShifted - 1; - if (lastRow > usedAddress.LastAddress.RowNumber) lastRow = usedAddress.LastAddress.RowNumber; - - Int32 firstColumn = range.RangeAddress.FirstAddress.ColumnNumber; - if (firstColumn < usedAddress.FirstAddress.ColumnNumber) firstColumn = usedAddress.FirstAddress.ColumnNumber; - - Int32 lastColumn = range.RangeAddress.LastAddress.ColumnNumber; - if (lastColumn > usedAddress.LastAddress.ColumnNumber) lastColumn = usedAddress.LastAddress.ColumnNumber; - - var insertedRange = Range(firstRow, firstColumn, lastRow, lastColumn); - var fr = insertedRange.FirstRow(); - var model = fr.RowAbove(); - Int32 modelFirstColumn = model.RangeAddress.FirstAddress.ColumnNumber; - if (ConditionalFormats.Any(cf=>cf.Range.Intersects(model))) - { - for (Int32 co = firstColumn; co <= lastColumn; co++) - { - var cellModel = model.Cell(co - modelFirstColumn + 1); - foreach (var cf in ConditionalFormats.Where(cf => cf.Range.Intersects(cellModel.AsRange())).ToList()) - { - Range(firstRow, co, lastRow, co).AddConditionalFormat(cf); - } - } - } - insertedRange.Dispose(); - model.Dispose(); - fr.Dispose(); - } - - - internal void BreakConditionalFormatsIntoCells(List addresses) - { - var newConditionalFormats = new XLConditionalFormats(); - SuspendEvents(); - foreach (var conditionalFormat in ConditionalFormats) - { - foreach (XLCell cell in conditionalFormat.Range.Cells(c=>!addresses.Contains(c.Address))) - { - var row = cell.Address.RowNumber; - var column = cell.Address.ColumnLetter; - var newConditionalFormat = new XLConditionalFormat(cell.AsRange(), true); - newConditionalFormat.CopyFrom(conditionalFormat); - newConditionalFormat.Values.Values.Where(f => f.IsFormula) - .ForEach(f => f._value = XLHelper.ReplaceRelative(f.Value, row, column)); - newConditionalFormats.Add(newConditionalFormat); - } - conditionalFormat.Range.Dispose(); - } - ResumeEvents(); - ConditionalFormats = newConditionalFormats; - } - - - - private void MoveNamedRangesRows(XLRange range, int rowsShifted, IXLNamedRanges namedRanges) - { - foreach (XLNamedRange nr in namedRanges) - { - var newRangeList = - nr.RangeList.Select(r => XLCell.ShiftFormulaRows(r, this, range, rowsShifted)).Where( - newReference => newReference.Length > 0).ToList(); - nr.RangeList = newRangeList; - } - } - - private void MoveNamedRangesColumns(XLRange range, int columnsShifted, IXLNamedRanges namedRanges) - { - foreach (XLNamedRange nr in namedRanges) - { - var newRangeList = - nr.RangeList.Select(r => XLCell.ShiftFormulaColumns(r, this, range, columnsShifted)).Where( - newReference => newReference.Length > 0).ToList(); - nr.RangeList = newRangeList; - } - } - - public void NotifyRangeShiftedRows(XLRange range, Int32 rowsShifted) - { - if (RangeShiftedRows != null) - { - foreach(var item in RangeShiftedRows) - { - item.Action(range, rowsShifted); - } - } - } - - public void NotifyRangeShiftedColumns(XLRange range, Int32 columnsShifted) - { - if (RangeShiftedColumns != null) - { - foreach(var item in RangeShiftedColumns) - { - item.Action(range, columnsShifted); - } - } - } - - public XLRow Row(Int32 row, Boolean pingCells) - { - if (row <= 0 || row > XLHelper.MaxRowNumber) - throw new IndexOutOfRangeException(String.Format("Row number must be between 1 and {0}", - XLHelper.MaxRowNumber)); - - Int32 styleId; - XLRow rowToUse; - if (Internals.RowsCollection.TryGetValue(row, out rowToUse)) - styleId = rowToUse.GetStyleId(); - else - { - if (pingCells) - { - // This is a new row so we're going to reference all - // cells in columns of this row to preserve their formatting - - var usedColumns = from c in Internals.ColumnsCollection - join dc in Internals.CellsCollection.ColumnsUsed.Keys - on c.Key equals dc - where !Internals.CellsCollection.Contains(row, dc) - select dc; - - usedColumns.ForEach(c => Cell(row, c)); - } - styleId = GetStyleId(); - Internals.RowsCollection.Add(row, new XLRow(row, new XLRowParameters(this, styleId, false))); - } - - return new XLRow(row, new XLRowParameters(this, styleId)); - } - - private IXLRange GetRangeForSort() - { - var range = RangeUsed(); - SortColumns.ForEach(e => range.SortColumns.Add(e.ElementNumber, e.SortOrder, e.IgnoreBlanks, e.MatchCase)); - SortRows.ForEach(e => range.SortRows.Add(e.ElementNumber, e.SortOrder, e.IgnoreBlanks, e.MatchCase)); - return range; - } - - public XLPivotTable PivotTable(String name) - { - return (XLPivotTable)PivotTables.PivotTable(name); - } - - public new IXLCells Cells() - { - return Cells(true, true); - } - - public new IXLCells Cells(Boolean usedCellsOnly) - { - if (usedCellsOnly) - return Cells(true, true); - else - return Range(FirstCellUsed(), LastCellUsed()).Cells(false, true); - } - - public new XLCell Cell(String cellAddressInRange) - { - if (XLHelper.IsValidA1Address(cellAddressInRange)) - return Cell(XLAddress.Create(this, cellAddressInRange)); - - if (NamedRanges.Any(n => String.Compare(n.Name, cellAddressInRange, true) == 0)) - return (XLCell)NamedRange(cellAddressInRange).Ranges.First().FirstCell(); - - var namedRanges = Workbook.NamedRanges.FirstOrDefault(n => - String.Compare(n.Name, cellAddressInRange, true) == 0 - && n.Ranges.Count == 1); - if (namedRanges == null || !namedRanges.Ranges.Any()) return null; - - return (XLCell)namedRanges.Ranges.First().FirstCell(); - } - - internal XLCell CellFast(String cellAddressInRange) - { - return Cell(XLAddress.Create(this, cellAddressInRange)); - } - - public override XLRange Range(String rangeAddressStr) - { - if (XLHelper.IsValidRangeAddress(rangeAddressStr)) - return Range(new XLRangeAddress(Worksheet, rangeAddressStr)); - - if (rangeAddressStr.Contains("[")) - return Table(rangeAddressStr.Substring(0, rangeAddressStr.IndexOf("["))) as XLRange; - - if (NamedRanges.Any(n => String.Compare(n.Name, rangeAddressStr, true) == 0)) - return (XLRange)NamedRange(rangeAddressStr).Ranges.First(); - - var namedRanges = Workbook.NamedRanges.FirstOrDefault(n => - String.Compare(n.Name, rangeAddressStr, true) == 0 - && n.Ranges.Count == 1 - ); - if (namedRanges == null || !namedRanges.Ranges.Any()) return null; - return (XLRange)namedRanges.Ranges.First(); - } - - public IXLRanges MergedRanges { get { return Internals.MergedRanges; } } - - public IXLConditionalFormats ConditionalFormats { get; private set; } - - private Boolean _eventTracking; - public void SuspendEvents() - { - _eventTracking = EventTrackingEnabled; - EventTrackingEnabled = false; - } - public void ResumeEvents() - { - EventTrackingEnabled = _eventTracking; - } - - public IXLRanges SelectedRanges { get; internal set; } - - public IXLCell ActiveCell { get; set; } - - private XLCalcEngine _calcEngine; - private XLCalcEngine CalcEngine - { - get { return _calcEngine ?? (_calcEngine = new XLCalcEngine(this)); } - } - - public Object Evaluate(String expression) - { - return CalcEngine.Evaluate(expression); - } - - public String Author { get; set; } - - public List Pictures() - { - return pictures; - } - - public void AddPicture(Drawings.XLPicture pic) - { - if (pictures == null) - { - pictures = new List(); - } - pictures.Add(pic); - } - } -} +using ClosedXML.Excel.CalcEngine; +using ClosedXML.Excel.Drawings; +using ClosedXML.Excel.Misc; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; + +namespace ClosedXML.Excel +{ + internal class XLWorksheet : XLRangeBase, IXLWorksheet + { + #region Events + + public XLReentrantEnumerableSet RangeShiftedRows; + public XLReentrantEnumerableSet RangeShiftedColumns; + + #endregion Events + + #region Fields + + private readonly Dictionary _columnOutlineCount = new Dictionary(); + private readonly Dictionary _rowOutlineCount = new Dictionary(); + internal Int32 ZOrder = 1; + private String _name; + internal Int32 _position; + + private Double _rowHeight; + private Boolean _tabActive; + internal Boolean EventTrackingEnabled; + + #endregion Fields + + #region Constructor + + public XLWorksheet(String sheetName, XLWorkbook workbook) + : base( + new XLRangeAddress( + new XLAddress(null, XLHelper.MinRowNumber, XLHelper.MinColumnNumber, false, false), + new XLAddress(null, XLHelper.MaxRowNumber, XLHelper.MaxColumnNumber, false, false))) + { + EventTrackingEnabled = workbook.EventTracking == XLEventTracking.Enabled; + + RangeShiftedRows = new XLReentrantEnumerableSet(); + RangeShiftedColumns = new XLReentrantEnumerableSet(); + + RangeAddress.Worksheet = this; + RangeAddress.FirstAddress.Worksheet = this; + RangeAddress.LastAddress.Worksheet = this; + + Pictures = new XLPictures(this); + NamedRanges = new XLNamedRanges(workbook); + SheetView = new XLSheetView(); + Tables = new XLTables(); + Hyperlinks = new XLHyperlinks(); + DataValidations = new XLDataValidations(); + PivotTables = new XLPivotTables(); + Protection = new XLSheetProtection(); + AutoFilter = new XLAutoFilter(); + ConditionalFormats = new XLConditionalFormats(); + Workbook = workbook; + SetStyle(workbook.Style); + Internals = new XLWorksheetInternals(new XLCellsCollection(), new XLColumnsCollection(), + new XLRowsCollection(), new XLRanges()); + PageSetup = new XLPageSetup((XLPageSetup)workbook.PageOptions, this); + Outline = new XLOutline(workbook.Outline); + _columnWidth = workbook.ColumnWidth; + _rowHeight = workbook.RowHeight; + RowHeightChanged = Math.Abs(workbook.RowHeight - XLWorkbook.DefaultRowHeight) > XLHelper.Epsilon; + Name = sheetName; + SubscribeToShiftedRows((range, rowsShifted) => this.WorksheetRangeShiftedRows(range, rowsShifted)); + SubscribeToShiftedColumns((range, columnsShifted) => this.WorksheetRangeShiftedColumns(range, columnsShifted)); + Charts = new XLCharts(); + ShowFormulas = workbook.ShowFormulas; + ShowGridLines = workbook.ShowGridLines; + ShowOutlineSymbols = workbook.ShowOutlineSymbols; + ShowRowColHeaders = workbook.ShowRowColHeaders; + ShowRuler = workbook.ShowRuler; + ShowWhiteSpace = workbook.ShowWhiteSpace; + ShowZeros = workbook.ShowZeros; + RightToLeft = workbook.RightToLeft; + TabColor = XLColor.NoColor; + SelectedRanges = new XLRanges(); + + Author = workbook.Author; + } + + #endregion Constructor + + //private IXLStyle _style; + private const String InvalidNameChars = @":\/?*[]"; + + public string LegacyDrawingId; + public Boolean LegacyDrawingIsNew; + private Double _columnWidth; + public XLWorksheetInternals Internals { get; private set; } + + public override IEnumerable Styles + { + get + { + UpdatingStyle = true; + yield return GetStyle(); + foreach (XLCell c in Internals.CellsCollection.GetCells()) + yield return c.Style; + UpdatingStyle = false; + } + } + + public override Boolean UpdatingStyle { get; set; } + + public override IXLStyle InnerStyle + { + get { return GetStyle(); } + set { SetStyle(value); } + } + + internal Boolean RowHeightChanged { get; set; } + internal Boolean ColumnWidthChanged { get; set; } + + public Int32 SheetId { get; set; } + internal String RelId { get; set; } + public XLDataValidations DataValidations { get; private set; } + public IXLCharts Charts { get; private set; } + public XLSheetProtection Protection { get; private set; } + public XLAutoFilter AutoFilter { get; private set; } + + #region IXLWorksheet Members + + public XLWorkbook Workbook { get; private set; } + + public override IXLStyle Style + { + get + { + return GetStyle(); + } + set + { + SetStyle(value); + foreach (XLCell cell in Internals.CellsCollection.GetCells()) + cell.Style = value; + } + } + + public Double ColumnWidth + { + get { return _columnWidth; } + set + { + ColumnWidthChanged = true; + _columnWidth = value; + } + } + + public Double RowHeight + { + get { return _rowHeight; } + set + { + RowHeightChanged = true; + _rowHeight = value; + } + } + + public String Name + { + get { return _name; } + set + { + if (value.IndexOfAny(InvalidNameChars.ToCharArray()) != -1) + throw new ArgumentException("Worksheet names cannot contain any of the following characters: " + + InvalidNameChars); + + if (XLHelper.IsNullOrWhiteSpace(value)) + throw new ArgumentException("Worksheet names cannot be empty"); + + if (value.Length > 31) + throw new ArgumentException("Worksheet names cannot be more than 31 characters"); + + Workbook.WorksheetsInternal.Rename(_name, value); + _name = value; + } + } + + public Int32 Position + { + get { return _position; } + set + { + if (value > Workbook.WorksheetsInternal.Count + Workbook.UnsupportedSheets.Count + 1) + throw new IndexOutOfRangeException("Index must be equal or less than the number of worksheets + 1."); + + if (value < _position) + { + Workbook.WorksheetsInternal + .Where(w => w.Position >= value && w.Position < _position) + .ForEach(w => w._position += 1); + } + + if (value > _position) + { + Workbook.WorksheetsInternal + .Where(w => w.Position <= value && w.Position > _position) + .ForEach(w => (w)._position -= 1); + } + + _position = value; + } + } + + public IXLPageSetup PageSetup { get; private set; } + public IXLOutline Outline { get; private set; } + + IXLRow IXLWorksheet.FirstRowUsed() + { + return FirstRowUsed(); + } + + IXLRow IXLWorksheet.FirstRowUsed(Boolean includeFormats) + { + return FirstRowUsed(includeFormats); + } + + IXLRow IXLWorksheet.LastRowUsed() + { + return LastRowUsed(); + } + + IXLRow IXLWorksheet.LastRowUsed(Boolean includeFormats) + { + return LastRowUsed(includeFormats); + } + + IXLColumn IXLWorksheet.LastColumn() + { + return LastColumn(); + } + + IXLColumn IXLWorksheet.FirstColumn() + { + return FirstColumn(); + } + + IXLRow IXLWorksheet.FirstRow() + { + return FirstRow(); + } + + IXLRow IXLWorksheet.LastRow() + { + return LastRow(); + } + + IXLColumn IXLWorksheet.FirstColumnUsed() + { + return FirstColumnUsed(); + } + + IXLColumn IXLWorksheet.FirstColumnUsed(Boolean includeFormats) + { + return FirstColumnUsed(includeFormats); + } + + IXLColumn IXLWorksheet.LastColumnUsed() + { + return LastColumnUsed(); + } + + IXLColumn IXLWorksheet.LastColumnUsed(Boolean includeFormats) + { + return LastColumnUsed(includeFormats); + } + + public IXLColumns Columns() + { + var retVal = new XLColumns(this); + var columnList = new List(); + + if (Internals.CellsCollection.Count > 0) + columnList.AddRange(Internals.CellsCollection.ColumnsUsed.Keys); + + if (Internals.ColumnsCollection.Count > 0) + columnList.AddRange(Internals.ColumnsCollection.Keys.Where(c => !columnList.Contains(c))); + + foreach (int c in columnList) + retVal.Add(Column(c)); + + return retVal; + } + + public IXLColumns Columns(String columns) + { + var retVal = new XLColumns(null); + var columnPairs = columns.Split(','); + foreach (string tPair in columnPairs.Select(pair => pair.Trim())) + { + String firstColumn; + String lastColumn; + if (tPair.Contains(':') || tPair.Contains('-')) + { + var columnRange = XLHelper.SplitRange(tPair); + firstColumn = columnRange[0]; + lastColumn = columnRange[1]; + } + else + { + firstColumn = tPair; + lastColumn = tPair; + } + + Int32 tmp; + if (Int32.TryParse(firstColumn, out tmp)) + { + foreach (IXLColumn col in Columns(Int32.Parse(firstColumn), Int32.Parse(lastColumn))) + retVal.Add((XLColumn)col); + } + else + { + foreach (IXLColumn col in Columns(firstColumn, lastColumn)) + retVal.Add((XLColumn)col); + } + } + return retVal; + } + + public IXLColumns Columns(String firstColumn, String lastColumn) + { + return Columns(XLHelper.GetColumnNumberFromLetter(firstColumn), + XLHelper.GetColumnNumberFromLetter(lastColumn)); + } + + public IXLColumns Columns(Int32 firstColumn, Int32 lastColumn) + { + var retVal = new XLColumns(null); + + for (int co = firstColumn; co <= lastColumn; co++) + retVal.Add(Column(co)); + return retVal; + } + + public IXLRows Rows() + { + var retVal = new XLRows(this); + var rowList = new List(); + + if (Internals.CellsCollection.Count > 0) + rowList.AddRange(Internals.CellsCollection.RowsUsed.Keys); + + if (Internals.RowsCollection.Count > 0) + rowList.AddRange(Internals.RowsCollection.Keys.Where(r => !rowList.Contains(r))); + + foreach (int r in rowList) + retVal.Add(Row(r)); + + return retVal; + } + + public IXLRows Rows(String rows) + { + var retVal = new XLRows(null); + var rowPairs = rows.Split(','); + foreach (string tPair in rowPairs.Select(pair => pair.Trim())) + { + String firstRow; + String lastRow; + if (tPair.Contains(':') || tPair.Contains('-')) + { + var rowRange = XLHelper.SplitRange(tPair); + firstRow = rowRange[0]; + lastRow = rowRange[1]; + } + else + { + firstRow = tPair; + lastRow = tPair; + } + foreach (IXLRow row in Rows(Int32.Parse(firstRow), Int32.Parse(lastRow))) + retVal.Add((XLRow)row); + } + return retVal; + } + + public IXLRows Rows(Int32 firstRow, Int32 lastRow) + { + var retVal = new XLRows(null); + + for (int ro = firstRow; ro <= lastRow; ro++) + retVal.Add(Row(ro)); + return retVal; + } + + IXLRow IXLWorksheet.Row(Int32 row) + { + return Row(row); + } + + IXLColumn IXLWorksheet.Column(Int32 column) + { + return Column(column); + } + + IXLColumn IXLWorksheet.Column(String column) + { + return Column(column); + } + + IXLCell IXLWorksheet.Cell(int row, int column) + { + return Cell(row, column); + } + + IXLCell IXLWorksheet.Cell(string cellAddressInRange) + { + return Cell(cellAddressInRange); + } + + IXLCell IXLWorksheet.Cell(int row, string column) + { + return Cell(row, column); + } + + IXLCell IXLWorksheet.Cell(IXLAddress cellAddressInRange) + { + return Cell(cellAddressInRange); + } + + IXLRange IXLWorksheet.Range(IXLRangeAddress rangeAddress) + { + return Range(rangeAddress); + } + + IXLRange IXLWorksheet.Range(string rangeAddress) + { + return Range(rangeAddress); + } + + IXLRange IXLWorksheet.Range(IXLCell firstCell, IXLCell lastCell) + { + return Range(firstCell, lastCell); + } + + IXLRange IXLWorksheet.Range(string firstCellAddress, string lastCellAddress) + { + return Range(firstCellAddress, lastCellAddress); + } + + IXLRange IXLWorksheet.Range(IXLAddress firstCellAddress, IXLAddress lastCellAddress) + { + return Range(firstCellAddress, lastCellAddress); + } + + IXLRange IXLWorksheet.Range(int firstCellRow, int firstCellColumn, int lastCellRow, int lastCellColumn) + { + return Range(firstCellRow, firstCellColumn, lastCellRow, lastCellColumn); + } + + public IXLWorksheet CollapseRows() + { + Enumerable.Range(1, 8).ForEach(i => CollapseRows(i)); + return this; + } + + public IXLWorksheet CollapseColumns() + { + Enumerable.Range(1, 8).ForEach(i => CollapseColumns(i)); + return this; + } + + public IXLWorksheet ExpandRows() + { + Enumerable.Range(1, 8).ForEach(i => ExpandRows(i)); + return this; + } + + public IXLWorksheet ExpandColumns() + { + Enumerable.Range(1, 8).ForEach(i => ExpandRows(i)); + return this; + } + + public IXLWorksheet CollapseRows(Int32 outlineLevel) + { + if (outlineLevel < 1 || outlineLevel > 8) + throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); + + Internals.RowsCollection.Values.Where(r => r.OutlineLevel == outlineLevel).ForEach(r => r.Collapse()); + return this; + } + + public IXLWorksheet CollapseColumns(Int32 outlineLevel) + { + if (outlineLevel < 1 || outlineLevel > 8) + throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); + + Internals.ColumnsCollection.Values.Where(c => c.OutlineLevel == outlineLevel).ForEach(c => c.Collapse()); + return this; + } + + public IXLWorksheet ExpandRows(Int32 outlineLevel) + { + if (outlineLevel < 1 || outlineLevel > 8) + throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); + + Internals.RowsCollection.Values.Where(r => r.OutlineLevel == outlineLevel).ForEach(r => r.Expand()); + return this; + } + + public IXLWorksheet ExpandColumns(Int32 outlineLevel) + { + if (outlineLevel < 1 || outlineLevel > 8) + throw new ArgumentOutOfRangeException("outlineLevel", "Outline level must be between 1 and 8."); + + Internals.ColumnsCollection.Values.Where(c => c.OutlineLevel == outlineLevel).ForEach(c => c.Expand()); + return this; + } + + public void Delete() + { + Workbook.WorksheetsInternal.Delete(Name); + } + + public IXLNamedRanges NamedRanges { get; private set; } + + public IXLNamedRange NamedRange(String rangeName) + { + return NamedRanges.NamedRange(rangeName); + } + + public IXLSheetView SheetView { get; private set; } + public IXLTables Tables { get; private set; } + + public IXLTable Table(Int32 index) + { + return Tables.Table(index); + } + + public IXLTable Table(String name) + { + return Tables.Table(name); + } + + public IXLWorksheet CopyTo(String newSheetName) + { + return CopyTo(Workbook, newSheetName, Workbook.WorksheetsInternal.Count + 1); + } + + public IXLWorksheet CopyTo(String newSheetName, Int32 position) + { + return CopyTo(Workbook, newSheetName, position); + } + + public IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName) + { + return CopyTo(workbook, newSheetName, workbook.WorksheetsInternal.Count + 1); + } + + public IXLWorksheet CopyTo(XLWorkbook workbook, String newSheetName, Int32 position) + { + var targetSheet = (XLWorksheet)workbook.WorksheetsInternal.Add(newSheetName, position); + Internals.ColumnsCollection.ForEach(kp => targetSheet.Internals.ColumnsCollection.Add(kp.Key, new XLColumn(kp.Value))); + Internals.RowsCollection.ForEach(kp => targetSheet.Internals.RowsCollection.Add(kp.Key, new XLRow(kp.Value))); + Internals.CellsCollection.GetCells().ForEach(c => targetSheet.Cell(c.Address).CopyFrom(c, false)); + DataValidations.ForEach(dv => targetSheet.DataValidations.Add(new XLDataValidation(dv))); + targetSheet.Visibility = Visibility; + targetSheet.ColumnWidth = ColumnWidth; + targetSheet.ColumnWidthChanged = ColumnWidthChanged; + targetSheet.RowHeight = RowHeight; + targetSheet.RowHeightChanged = RowHeightChanged; + targetSheet.SetStyle(Style); + targetSheet.PageSetup = new XLPageSetup((XLPageSetup)PageSetup, targetSheet); + (targetSheet.PageSetup.Header as XLHeaderFooter).Changed = true; + (targetSheet.PageSetup.Footer as XLHeaderFooter).Changed = true; + targetSheet.Outline = new XLOutline(Outline); + targetSheet.SheetView = new XLSheetView(SheetView); + Internals.MergedRanges.ForEach( + kp => targetSheet.Internals.MergedRanges.Add(targetSheet.Range(kp.RangeAddress.ToString()))); + + foreach (var picture in Pictures) + { + var newPic = targetSheet.AddPicture(picture.ImageStream, picture.Format, picture.Name) + .WithPlacement(picture.Placement) + .WithSize(picture.Width, picture.Height); + + switch (picture.Placement) + { + case XLPicturePlacement.FreeFloating: + newPic.MoveTo(picture.Left, picture.Top); + break; + + case XLPicturePlacement.Move: + var newAddress = new XLAddress(targetSheet, picture.TopLeftCellAddress.RowNumber, picture.TopLeftCellAddress.ColumnNumber, false, false); + newPic.MoveTo(newAddress, picture.GetOffset(XLMarkerPosition.TopLeft)); + break; + + case XLPicturePlacement.MoveAndSize: + var newFromAddress = new XLAddress(targetSheet, picture.TopLeftCellAddress.RowNumber, picture.TopLeftCellAddress.ColumnNumber, false, false); + var newToAddress = new XLAddress(targetSheet, picture.BottomRightCellAddress.RowNumber, picture.BottomRightCellAddress.ColumnNumber, false, false); + + newPic.MoveTo(newFromAddress, picture.GetOffset(XLMarkerPosition.TopLeft), newToAddress, picture.GetOffset(XLMarkerPosition.BottomRight)); + break; + } + } + + foreach (IXLNamedRange r in NamedRanges) + { + var ranges = new XLRanges(); + r.Ranges.ForEach(ranges.Add); + targetSheet.NamedRanges.Add(r.Name, ranges); + } + + foreach (XLTable t in Tables.Cast()) + { + String tableName = t.Name; + var table = targetSheet.Tables.Any(tt => tt.Name == tableName) + ? new XLTable(targetSheet.Range(t.RangeAddress.ToString()), true) + : new XLTable(targetSheet.Range(t.RangeAddress.ToString()), tableName, true); + + table.RelId = t.RelId; + table.EmphasizeFirstColumn = t.EmphasizeFirstColumn; + table.EmphasizeLastColumn = t.EmphasizeLastColumn; + table.ShowRowStripes = t.ShowRowStripes; + table.ShowColumnStripes = t.ShowColumnStripes; + table.ShowAutoFilter = t.ShowAutoFilter; + table.Theme = t.Theme; + table._showTotalsRow = t.ShowTotalsRow; + table._uniqueNames.Clear(); + + t._uniqueNames.ForEach(n => table._uniqueNames.Add(n)); + Int32 fieldCount = t.ColumnCount(); + for (Int32 f = 0; f < fieldCount; f++) + { + var tableField = table.Field(f) as XLTableField; + var tField = t.Field(f) as XLTableField; + tableField.Index = tField.Index; + tableField.Name = tField.Name; + tableField.totalsRowLabel = tField.totalsRowLabel; + tableField.totalsRowFunction = tField.totalsRowFunction; + } + } + + if (AutoFilter.Enabled) + targetSheet.Range(AutoFilter.Range.RangeAddress).SetAutoFilter(); + + return targetSheet; + } + + private String ReplaceRelativeSheet(string newSheetName, String value) + { + if (XLHelper.IsNullOrWhiteSpace(value)) return value; + + var newValue = new StringBuilder(); + var addresses = value.Split(','); + foreach (var address in addresses) + { + var pair = address.Split('!'); + if (pair.Length == 2) + { + String sheetName = pair[0]; + if (sheetName.StartsWith("'")) + sheetName = sheetName.Substring(1, sheetName.Length - 2); + + String name = sheetName.ToLower().Equals(Name.ToLower()) + ? newSheetName + : sheetName; + newValue.Append(String.Format("'{0}'!{1}", name, pair[1])); + } + else + { + newValue.Append(address); + } + } + return newValue.ToString(); + } + + public new IXLHyperlinks Hyperlinks { get; private set; } + + IXLDataValidations IXLWorksheet.DataValidations + { + get { return DataValidations; } + } + + private XLWorksheetVisibility _visibility; + + public XLWorksheetVisibility Visibility + { + get { return _visibility; } + set + { + if (value != XLWorksheetVisibility.Visible) + TabSelected = false; + + _visibility = value; + } + } + + public IXLWorksheet Hide() + { + Visibility = XLWorksheetVisibility.Hidden; + return this; + } + + public IXLWorksheet Unhide() + { + Visibility = XLWorksheetVisibility.Visible; + return this; + } + + IXLSheetProtection IXLWorksheet.Protection + { + get { return Protection; } + } + + public IXLSheetProtection Protect() + { + return Protection.Protect(); + } + + public IXLSheetProtection Protect(String password) + { + return Protection.Protect(password); + } + + public IXLSheetProtection Unprotect() + { + return Protection.Unprotect(); + } + + public IXLSheetProtection Unprotect(String password) + { + return Protection.Unprotect(password); + } + + public new IXLRange Sort() + { + return GetRangeForSort().Sort(); + } + + public new IXLRange Sort(String columnsToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, + Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return GetRangeForSort().Sort(columnsToSortBy, sortOrder, matchCase, ignoreBlanks); + } + + public new IXLRange Sort(Int32 columnToSortBy, XLSortOrder sortOrder = XLSortOrder.Ascending, + Boolean matchCase = false, Boolean ignoreBlanks = true) + { + return GetRangeForSort().Sort(columnToSortBy, sortOrder, matchCase, ignoreBlanks); + } + + public new IXLRange SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, + Boolean ignoreBlanks = true) + { + return GetRangeForSort().SortLeftToRight(sortOrder, matchCase, ignoreBlanks); + } + + public Boolean ShowFormulas { get; set; } + public Boolean ShowGridLines { get; set; } + public Boolean ShowOutlineSymbols { get; set; } + public Boolean ShowRowColHeaders { get; set; } + public Boolean ShowRuler { get; set; } + public Boolean ShowWhiteSpace { get; set; } + public Boolean ShowZeros { get; set; } + + public IXLWorksheet SetShowFormulas() + { + ShowFormulas = true; + return this; + } + + public IXLWorksheet SetShowFormulas(Boolean value) + { + ShowFormulas = value; + return this; + } + + public IXLWorksheet SetShowGridLines() + { + ShowGridLines = true; + return this; + } + + public IXLWorksheet SetShowGridLines(Boolean value) + { + ShowGridLines = value; + return this; + } + + public IXLWorksheet SetShowOutlineSymbols() + { + ShowOutlineSymbols = true; + return this; + } + + public IXLWorksheet SetShowOutlineSymbols(Boolean value) + { + ShowOutlineSymbols = value; + return this; + } + + public IXLWorksheet SetShowRowColHeaders() + { + ShowRowColHeaders = true; + return this; + } + + public IXLWorksheet SetShowRowColHeaders(Boolean value) + { + ShowRowColHeaders = value; + return this; + } + + public IXLWorksheet SetShowRuler() + { + ShowRuler = true; + return this; + } + + public IXLWorksheet SetShowRuler(Boolean value) + { + ShowRuler = value; + return this; + } + + public IXLWorksheet SetShowWhiteSpace() + { + ShowWhiteSpace = true; + return this; + } + + public IXLWorksheet SetShowWhiteSpace(Boolean value) + { + ShowWhiteSpace = value; + return this; + } + + public IXLWorksheet SetShowZeros() + { + ShowZeros = true; + return this; + } + + public IXLWorksheet SetShowZeros(Boolean value) + { + ShowZeros = value; + return this; + } + + public XLColor TabColor { get; set; } + + public IXLWorksheet SetTabColor(XLColor color) + { + TabColor = color; + return this; + } + + public Boolean TabSelected { get; set; } + + public Boolean TabActive + { + get { return _tabActive; } + set + { + if (value && !_tabActive) + { + foreach (XLWorksheet ws in Worksheet.Workbook.WorksheetsInternal) + ws._tabActive = false; + } + _tabActive = value; + } + } + + public IXLWorksheet SetTabSelected() + { + TabSelected = true; + return this; + } + + public IXLWorksheet SetTabSelected(Boolean value) + { + TabSelected = value; + return this; + } + + public IXLWorksheet SetTabActive() + { + TabActive = true; + return this; + } + + public IXLWorksheet SetTabActive(Boolean value) + { + TabActive = value; + return this; + } + + IXLPivotTable IXLWorksheet.PivotTable(String name) + { + return PivotTable(name); + } + + public IXLPivotTables PivotTables { get; private set; } + + public Boolean RightToLeft { get; set; } + + public IXLWorksheet SetRightToLeft() + { + RightToLeft = true; + return this; + } + + public IXLWorksheet SetRightToLeft(Boolean value) + { + RightToLeft = value; + return this; + } + + public new IXLRanges Ranges(String ranges) + { + var retVal = new XLRanges(); + foreach (string rangeAddressStr in ranges.Split(',').Select(s => s.Trim())) + { + if (XLHelper.IsValidRangeAddress(rangeAddressStr)) + retVal.Add(Range(new XLRangeAddress(Worksheet, rangeAddressStr))); + else if (NamedRanges.Any(n => String.Compare(n.Name, rangeAddressStr, true) == 0)) + NamedRange(rangeAddressStr).Ranges.ForEach(retVal.Add); + else + { + Workbook.NamedRanges.First(n => + String.Compare(n.Name, rangeAddressStr, true) == 0 + && n.Ranges.First().Worksheet == this) + .Ranges.ForEach(retVal.Add); + } + } + return retVal; + } + + IXLBaseAutoFilter IXLWorksheet.AutoFilter + { + get { return AutoFilter; } + } + + public IXLRows RowsUsed(Boolean includeFormats = false, Func predicate = null) + { + var rows = new XLRows(Worksheet); + var rowsUsed = new HashSet(); + Internals.RowsCollection.Keys.ForEach(r => rowsUsed.Add(r)); + Internals.CellsCollection.RowsUsed.Keys.ForEach(r => rowsUsed.Add(r)); + foreach (var rowNum in rowsUsed) + { + var row = Row(rowNum); + if (!row.IsEmpty(includeFormats) && (predicate == null || predicate(row))) + rows.Add(row); + else + row.Dispose(); + } + return rows; + } + + public IXLRows RowsUsed(Func predicate = null) + { + return RowsUsed(false, predicate); + } + + public IXLColumns ColumnsUsed(Boolean includeFormats = false, Func predicate = null) + { + var columns = new XLColumns(Worksheet); + var columnsUsed = new HashSet(); + Internals.ColumnsCollection.Keys.ForEach(r => columnsUsed.Add(r)); + Internals.CellsCollection.ColumnsUsed.Keys.ForEach(r => columnsUsed.Add(r)); + foreach (var columnNum in columnsUsed) + { + var column = Column(columnNum); + if (!column.IsEmpty(includeFormats) && (predicate == null || predicate(column))) + columns.Add(column); + else + column.Dispose(); + } + return columns; + } + + public IXLColumns ColumnsUsed(Func predicate = null) + { + return ColumnsUsed(false, predicate); + } + + public new void Dispose() + { + if (AutoFilter != null) + AutoFilter.Dispose(); + + Internals.Dispose(); + + this.Pictures.ForEach(p => p.Dispose()); + + base.Dispose(); + } + + #endregion IXLWorksheet Members + + #region Outlines + + public void IncrementColumnOutline(Int32 level) + { + if (level <= 0) return; + if (!_columnOutlineCount.ContainsKey(level)) + _columnOutlineCount.Add(level, 0); + + _columnOutlineCount[level]++; + } + + public void DecrementColumnOutline(Int32 level) + { + if (level <= 0) return; + if (!_columnOutlineCount.ContainsKey(level)) + _columnOutlineCount.Add(level, 0); + + if (_columnOutlineCount[level] > 0) + _columnOutlineCount[level]--; + } + + public Int32 GetMaxColumnOutline() + { + var list = _columnOutlineCount.Where(kp => kp.Value > 0).ToList(); + return list.Count == 0 ? 0 : list.Max(kp => kp.Key); + } + + public void IncrementRowOutline(Int32 level) + { + if (level <= 0) return; + if (!_rowOutlineCount.ContainsKey(level)) + _rowOutlineCount.Add(level, 0); + + _rowOutlineCount[level]++; + } + + public void DecrementRowOutline(Int32 level) + { + if (level <= 0) return; + if (!_rowOutlineCount.ContainsKey(level)) + _rowOutlineCount.Add(level, 0); + + if (_rowOutlineCount[level] > 0) + _rowOutlineCount[level]--; + } + + public Int32 GetMaxRowOutline() + { + return _rowOutlineCount.Count == 0 ? 0 : _rowOutlineCount.Where(kp => kp.Value > 0).Max(kp => kp.Key); + } + + #endregion Outlines + + public HashSet GetStyleIds() + { + return Internals.CellsCollection.GetStyleIds(GetStyleId()); + } + + public XLRow FirstRowUsed() + { + return FirstRowUsed(false); + } + + public XLRow FirstRowUsed(Boolean includeFormats) + { + using (var asRange = AsRange()) + using (var rngRow = asRange.FirstRowUsed(includeFormats)) + return rngRow != null ? Row(rngRow.RangeAddress.FirstAddress.RowNumber) : null; + } + + public XLRow LastRowUsed() + { + return LastRowUsed(false); + } + + public XLRow LastRowUsed(Boolean includeFormats) + { + using (var asRange = AsRange()) + using (var rngRow = asRange.LastRowUsed(includeFormats)) + return rngRow != null ? Row(rngRow.RangeAddress.LastAddress.RowNumber) : null; + } + + public XLColumn LastColumn() + { + return Column(XLHelper.MaxColumnNumber); + } + + public XLColumn FirstColumn() + { + return Column(1); + } + + public XLRow FirstRow() + { + return Row(1); + } + + public XLRow LastRow() + { + return Row(XLHelper.MaxRowNumber); + } + + public XLColumn FirstColumnUsed() + { + return FirstColumnUsed(false); + } + + public XLColumn FirstColumnUsed(Boolean includeFormats) + { + using (var asRange = AsRange()) + using (var rngColumn = asRange.FirstColumnUsed(includeFormats)) + return rngColumn != null ? Column(rngColumn.RangeAddress.FirstAddress.ColumnNumber) : null; + } + + public XLColumn LastColumnUsed() + { + return LastColumnUsed(false); + } + + public XLColumn LastColumnUsed(Boolean includeFormats) + { + using (var asRange = AsRange()) + using (var rngColumn = asRange.LastColumnUsed(includeFormats)) + return rngColumn != null ? Column(rngColumn.RangeAddress.LastAddress.ColumnNumber) : null; + } + + public XLRow Row(Int32 row) + { + return Row(row, true); + } + + public XLColumn Column(Int32 column) + { + if (column <= 0 || column > XLHelper.MaxColumnNumber) + throw new IndexOutOfRangeException(String.Format("Column number must be between 1 and {0}", + XLHelper.MaxColumnNumber)); + + Int32 thisStyleId = GetStyleId(); + if (!Internals.ColumnsCollection.ContainsKey(column)) + { + // This is a new row so we're going to reference all + // cells in this row to preserve their formatting + Internals.RowsCollection.Keys.ForEach(r => Cell(r, column)); + Internals.ColumnsCollection.Add(column, + new XLColumn(column, new XLColumnParameters(this, thisStyleId, false))); + } + + return new XLColumn(column, new XLColumnParameters(this, thisStyleId, true)); + } + + public IXLColumn Column(String column) + { + return Column(XLHelper.GetColumnNumberFromLetter(column)); + } + + public override XLRange AsRange() + { + return Range(1, 1, XLHelper.MaxRowNumber, XLHelper.MaxColumnNumber); + } + + public void Clear() + { + Internals.CellsCollection.Clear(); + Internals.ColumnsCollection.Clear(); + Internals.MergedRanges.Clear(); + Internals.RowsCollection.Clear(); + } + + private void WorksheetRangeShiftedColumns(XLRange range, int columnsShifted) + { + var newMerge = new XLRanges(); + foreach (IXLRange rngMerged in Internals.MergedRanges) + { + if (range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.RangeAddress.FirstAddress.ColumnNumber + && rngMerged.RangeAddress.FirstAddress.RowNumber >= range.RangeAddress.FirstAddress.RowNumber + && rngMerged.RangeAddress.LastAddress.RowNumber <= range.RangeAddress.LastAddress.RowNumber) + { + var newRng = Range( + rngMerged.RangeAddress.FirstAddress.RowNumber, + rngMerged.RangeAddress.FirstAddress.ColumnNumber + columnsShifted, + rngMerged.RangeAddress.LastAddress.RowNumber, + rngMerged.RangeAddress.LastAddress.ColumnNumber + columnsShifted); + newMerge.Add(newRng); + } + else if ( + !(range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.RangeAddress.FirstAddress.ColumnNumber + && range.RangeAddress.FirstAddress.RowNumber <= rngMerged.RangeAddress.LastAddress.RowNumber)) + newMerge.Add(rngMerged); + } + Internals.MergedRanges = newMerge; + + Workbook.Worksheets.ForEach(ws => MoveNamedRangesColumns(range, columnsShifted, ws.NamedRanges)); + MoveNamedRangesColumns(range, columnsShifted, Workbook.NamedRanges); + ShiftConditionalFormattingColumns(range, columnsShifted); + ShiftPageBreaksColumns(range, columnsShifted); + } + + private void ShiftPageBreaksColumns(XLRange range, int columnsShifted) + { + for (var i = 0; i < PageSetup.ColumnBreaks.Count; i++) + { + int br = PageSetup.ColumnBreaks[i]; + if (range.RangeAddress.FirstAddress.ColumnNumber <= br) + { + PageSetup.ColumnBreaks[i] = br + columnsShifted; + } + } + } + + private void ShiftConditionalFormattingColumns(XLRange range, int columnsShifted) + { + Int32 firstColumn = range.RangeAddress.FirstAddress.ColumnNumber; + if (firstColumn == 1) return; + + Int32 lastColumn = range.RangeAddress.FirstAddress.ColumnNumber + columnsShifted - 1; + Int32 firstRow = range.RangeAddress.FirstAddress.RowNumber; + Int32 lastRow = range.RangeAddress.LastAddress.RowNumber; + var insertedRange = Range(firstRow, firstColumn, lastRow, lastColumn); + var fc = insertedRange.FirstColumn(); + var model = fc.ColumnLeft(); + Int32 modelFirstRow = model.RangeAddress.FirstAddress.RowNumber; + if (ConditionalFormats.Any(cf => cf.Range.Intersects(model))) + { + for (Int32 ro = firstRow; ro <= lastRow; ro++) + { + var cellModel = model.Cell(ro - modelFirstRow + 1); + foreach (var cf in ConditionalFormats.Where(cf => cf.Range.Intersects(cellModel.AsRange())).ToList()) + { + Range(ro, firstColumn, ro, lastColumn).AddConditionalFormat(cf); + } + } + } + insertedRange.Dispose(); + model.Dispose(); + fc.Dispose(); + } + + private void WorksheetRangeShiftedRows(XLRange range, int rowsShifted) + { + var newMerge = new XLRanges(); + foreach (IXLRange rngMerged in Internals.MergedRanges) + { + if (range.RangeAddress.FirstAddress.RowNumber <= rngMerged.RangeAddress.FirstAddress.RowNumber + && rngMerged.RangeAddress.FirstAddress.ColumnNumber >= range.RangeAddress.FirstAddress.ColumnNumber + && rngMerged.RangeAddress.LastAddress.ColumnNumber <= range.RangeAddress.LastAddress.ColumnNumber) + { + var newRng = Range( + rngMerged.RangeAddress.FirstAddress.RowNumber + rowsShifted, + rngMerged.RangeAddress.FirstAddress.ColumnNumber, + rngMerged.RangeAddress.LastAddress.RowNumber + rowsShifted, + rngMerged.RangeAddress.LastAddress.ColumnNumber); + newMerge.Add(newRng); + } + else if (!(range.RangeAddress.FirstAddress.RowNumber <= rngMerged.RangeAddress.FirstAddress.RowNumber + && range.RangeAddress.FirstAddress.ColumnNumber <= rngMerged.RangeAddress.LastAddress.ColumnNumber)) + newMerge.Add(rngMerged); + } + Internals.MergedRanges = newMerge; + + Workbook.Worksheets.ForEach(ws => MoveNamedRangesRows(range, rowsShifted, ws.NamedRanges)); + MoveNamedRangesRows(range, rowsShifted, Workbook.NamedRanges); + ShiftConditionalFormattingRows(range, rowsShifted); + ShiftPageBreaksRows(range, rowsShifted); + } + + private void ShiftPageBreaksRows(XLRange range, int rowsShifted) + { + for (var i = 0; i < PageSetup.RowBreaks.Count; i++) + { + int br = PageSetup.RowBreaks[i]; + if (range.RangeAddress.FirstAddress.RowNumber <= br) + { + PageSetup.RowBreaks[i] = br + rowsShifted; + } + } + } + + private void ShiftConditionalFormattingRows(XLRange range, int rowsShifted) + { + Int32 firstRow = range.RangeAddress.FirstAddress.RowNumber; + if (firstRow == 1) return; + + SuspendEvents(); + var rangeUsed = range.Worksheet.RangeUsed(true); + IXLRangeAddress usedAddress; + if (rangeUsed == null) + usedAddress = range.RangeAddress; + else + usedAddress = rangeUsed.RangeAddress; + ResumeEvents(); + + if (firstRow < usedAddress.FirstAddress.RowNumber) firstRow = usedAddress.FirstAddress.RowNumber; + + Int32 lastRow = range.RangeAddress.FirstAddress.RowNumber + rowsShifted - 1; + if (lastRow > usedAddress.LastAddress.RowNumber) lastRow = usedAddress.LastAddress.RowNumber; + + Int32 firstColumn = range.RangeAddress.FirstAddress.ColumnNumber; + if (firstColumn < usedAddress.FirstAddress.ColumnNumber) firstColumn = usedAddress.FirstAddress.ColumnNumber; + + Int32 lastColumn = range.RangeAddress.LastAddress.ColumnNumber; + if (lastColumn > usedAddress.LastAddress.ColumnNumber) lastColumn = usedAddress.LastAddress.ColumnNumber; + + var insertedRange = Range(firstRow, firstColumn, lastRow, lastColumn); + var fr = insertedRange.FirstRow(); + var model = fr.RowAbove(); + Int32 modelFirstColumn = model.RangeAddress.FirstAddress.ColumnNumber; + if (ConditionalFormats.Any(cf => cf.Range.Intersects(model))) + { + for (Int32 co = firstColumn; co <= lastColumn; co++) + { + var cellModel = model.Cell(co - modelFirstColumn + 1); + foreach (var cf in ConditionalFormats.Where(cf => cf.Range.Intersects(cellModel.AsRange())).ToList()) + { + Range(firstRow, co, lastRow, co).AddConditionalFormat(cf); + } + } + } + insertedRange.Dispose(); + model.Dispose(); + fr.Dispose(); + } + + internal void BreakConditionalFormatsIntoCells(List addresses) + { + var newConditionalFormats = new XLConditionalFormats(); + SuspendEvents(); + foreach (var conditionalFormat in ConditionalFormats) + { + foreach (XLCell cell in conditionalFormat.Range.Cells(c => !addresses.Contains(c.Address))) + { + var row = cell.Address.RowNumber; + var column = cell.Address.ColumnLetter; + var newConditionalFormat = new XLConditionalFormat(cell.AsRange(), true); + newConditionalFormat.CopyFrom(conditionalFormat); + newConditionalFormat.Values.Values.Where(f => f.IsFormula) + .ForEach(f => f._value = XLHelper.ReplaceRelative(f.Value, row, column)); + newConditionalFormats.Add(newConditionalFormat); + } + conditionalFormat.Range.Dispose(); + } + ResumeEvents(); + ConditionalFormats = newConditionalFormats; + } + + private void MoveNamedRangesRows(XLRange range, int rowsShifted, IXLNamedRanges namedRanges) + { + foreach (XLNamedRange nr in namedRanges) + { + var newRangeList = + nr.RangeList.Select(r => XLCell.ShiftFormulaRows(r, this, range, rowsShifted)).Where( + newReference => newReference.Length > 0).ToList(); + nr.RangeList = newRangeList; + } + } + + private void MoveNamedRangesColumns(XLRange range, int columnsShifted, IXLNamedRanges namedRanges) + { + foreach (XLNamedRange nr in namedRanges) + { + var newRangeList = + nr.RangeList.Select(r => XLCell.ShiftFormulaColumns(r, this, range, columnsShifted)).Where( + newReference => newReference.Length > 0).ToList(); + nr.RangeList = newRangeList; + } + } + + public void NotifyRangeShiftedRows(XLRange range, Int32 rowsShifted) + { + if (RangeShiftedRows != null) + { + foreach (var item in RangeShiftedRows) + { + item.Action(range, rowsShifted); + } + } + } + + public void NotifyRangeShiftedColumns(XLRange range, Int32 columnsShifted) + { + if (RangeShiftedColumns != null) + { + foreach (var item in RangeShiftedColumns) + { + item.Action(range, columnsShifted); + } + } + } + + public XLRow Row(Int32 row, Boolean pingCells) + { + if (row <= 0 || row > XLHelper.MaxRowNumber) + throw new IndexOutOfRangeException(String.Format("Row number must be between 1 and {0}", + XLHelper.MaxRowNumber)); + + Int32 styleId; + XLRow rowToUse; + if (Internals.RowsCollection.TryGetValue(row, out rowToUse)) + styleId = rowToUse.GetStyleId(); + else + { + if (pingCells) + { + // This is a new row so we're going to reference all + // cells in columns of this row to preserve their formatting + + var usedColumns = from c in Internals.ColumnsCollection + join dc in Internals.CellsCollection.ColumnsUsed.Keys + on c.Key equals dc + where !Internals.CellsCollection.Contains(row, dc) + select dc; + + usedColumns.ForEach(c => Cell(row, c)); + } + styleId = GetStyleId(); + Internals.RowsCollection.Add(row, new XLRow(row, new XLRowParameters(this, styleId, false))); + } + + return new XLRow(row, new XLRowParameters(this, styleId)); + } + + private IXLRange GetRangeForSort() + { + var range = RangeUsed(); + SortColumns.ForEach(e => range.SortColumns.Add(e.ElementNumber, e.SortOrder, e.IgnoreBlanks, e.MatchCase)); + SortRows.ForEach(e => range.SortRows.Add(e.ElementNumber, e.SortOrder, e.IgnoreBlanks, e.MatchCase)); + return range; + } + + public XLPivotTable PivotTable(String name) + { + return (XLPivotTable)PivotTables.PivotTable(name); + } + + public new IXLCells Cells() + { + return Cells(true, true); + } + + public new IXLCells Cells(Boolean usedCellsOnly) + { + if (usedCellsOnly) + return Cells(true, true); + else + return Range(FirstCellUsed(), LastCellUsed()).Cells(false, true); + } + + public new XLCell Cell(String cellAddressInRange) + { + if (XLHelper.IsValidA1Address(cellAddressInRange)) + return Cell(XLAddress.Create(this, cellAddressInRange)); + + if (NamedRanges.Any(n => String.Compare(n.Name, cellAddressInRange, true) == 0)) + return (XLCell)NamedRange(cellAddressInRange).Ranges.First().FirstCell(); + + var namedRanges = Workbook.NamedRanges.FirstOrDefault(n => + String.Compare(n.Name, cellAddressInRange, true) == 0 + && n.Ranges.Count == 1); + if (namedRanges == null || !namedRanges.Ranges.Any()) return null; + + return (XLCell)namedRanges.Ranges.First().FirstCell(); + } + + internal XLCell CellFast(String cellAddressInRange) + { + return Cell(XLAddress.Create(this, cellAddressInRange)); + } + + public override XLRange Range(String rangeAddressStr) + { + if (XLHelper.IsValidRangeAddress(rangeAddressStr)) + return Range(new XLRangeAddress(Worksheet, rangeAddressStr)); + + if (rangeAddressStr.Contains("[")) + return Table(rangeAddressStr.Substring(0, rangeAddressStr.IndexOf("["))) as XLRange; + + if (NamedRanges.Any(n => String.Compare(n.Name, rangeAddressStr, true) == 0)) + return (XLRange)NamedRange(rangeAddressStr).Ranges.First(); + + var namedRanges = Workbook.NamedRanges.FirstOrDefault(n => + String.Compare(n.Name, rangeAddressStr, true) == 0 + && n.Ranges.Count == 1 + ); + if (namedRanges == null || !namedRanges.Ranges.Any()) return null; + return (XLRange)namedRanges.Ranges.First(); + } + + public IXLRanges MergedRanges { get { return Internals.MergedRanges; } } + + public IXLConditionalFormats ConditionalFormats { get; private set; } + + private Boolean _eventTracking; + + public void SuspendEvents() + { + _eventTracking = EventTrackingEnabled; + EventTrackingEnabled = false; + } + + public void ResumeEvents() + { + EventTrackingEnabled = _eventTracking; + } + + public IXLRanges SelectedRanges { get; internal set; } + + public IXLCell ActiveCell { get; set; } + + private XLCalcEngine _calcEngine; + + private XLCalcEngine CalcEngine + { + get { return _calcEngine ?? (_calcEngine = new XLCalcEngine(this)); } + } + + public Object Evaluate(String expression) + { + return CalcEngine.Evaluate(expression); + } + + public String Author { get; set; } + + public IXLPictures Pictures { get; private set; } + + public IXLPicture Picture(string pictureName) + { + return Pictures.Picture(pictureName); + } + + public IXLPicture AddPicture(Stream stream) + { + return Pictures.Add(stream); + } + + public IXLPicture AddPicture(Stream stream, string name) + { + return Pictures.Add(stream, name); + } + + public Drawings.IXLPicture AddPicture(Stream stream, XLPictureFormat format) + { + return Pictures.Add(stream, format); + } + + public IXLPicture AddPicture(Stream stream, XLPictureFormat format, string name) + { + return Pictures.Add(stream, format, name); + } + + public IXLPicture AddPicture(Bitmap bitmap) + { + return Pictures.Add(bitmap); + } + + public IXLPicture AddPicture(Bitmap bitmap, string name) + { + return Pictures.Add(bitmap, name); + } + + public IXLPicture AddPicture(string imageFile) + { + return Pictures.Add(imageFile); + } + + public IXLPicture AddPicture(string imageFile, string name) + { + return Pictures.Add(imageFile, name); + } + } +} diff --git a/ClosedXML/Excel/XLWorksheetInternals.cs b/ClosedXML/Excel/XLWorksheetInternals.cs index e7b7b0c..04a73f7 100644 --- a/ClosedXML/Excel/XLWorksheetInternals.cs +++ b/ClosedXML/Excel/XLWorksheetInternals.cs @@ -1,31 +1,32 @@ -using System; -namespace ClosedXML.Excel -{ - internal class XLWorksheetInternals: IDisposable - { - public XLWorksheetInternals( - XLCellsCollection cellsCollection, - XLColumnsCollection columnsCollection, - XLRowsCollection rowsCollection, - XLRanges mergedRanges - ) - { - CellsCollection = cellsCollection; - ColumnsCollection = columnsCollection; - RowsCollection = rowsCollection; - MergedRanges = mergedRanges; - } - - public XLCellsCollection CellsCollection { get; private set; } - public XLColumnsCollection ColumnsCollection { get; private set; } - public XLRowsCollection RowsCollection { get; private set; } - public XLRanges MergedRanges { get; internal set; } - - public void Dispose() - { - ColumnsCollection.Dispose(); - RowsCollection.Dispose(); - MergedRanges.Dispose(); - } - } -} +using System; + +namespace ClosedXML.Excel +{ + internal class XLWorksheetInternals : IDisposable + { + public XLWorksheetInternals( + XLCellsCollection cellsCollection, + XLColumnsCollection columnsCollection, + XLRowsCollection rowsCollection, + XLRanges mergedRanges + ) + { + CellsCollection = cellsCollection; + ColumnsCollection = columnsCollection; + RowsCollection = rowsCollection; + MergedRanges = mergedRanges; + } + + public XLCellsCollection CellsCollection { get; private set; } + public XLColumnsCollection ColumnsCollection { get; private set; } + public XLRowsCollection RowsCollection { get; private set; } + public XLRanges MergedRanges { get; internal set; } + + public void Dispose() + { + ColumnsCollection.Dispose(); + RowsCollection.Dispose(); + MergedRanges.Dispose(); + } + } +} diff --git a/ClosedXML/Excel/XLWorksheets.cs b/ClosedXML/Excel/XLWorksheets.cs index 6207f57..ea22509 100644 --- a/ClosedXML/Excel/XLWorksheets.cs +++ b/ClosedXML/Excel/XLWorksheets.cs @@ -1,180 +1,180 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Data; -using System.Diagnostics; -using System.Linq; - -namespace ClosedXML.Excel -{ - internal class XLWorksheets : IXLWorksheets, IEnumerable - { - #region Constructor - - private readonly XLWorkbook _workbook; - private readonly Dictionary _worksheets = new Dictionary(); - - #endregion - - public HashSet Deleted = new HashSet(); - - #region Constructor - - public XLWorksheets(XLWorkbook workbook) - { - _workbook = workbook; - } - - #endregion - - #region IEnumerable Members - - public IEnumerator GetEnumerator() - { - return ((IEnumerable)_worksheets.Values).GetEnumerator(); - } - - #endregion - - #region IXLWorksheets Members - - public int Count - { - [DebuggerStepThrough] - get { return _worksheets.Count; } - } - - public bool TryGetWorksheet(string sheetName, out IXLWorksheet worksheet) - { - XLWorksheet w; - if (_worksheets.TryGetValue(sheetName, out w)) - { - worksheet = w; - return true; - } - worksheet = null; - return false; - } - - internal static string TrimSheetName(string sheetName) - { - if (sheetName.StartsWith("'") && sheetName.EndsWith("'") && sheetName.Length > 2) - sheetName = sheetName.Substring(1, sheetName.Length - 2); - - return sheetName; - } - - public IXLWorksheet Worksheet(String sheetName) - { - sheetName = TrimSheetName(sheetName); - - XLWorksheet w; - - if (_worksheets.TryGetValue(sheetName, out w)) - return w; - - var wss = _worksheets.Where(ws => string.Equals(ws.Key, sheetName, StringComparison.OrdinalIgnoreCase)); - if (wss.Any()) - return wss.First().Value; - - throw new Exception("There isn't a worksheet named '" + sheetName + "'."); - } - - public IXLWorksheet Worksheet(Int32 position) - { - int wsCount = _worksheets.Values.Count(w => w.Position == position); - if (wsCount == 0) - throw new Exception("There isn't a worksheet associated with that position."); - - if (wsCount > 1) - { - throw new Exception( - "Can't retrieve a worksheet because there are multiple worksheets associated with that position."); - } - - return _worksheets.Values.Single(w => w.Position == position); - } - - public IXLWorksheet Add(String sheetName) - { - var sheet = new XLWorksheet(sheetName, _workbook); - _worksheets.Add(sheetName, sheet); - sheet._position = _worksheets.Count + _workbook.UnsupportedSheets.Count; - return sheet; - } - - public IXLWorksheet Add(String sheetName, Int32 position) - { - _worksheets.Values.Where(w => w._position >= position).ForEach(w => w._position += 1); - _workbook.UnsupportedSheets.Where(w => w.Position >= position).ForEach(w => w.Position += 1); - var sheet = new XLWorksheet(sheetName, _workbook); - _worksheets.Add(sheetName, sheet); - sheet._position = position; - return sheet; - } - - public void Delete(String sheetName) - { - Delete(_worksheets[sheetName].Position); - } - - public void Delete(Int32 position) - { - int wsCount = _worksheets.Values.Count(w => w.Position == position); - if (wsCount == 0) - throw new Exception("There isn't a worksheet associated with that index."); - - if (wsCount > 1) - throw new Exception( - "Can't delete the worksheet because there are multiple worksheets associated with that index."); - - var ws = _worksheets.Values.Single(w => w.Position == position); - if (!XLHelper.IsNullOrWhiteSpace(ws.RelId) && !Deleted.Contains(ws.RelId)) - Deleted.Add(ws.RelId); - - _worksheets.RemoveAll(w => w.Position == position); - _worksheets.Values.Where(w => w.Position > position).ForEach(w => w._position -= 1); - _workbook.UnsupportedSheets.Where(w => w.Position > position).ForEach(w => w.Position -= 1); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return _worksheets.Values.Cast().GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IXLWorksheet Add(DataTable dataTable) - { - return Add(dataTable, dataTable.TableName); - } - - public IXLWorksheet Add(DataTable dataTable, String sheetName) - { - var ws = Add(sheetName); - ws.Cell(1, 1).InsertTable(dataTable); - ws.Columns().AdjustToContents(1, 75); - return ws; - } - - public void Add(DataSet dataSet) - { - foreach (DataTable t in dataSet.Tables) - Add(t); - } - - #endregion - - public void Rename(String oldSheetName, String newSheetName) - { - if (XLHelper.IsNullOrWhiteSpace(oldSheetName) || !_worksheets.ContainsKey(oldSheetName)) return; - - var ws = _worksheets[oldSheetName]; - _worksheets.Remove(oldSheetName); - _worksheets.Add(newSheetName, ws); - } - } -} +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Linq; + +namespace ClosedXML.Excel +{ + internal class XLWorksheets : IXLWorksheets, IEnumerable + { + #region Constructor + + private readonly XLWorkbook _workbook; + private readonly Dictionary _worksheets = new Dictionary(); + + #endregion Constructor + + public HashSet Deleted = new HashSet(); + + #region Constructor + + public XLWorksheets(XLWorkbook workbook) + { + _workbook = workbook; + } + + #endregion Constructor + + #region IEnumerable Members + + public IEnumerator GetEnumerator() + { + return ((IEnumerable)_worksheets.Values).GetEnumerator(); + } + + #endregion IEnumerable Members + + #region IXLWorksheets Members + + public int Count + { + [DebuggerStepThrough] + get { return _worksheets.Count; } + } + + public bool TryGetWorksheet(string sheetName, out IXLWorksheet worksheet) + { + XLWorksheet w; + if (_worksheets.TryGetValue(sheetName, out w)) + { + worksheet = w; + return true; + } + worksheet = null; + return false; + } + + internal static string TrimSheetName(string sheetName) + { + if (sheetName.StartsWith("'") && sheetName.EndsWith("'") && sheetName.Length > 2) + sheetName = sheetName.Substring(1, sheetName.Length - 2); + + return sheetName; + } + + public IXLWorksheet Worksheet(String sheetName) + { + sheetName = TrimSheetName(sheetName); + + XLWorksheet w; + + if (_worksheets.TryGetValue(sheetName, out w)) + return w; + + var wss = _worksheets.Where(ws => string.Equals(ws.Key, sheetName, StringComparison.OrdinalIgnoreCase)); + if (wss.Any()) + return wss.First().Value; + + throw new Exception("There isn't a worksheet named '" + sheetName + "'."); + } + + public IXLWorksheet Worksheet(Int32 position) + { + int wsCount = _worksheets.Values.Count(w => w.Position == position); + if (wsCount == 0) + throw new Exception("There isn't a worksheet associated with that position."); + + if (wsCount > 1) + { + throw new Exception( + "Can't retrieve a worksheet because there are multiple worksheets associated with that position."); + } + + return _worksheets.Values.Single(w => w.Position == position); + } + + public IXLWorksheet Add(String sheetName) + { + var sheet = new XLWorksheet(sheetName, _workbook); + _worksheets.Add(sheetName, sheet); + sheet._position = _worksheets.Count + _workbook.UnsupportedSheets.Count; + return sheet; + } + + public IXLWorksheet Add(String sheetName, Int32 position) + { + _worksheets.Values.Where(w => w._position >= position).ForEach(w => w._position += 1); + _workbook.UnsupportedSheets.Where(w => w.Position >= position).ForEach(w => w.Position += 1); + var sheet = new XLWorksheet(sheetName, _workbook); + _worksheets.Add(sheetName, sheet); + sheet._position = position; + return sheet; + } + + public void Delete(String sheetName) + { + Delete(_worksheets[sheetName].Position); + } + + public void Delete(Int32 position) + { + int wsCount = _worksheets.Values.Count(w => w.Position == position); + if (wsCount == 0) + throw new Exception("There isn't a worksheet associated with that index."); + + if (wsCount > 1) + throw new Exception( + "Can't delete the worksheet because there are multiple worksheets associated with that index."); + + var ws = _worksheets.Values.Single(w => w.Position == position); + if (!XLHelper.IsNullOrWhiteSpace(ws.RelId) && !Deleted.Contains(ws.RelId)) + Deleted.Add(ws.RelId); + + _worksheets.RemoveAll(w => w.Position == position); + _worksheets.Values.Where(w => w.Position > position).ForEach(w => w._position -= 1); + _workbook.UnsupportedSheets.Where(w => w.Position > position).ForEach(w => w.Position -= 1); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _worksheets.Values.Cast().GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IXLWorksheet Add(DataTable dataTable) + { + return Add(dataTable, dataTable.TableName); + } + + public IXLWorksheet Add(DataTable dataTable, String sheetName) + { + var ws = Add(sheetName); + ws.Cell(1, 1).InsertTable(dataTable); + ws.Columns().AdjustToContents(1, 75); + return ws; + } + + public void Add(DataSet dataSet) + { + foreach (DataTable t in dataSet.Tables) + Add(t); + } + + #endregion IXLWorksheets Members + + public void Rename(String oldSheetName, String newSheetName) + { + if (XLHelper.IsNullOrWhiteSpace(oldSheetName) || !_worksheets.ContainsKey(oldSheetName)) return; + + var ws = _worksheets[oldSheetName]; + _worksheets.Remove(oldSheetName); + _worksheets.Add(newSheetName, ws); + } + } +} diff --git a/ClosedXML/Extensions.cs b/ClosedXML/Extensions.cs index b2e1cd0..7655168 100644 --- a/ClosedXML/Extensions.cs +++ b/ClosedXML/Extensions.cs @@ -1,357 +1,349 @@ -using ClosedXML.Utils; -using DocumentFormat.OpenXml; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Linq; - -[assembly: CLSCompliantAttribute(true)] - -namespace ClosedXML.Excel -{ - public static class Extensions - { - // Adds the .ForEach method to all IEnumerables - - private static readonly char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; - - public static String ToHex(this Color color) - { - byte[] bytes = new byte[4]; - - bytes[0] = color.A; - - bytes[1] = color.R; - - bytes[2] = color.G; - - bytes[3] = color.B; - - char[] chars = new char[bytes.Length * 2]; - - for (int i = 0; i < bytes.Length; i++) - { - int b = bytes[i]; - - chars[i * 2] = hexDigits[b >> 4]; - - chars[i * 2 + 1] = hexDigits[b & 0xF]; - } - - return new string(chars); - } - - public static String RemoveSpecialCharacters(this String str) - { - StringBuilder sb = new StringBuilder(); - foreach (char c in str) - { - if (Char.IsLetterOrDigit(c) || c == '.' || c == '_') - { - sb.Append(c); - } - } - return sb.ToString(); - } - - public static Int32 CharCount(this String instance, Char c) - { - return instance.Length - instance.Replace(c.ToString(), "").Length; - } - - public static Boolean HasDuplicates(this IEnumerable source) - { - HashSet distinctItems = new HashSet(); - foreach (var item in source) - { - if (!distinctItems.Add(item)) - { - return true; - } - } - return false; - } - - public static T CastTo(this Object o) - { - return (T)Convert.ChangeType(o, typeof(T)); - } - } - - public static class DictionaryExtensions - { - public static void RemoveAll(this Dictionary dic, - Func predicate) - { - var keys = dic.Keys.Where(k => predicate(dic[k])).ToList(); - foreach (var key in keys) - { - dic.Remove(key); - } - } - } - - public static class StringExtensions - { - private static readonly Regex RegexNewLine = new Regex(@"((? bankHolidays) - { - var nextDate = date.AddDays(1); - while (!nextDate.IsWorkDay(bankHolidays)) - nextDate = nextDate.AddDays(1); - - return nextDate; - } - - public static DateTime PreviousWorkDay(this DateTime date, IEnumerable bankHolidays) - { - var previousDate = date.AddDays(-1); - while (!previousDate.IsWorkDay(bankHolidays)) - previousDate = previousDate.AddDays(-1); - - return previousDate; - } - - public static bool IsWorkDay(this DateTime date, IEnumerable bankHolidays) - { - return date.DayOfWeek != DayOfWeek.Saturday - && date.DayOfWeek != DayOfWeek.Sunday - && !bankHolidays.Contains(date); - } - } - - public static class IntegerExtensions - { - private static readonly NumberFormatInfo nfi = CultureInfo.InvariantCulture.NumberFormat; - - [ThreadStatic] - private static Dictionary intToString; - - public static String ToInvariantString(this Int32 value) - { - String sValue; - if (intToString == null) - { - intToString = new Dictionary(); - sValue = value.ToString(nfi); - intToString.Add(value, sValue); - } - else - { - if (!intToString.TryGetValue(value, out sValue)) - { - sValue = value.ToString(nfi); - intToString.Add(value, sValue); - } - } - return sValue; - } - } - - public static class DecimalExtensions - { - //All numbers are stored in XL files as invarient culture this is just a easy helper - public static String ToInvariantString(this Decimal value) - { - return value.ToString(CultureInfo.InvariantCulture); - } - - public static Decimal SaveRound(this Decimal value) - { - return Math.Round(value, 6); - } - } - - public static class DoubleExtensions - { - //All numbers are stored in XL files as invarient culture this is just a easy helper - public static String ToInvariantString(this Double value) - { - return value.ToString(CultureInfo.InvariantCulture); - } - - public static Double SaveRound(this Double value) - { - return Math.Round(value, 6); - } - } - - public static class FontBaseExtensions - { - private static Font GetCachedFont(IXLFontBase fontBase, Dictionary fontCache) - { - Font font; - if (!fontCache.TryGetValue(fontBase, out font)) - { - font = new Font(fontBase.FontName, (float)fontBase.FontSize, GetFontStyle(fontBase)); - fontCache.Add(fontBase, font); - } - return font; - } - - public static Double GetWidth(this IXLFontBase fontBase, String text, Dictionary fontCache) - { - if (XLHelper.IsNullOrWhiteSpace(text)) - return 0; - - var font = GetCachedFont(fontBase, fontCache); - - var textSize = GraphicsUtils.MeasureString(text, font); - - double width = (((textSize.Width / (double)7) * 256) - (128 / 7)) / 256; - width = (double)decimal.Round((decimal)width + 0.2M, 2); - - return width; - } - - private static FontStyle GetFontStyle(IXLFontBase font) - { - FontStyle fontStyle = FontStyle.Regular; - if (font.Bold) fontStyle |= FontStyle.Bold; - if (font.Italic) fontStyle |= FontStyle.Italic; - if (font.Strikethrough) fontStyle |= FontStyle.Strikeout; - if (font.Underline != XLFontUnderlineValues.None) fontStyle |= FontStyle.Underline; - return fontStyle; - } - - public static Double GetHeight(this IXLFontBase fontBase, Dictionary fontCache) - { - var font = GetCachedFont(fontBase, fontCache); - var textSize = GraphicsUtils.MeasureString("X", font); - return (double)textSize.Height * 0.85; - } - - public static void CopyFont(this IXLFontBase font, IXLFontBase sourceFont) - { - font.Bold = sourceFont.Bold; - font.Italic = sourceFont.Italic; - font.Underline = sourceFont.Underline; - font.Strikethrough = sourceFont.Strikethrough; - font.VerticalAlignment = sourceFont.VerticalAlignment; - font.Shadow = sourceFont.Shadow; - font.FontSize = sourceFont.FontSize; - font.FontColor = sourceFont.FontColor; - font.FontName = sourceFont.FontName; - font.FontFamilyNumbering = sourceFont.FontFamilyNumbering; - } - } - - public static class XDocumentExtensions - { - public static XDocument Load(Stream stream) - { - using (XmlReader reader = XmlReader.Create(stream)) - { - return XDocument.Load(reader); - } - } - } - - public static class EnumerableExtensions - { - public static void ForEach(this IEnumerable source, Action action) - { - foreach (T item in source) - action(item); - } - - public static Type GetItemType(this IEnumerable source) - { - return typeof(T); - } - } - - public static class DoubleValueExtensions - { - public static DoubleValue SaveRound(this DoubleValue value) - { - return value.HasValue ? new DoubleValue(Math.Round(value, 6)) : value; - } - } - - public static class TypeExtensions - { - public static bool IsNumber(this Type type) - { - return type == typeof(sbyte) - || type == typeof(byte) - || type == typeof(short) - || type == typeof(ushort) - || type == typeof(int) - || type == typeof(uint) - || type == typeof(long) - || type == typeof(ulong) - || type == typeof(float) - || type == typeof(double) - || type == typeof(decimal); - } - } - - public static class ObjectExtensions - { - public static bool IsNumber(this object value) - { - return value is sbyte - || value is byte - || value is short - || value is ushort - || value is int - || value is uint - || value is long - || value is ulong - || value is float - || value is double - || value is decimal; - } - } -} +using ClosedXML.Utils; +using DocumentFormat.OpenXml; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; +using System.Xml.Linq; + +[assembly: CLSCompliantAttribute(true)] + +namespace ClosedXML.Excel +{ + public static class Extensions + { + // Adds the .ForEach method to all IEnumerables + + private static readonly char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + + public static String ToHex(this Color color) + { + byte[] bytes = new byte[4]; + + bytes[0] = color.A; + + bytes[1] = color.R; + + bytes[2] = color.G; + + bytes[3] = color.B; + + char[] chars = new char[bytes.Length * 2]; + + for (int i = 0; i < bytes.Length; i++) + { + int b = bytes[i]; + + chars[i * 2] = hexDigits[b >> 4]; + + chars[i * 2 + 1] = hexDigits[b & 0xF]; + } + + return new string(chars); + } + + public static String RemoveSpecialCharacters(this String str) + { + StringBuilder sb = new StringBuilder(); + foreach (char c in str) + { + if (Char.IsLetterOrDigit(c) || c == '.' || c == '_') + { + sb.Append(c); + } + } + return sb.ToString(); + } + + public static Int32 CharCount(this String instance, Char c) + { + return instance.Length - instance.Replace(c.ToString(), "").Length; + } + + public static Boolean HasDuplicates(this IEnumerable source) + { + HashSet distinctItems = new HashSet(); + foreach (var item in source) + { + if (!distinctItems.Add(item)) + { + return true; + } + } + return false; + } + + public static T CastTo(this Object o) + { + return (T)Convert.ChangeType(o, typeof(T)); + } + } + + public static class DictionaryExtensions + { + public static void RemoveAll(this Dictionary dic, + Func predicate) + { + var keys = dic.Keys.Where(k => predicate(dic[k])).ToList(); + foreach (var key in keys) + { + dic.Remove(key); + } + } + } + + public static class StringExtensions + { + private static readonly Regex RegexNewLine = new Regex(@"((? bankHolidays) + { + var nextDate = date.AddDays(1); + while (!nextDate.IsWorkDay(bankHolidays)) + nextDate = nextDate.AddDays(1); + + return nextDate; + } + + public static DateTime PreviousWorkDay(this DateTime date, IEnumerable bankHolidays) + { + var previousDate = date.AddDays(-1); + while (!previousDate.IsWorkDay(bankHolidays)) + previousDate = previousDate.AddDays(-1); + + return previousDate; + } + + public static bool IsWorkDay(this DateTime date, IEnumerable bankHolidays) + { + return date.DayOfWeek != DayOfWeek.Saturday + && date.DayOfWeek != DayOfWeek.Sunday + && !bankHolidays.Contains(date); + } + } + + public static class IntegerExtensions + { + public static String ToInvariantString(this Int32 value) + { + return value.ToString(CultureInfo.InvariantCulture.NumberFormat); + } + } + + public static class DecimalExtensions + { + //All numbers are stored in XL files as invarient culture this is just a easy helper + public static String ToInvariantString(this Decimal value) + { + return value.ToString(CultureInfo.InvariantCulture); + } + + public static Decimal SaveRound(this Decimal value) + { + return Math.Round(value, 6); + } + } + + public static class DoubleExtensions + { + //All numbers are stored in XL files as invarient culture this is just a easy helper + public static String ToInvariantString(this Double value) + { + return value.ToString(CultureInfo.InvariantCulture); + } + + public static Double SaveRound(this Double value) + { + return Math.Round(value, 6); + } + } + + public static class FontBaseExtensions + { + private static Font GetCachedFont(IXLFontBase fontBase, Dictionary fontCache) + { + Font font; + if (!fontCache.TryGetValue(fontBase, out font)) + { + font = new Font(fontBase.FontName, (float)fontBase.FontSize, GetFontStyle(fontBase)); + fontCache.Add(fontBase, font); + } + return font; + } + + public static Double GetWidth(this IXLFontBase fontBase, String text, Dictionary fontCache) + { + if (XLHelper.IsNullOrWhiteSpace(text)) + return 0; + + var font = GetCachedFont(fontBase, fontCache); + + var textSize = GraphicsUtils.MeasureString(text, font); + + double width = (((textSize.Width / (double)7) * 256) - (128 / 7)) / 256; + width = (double)decimal.Round((decimal)width + 0.2M, 2); + + return width; + } + + private static FontStyle GetFontStyle(IXLFontBase font) + { + FontStyle fontStyle = FontStyle.Regular; + if (font.Bold) fontStyle |= FontStyle.Bold; + if (font.Italic) fontStyle |= FontStyle.Italic; + if (font.Strikethrough) fontStyle |= FontStyle.Strikeout; + if (font.Underline != XLFontUnderlineValues.None) fontStyle |= FontStyle.Underline; + return fontStyle; + } + + public static Double GetHeight(this IXLFontBase fontBase, Dictionary fontCache) + { + var font = GetCachedFont(fontBase, fontCache); + var textSize = GraphicsUtils.MeasureString("X", font); + return (double)textSize.Height * 0.85; + } + + public static void CopyFont(this IXLFontBase font, IXLFontBase sourceFont) + { + font.Bold = sourceFont.Bold; + font.Italic = sourceFont.Italic; + font.Underline = sourceFont.Underline; + font.Strikethrough = sourceFont.Strikethrough; + font.VerticalAlignment = sourceFont.VerticalAlignment; + font.Shadow = sourceFont.Shadow; + font.FontSize = sourceFont.FontSize; + font.FontColor = sourceFont.FontColor; + font.FontName = sourceFont.FontName; + font.FontFamilyNumbering = sourceFont.FontFamilyNumbering; + } + } + + public static class XDocumentExtensions + { + public static XDocument Load(Stream stream) + { + using (XmlReader reader = XmlReader.Create(stream)) + { + return XDocument.Load(reader); + } + } + } + + public static class EnumerableExtensions + { + public static void ForEach(this IEnumerable source, Action action) + { + foreach (T item in source) + action(item); + } + + public static Type GetItemType(this IEnumerable source) + { + return typeof(T); + } + } + + public static class ListExtensions + { + public static void RemoveAll(this IList list, Func predicate) + { + var indices = list.Where(item => predicate(item)).Select((item, i) => i).OrderByDescending(i => i).ToList(); + foreach (var i in indices) + { + list.RemoveAt(i); + } + } + } + + public static class DoubleValueExtensions + { + public static DoubleValue SaveRound(this DoubleValue value) + { + return value.HasValue ? new DoubleValue(Math.Round(value, 6)) : value; + } + } + + public static class TypeExtensions + { + public static bool IsNumber(this Type type) + { + return type == typeof(sbyte) + || type == typeof(byte) + || type == typeof(short) + || type == typeof(ushort) + || type == typeof(int) + || type == typeof(uint) + || type == typeof(long) + || type == typeof(ulong) + || type == typeof(float) + || type == typeof(double) + || type == typeof(decimal); + } + } + + public static class ObjectExtensions + { + public static bool IsNumber(this object value) + { + return value is sbyte + || value is byte + || value is short + || value is ushort + || value is int + || value is uint + || value is long + || value is ulong + || value is float + || value is double + || value is decimal; + } + } +} diff --git a/ClosedXML/Extensions/OpenXmlPartContainerExtensions.cs b/ClosedXML/Extensions/OpenXmlPartContainerExtensions.cs new file mode 100644 index 0000000..db2424f --- /dev/null +++ b/ClosedXML/Extensions/OpenXmlPartContainerExtensions.cs @@ -0,0 +1,14 @@ +using DocumentFormat.OpenXml.Packaging; +using System; +using System.Linq; + +namespace ClosedXML.Extensions +{ + internal static class OpenXmlPartContainerExtensions + { + public static Boolean HasPartWithId(this OpenXmlPartContainer container, String relId) + { + return container.Parts.Any(p => p.RelationshipId.Equals(relId)); + } + } +} diff --git a/ClosedXML/PathHelper.cs b/ClosedXML/PathHelper.cs index 83cbb4c..f87a9db 100644 --- a/ClosedXML/PathHelper.cs +++ b/ClosedXML/PathHelper.cs @@ -1,243 +1,243 @@ -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Text.RegularExpressions; - -namespace ClosedXML -{ - /// - /// Help methods for work with files - /// - internal static class PathHelper - { - private static readonly Regex ms_checkValidAbsolutePathRegEx = new Regex( - "^(([a-zA-Z]\\:)|\\\\)(\\\\|(\\\\[^\\n\\r\\t/:*?<>\\\"|]*)+)$", - RegexOptions.IgnoreCase - | RegexOptions.Singleline - | RegexOptions.CultureInvariant - | RegexOptions.Compiled - ); - /// - /// Can check only .\dfdfd\dfdf\dfdf or ..\..\gfhfgh\fghfh - /// - private static readonly Regex ms_checkValidRelativePathRegEx = new Regex( - "^(\\.\\.|\\.)(\\\\|(\\\\[^\\n\\r\\t/:*?<>\\\"|]*)+)$", - RegexOptions.IgnoreCase - | RegexOptions.Multiline - | RegexOptions.CultureInvariant - | RegexOptions.Compiled - ); - - private static readonly object ms_syncAbsolutePathObj = new object(); - - /// - /// Gets data and time string stamp for file name - /// - /// - public static string GetTimeStamp() - { - return GetTimeStamp(DateTime.Now); - } - /// - /// Gets data and time string stamp for file name - /// - /// - public static string GetTimeStamp(DateTime dateTime) - { - return dateTime.ToString("ddMMMyyyy_HHmmss", DateTimeFormatInfo.InvariantInfo); - } - /// - /// Safety delete file(with try block) - /// - /// file name - public static void SafetyDeleteFile(string fileName) - { - try - { - if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) - { - File.Delete(fileName); - } - } - catch (Exception ex) - { - Debug.Fail("Error during file deleting. Error message:" + ex.Message); - } - } - /// - /// Replace all not implemented symbols to '_' - /// - /// input filename - /// - public static string NormalizeFileName(string fileName) - { - char[] invalidCharacters = Path.GetInvalidFileNameChars(); - #region Replace begin space - string result = fileName.TrimStart(' '); - if (result.Length < fileName.Length) - { - result = new string('_', fileName.Length - result.Length) + result; - } - #endregion - foreach (char curChar in invalidCharacters) - { - result = result.Replace(curChar, '_'); - } - return result; - } - - public static string NormalizePathName(string fileName) - { - char[] invalidCharacters = Path.GetInvalidPathChars(); - string result = fileName.TrimStart(' '); - foreach (char curChar in invalidCharacters) - { - result = result.Replace(curChar, '_'); - } - return result; - } - /// - /// ValidatePath file or diretory path - /// - /// - /// path type - /// - public static bool ValidatePath(string path, PathTypes type) - { - bool _result = false; - if ((type & PathTypes.Absolute) == PathTypes.Absolute) - { - _result |= ms_checkValidAbsolutePathRegEx.IsMatch(path); - } - if ((type & PathTypes.Relative) == PathTypes.Relative) - { - _result |= ms_checkValidRelativePathRegEx.IsMatch(path); - } - return _result; - } - - /// - /// ValidatePath file or diretory path - /// - /// - /// - public static bool ValidateFileName(string fileName) - { - return fileName.LastIndexOfAny(Path.GetInvalidFileNameChars()) < 0; - } - - public static string EvaluateRelativePath(string mainDirPath, string absoluteFilePath) - { - string[] firstPathParts = mainDirPath.Trim(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar); - string[] secondPathParts = absoluteFilePath.Trim(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar); - - int sameCounter = 0; - int partsCount = Math.Min(firstPathParts.Length, secondPathParts.Length); - for (int i = 0; i < partsCount; i++) - { - if (String.Compare(firstPathParts[i], secondPathParts[i], true) != 0) - { - break; - } - sameCounter++; - } - - if (sameCounter == 0) - { - return absoluteFilePath; - } - - string newPath = string.Empty; - for (int i = sameCounter; i < firstPathParts.Length; i++) - { - if (i > sameCounter) - { - newPath += Path.DirectorySeparatorChar; - } - newPath += ".."; - } - if (newPath.Length == 0) - { - newPath = "."; - } - for (int i = sameCounter; i < secondPathParts.Length; i++) - { - newPath += Path.DirectorySeparatorChar; - newPath += secondPathParts[i]; - } - return newPath; - } - - public static string EvaluateAbsolutePath(string rootPath, string relativePath) - { - lock (ms_syncAbsolutePathObj) - { - string _temp = Environment.CurrentDirectory; - Environment.CurrentDirectory = rootPath; - string _result = Path.GetFullPath(relativePath); - Environment.CurrentDirectory = _temp; - return _result; - } - } - - public static bool TryCreateFile(string filePath, out string message) - { - #region Check - if (string.IsNullOrEmpty(filePath)) - { - throw new ArgumentNullException("filePath"); - } - #endregion - try - { - if (File.Exists(filePath)) - { - message = null; - return true; - } - - using (FileStream _stream = new FileStream(filePath, - FileMode.Create, - FileAccess.ReadWrite, - FileShare.Read, - 1024, - FileOptions.DeleteOnClose)) - { - } - } - catch (Exception exc) - { - message = exc.Message; - return false; - } - - message = null; - return true; - } - - public static string CreateDirectory(string path) - { - try - { - var info = new DirectoryInfo(path); - if (!info.Exists) - { - info.Create(); - } - } - catch - { - } - return path; - } - - [Flags] - public enum PathTypes - { - None = 0, - Absolute = 1, - Relative = 2 - } - } +using System; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text.RegularExpressions; + +namespace ClosedXML +{ + /// + /// Help methods for work with files + /// + internal static class PathHelper + { + private static readonly Regex ms_checkValidAbsolutePathRegEx = new Regex( + "^(([a-zA-Z]\\:)|\\\\)(\\\\|(\\\\[^\\n\\r\\t/:*?<>\\\"|]*)+)$", + RegexOptions.IgnoreCase + | RegexOptions.Singleline + | RegexOptions.CultureInvariant + | RegexOptions.Compiled + ); + /// + /// Can check only .\dfdfd\dfdf\dfdf or ..\..\gfhfgh\fghfh + /// + private static readonly Regex ms_checkValidRelativePathRegEx = new Regex( + "^(\\.\\.|\\.)(\\\\|(\\\\[^\\n\\r\\t/:*?<>\\\"|]*)+)$", + RegexOptions.IgnoreCase + | RegexOptions.Multiline + | RegexOptions.CultureInvariant + | RegexOptions.Compiled + ); + + private static readonly object ms_syncAbsolutePathObj = new object(); + + /// + /// Gets data and time string stamp for file name + /// + /// + public static string GetTimeStamp() + { + return GetTimeStamp(DateTime.Now); + } + /// + /// Gets data and time string stamp for file name + /// + /// + public static string GetTimeStamp(DateTime dateTime) + { + return dateTime.ToString("ddMMMyyyy_HHmmss", DateTimeFormatInfo.InvariantInfo); + } + /// + /// Safety delete file(with try block) + /// + /// file name + public static void SafetyDeleteFile(string fileName) + { + try + { + if (!string.IsNullOrEmpty(fileName) && File.Exists(fileName)) + { + File.Delete(fileName); + } + } + catch (Exception ex) + { + Debug.Fail("Error during file deleting. Error message:" + ex.Message); + } + } + /// + /// Replace all not implemented symbols to '_' + /// + /// input filename + /// + public static string NormalizeFileName(string fileName) + { + char[] invalidCharacters = Path.GetInvalidFileNameChars(); + #region Replace begin space + string result = fileName.TrimStart(' '); + if (result.Length < fileName.Length) + { + result = new string('_', fileName.Length - result.Length) + result; + } + #endregion + foreach (char curChar in invalidCharacters) + { + result = result.Replace(curChar, '_'); + } + return result; + } + + public static string NormalizePathName(string fileName) + { + char[] invalidCharacters = Path.GetInvalidPathChars(); + string result = fileName.TrimStart(' '); + foreach (char curChar in invalidCharacters) + { + result = result.Replace(curChar, '_'); + } + return result; + } + /// + /// ValidatePath file or diretory path + /// + /// + /// path type + /// + public static bool ValidatePath(string path, PathTypes type) + { + bool _result = false; + if ((type & PathTypes.Absolute) == PathTypes.Absolute) + { + _result |= ms_checkValidAbsolutePathRegEx.IsMatch(path); + } + if ((type & PathTypes.Relative) == PathTypes.Relative) + { + _result |= ms_checkValidRelativePathRegEx.IsMatch(path); + } + return _result; + } + + /// + /// ValidatePath file or diretory path + /// + /// + /// + public static bool ValidateFileName(string fileName) + { + return fileName.LastIndexOfAny(Path.GetInvalidFileNameChars()) < 0; + } + + public static string EvaluateRelativePath(string mainDirPath, string absoluteFilePath) + { + string[] firstPathParts = mainDirPath.Trim(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar); + string[] secondPathParts = absoluteFilePath.Trim(Path.DirectorySeparatorChar).Split(Path.DirectorySeparatorChar); + + int sameCounter = 0; + int partsCount = Math.Min(firstPathParts.Length, secondPathParts.Length); + for (int i = 0; i < partsCount; i++) + { + if (String.Compare(firstPathParts[i], secondPathParts[i], true) != 0) + { + break; + } + sameCounter++; + } + + if (sameCounter == 0) + { + return absoluteFilePath; + } + + string newPath = string.Empty; + for (int i = sameCounter; i < firstPathParts.Length; i++) + { + if (i > sameCounter) + { + newPath += Path.DirectorySeparatorChar; + } + newPath += ".."; + } + if (newPath.Length == 0) + { + newPath = "."; + } + for (int i = sameCounter; i < secondPathParts.Length; i++) + { + newPath += Path.DirectorySeparatorChar; + newPath += secondPathParts[i]; + } + return newPath; + } + + public static string EvaluateAbsolutePath(string rootPath, string relativePath) + { + lock (ms_syncAbsolutePathObj) + { + string _temp = Environment.CurrentDirectory; + Environment.CurrentDirectory = rootPath; + string _result = Path.GetFullPath(relativePath); + Environment.CurrentDirectory = _temp; + return _result; + } + } + + public static bool TryCreateFile(string filePath, out string message) + { + #region Check + if (string.IsNullOrEmpty(filePath)) + { + throw new ArgumentNullException("filePath"); + } + #endregion + try + { + if (File.Exists(filePath)) + { + message = null; + return true; + } + + using (FileStream _stream = new FileStream(filePath, + FileMode.Create, + FileAccess.ReadWrite, + FileShare.Read, + 1024, + FileOptions.DeleteOnClose)) + { + } + } + catch (Exception exc) + { + message = exc.Message; + return false; + } + + message = null; + return true; + } + + public static string CreateDirectory(string path) + { + try + { + var info = new DirectoryInfo(path); + if (!info.Exists) + { + info.Create(); + } + } + catch + { + } + return path; + } + + [Flags] + public enum PathTypes + { + None = 0, + Absolute = 1, + Relative = 2 + } + } } \ No newline at end of file diff --git a/ClosedXML/Properties/AssemblyInfo.cs b/ClosedXML/Properties/AssemblyInfo.cs index 0abe05b..fee9537 100644 --- a/ClosedXML/Properties/AssemblyInfo.cs +++ b/ClosedXML/Properties/AssemblyInfo.cs @@ -1,36 +1,36 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ClosedXML")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ClosedXML")] -[assembly: AssemblyCopyright("Copyright © Manuel De Leon 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8747331d-de58-4621-8c7f-a7d57ca3467a")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.80.0.0")] -[assembly: AssemblyFileVersion("0.80.0.0")] +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ClosedXML")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ClosedXML")] +[assembly: AssemblyCopyright("Copyright © Manuel De Leon 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("8747331d-de58-4621-8c7f-a7d57ca3467a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("0.80.0.0")] +[assembly: AssemblyFileVersion("0.80.0.0")] [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("ClosedXML_Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100a1fb8ba59167fe734d64128ca73d32c45cb8a117246d09c95c8769db88fe332b0a3396bedd0ea48ee42b0e5796fec0798ca5cb628a9a6de80d35d6c67b936ca1670347b3d4f2b769c8ce2ddcf959dbac6bcd88e6c08751ea1fffa0522de3507193e7035305a8aa008d6c88cca1341b3120fa9c347ab3f97e2d772e2709277da5")] \ No newline at end of file diff --git a/ClosedXML/Utils/GraphicsUtils.cs b/ClosedXML/Utils/GraphicsUtils.cs index b5e6762..be2472f 100644 --- a/ClosedXML/Utils/GraphicsUtils.cs +++ b/ClosedXML/Utils/GraphicsUtils.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Drawing; namespace ClosedXML.Utils @@ -7,7 +7,7 @@ { [ThreadStatic] private static Graphics threadLocalGraphics; - private static Graphics g + internal static Graphics Graphics { get { @@ -22,7 +22,7 @@ public static SizeF MeasureString(string s, Font font) { - SizeF result = g.MeasureString(s, font, Int32.MaxValue, StringFormat.GenericTypographic); + SizeF result = Graphics.MeasureString(s, font, Int32.MaxValue, StringFormat.GenericTypographic); return result; } } diff --git a/ClosedXML/Utils/XmlEncoder.cs b/ClosedXML/Utils/XmlEncoder.cs index 5c42ed9..4219901 100644 --- a/ClosedXML/Utils/XmlEncoder.cs +++ b/ClosedXML/Utils/XmlEncoder.cs @@ -1,4 +1,4 @@ -using System.Text; +using System.Text; using System.Xml; namespace ClosedXML.Utils diff --git a/ClosedXML/XLHelper.cs b/ClosedXML/XLHelper.cs index 83d2434..66d7fa2 100644 --- a/ClosedXML/XLHelper.cs +++ b/ClosedXML/XLHelper.cs @@ -1,308 +1,308 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; - -namespace ClosedXML.Excel -{ - using System.Linq; - using System.Text.RegularExpressions; - using System.Drawing; - - /// - /// Common methods - /// - public static class XLHelper - { - public const int MinRowNumber = 1; - public const int MinColumnNumber = 1; - public const int MaxRowNumber = 1048576; - public const int MaxColumnNumber = 16384; - public const String MaxColumnLetter = "XFD"; - public const Double Epsilon = 1e-10; - - private const Int32 TwoT26 = 26*26; - internal static readonly Graphics Graphic = Graphics.FromImage(new Bitmap(200, 200)); - internal static readonly Double DpiX = Graphic.DpiX; - internal static readonly NumberStyles NumberStyle = NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowExponent; - internal static readonly CultureInfo ParseCulture = CultureInfo.InvariantCulture; - - internal static readonly Regex A1SimpleRegex = new Regex( - @"\A" - + @"(?" // Start Group to pick - + @"(?" // Start Sheet Name, optional - + @"(" - + @"\'([^\[\]\*/\\\?:\']+|\'\')\'" - // Sheet name with special characters, surrounding apostrophes are required - + @"|" - + @"\'?\w+\'?" // Sheet name with letters and numbers, surrounding apostrophes are optional - + @")" - + @"!)?" // End Sheet Name, optional - + @"(?" // Start range - + @"\$?[a-zA-Z]{1,3}\$?\d{1,7}" // A1 Address 1 - + @"(?:\$?[a-zA-Z]{1,3}\$?\d{1,7})?" // A1 Address 2, optional - + @"|" - + @"(?\$?\d{1,7}:\$?\d{1,7})" // 1:1 - + @"|" - + @"(?\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})" // A:A - + @")" // End Range - + @")" // End Group to pick - + @"\Z" - , RegexOptions.Compiled); - - internal static readonly Regex NamedRangeReferenceRegex = - new Regex(@"^('?(?[^'!]+)'?!(?.+))|((?[^\[]+)\[(?[^\]]+)\])$", - RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture - ); - - /// - /// Gets the column number of a given column letter. - /// - /// The column letter to translate into a column number. - public static int GetColumnNumberFromLetter(string columnLetter) - { - if (string.IsNullOrEmpty(columnLetter)) throw new ArgumentNullException("columnLetter"); - - int retVal; - columnLetter = columnLetter.ToUpper(); - - //Extra check because we allow users to pass row col positions in as strings - if (columnLetter[0] <= '9') - { - retVal = Int32.Parse(columnLetter, XLHelper.NumberStyle, XLHelper.ParseCulture); - return retVal; - } - - int sum = 0; - - for (int i = 0; i < columnLetter.Length; i++) - { - sum *= 26; - sum += (columnLetter[i] - 'A' + 1); - } - - return sum; - } - - private static readonly string[] letters = new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; - - /// - /// Gets the column letter of a given column number. - /// - /// The column number to translate into a column letter. - public static string GetColumnLetterFromNumber(int columnNumber) - { - columnNumber--; // Adjust for start on column 1 - if (columnNumber <= 25) - { - return letters[columnNumber]; - } - var firstPart = (columnNumber) / 26; - var remainder = ((columnNumber) % 26) + 1; - return GetColumnLetterFromNumber(firstPart) + GetColumnLetterFromNumber(remainder); - } - - public static bool IsValidColumn(string column) - { - var length = column.Length; - if (IsNullOrWhiteSpace(column) || length > 3) - return false; - - var theColumn = column.ToUpper(); - - - var isValid = theColumn[0] >= 'A' && theColumn[0] <= 'Z'; - if (length == 1) - return isValid; - - if (length == 2) - return isValid && theColumn[1] >= 'A' && theColumn[1] <= 'Z'; - - if (theColumn[0] >= 'A' && theColumn[0] < 'X') - return theColumn[1] >= 'A' && theColumn[1] <= 'Z' - && theColumn[2] >= 'A' && theColumn[2] <= 'Z'; - - if (theColumn[0] != 'X') return false; - - if (theColumn[1] < 'F') - return theColumn[2] >= 'A' && theColumn[2] <= 'Z'; - - if (theColumn[1] != 'F') return false; - - return theColumn[2] >= 'A' && theColumn[2] <= 'D'; - } - - public static bool IsValidRow(string rowString) - { - Int32 row; - if (Int32.TryParse(rowString, out row)) - return row > 0 && row <= MaxRowNumber; - return false; - } - - public static bool IsValidA1Address(string address) - { - if (IsNullOrWhiteSpace(address)) - return false; - - address = address.Replace("$", ""); - var rowPos = 0; - var addressLength = address.Length; - while (rowPos < addressLength && (address[rowPos] > '9' || address[rowPos] < '0')) - rowPos++; - - return - rowPos < addressLength - && IsValidRow(address.Substring(rowPos)) - && IsValidColumn(address.Substring(0, rowPos)); - } - - public static Boolean IsValidRangeAddress(String rangeAddress) - { - return A1SimpleRegex.IsMatch(rangeAddress); - } - - public static Boolean IsValidRangeAddress(IXLRangeAddress rangeAddress) - { - - return !rangeAddress.IsInvalid - && rangeAddress.FirstAddress.RowNumber >= 1 && rangeAddress.LastAddress.RowNumber <= MaxRowNumber - && rangeAddress.FirstAddress.ColumnNumber >= 1 && rangeAddress.LastAddress.ColumnNumber <= MaxColumnNumber - && rangeAddress.FirstAddress.RowNumber <= rangeAddress.LastAddress.RowNumber - && rangeAddress.FirstAddress.ColumnNumber <= rangeAddress.LastAddress.ColumnNumber; - } - - public static int GetColumnNumberFromAddress(string cellAddressString) - { - var rowPos = 0; - while (cellAddressString[rowPos] > '9') - rowPos++; - - return GetColumnNumberFromLetter(cellAddressString.Substring(0, rowPos)); - } - - internal static string[] SplitRange(string range) - { - return range.Contains('-') ? range.Replace('-', ':').Split(':') : range.Split(':'); - } - - public static Int32 GetPtFromPx(Double px) - { - return Convert.ToInt32(px*72.0/DpiX); - } - - public static Double GetPxFromPt(Int32 pt) - { - return Convert.ToDouble(pt)*DpiX/72.0; - } - - internal static IXLTableRows InsertRowsWithoutEvents(Func insertFunc, - XLTableRange tableRange, Int32 numberOfRows, - Boolean expandTable) - { - var ws = tableRange.Worksheet; - var tracking = ws.EventTrackingEnabled; - ws.EventTrackingEnabled = false; - - var rows = new XLTableRows(ws.Style); - var inserted = insertFunc(numberOfRows, false); - inserted.ForEach(r => rows.Add(new XLTableRow(tableRange, r as XLRangeRow))); - - if (expandTable) - tableRange.Table.ExpandTableRows(numberOfRows); - - ws.EventTrackingEnabled = tracking; - - return rows; - } - - - - public static bool IsNullOrWhiteSpace(string value) - { -#if NET4 - return String.IsNullOrWhiteSpace(value); -#else - if (value != null) - { - var length = value.Length; - for (int i = 0; i < length; i++) - { - if (!char.IsWhiteSpace(value[i])) - { - return false; - } - } - } - return true; -#endif - - } - - private static readonly Regex A1RegexRelative = new Regex( - @"(?<=\W)(?\$?[a-zA-Z]{1,3}\$?\d{1,7})(?=\W)" // A1 - + @"|(?<=\W)(?\$?\d{1,7}:\$?\d{1,7})(?=\W)" // 1:1 - + @"|(?<=\W)(?\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})(?=\W)", RegexOptions.Compiled); // A:A - - private static string Evaluator(Match match, Int32 row, String column) - { - if (match.Groups["one"].Success) - { - var split = match.Groups["one"].Value.Split('$'); - if (split.Length == 1) return column + row; // A1 - if (split.Length == 3) return match.Groups["one"].Value; // $A$1 - var a = XLAddress.Create(match.Groups["one"].Value); - if (split[0] == String.Empty) return "$" + a.ColumnLetter + row; // $A1 - return column + "$" + a.RowNumber; - } - - if (match.Groups["two"].Success) - return ReplaceGroup(match.Groups["two"].Value, row.ToString()); - - return ReplaceGroup(match.Groups["three"].Value, column); - } - - private static String ReplaceGroup(String value, String item) - { - var split = value.Split(':'); - String ret1 = split[0].StartsWith("$") ? split[0] : item; - String ret2 = split[1].StartsWith("$") ? split[1] : item; - return ret1 + ":" + ret2; - } - - internal static String ReplaceRelative(String value, Int32 row, String column) - { - var oldValue = ">" + value + "<"; - var newVal = A1RegexRelative.Replace(oldValue, m => Evaluator(m, row, column)); - return newVal.Substring(1, newVal.Length - 2); - } - - public static Boolean AreEqual(Double d1, Double d2) - { - return Math.Abs(d1 - d2) < Epsilon; - } - - public static DateTime GetDate(Object v) - { - // handle dates - if (v is DateTime) - { - return (DateTime)v; - } - - // handle doubles - if (v is double && ((double)v).IsValidOADateNumber()) - { - return DateTime.FromOADate((double)v); - } - - // handle everything else - return (DateTime)Convert.ChangeType(v, typeof(DateTime)); - } - - internal static bool IsValidOADateNumber(this double d) - { - return -657435 <= d && d < 2958466; - } - } -} +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; + +namespace ClosedXML.Excel +{ + using System.Linq; + using System.Text.RegularExpressions; + using System.Drawing; + + /// + /// Common methods + /// + public static class XLHelper + { + public const int MinRowNumber = 1; + public const int MinColumnNumber = 1; + public const int MaxRowNumber = 1048576; + public const int MaxColumnNumber = 16384; + public const String MaxColumnLetter = "XFD"; + public const Double Epsilon = 1e-10; + + private const Int32 TwoT26 = 26*26; + internal static readonly Graphics Graphic = Graphics.FromImage(new Bitmap(200, 200)); + internal static readonly Double DpiX = Graphic.DpiX; + internal static readonly NumberStyles NumberStyle = NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite | NumberStyles.AllowExponent; + internal static readonly CultureInfo ParseCulture = CultureInfo.InvariantCulture; + + internal static readonly Regex A1SimpleRegex = new Regex( + @"\A" + + @"(?" // Start Group to pick + + @"(?" // Start Sheet Name, optional + + @"(" + + @"\'([^\[\]\*/\\\?:\']+|\'\')\'" + // Sheet name with special characters, surrounding apostrophes are required + + @"|" + + @"\'?\w+\'?" // Sheet name with letters and numbers, surrounding apostrophes are optional + + @")" + + @"!)?" // End Sheet Name, optional + + @"(?" // Start range + + @"\$?[a-zA-Z]{1,3}\$?\d{1,7}" // A1 Address 1 + + @"(?:\$?[a-zA-Z]{1,3}\$?\d{1,7})?" // A1 Address 2, optional + + @"|" + + @"(?\$?\d{1,7}:\$?\d{1,7})" // 1:1 + + @"|" + + @"(?\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})" // A:A + + @")" // End Range + + @")" // End Group to pick + + @"\Z" + , RegexOptions.Compiled); + + internal static readonly Regex NamedRangeReferenceRegex = + new Regex(@"^('?(?[^'!]+)'?!(?.+))|((?
[^\[]+)\[(?[^\]]+)\])$", + RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture + ); + + /// + /// Gets the column number of a given column letter. + /// + /// The column letter to translate into a column number. + public static int GetColumnNumberFromLetter(string columnLetter) + { + if (string.IsNullOrEmpty(columnLetter)) throw new ArgumentNullException("columnLetter"); + + int retVal; + columnLetter = columnLetter.ToUpper(); + + //Extra check because we allow users to pass row col positions in as strings + if (columnLetter[0] <= '9') + { + retVal = Int32.Parse(columnLetter, XLHelper.NumberStyle, XLHelper.ParseCulture); + return retVal; + } + + int sum = 0; + + for (int i = 0; i < columnLetter.Length; i++) + { + sum *= 26; + sum += (columnLetter[i] - 'A' + 1); + } + + return sum; + } + + private static readonly string[] letters = new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; + + /// + /// Gets the column letter of a given column number. + /// + /// The column number to translate into a column letter. + public static string GetColumnLetterFromNumber(int columnNumber) + { + columnNumber--; // Adjust for start on column 1 + if (columnNumber <= 25) + { + return letters[columnNumber]; + } + var firstPart = (columnNumber) / 26; + var remainder = ((columnNumber) % 26) + 1; + return GetColumnLetterFromNumber(firstPart) + GetColumnLetterFromNumber(remainder); + } + + public static bool IsValidColumn(string column) + { + var length = column.Length; + if (IsNullOrWhiteSpace(column) || length > 3) + return false; + + var theColumn = column.ToUpper(); + + + var isValid = theColumn[0] >= 'A' && theColumn[0] <= 'Z'; + if (length == 1) + return isValid; + + if (length == 2) + return isValid && theColumn[1] >= 'A' && theColumn[1] <= 'Z'; + + if (theColumn[0] >= 'A' && theColumn[0] < 'X') + return theColumn[1] >= 'A' && theColumn[1] <= 'Z' + && theColumn[2] >= 'A' && theColumn[2] <= 'Z'; + + if (theColumn[0] != 'X') return false; + + if (theColumn[1] < 'F') + return theColumn[2] >= 'A' && theColumn[2] <= 'Z'; + + if (theColumn[1] != 'F') return false; + + return theColumn[2] >= 'A' && theColumn[2] <= 'D'; + } + + public static bool IsValidRow(string rowString) + { + Int32 row; + if (Int32.TryParse(rowString, out row)) + return row > 0 && row <= MaxRowNumber; + return false; + } + + public static bool IsValidA1Address(string address) + { + if (IsNullOrWhiteSpace(address)) + return false; + + address = address.Replace("$", ""); + var rowPos = 0; + var addressLength = address.Length; + while (rowPos < addressLength && (address[rowPos] > '9' || address[rowPos] < '0')) + rowPos++; + + return + rowPos < addressLength + && IsValidRow(address.Substring(rowPos)) + && IsValidColumn(address.Substring(0, rowPos)); + } + + public static Boolean IsValidRangeAddress(String rangeAddress) + { + return A1SimpleRegex.IsMatch(rangeAddress); + } + + public static Boolean IsValidRangeAddress(IXLRangeAddress rangeAddress) + { + + return !rangeAddress.IsInvalid + && rangeAddress.FirstAddress.RowNumber >= 1 && rangeAddress.LastAddress.RowNumber <= MaxRowNumber + && rangeAddress.FirstAddress.ColumnNumber >= 1 && rangeAddress.LastAddress.ColumnNumber <= MaxColumnNumber + && rangeAddress.FirstAddress.RowNumber <= rangeAddress.LastAddress.RowNumber + && rangeAddress.FirstAddress.ColumnNumber <= rangeAddress.LastAddress.ColumnNumber; + } + + public static int GetColumnNumberFromAddress(string cellAddressString) + { + var rowPos = 0; + while (cellAddressString[rowPos] > '9') + rowPos++; + + return GetColumnNumberFromLetter(cellAddressString.Substring(0, rowPos)); + } + + internal static string[] SplitRange(string range) + { + return range.Contains('-') ? range.Replace('-', ':').Split(':') : range.Split(':'); + } + + public static Int32 GetPtFromPx(Double px) + { + return Convert.ToInt32(px*72.0/DpiX); + } + + public static Double GetPxFromPt(Int32 pt) + { + return Convert.ToDouble(pt)*DpiX/72.0; + } + + internal static IXLTableRows InsertRowsWithoutEvents(Func insertFunc, + XLTableRange tableRange, Int32 numberOfRows, + Boolean expandTable) + { + var ws = tableRange.Worksheet; + var tracking = ws.EventTrackingEnabled; + ws.EventTrackingEnabled = false; + + var rows = new XLTableRows(ws.Style); + var inserted = insertFunc(numberOfRows, false); + inserted.ForEach(r => rows.Add(new XLTableRow(tableRange, r as XLRangeRow))); + + if (expandTable) + tableRange.Table.ExpandTableRows(numberOfRows); + + ws.EventTrackingEnabled = tracking; + + return rows; + } + + + + public static bool IsNullOrWhiteSpace(string value) + { +#if NET4 + return String.IsNullOrWhiteSpace(value); +#else + if (value != null) + { + var length = value.Length; + for (int i = 0; i < length; i++) + { + if (!char.IsWhiteSpace(value[i])) + { + return false; + } + } + } + return true; +#endif + + } + + private static readonly Regex A1RegexRelative = new Regex( + @"(?<=\W)(?\$?[a-zA-Z]{1,3}\$?\d{1,7})(?=\W)" // A1 + + @"|(?<=\W)(?\$?\d{1,7}:\$?\d{1,7})(?=\W)" // 1:1 + + @"|(?<=\W)(?\$?[a-zA-Z]{1,3}:\$?[a-zA-Z]{1,3})(?=\W)", RegexOptions.Compiled); // A:A + + private static string Evaluator(Match match, Int32 row, String column) + { + if (match.Groups["one"].Success) + { + var split = match.Groups["one"].Value.Split('$'); + if (split.Length == 1) return column + row; // A1 + if (split.Length == 3) return match.Groups["one"].Value; // $A$1 + var a = XLAddress.Create(match.Groups["one"].Value); + if (split[0] == String.Empty) return "$" + a.ColumnLetter + row; // $A1 + return column + "$" + a.RowNumber; + } + + if (match.Groups["two"].Success) + return ReplaceGroup(match.Groups["two"].Value, row.ToString()); + + return ReplaceGroup(match.Groups["three"].Value, column); + } + + private static String ReplaceGroup(String value, String item) + { + var split = value.Split(':'); + String ret1 = split[0].StartsWith("$") ? split[0] : item; + String ret2 = split[1].StartsWith("$") ? split[1] : item; + return ret1 + ":" + ret2; + } + + internal static String ReplaceRelative(String value, Int32 row, String column) + { + var oldValue = ">" + value + "<"; + var newVal = A1RegexRelative.Replace(oldValue, m => Evaluator(m, row, column)); + return newVal.Substring(1, newVal.Length - 2); + } + + public static Boolean AreEqual(Double d1, Double d2) + { + return Math.Abs(d1 - d2) < Epsilon; + } + + public static DateTime GetDate(Object v) + { + // handle dates + if (v is DateTime) + { + return (DateTime)v; + } + + // handle doubles + if (v is double && ((double)v).IsValidOADateNumber()) + { + return DateTime.FromOADate((double)v); + } + + // handle everything else + return (DateTime)Convert.ChangeType(v, typeof(DateTime)); + } + + internal static bool IsValidOADateNumber(this double d) + { + return -657435 <= d && d < 2958466; + } + } +} diff --git a/ClosedXML/packages.config b/ClosedXML/packages.config index cd2fc49..bed0dd7 100644 --- a/ClosedXML/packages.config +++ b/ClosedXML/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/ClosedXML_Examples/AutoFilters/CustomAutoFilter.cs b/ClosedXML_Examples/AutoFilters/CustomAutoFilter.cs index 6dcdaa4..9cd1b9d 100644 --- a/ClosedXML_Examples/AutoFilters/CustomAutoFilter.cs +++ b/ClosedXML_Examples/AutoFilters/CustomAutoFilter.cs @@ -1,139 +1,139 @@ -using System; -using System.IO; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class CustomAutoFilter : IXLExample - { - public void Create(string filePath) - { - var wb = new XLWorkbook(); - IXLWorksheet ws; - - #region Single Column Numbers - String singleColumnNumbers = "Single Column Numbers"; - ws = wb.Worksheets.Add(singleColumnNumbers); - - // Add a bunch of numbers to filter - ws.Cell("A1").SetValue("Numbers") - .CellBelow().SetValue(2) - .CellBelow().SetValue(3) - .CellBelow().SetValue(3) - .CellBelow().SetValue(5) - .CellBelow().SetValue(1) - .CellBelow().SetValue(4); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(1).EqualTo(3).Or.GreaterThan(4); - - // Sort the filtered list - ws.AutoFilter.Sort(1); - #endregion - - #region Single Column Strings - String singleColumnStrings = "Single Column Strings"; - ws = wb.Worksheets.Add(singleColumnStrings); - - // Add a bunch of strings to filter - ws.Cell("A1").SetValue("Strings") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C") - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue("A") - .CellBelow().SetValue("D"); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(1).Between("B", "D"); - - // Sort the filtered list - ws.AutoFilter.Sort(1); - #endregion - - #region Single Column Mixed - String singleColumnMixed = "Single Column Mixed"; - ws = wb.Worksheets.Add(singleColumnMixed); - - // Add a bunch of items to filter - ws.Cell("A1").SetValue("Mixed") - .CellBelow().SetValue("B") - .CellBelow().SetValue(3) - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue(1) - .CellBelow().SetValue(4); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(1).EqualTo(3).Or.EqualTo("C"); - - // Sort the filtered list - ws.AutoFilter.Sort(1); - #endregion - - #region Multi Column - String multiColumn = "Multi Column"; - ws = wb.Worksheets.Add(multiColumn); - - ws.Cell("A1").SetValue("First") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C") - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue("A") - .CellBelow().SetValue("D"); - - ws.Cell("B1").SetValue("Numbers") - .CellBelow().SetValue(2) - .CellBelow().SetValue(3) - .CellBelow().SetValue(3) - .CellBelow().SetValue(5) - .CellBelow().SetValue(1) - .CellBelow().SetValue(4); - - ws.Cell("C1").SetValue("Strings") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C") - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue("A") - .CellBelow().SetValue("D"); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(2).EqualTo(3).Or.GreaterThan(4); - ws.RangeUsed().SetAutoFilter().Column(3).Between("B", "D"); - - // Sort the filtered list - ws.AutoFilter.Sort(3); - #endregion - - using (var ms = new MemoryStream()) - { - wb.SaveAs(ms); - - var workbook = new XLWorkbook(ms); - - #region Single Column Numbers - workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); - #endregion - - #region Single Column Strings - workbook.Worksheet(singleColumnStrings).AutoFilter.Sort(1, XLSortOrder.Descending); - #endregion - - #region Single Column Mixed - workbook.Worksheet(singleColumnMixed).AutoFilter.Column(1).EqualOrGreaterThan("D"); - workbook.Worksheet(singleColumnMixed).AutoFilter.Sort(1, XLSortOrder.Descending); - #endregion - - #region Multi Column - workbook.Worksheet(multiColumn).AutoFilter.Column(3).EqualTo("E"); - workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); - #endregion - - workbook.SaveAs(filePath); - ms.Close(); - } - } - } -} +using System; +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class CustomAutoFilter : IXLExample + { + public void Create(string filePath) + { + var wb = new XLWorkbook(); + IXLWorksheet ws; + + #region Single Column Numbers + String singleColumnNumbers = "Single Column Numbers"; + ws = wb.Worksheets.Add(singleColumnNumbers); + + // Add a bunch of numbers to filter + ws.Cell("A1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).EqualTo(3).Or.GreaterThan(4); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + #endregion + + #region Single Column Strings + String singleColumnStrings = "Single Column Strings"; + ws = wb.Worksheets.Add(singleColumnStrings); + + // Add a bunch of strings to filter + ws.Cell("A1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).Between("B", "D"); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + #endregion + + #region Single Column Mixed + String singleColumnMixed = "Single Column Mixed"; + ws = wb.Worksheets.Add(singleColumnMixed); + + // Add a bunch of items to filter + ws.Cell("A1").SetValue("Mixed") + .CellBelow().SetValue("B") + .CellBelow().SetValue(3) + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).EqualTo(3).Or.EqualTo("C"); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + #endregion + + #region Multi Column + String multiColumn = "Multi Column"; + ws = wb.Worksheets.Add(multiColumn); + + ws.Cell("A1").SetValue("First") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + ws.Cell("B1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + ws.Cell("C1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(2).EqualTo(3).Or.GreaterThan(4); + ws.RangeUsed().SetAutoFilter().Column(3).Between("B", "D"); + + // Sort the filtered list + ws.AutoFilter.Sort(3); + #endregion + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms); + + var workbook = new XLWorkbook(ms); + + #region Single Column Numbers + workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Single Column Strings + workbook.Worksheet(singleColumnStrings).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Single Column Mixed + workbook.Worksheet(singleColumnMixed).AutoFilter.Column(1).EqualOrGreaterThan("D"); + workbook.Worksheet(singleColumnMixed).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Multi Column + workbook.Worksheet(multiColumn).AutoFilter.Column(3).EqualTo("E"); + workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); + #endregion + + workbook.SaveAs(filePath); + ms.Close(); + } + } + } +} diff --git a/ClosedXML_Examples/AutoFilters/DynamicAutoFilter.cs b/ClosedXML_Examples/AutoFilters/DynamicAutoFilter.cs index 3791185..543e14b 100644 --- a/ClosedXML_Examples/AutoFilters/DynamicAutoFilter.cs +++ b/ClosedXML_Examples/AutoFilters/DynamicAutoFilter.cs @@ -1,88 +1,88 @@ -using System; -using System.IO; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class DynamicAutoFilter : IXLExample - { - public void Create(string filePath) - { - var wb = new XLWorkbook(); - IXLWorksheet ws; - - #region Single Column Numbers - String singleColumnNumbers = "Single Column Numbers"; - ws = wb.Worksheets.Add(singleColumnNumbers); - - // Add a bunch of numbers to filter - ws.Cell("A1").SetValue("Numbers") - .CellBelow().SetValue(2) - .CellBelow().SetValue(3) - .CellBelow().SetValue(3) - .CellBelow().SetValue(5) - .CellBelow().SetValue(1) - .CellBelow().SetValue(4); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(1).AboveAverage(); - - // Sort the filtered list - //ws.AutoFilter.Sort(1); - #endregion - - #region Multi Column - String multiColumn = "Multi Column"; - ws = wb.Worksheets.Add(multiColumn); - - ws.Cell("A1").SetValue("First") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C") - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue("A") - .CellBelow().SetValue("D"); - - ws.Cell("B1").SetValue("Numbers") - .CellBelow().SetValue(2) - .CellBelow().SetValue(3) - .CellBelow().SetValue(3) - .CellBelow().SetValue(5) - .CellBelow().SetValue(1) - .CellBelow().SetValue(4); - - ws.Cell("C1").SetValue("Strings") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C") - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue("A") - .CellBelow().SetValue("D"); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(2).BelowAverage(); - - // Sort the filtered list - //ws.AutoFilter.Sort(3); - #endregion - - using (var ms = new MemoryStream()) - { - wb.SaveAs(ms); - - var workbook = new XLWorkbook(ms); - - #region Single Column Numbers - //workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); - #endregion - - #region Multi Column - //workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); - #endregion - - workbook.SaveAs(filePath); - ms.Close(); - } - } - } -} +using System; +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class DynamicAutoFilter : IXLExample + { + public void Create(string filePath) + { + var wb = new XLWorkbook(); + IXLWorksheet ws; + + #region Single Column Numbers + String singleColumnNumbers = "Single Column Numbers"; + ws = wb.Worksheets.Add(singleColumnNumbers); + + // Add a bunch of numbers to filter + ws.Cell("A1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).AboveAverage(); + + // Sort the filtered list + //ws.AutoFilter.Sort(1); + #endregion + + #region Multi Column + String multiColumn = "Multi Column"; + ws = wb.Worksheets.Add(multiColumn); + + ws.Cell("A1").SetValue("First") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + ws.Cell("B1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + ws.Cell("C1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(2).BelowAverage(); + + // Sort the filtered list + //ws.AutoFilter.Sort(3); + #endregion + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms); + + var workbook = new XLWorkbook(ms); + + #region Single Column Numbers + //workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Multi Column + //workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); + #endregion + + workbook.SaveAs(filePath); + ms.Close(); + } + } + } +} diff --git a/ClosedXML_Examples/AutoFilters/RegularAutoFilter.cs b/ClosedXML_Examples/AutoFilters/RegularAutoFilter.cs index 9a65eab..74ee1fe 100644 --- a/ClosedXML_Examples/AutoFilters/RegularAutoFilter.cs +++ b/ClosedXML_Examples/AutoFilters/RegularAutoFilter.cs @@ -1,172 +1,172 @@ -using System; -using System.IO; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class RegularAutoFilter : IXLExample - { - public void Create(string filePath) - { - var wb = new XLWorkbook(); - IXLWorksheet ws; - - #region Single Column Numbers - String singleColumnNumbers = "Single Column Numbers"; - ws = wb.Worksheets.Add(singleColumnNumbers); - - // Add a bunch of numbers to filter - ws.Cell("A1").SetValue("Numbers") - .CellBelow().SetValue(2) - .CellBelow().SetValue(3) - .CellBelow().SetValue(3) - .CellBelow().SetValue(5) - .CellBelow().SetValue(1) - .CellBelow().SetValue(4); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(1).AddFilter(3) - .AddFilter(1); - - // Sort the filtered list - ws.AutoFilter.Sort(1); - #endregion - - #region Single Column Strings - String singleColumnStrings = "Single Column Strings"; - ws = wb.Worksheets.Add(singleColumnStrings); - - // Add a bunch of strings to filter - ws.Cell("A1").SetValue("Strings") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C") - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue("A") - .CellBelow().SetValue("D"); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(1).AddFilter("C") - .AddFilter("A"); - - // Sort the filtered list - ws.AutoFilter.Sort(1); - #endregion - - #region Single Column Mixed - String singleColumnMixed = "Single Column Mixed"; - ws = wb.Worksheets.Add(singleColumnMixed); - - // Add a bunch of items to filter - ws.Cell("A1").SetValue("Mixed") - .CellBelow().SetValue("B") - .CellBelow().SetValue(3) - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue(1) - .CellBelow().SetValue(4); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(1).AddFilter("C") - .AddFilter(1); - - // Sort the filtered list - ws.AutoFilter.Sort(1); - #endregion - - #region Multi Column - String multiColumn = "Multi Column"; - ws = wb.Worksheets.Add(multiColumn); - - ws.Cell("A1").SetValue("First") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C") - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue("A") - .CellBelow().SetValue("D"); - - ws.Cell("B1").SetValue("Numbers") - .CellBelow().SetValue(2) - .CellBelow().SetValue(3) - .CellBelow().SetValue(3) - .CellBelow().SetValue(5) - .CellBelow().SetValue(1) - .CellBelow().SetValue(4); - - ws.Cell("C1").SetValue("Strings") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C") - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue("A") - .CellBelow().SetValue("D"); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(2).AddFilter(3) - .AddFilter(1); - - // Sort the filtered list - ws.AutoFilter.Sort(3); - #endregion - - #region Table - String tableSheetName = "Table"; - ws = wb.Worksheets.Add(tableSheetName); - - // Add a bunch of numbers to filter - ws.Cell("A1").SetValue("Numbers") - .CellBelow().SetValue(2) - .CellBelow().SetValue(3) - .CellBelow().SetValue(3) - .CellBelow().SetValue(5) - .CellBelow().SetValue(1) - .CellBelow().SetValue(4); - - // Add filters - var table = ws.RangeUsed().CreateTable(); - table.ShowTotalsRow = true; - table.Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; - table.AutoFilter.Column(1).AddFilter(3).AddFilter(4); - - table.AutoFilter.Sort(1); - #endregion - - using (var ms = new MemoryStream()) - { - wb.SaveAs(ms); - - var workbook = new XLWorkbook(ms); - - #region Single Column Numbers - workbook.Worksheet(singleColumnNumbers).AutoFilter.Column(1).AddFilter(5); - workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); - #endregion - - #region Single Column Strings - workbook.Worksheet(singleColumnStrings).AutoFilter.Column(1).AddFilter("E"); - workbook.Worksheet(singleColumnStrings).AutoFilter.Sort(1, XLSortOrder.Descending); - #endregion - - #region Single Column Mixed - workbook.Worksheet(singleColumnMixed).AutoFilter.Column(1).AddFilter("E"); - workbook.Worksheet(singleColumnMixed).AutoFilter.Column(1).AddFilter(3); - workbook.Worksheet(singleColumnMixed).AutoFilter.Sort(1, XLSortOrder.Descending); - #endregion - - #region Multi Column - workbook.Worksheet(multiColumn).AutoFilter.Column(3).AddFilter("C"); - workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); - #endregion - - #region Table - workbook.Worksheet(tableSheetName).Table(0).AutoFilter.Column(1).AddFilter(5); - workbook.Worksheet(tableSheetName).Table(0).AutoFilter.Sort(1, XLSortOrder.Descending); - #endregion - - workbook.SaveAs(filePath); - ms.Close(); - } - } - } -} +using System; +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class RegularAutoFilter : IXLExample + { + public void Create(string filePath) + { + var wb = new XLWorkbook(); + IXLWorksheet ws; + + #region Single Column Numbers + String singleColumnNumbers = "Single Column Numbers"; + ws = wb.Worksheets.Add(singleColumnNumbers); + + // Add a bunch of numbers to filter + ws.Cell("A1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).AddFilter(3) + .AddFilter(1); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + #endregion + + #region Single Column Strings + String singleColumnStrings = "Single Column Strings"; + ws = wb.Worksheets.Add(singleColumnStrings); + + // Add a bunch of strings to filter + ws.Cell("A1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).AddFilter("C") + .AddFilter("A"); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + #endregion + + #region Single Column Mixed + String singleColumnMixed = "Single Column Mixed"; + ws = wb.Worksheets.Add(singleColumnMixed); + + // Add a bunch of items to filter + ws.Cell("A1").SetValue("Mixed") + .CellBelow().SetValue("B") + .CellBelow().SetValue(3) + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).AddFilter("C") + .AddFilter(1); + + // Sort the filtered list + ws.AutoFilter.Sort(1); + #endregion + + #region Multi Column + String multiColumn = "Multi Column"; + ws = wb.Worksheets.Add(multiColumn); + + ws.Cell("A1").SetValue("First") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + ws.Cell("B1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + ws.Cell("C1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(2).AddFilter(3) + .AddFilter(1); + + // Sort the filtered list + ws.AutoFilter.Sort(3); + #endregion + + #region Table + String tableSheetName = "Table"; + ws = wb.Worksheets.Add(tableSheetName); + + // Add a bunch of numbers to filter + ws.Cell("A1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + var table = ws.RangeUsed().CreateTable(); + table.ShowTotalsRow = true; + table.Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; + table.AutoFilter.Column(1).AddFilter(3).AddFilter(4); + + table.AutoFilter.Sort(1); + #endregion + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms); + + var workbook = new XLWorkbook(ms); + + #region Single Column Numbers + workbook.Worksheet(singleColumnNumbers).AutoFilter.Column(1).AddFilter(5); + workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Single Column Strings + workbook.Worksheet(singleColumnStrings).AutoFilter.Column(1).AddFilter("E"); + workbook.Worksheet(singleColumnStrings).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Single Column Mixed + workbook.Worksheet(singleColumnMixed).AutoFilter.Column(1).AddFilter("E"); + workbook.Worksheet(singleColumnMixed).AutoFilter.Column(1).AddFilter(3); + workbook.Worksheet(singleColumnMixed).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Multi Column + workbook.Worksheet(multiColumn).AutoFilter.Column(3).AddFilter("C"); + workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); + #endregion + + #region Table + workbook.Worksheet(tableSheetName).Table(0).AutoFilter.Column(1).AddFilter(5); + workbook.Worksheet(tableSheetName).Table(0).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + workbook.SaveAs(filePath); + ms.Close(); + } + } + } +} diff --git a/ClosedXML_Examples/AutoFilters/TopBottomAutoFilter.cs b/ClosedXML_Examples/AutoFilters/TopBottomAutoFilter.cs index dbd8f88..7d3b0b7 100644 --- a/ClosedXML_Examples/AutoFilters/TopBottomAutoFilter.cs +++ b/ClosedXML_Examples/AutoFilters/TopBottomAutoFilter.cs @@ -1,88 +1,88 @@ -using System; -using System.IO; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class TopBottomAutoFilter : IXLExample - { - public void Create(string filePath) - { - var wb = new XLWorkbook(); - IXLWorksheet ws; - - #region Single Column Numbers - String singleColumnNumbers = "Single Column Numbers"; - ws = wb.Worksheets.Add(singleColumnNumbers); - - // Add a bunch of numbers to filter - ws.Cell("A1").SetValue("Numbers") - .CellBelow().SetValue(2) - .CellBelow().SetValue(3) - .CellBelow().SetValue(3) - .CellBelow().SetValue(5) - .CellBelow().SetValue(1) - .CellBelow().SetValue(4); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(1).Top(2); - - // Sort the filtered list - //ws.AutoFilter.Sort(1); - #endregion - - #region Multi Column - String multiColumn = "Multi Column"; - ws = wb.Worksheets.Add(multiColumn); - - ws.Cell("A1").SetValue("First") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C") - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue("A") - .CellBelow().SetValue("D"); - - ws.Cell("B1").SetValue("Numbers") - .CellBelow().SetValue(2) - .CellBelow().SetValue(3) - .CellBelow().SetValue(3) - .CellBelow().SetValue(5) - .CellBelow().SetValue(1) - .CellBelow().SetValue(4); - - ws.Cell("C1").SetValue("Strings") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C") - .CellBelow().SetValue("C") - .CellBelow().SetValue("E") - .CellBelow().SetValue("A") - .CellBelow().SetValue("D"); - - // Add filters - ws.RangeUsed().SetAutoFilter().Column(2).Bottom(50, XLTopBottomType.Percent); - - // Sort the filtered list - //ws.AutoFilter.Sort(3); - #endregion - - using (var ms = new MemoryStream()) - { - wb.SaveAs(ms); - - var workbook = new XLWorkbook(ms); - - #region Single Column Numbers - //workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); - #endregion - - #region Multi Column - //workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); - #endregion - - workbook.SaveAs(filePath); - ms.Close(); - } - } - } -} +using System; +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class TopBottomAutoFilter : IXLExample + { + public void Create(string filePath) + { + var wb = new XLWorkbook(); + IXLWorksheet ws; + + #region Single Column Numbers + String singleColumnNumbers = "Single Column Numbers"; + ws = wb.Worksheets.Add(singleColumnNumbers); + + // Add a bunch of numbers to filter + ws.Cell("A1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(1).Top(2); + + // Sort the filtered list + //ws.AutoFilter.Sort(1); + #endregion + + #region Multi Column + String multiColumn = "Multi Column"; + ws = wb.Worksheets.Add(multiColumn); + + ws.Cell("A1").SetValue("First") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + ws.Cell("B1").SetValue("Numbers") + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(3) + .CellBelow().SetValue(5) + .CellBelow().SetValue(1) + .CellBelow().SetValue(4); + + ws.Cell("C1").SetValue("Strings") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C") + .CellBelow().SetValue("C") + .CellBelow().SetValue("E") + .CellBelow().SetValue("A") + .CellBelow().SetValue("D"); + + // Add filters + ws.RangeUsed().SetAutoFilter().Column(2).Bottom(50, XLTopBottomType.Percent); + + // Sort the filtered list + //ws.AutoFilter.Sort(3); + #endregion + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms); + + var workbook = new XLWorkbook(ms); + + #region Single Column Numbers + //workbook.Worksheet(singleColumnNumbers).AutoFilter.Sort(1, XLSortOrder.Descending); + #endregion + + #region Multi Column + //workbook.Worksheet(multiColumn).AutoFilter.Sort(3, XLSortOrder.Descending); + #endregion + + workbook.SaveAs(filePath); + ms.Close(); + } + } + } +} diff --git a/ClosedXML_Examples/BasicTable.cs b/ClosedXML_Examples/BasicTable.cs index c084772..30a92cf 100644 --- a/ClosedXML_Examples/BasicTable.cs +++ b/ClosedXML_Examples/BasicTable.cs @@ -1,94 +1,94 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples -{ - public class BasicTable : IXLExample - { - public void Create(string filePath) - { - // Creating a new workbook - var wb = new XLWorkbook(); - - //Adding a worksheet - var ws = wb.Worksheets.Add("Contacts"); - - //Adding text - //Title - ws.Cell("B2").Value = "Contacts"; - //First Names - ws.Cell("B3").Value = "FName"; - ws.Cell("B4").Value = "John"; - ws.Cell("B5").Value = "Hank"; - ws.Cell("B6").Value = "Dagny"; - //Last Names - ws.Cell("C3").Value = "LName"; - ws.Cell("C4").Value = "Galt"; - ws.Cell("C5").Value = "Rearden"; - ws.Cell("C6").Value = "Taggart"; - - //Adding more data types - //Is an outcast? - ws.Cell("D3").Value = "Outcast"; - ws.Cell("D4").Value = true; - ws.Cell("D5").Value = false; - ws.Cell("D6").Value = false; - //Date of Birth - ws.Cell("E3").Value = "DOB"; - ws.Cell("E4").Value = new DateTime(1919, 1, 21); - ws.Cell("E5").Value = new DateTime(1907, 3, 4); - ws.Cell("E6").Value = new DateTime(1921, 12, 15); - //Income - ws.Cell("F3").Value = "Income"; - ws.Cell("F4").Value = 2000; - ws.Cell("F5").Value = 40000; - ws.Cell("F6").Value = 10000; - - //Defining ranges - //From worksheet - var rngTable = ws.Range("B2:F6"); - //From another range - var rngDates = rngTable.Range("D3:D5"); // The address is relative to rngTable (NOT the worksheet) - var rngNumbers = rngTable.Range("E3:E5"); // The address is relative to rngTable (NOT the worksheet) - - //Formatting dates and numbers - //Using a OpenXML's predefined formats - rngDates.Style.NumberFormat.NumberFormatId = 15; - //Using a custom format - rngNumbers.Style.NumberFormat.Format = "$ #,##0"; - - //Formatting headers - var rngHeaders = rngTable.Range("A2:E2"); // The address is relative to rngTable (NOT the worksheet) - rngHeaders.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - rngHeaders.Style.Font.Bold = true; - rngHeaders.Style.Fill.BackgroundColor = XLColor.Aqua; - - //Adding grid lines - rngTable.Style.Border.BottomBorder = XLBorderStyleValues.Thin; - - //Format title cell - rngTable.Cell(1, 1).Style.Font.Bold = true; - rngTable.Cell(1, 1).Style.Fill.BackgroundColor = XLColor.CornflowerBlue; - rngTable.Cell(1, 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - - //Merge title cells - rngTable.Row(1).Merge(); // We could've also used: rngTable.Range("A1:E1").Merge() - - //Add thick borders - rngTable.Style.Border.OutsideBorder = XLBorderStyleValues.Thick; - - // You can also specify the border for each side with: - // rngTable.FirstColumn().Style.Border.LeftBorder = XLBorderStyleValues.Thick; - // rngTable.LastColumn().Style.Border.RightBorder = XLBorderStyleValues.Thick; - // rngTable.FirstRow().Style.Border.TopBorder = XLBorderStyleValues.Thick; - // rngTable.LastRow().Style.Border.BottomBorder = XLBorderStyleValues.Thick; - - // Adjust column widths to their content - ws.Columns(2, 6).AdjustToContents(); - - //Saving the workbook - wb.SaveAs(filePath); - } - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples +{ + public class BasicTable : IXLExample + { + public void Create(string filePath) + { + // Creating a new workbook + var wb = new XLWorkbook(); + + //Adding a worksheet + var ws = wb.Worksheets.Add("Contacts"); + + //Adding text + //Title + ws.Cell("B2").Value = "Contacts"; + //First Names + ws.Cell("B3").Value = "FName"; + ws.Cell("B4").Value = "John"; + ws.Cell("B5").Value = "Hank"; + ws.Cell("B6").Value = "Dagny"; + //Last Names + ws.Cell("C3").Value = "LName"; + ws.Cell("C4").Value = "Galt"; + ws.Cell("C5").Value = "Rearden"; + ws.Cell("C6").Value = "Taggart"; + + //Adding more data types + //Is an outcast? + ws.Cell("D3").Value = "Outcast"; + ws.Cell("D4").Value = true; + ws.Cell("D5").Value = false; + ws.Cell("D6").Value = false; + //Date of Birth + ws.Cell("E3").Value = "DOB"; + ws.Cell("E4").Value = new DateTime(1919, 1, 21); + ws.Cell("E5").Value = new DateTime(1907, 3, 4); + ws.Cell("E6").Value = new DateTime(1921, 12, 15); + //Income + ws.Cell("F3").Value = "Income"; + ws.Cell("F4").Value = 2000; + ws.Cell("F5").Value = 40000; + ws.Cell("F6").Value = 10000; + + //Defining ranges + //From worksheet + var rngTable = ws.Range("B2:F6"); + //From another range + var rngDates = rngTable.Range("D3:D5"); // The address is relative to rngTable (NOT the worksheet) + var rngNumbers = rngTable.Range("E3:E5"); // The address is relative to rngTable (NOT the worksheet) + + //Formatting dates and numbers + //Using a OpenXML's predefined formats + rngDates.Style.NumberFormat.NumberFormatId = 15; + //Using a custom format + rngNumbers.Style.NumberFormat.Format = "$ #,##0"; + + //Formatting headers + var rngHeaders = rngTable.Range("A2:E2"); // The address is relative to rngTable (NOT the worksheet) + rngHeaders.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + rngHeaders.Style.Font.Bold = true; + rngHeaders.Style.Fill.BackgroundColor = XLColor.Aqua; + + //Adding grid lines + rngTable.Style.Border.BottomBorder = XLBorderStyleValues.Thin; + + //Format title cell + rngTable.Cell(1, 1).Style.Font.Bold = true; + rngTable.Cell(1, 1).Style.Fill.BackgroundColor = XLColor.CornflowerBlue; + rngTable.Cell(1, 1).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + + //Merge title cells + rngTable.Row(1).Merge(); // We could've also used: rngTable.Range("A1:E1").Merge() + + //Add thick borders + rngTable.Style.Border.OutsideBorder = XLBorderStyleValues.Thick; + + // You can also specify the border for each side with: + // rngTable.FirstColumn().Style.Border.LeftBorder = XLBorderStyleValues.Thick; + // rngTable.LastColumn().Style.Border.RightBorder = XLBorderStyleValues.Thick; + // rngTable.FirstRow().Style.Border.TopBorder = XLBorderStyleValues.Thick; + // rngTable.LastRow().Style.Border.BottomBorder = XLBorderStyleValues.Thick; + + // Adjust column widths to their content + ws.Columns(2, 6).AdjustToContents(); + + //Saving the workbook + wb.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/ClosedXML_Examples.csproj b/ClosedXML_Examples/ClosedXML_Examples.csproj index de7cb8e..30a0fa7 100644 --- a/ClosedXML_Examples/ClosedXML_Examples.csproj +++ b/ClosedXML_Examples/ClosedXML_Examples.csproj @@ -48,8 +48,8 @@ true - - ..\packages\DocumentFormat.OpenXml.2.7.1\lib\net45\DocumentFormat.OpenXml.dll + + ..\packages\DocumentFormat.OpenXml.2.7.2\lib\net40\DocumentFormat.OpenXml.dll True @@ -185,6 +185,9 @@ + + + + + + + Debug + AnyCPU + + + 2.0 + {09B066ED-E4A7-4545-A1A4-FF03DD524BDF} + Library + Properties + ClosedXML_Tests + ClosedXML_Tests + v4.5.2 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\ + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE;$(AppVeyor) + prompt + 4 + false + + + pdbonly + true + bin\Release\ + TRACE;$(AppVeyor) + prompt + 4 + false + + + true + + + ClosedXML.snk + + + + ..\packages\DocumentFormat.OpenXml.2.7.2\lib\net40\DocumentFormat.OpenXml.dll + True + + + + ..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + True + + + + + 3.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {BD5E6BFE-E837-4A35-BCA9-39667D873A20} + ClosedXML + + + {03A518D0-1CB7-488E-861C-C4E782B27A46} + ClosedXML_Examples + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + .editorconfig + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/AutoFilterTests.cs b/ClosedXML_Tests/Examples/AutoFilterTests.cs index 5541af7..0ed0489 100644 --- a/ClosedXML_Tests/Examples/AutoFilterTests.cs +++ b/ClosedXML_Tests/Examples/AutoFilterTests.cs @@ -1,33 +1,33 @@ -using ClosedXML_Examples; -using NUnit.Framework; - -namespace ClosedXML_Tests.Examples -{ - [TestFixture] - public class AutoFilterTests - { - [Test] - public void CustomAutoFilter() - { - TestHelper.RunTestExample(@"AutoFilter\CustomAutoFilter.xlsx"); - } - - [Test] - public void DynamicAutoFilter() - { - TestHelper.RunTestExample(@"AutoFilter\DynamicAutoFilter.xlsx"); - } - - [Test] - public void RegularAutoFilter() - { - TestHelper.RunTestExample(@"AutoFilter\RegularAutoFilter.xlsx"); - } - - [Test] - public void TopBottomAutoFilter() - { - TestHelper.RunTestExample(@"AutoFilter\TopBottomAutoFilter.xlsx"); - } - } +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class AutoFilterTests + { + [Test] + public void CustomAutoFilter() + { + TestHelper.RunTestExample(@"AutoFilter\CustomAutoFilter.xlsx"); + } + + [Test] + public void DynamicAutoFilter() + { + TestHelper.RunTestExample(@"AutoFilter\DynamicAutoFilter.xlsx"); + } + + [Test] + public void RegularAutoFilter() + { + TestHelper.RunTestExample(@"AutoFilter\RegularAutoFilter.xlsx"); + } + + [Test] + public void TopBottomAutoFilter() + { + TestHelper.RunTestExample(@"AutoFilter\TopBottomAutoFilter.xlsx"); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/ColumnsTests.cs b/ClosedXML_Tests/Examples/ColumnsTests.cs index c523d57..1ecd215 100644 --- a/ClosedXML_Tests/Examples/ColumnsTests.cs +++ b/ClosedXML_Tests/Examples/ColumnsTests.cs @@ -1,34 +1,34 @@ -using ClosedXML_Examples; -using ClosedXML_Examples.Columns; -using NUnit.Framework; - -namespace ClosedXML_Tests.Examples -{ - [TestFixture] - public class ColumnsTests - { - [Test] - public void ColumnCells() - { - TestHelper.RunTestExample(@"Columns\ColumnCells.xlsx"); - } - - [Test] - public void ColumnCollections() - { - TestHelper.RunTestExample(@"Columns\ColumnCollection.xlsx"); - } - - [Test] - public void ColumnSettings() - { - TestHelper.RunTestExample(@"Columns\ColumnSettings.xlsx"); - } - - [Test] - public void DeletingColumns() - { - TestHelper.RunTestExample(@"Columns\DeletingColumns.xlsx"); - } - } +using ClosedXML_Examples; +using ClosedXML_Examples.Columns; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class ColumnsTests + { + [Test] + public void ColumnCells() + { + TestHelper.RunTestExample(@"Columns\ColumnCells.xlsx"); + } + + [Test] + public void ColumnCollections() + { + TestHelper.RunTestExample(@"Columns\ColumnCollection.xlsx"); + } + + [Test] + public void ColumnSettings() + { + TestHelper.RunTestExample(@"Columns\ColumnSettings.xlsx"); + } + + [Test] + public void DeletingColumns() + { + TestHelper.RunTestExample(@"Columns\DeletingColumns.xlsx"); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/CommentsTests.cs b/ClosedXML_Tests/Examples/CommentsTests.cs index b4cb1e9..11d719c 100644 --- a/ClosedXML_Tests/Examples/CommentsTests.cs +++ b/ClosedXML_Tests/Examples/CommentsTests.cs @@ -1,15 +1,15 @@ -using ClosedXML_Examples; -using NUnit.Framework; - -namespace ClosedXML_Tests.Examples -{ - [TestFixture] - public class CommentsTests - { - [Test] - public void AddingComments() - { - TestHelper.RunTestExample(@"Comments\AddingComments.xlsx"); - } - } +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class CommentsTests + { + [Test] + public void AddingComments() + { + TestHelper.RunTestExample(@"Comments\AddingComments.xlsx"); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs b/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs index 1ab8fe2..0760da0 100644 --- a/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs +++ b/ClosedXML_Tests/Examples/ConditionalFormattingTests.cs @@ -1,117 +1,117 @@ -using ClosedXML_Examples; -using NUnit.Framework; - -namespace ClosedXML_Tests.Examples -{ - [TestFixture] - public class ConditionalFormattingTests - { - [Test] - public void CFColorScaleLowHigh() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFColorScaleLowHigh.xlsx"); - } - - [Test] - public void CFColorScaleLowMidHigh() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFColorScaleLowMidHigh.xlsx"); - } - - [Test] - public void CFColorScaleMinimumMaximum() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFColorScaleMinimumMaximum.xlsx"); - } - - [Test] - public void CFContains() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFContains.xlsx"); - } - - [Test] - public void CFDataBar() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFDataBar.xlsx"); - } - - [Test] - public void CFEndsWith() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFEndsWith.xlsx"); - } - - [Test] - public void CFEqualsNumber() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFEqualsNumber.xlsx"); - } - - [Test] - public void CFEqualsString() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFEqualsString.xlsx"); - } - - [Test] - public void CFIconSet() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFIconSet.xlsx"); - } - - [Test] - public void CFIsBlank() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFIsBlank.xlsx"); - } - - [Test] - public void CFIsError() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFIsError.xlsx"); - } - - [Test] - public void CFNotBlank() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFNotBlank.xlsx"); - } - - [Test] - public void CFNotContains() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFNotContains.xlsx"); - } - - [Test] - public void CFNotEqualsNumber() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFNotEqualsNumber.xlsx"); - } - - [Test] - public void CFNotEqualsString() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFNotEqualsString.xlsx"); - } - - [Test] - public void CFNotError() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFNotError.xlsx"); - } - - [Test] - public void CFStartsWith() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFStartsWith.xlsx"); - } - - [Test] - public void CFMultipleConditions() - { - TestHelper.RunTestExample(@"ConditionalFormatting\CFMultipleConditions.xlsx"); - } - } -} +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class ConditionalFormattingTests + { + [Test] + public void CFColorScaleLowHigh() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFColorScaleLowHigh.xlsx"); + } + + [Test] + public void CFColorScaleLowMidHigh() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFColorScaleLowMidHigh.xlsx"); + } + + [Test] + public void CFColorScaleMinimumMaximum() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFColorScaleMinimumMaximum.xlsx"); + } + + [Test] + public void CFContains() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFContains.xlsx"); + } + + [Test] + public void CFDataBar() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFDataBar.xlsx"); + } + + [Test] + public void CFEndsWith() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFEndsWith.xlsx"); + } + + [Test] + public void CFEqualsNumber() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFEqualsNumber.xlsx"); + } + + [Test] + public void CFEqualsString() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFEqualsString.xlsx"); + } + + [Test] + public void CFIconSet() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFIconSet.xlsx"); + } + + [Test] + public void CFIsBlank() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFIsBlank.xlsx"); + } + + [Test] + public void CFIsError() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFIsError.xlsx"); + } + + [Test] + public void CFNotBlank() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFNotBlank.xlsx"); + } + + [Test] + public void CFNotContains() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFNotContains.xlsx"); + } + + [Test] + public void CFNotEqualsNumber() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFNotEqualsNumber.xlsx"); + } + + [Test] + public void CFNotEqualsString() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFNotEqualsString.xlsx"); + } + + [Test] + public void CFNotError() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFNotError.xlsx"); + } + + [Test] + public void CFStartsWith() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFStartsWith.xlsx"); + } + + [Test] + public void CFMultipleConditions() + { + TestHelper.RunTestExample(@"ConditionalFormatting\CFMultipleConditions.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Examples/DeleteTests.cs b/ClosedXML_Tests/Examples/DeleteTests.cs index b6e56ee..bd498be 100644 --- a/ClosedXML_Tests/Examples/DeleteTests.cs +++ b/ClosedXML_Tests/Examples/DeleteTests.cs @@ -1,21 +1,21 @@ -using ClosedXML_Examples.Delete; -using NUnit.Framework; - -namespace ClosedXML_Tests.Examples -{ - [TestFixture] - public class DeleteTests - { - [Test] - public void DeleteFewWorksheets() - { - TestHelper.RunTestExample(@"Delete\DeleteFewWorksheets.xlsx"); - } - - [Test] - public void RemoveRows() - { - TestHelper.RunTestExample(@"Delete\RemoveRows.xlsx"); - } - } +using ClosedXML_Examples.Delete; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class DeleteTests + { + [Test] + public void DeleteFewWorksheets() + { + TestHelper.RunTestExample(@"Delete\DeleteFewWorksheets.xlsx"); + } + + [Test] + public void RemoveRows() + { + TestHelper.RunTestExample(@"Delete\RemoveRows.xlsx"); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/ImageHandlingTests.cs b/ClosedXML_Tests/Examples/ImageHandlingTests.cs index 6af9d80..cbbbd94 100644 --- a/ClosedXML_Tests/Examples/ImageHandlingTests.cs +++ b/ClosedXML_Tests/Examples/ImageHandlingTests.cs @@ -1,4 +1,4 @@ -using ClosedXML_Examples; +using ClosedXML_Examples; using NUnit.Framework; namespace ClosedXML_Tests.Examples diff --git a/ClosedXML_Tests/Examples/LoadingTests.cs b/ClosedXML_Tests/Examples/LoadingTests.cs index 2391d19..d6af919 100644 --- a/ClosedXML_Tests/Examples/LoadingTests.cs +++ b/ClosedXML_Tests/Examples/LoadingTests.cs @@ -1,15 +1,15 @@ -using ClosedXML_Examples; -using NUnit.Framework; - -namespace ClosedXML_Tests.Examples -{ - [TestFixture] - public class LoadingTests - { - [Test] - public void ChangingBasicTable() - { - TestHelper.RunTestExample(@"Loading\ChangingBasicTable.xlsx"); - } - } +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class LoadingTests + { + [Test] + public void ChangingBasicTable() + { + TestHelper.RunTestExample(@"Loading\ChangingBasicTable.xlsx"); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/MiscTests.cs b/ClosedXML_Tests/Examples/MiscTests.cs index 47865bc..a78a7fa 100644 --- a/ClosedXML_Tests/Examples/MiscTests.cs +++ b/ClosedXML_Tests/Examples/MiscTests.cs @@ -1,202 +1,202 @@ -using ClosedXML_Examples; -using ClosedXML_Examples.Misc; -using NUnit.Framework; - -namespace ClosedXML_Tests.Examples -{ - [TestFixture] - public class MiscTests - { - [Test] - public void AddingDataSet() - { - TestHelper.RunTestExample(@"Misc\AddingDataSet.xlsx"); - } - - [Test] - public void AddingDataTableAsWorksheet() - { - TestHelper.RunTestExample(@"Misc\AddingDataTableAsWorksheet.xlsx"); - } - - [Test] - public void AdjustToContents() - { - TestHelper.RunTestExample(@"Misc\AdjustToContents.xlsx"); - } - - [Test] - public void AdjustToContentsWithAutoFilter() - { - TestHelper.RunTestExample(@"Misc\AdjustToContentsWithAutoFilter.xlsx"); - } - - [Test] - public void AutoFilter() - { - TestHelper.RunTestExample(@"Misc\AutoFilter.xlsx"); - } - - [Test] - public void BasicTable() - { - TestHelper.RunTestExample(@"Misc\BasicTable.xlsx"); - } - - [Test] - public void BlankCells() - { - TestHelper.RunTestExample(@"Misc\BlankCells.xlsx"); - } - - [Test] - public void CellValues() - { - TestHelper.RunTestExample(@"Misc\CellValues.xlsx"); - } - - [Test] - public void Collections() - { - TestHelper.RunTestExample(@"Misc\Collections.xlsx"); - } - - [Test] - public void CopyingRowsAndColumns() - { - TestHelper.RunTestExample(@"Misc\CopyingRowsAndColumns.xlsx"); - } - - [Test] - public void CopyingWorksheets() - { - TestHelper.RunTestExample(@"Misc\CopyingWorksheets.xlsx"); - } - - [Test] - public void DataTypes() - { - TestHelper.RunTestExample(@"Misc\DataTypes.xlsx"); - } - - [Test] - public void DataTypesUnderDifferentCulture() - { - TestHelper.RunTestExample(@"Misc\DataTypesUnderDifferentCulture.xlsx"); - } - - [Test] - public void DataValidation() - { - TestHelper.RunTestExample(@"Misc\DataValidation.xlsx"); - } - - [Test] - public void Formulas() - { - TestHelper.RunTestExample(@"Misc\Formulas.xlsx"); - } - - [Test] - public void FreezePanes() - { - TestHelper.RunTestExample(@"Misc\FreezePanes.xlsx"); - } - - [Test] - public void HideSheets() - { - TestHelper.RunTestExample(@"Misc\HideSheets.xlsx"); - } - - [Test] - public void HideUnhide() - { - TestHelper.RunTestExample(@"Misc\HideUnhide.xlsx"); - } - - [Test] - public void Hyperlinks() - { - TestHelper.RunTestExample(@"Misc\Hyperlinks.xlsx"); - } - - [Test] - public void InsertingData() - { - TestHelper.RunTestExample(@"Misc\InsertingData.xlsx"); - } - - [Test] - public void InsertingTables() - { - TestHelper.RunTestExample(@"Misc\InsertingTables.xlsx"); - } - - [Test] - public void LambdaExpressions() - { - TestHelper.RunTestExample(@"Misc\LambdaExpressions.xlsx"); - } - - [Test] - public void MergeCells() - { - TestHelper.RunTestExample(@"Misc\MergeCells.xlsx"); - } - - [Test] - public void MergeMoves() - { - TestHelper.RunTestExample(@"Misc\MergeMoves.xlsx"); - } - - [Test] - public void Outline() - { - TestHelper.RunTestExample(@"Misc\Outline.xlsx"); - } - - [Test] - public void RightToLeft() - { - TestHelper.RunTestExample(@"Misc\RightToLeft.xlsx"); - } - - [Test] - public void SheetProtection() - { - TestHelper.RunTestExample(@"Misc\SheetProtection.xlsx"); - } - - [Test] - public void SheetViews() - { - TestHelper.RunTestExample(@"Misc\SheetViews.xlsx"); - } - - [Test] - public void ShiftingFormulas() - { - TestHelper.RunTestExample(@"Misc\ShiftingFormulas.xlsx"); - } - - [Test] - public void ShowCase() - { - TestHelper.RunTestExample(@"Misc\ShowCase.xlsx"); - } - - [Test] - public void TabColors() - { - TestHelper.RunTestExample(@"Misc\TabColors.xlsx"); - } - - [Test] - public void WorkbookProperties() - { - TestHelper.RunTestExample(@"Misc\WorkbookProperties.xlsx"); - } - } -} +using ClosedXML_Examples; +using ClosedXML_Examples.Misc; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class MiscTests + { + [Test] + public void AddingDataSet() + { + TestHelper.RunTestExample(@"Misc\AddingDataSet.xlsx"); + } + + [Test] + public void AddingDataTableAsWorksheet() + { + TestHelper.RunTestExample(@"Misc\AddingDataTableAsWorksheet.xlsx"); + } + + [Test] + public void AdjustToContents() + { + TestHelper.RunTestExample(@"Misc\AdjustToContents.xlsx"); + } + + [Test] + public void AdjustToContentsWithAutoFilter() + { + TestHelper.RunTestExample(@"Misc\AdjustToContentsWithAutoFilter.xlsx"); + } + + [Test] + public void AutoFilter() + { + TestHelper.RunTestExample(@"Misc\AutoFilter.xlsx"); + } + + [Test] + public void BasicTable() + { + TestHelper.RunTestExample(@"Misc\BasicTable.xlsx"); + } + + [Test] + public void BlankCells() + { + TestHelper.RunTestExample(@"Misc\BlankCells.xlsx"); + } + + [Test] + public void CellValues() + { + TestHelper.RunTestExample(@"Misc\CellValues.xlsx"); + } + + [Test] + public void Collections() + { + TestHelper.RunTestExample(@"Misc\Collections.xlsx"); + } + + [Test] + public void CopyingRowsAndColumns() + { + TestHelper.RunTestExample(@"Misc\CopyingRowsAndColumns.xlsx"); + } + + [Test] + public void CopyingWorksheets() + { + TestHelper.RunTestExample(@"Misc\CopyingWorksheets.xlsx"); + } + + [Test] + public void DataTypes() + { + TestHelper.RunTestExample(@"Misc\DataTypes.xlsx"); + } + + [Test] + public void DataTypesUnderDifferentCulture() + { + TestHelper.RunTestExample(@"Misc\DataTypesUnderDifferentCulture.xlsx"); + } + + [Test] + public void DataValidation() + { + TestHelper.RunTestExample(@"Misc\DataValidation.xlsx"); + } + + [Test] + public void Formulas() + { + TestHelper.RunTestExample(@"Misc\Formulas.xlsx"); + } + + [Test] + public void FreezePanes() + { + TestHelper.RunTestExample(@"Misc\FreezePanes.xlsx"); + } + + [Test] + public void HideSheets() + { + TestHelper.RunTestExample(@"Misc\HideSheets.xlsx"); + } + + [Test] + public void HideUnhide() + { + TestHelper.RunTestExample(@"Misc\HideUnhide.xlsx"); + } + + [Test] + public void Hyperlinks() + { + TestHelper.RunTestExample(@"Misc\Hyperlinks.xlsx"); + } + + [Test] + public void InsertingData() + { + TestHelper.RunTestExample(@"Misc\InsertingData.xlsx"); + } + + [Test] + public void InsertingTables() + { + TestHelper.RunTestExample(@"Misc\InsertingTables.xlsx"); + } + + [Test] + public void LambdaExpressions() + { + TestHelper.RunTestExample(@"Misc\LambdaExpressions.xlsx"); + } + + [Test] + public void MergeCells() + { + TestHelper.RunTestExample(@"Misc\MergeCells.xlsx"); + } + + [Test] + public void MergeMoves() + { + TestHelper.RunTestExample(@"Misc\MergeMoves.xlsx"); + } + + [Test] + public void Outline() + { + TestHelper.RunTestExample(@"Misc\Outline.xlsx"); + } + + [Test] + public void RightToLeft() + { + TestHelper.RunTestExample(@"Misc\RightToLeft.xlsx"); + } + + [Test] + public void SheetProtection() + { + TestHelper.RunTestExample(@"Misc\SheetProtection.xlsx"); + } + + [Test] + public void SheetViews() + { + TestHelper.RunTestExample(@"Misc\SheetViews.xlsx"); + } + + [Test] + public void ShiftingFormulas() + { + TestHelper.RunTestExample(@"Misc\ShiftingFormulas.xlsx"); + } + + [Test] + public void ShowCase() + { + TestHelper.RunTestExample(@"Misc\ShowCase.xlsx"); + } + + [Test] + public void TabColors() + { + TestHelper.RunTestExample(@"Misc\TabColors.xlsx"); + } + + [Test] + public void WorkbookProperties() + { + TestHelper.RunTestExample(@"Misc\WorkbookProperties.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Examples/PageSetupTests.cs b/ClosedXML_Tests/Examples/PageSetupTests.cs index 588ef50..63930b0 100644 --- a/ClosedXML_Tests/Examples/PageSetupTests.cs +++ b/ClosedXML_Tests/Examples/PageSetupTests.cs @@ -1,45 +1,45 @@ -using ClosedXML_Examples.PageSetup; -using NUnit.Framework; - -namespace ClosedXML_Tests.Examples -{ - [TestFixture] - public class PageSetupTests - { - [Test] - public void HeaderFooters() - { - TestHelper.RunTestExample(@"PageSetup\HeaderFooters.xlsx"); - } - - [Test] - public void Margins() - { - TestHelper.RunTestExample(@"PageSetup\Margins.xlsx"); - } - - [Test] - public void Page() - { - TestHelper.RunTestExample(@"PageSetup\Page.xlsx"); - } - - [Test] - public void SheetTab() - { - TestHelper.RunTestExample(@"PageSetup\SheetTab.xlsx"); - } - - [Test] - public void Sheets() - { - TestHelper.RunTestExample(@"PageSetup\Sheets.xlsx"); - } - - [Test] - public void TwoPages() - { - TestHelper.RunTestExample(@"PageSetup\TwoPages.xlsx"); - } - } +using ClosedXML_Examples.PageSetup; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class PageSetupTests + { + [Test] + public void HeaderFooters() + { + TestHelper.RunTestExample(@"PageSetup\HeaderFooters.xlsx"); + } + + [Test] + public void Margins() + { + TestHelper.RunTestExample(@"PageSetup\Margins.xlsx"); + } + + [Test] + public void Page() + { + TestHelper.RunTestExample(@"PageSetup\Page.xlsx"); + } + + [Test] + public void SheetTab() + { + TestHelper.RunTestExample(@"PageSetup\SheetTab.xlsx"); + } + + [Test] + public void Sheets() + { + TestHelper.RunTestExample(@"PageSetup\Sheets.xlsx"); + } + + [Test] + public void TwoPages() + { + TestHelper.RunTestExample(@"PageSetup\TwoPages.xlsx"); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/RangesTests.cs b/ClosedXML_Tests/Examples/RangesTests.cs index 8595872..fe3e1e2 100644 --- a/ClosedXML_Tests/Examples/RangesTests.cs +++ b/ClosedXML_Tests/Examples/RangesTests.cs @@ -1,119 +1,119 @@ -using ClosedXML_Examples; -using ClosedXML_Examples.Misc; -using ClosedXML_Examples.Ranges; -using NUnit.Framework; - -namespace ClosedXML_Tests.Examples -{ - [TestFixture] - public class RangesTests - { - [Test] - public void ClearingRanges() - { - TestHelper.RunTestExample(@"Ranges\ClearingRanges.xlsx"); - } - - [Test] - public void CopyingRanges() - { - TestHelper.RunTestExample(@"Ranges\CopyingRanges.xlsx"); - } - - [Test] - public void CurrentRowColumn() - { - TestHelper.RunTestExample(@"Ranges\CurrentRowColumn.xlsx"); - } - - [Test] - public void DefiningRanges() - { - TestHelper.RunTestExample(@"Ranges\DefiningRanges.xlsx"); - } - - [Test] - public void DeletingRanges() - { - TestHelper.RunTestExample(@"Ranges\DeletingRanges.xlsx"); - } - - [Test] - public void InsertingDeletingColumns() - { - TestHelper.RunTestExample(@"Ranges\InsertingDeletingColumns.xlsx"); - } - - [Test] - public void InsertingDeletingRows() - { - TestHelper.RunTestExample(@"Ranges\InsertingDeletingRows.xlsx"); - } - - [Test] - public void MultipleRanges() - { - TestHelper.RunTestExample(@"Ranges\MultipleRanges.xlsx"); - } - - [Test] - public void NamedRanges() - { - TestHelper.RunTestExample(@"Ranges\NamedRanges.xlsx"); - } - - [Test] - public void SelectingRanges() - { - TestHelper.RunTestExample(@"Ranges\SelectingRanges.xlsx"); - } - - [Test] - public void ShiftingRanges() - { - TestHelper.RunTestExample(@"Ranges\ShiftingRanges.xlsx"); - } - - [Test] - public void SortExample() - { - TestHelper.RunTestExample(@"Ranges\SortExample.xlsx"); - } - - [Test] - public void Sorting() - { - TestHelper.RunTestExample(@"Ranges\Sorting.xlsx"); - } - - [Test] - public void TransposeRanges() - { - TestHelper.RunTestExample(@"Ranges\TransposeRanges.xlsx"); - } - - [Test] - public void TransposeRangesPlus() - { - TestHelper.RunTestExample(@"Ranges\TransposeRangesPlus.xlsx"); - } - - [Test] - public void UsingTables() - { - TestHelper.RunTestExample(@"Ranges\UsingTables.xlsx"); - } - - [Test] - public void AddingRowToTables() - { - TestHelper.RunTestExample(@"Ranges\AddingRowToTables.xlsx"); - } - - [Test] - public void WalkingRanges() - { - TestHelper.RunTestExample(@"Ranges\WalkingRanges.xlsx"); - } - } +using ClosedXML_Examples; +using ClosedXML_Examples.Misc; +using ClosedXML_Examples.Ranges; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class RangesTests + { + [Test] + public void ClearingRanges() + { + TestHelper.RunTestExample(@"Ranges\ClearingRanges.xlsx"); + } + + [Test] + public void CopyingRanges() + { + TestHelper.RunTestExample(@"Ranges\CopyingRanges.xlsx"); + } + + [Test] + public void CurrentRowColumn() + { + TestHelper.RunTestExample(@"Ranges\CurrentRowColumn.xlsx"); + } + + [Test] + public void DefiningRanges() + { + TestHelper.RunTestExample(@"Ranges\DefiningRanges.xlsx"); + } + + [Test] + public void DeletingRanges() + { + TestHelper.RunTestExample(@"Ranges\DeletingRanges.xlsx"); + } + + [Test] + public void InsertingDeletingColumns() + { + TestHelper.RunTestExample(@"Ranges\InsertingDeletingColumns.xlsx"); + } + + [Test] + public void InsertingDeletingRows() + { + TestHelper.RunTestExample(@"Ranges\InsertingDeletingRows.xlsx"); + } + + [Test] + public void MultipleRanges() + { + TestHelper.RunTestExample(@"Ranges\MultipleRanges.xlsx"); + } + + [Test] + public void NamedRanges() + { + TestHelper.RunTestExample(@"Ranges\NamedRanges.xlsx"); + } + + [Test] + public void SelectingRanges() + { + TestHelper.RunTestExample(@"Ranges\SelectingRanges.xlsx"); + } + + [Test] + public void ShiftingRanges() + { + TestHelper.RunTestExample(@"Ranges\ShiftingRanges.xlsx"); + } + + [Test] + public void SortExample() + { + TestHelper.RunTestExample(@"Ranges\SortExample.xlsx"); + } + + [Test] + public void Sorting() + { + TestHelper.RunTestExample(@"Ranges\Sorting.xlsx"); + } + + [Test] + public void TransposeRanges() + { + TestHelper.RunTestExample(@"Ranges\TransposeRanges.xlsx"); + } + + [Test] + public void TransposeRangesPlus() + { + TestHelper.RunTestExample(@"Ranges\TransposeRangesPlus.xlsx"); + } + + [Test] + public void UsingTables() + { + TestHelper.RunTestExample(@"Ranges\UsingTables.xlsx"); + } + + [Test] + public void AddingRowToTables() + { + TestHelper.RunTestExample(@"Ranges\AddingRowToTables.xlsx"); + } + + [Test] + public void WalkingRanges() + { + TestHelper.RunTestExample(@"Ranges\WalkingRanges.xlsx"); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/RowsTests.cs b/ClosedXML_Tests/Examples/RowsTests.cs index 917a985..3042957 100644 --- a/ClosedXML_Tests/Examples/RowsTests.cs +++ b/ClosedXML_Tests/Examples/RowsTests.cs @@ -1,28 +1,28 @@ -using ClosedXML_Examples; -using ClosedXML_Examples.Rows; -using NUnit.Framework; - -namespace ClosedXML_Tests.Examples -{ - [TestFixture] - public class RowsTests - { - [Test] - public void RowCells() - { - TestHelper.RunTestExample(@"Rows\RowCells.xlsx"); - } - - [Test] - public void RowCollection() - { - TestHelper.RunTestExample(@"Rows\RowCollection.xlsx"); - } - - [Test] - public void RowSettings() - { - TestHelper.RunTestExample(@"Rows\RowSettings.xlsx"); - } - } +using ClosedXML_Examples; +using ClosedXML_Examples.Rows; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class RowsTests + { + [Test] + public void RowCells() + { + TestHelper.RunTestExample(@"Rows\RowCells.xlsx"); + } + + [Test] + public void RowCollection() + { + TestHelper.RunTestExample(@"Rows\RowCollection.xlsx"); + } + + [Test] + public void RowSettings() + { + TestHelper.RunTestExample(@"Rows\RowSettings.xlsx"); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Examples/StylesTests.cs b/ClosedXML_Tests/Examples/StylesTests.cs index 77e0bf4..4ecfb15 100644 --- a/ClosedXML_Tests/Examples/StylesTests.cs +++ b/ClosedXML_Tests/Examples/StylesTests.cs @@ -1,75 +1,75 @@ -using ClosedXML_Examples.Styles; -using NUnit.Framework; - -namespace ClosedXML_Tests.Examples -{ - [TestFixture] - public class StylesTests - { - [Test] - public void DefaultStyles() - { - TestHelper.RunTestExample(@"Styles\DefaultStyles.xlsx"); - } - - [Test] - public void PurpleWorksheet() - { - TestHelper.RunTestExample(@"Styles\PurpleWorksheet.xlsx"); - } - - [Test] - public void StyleAlignment() - { - TestHelper.RunTestExample(@"Styles\StyleAlignment.xlsx"); - } - - [Test] - public void StyleBorder() - { - TestHelper.RunTestExample(@"Styles\StyleBorder.xlsx"); - } - - [Test] - public void StyleFill() - { - TestHelper.RunTestExample(@"Styles\StyleFill.xlsx"); - } - - [Test] - public void StyleFont() - { - TestHelper.RunTestExample(@"Styles\StyleFont.xlsx"); - } - - [Test] - public void StyleNumberFormat() - { - TestHelper.RunTestExample(@"Styles\StyleNumberFormat.xlsx"); - } - - [Test] - public void StyleRowsColumns() - { - TestHelper.RunTestExample(@"Styles\StyleRowsColumns.xlsx"); - } - - [Test] - public void StyleWorksheet() - { - TestHelper.RunTestExample(@"Styles\StyleWorksheet.xlsx"); - } - - [Test] - public void UsingColors() - { - TestHelper.RunTestExample(@"Styles\UsingColors.xlsx"); - } - - [Test] - public void UsingRichText() - { - TestHelper.RunTestExample(@"Styles\UsingRichText.xlsx"); - } - } +using ClosedXML_Examples.Styles; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class StylesTests + { + [Test] + public void DefaultStyles() + { + TestHelper.RunTestExample(@"Styles\DefaultStyles.xlsx"); + } + + [Test] + public void PurpleWorksheet() + { + TestHelper.RunTestExample(@"Styles\PurpleWorksheet.xlsx"); + } + + [Test] + public void StyleAlignment() + { + TestHelper.RunTestExample(@"Styles\StyleAlignment.xlsx"); + } + + [Test] + public void StyleBorder() + { + TestHelper.RunTestExample(@"Styles\StyleBorder.xlsx"); + } + + [Test] + public void StyleFill() + { + TestHelper.RunTestExample(@"Styles\StyleFill.xlsx"); + } + + [Test] + public void StyleFont() + { + TestHelper.RunTestExample(@"Styles\StyleFont.xlsx"); + } + + [Test] + public void StyleNumberFormat() + { + TestHelper.RunTestExample(@"Styles\StyleNumberFormat.xlsx"); + } + + [Test] + public void StyleRowsColumns() + { + TestHelper.RunTestExample(@"Styles\StyleRowsColumns.xlsx"); + } + + [Test] + public void StyleWorksheet() + { + TestHelper.RunTestExample(@"Styles\StyleWorksheet.xlsx"); + } + + [Test] + public void UsingColors() + { + TestHelper.RunTestExample(@"Styles\UsingColors.xlsx"); + } + + [Test] + public void UsingRichText() + { + TestHelper.RunTestExample(@"Styles\UsingRichText.xlsx"); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs b/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs index a9c47d8..c630f5a 100644 --- a/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs +++ b/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs @@ -1,76 +1,76 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class AutoFilterTests - { - [Test] - public void AutoFilterExpandsWithTable() - { - using (var wb = new XLWorkbook()) - { - using (IXLWorksheet ws = wb.Worksheets.Add("Sheet1")) - { - ws.FirstCell().SetValue("Categories") - .CellBelow().SetValue("1") - .CellBelow().SetValue("2"); - - IXLTable table = ws.RangeUsed().CreateTable(); - - var listOfArr = new List(); - listOfArr.Add(3); - listOfArr.Add(4); - listOfArr.Add(5); - listOfArr.Add(6); - - table.DataRange.InsertRowsBelow(listOfArr.Count - table.DataRange.RowCount()); - table.DataRange.FirstCell().InsertData(listOfArr.AsEnumerable()); - - Assert.AreEqual("A1:A5", table.AutoFilter.Range.RangeAddress.ToStringRelative()); - } - } - } - - [Test] - public void AutoFilterSortWhenNotInFirstRow() - { - using (var wb = new XLWorkbook()) - { - using (IXLWorksheet ws = wb.Worksheets.Add("Sheet1")) - { - ws.Cell(3, 3).SetValue("Names") - .CellBelow().SetValue("Manuel") - .CellBelow().SetValue("Carlos") - .CellBelow().SetValue("Dominic"); - ws.RangeUsed().SetAutoFilter().Sort(); - Assert.AreEqual(ws.Cell(4, 3).GetString(), "Carlos"); - } - } - } - - [Test] - public void CanClearAutoFilter() - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("AutoFilter"); - ws.Cell("A1").Value = "Names"; - ws.Cell("A2").Value = "John"; - ws.Cell("A3").Value = "Hank"; - ws.Cell("A4").Value = "Dagny"; - - ws.AutoFilter.Clear(); // We should be able to clear a filter even if it hasn't been set. - Assert.That(!ws.AutoFilter.Enabled); - - ws.RangeUsed().SetAutoFilter(); - Assert.That(ws.AutoFilter.Enabled); - - ws.AutoFilter.Clear(); - Assert.That(!ws.AutoFilter.Enabled); - } - } +using System; +using System.Collections.Generic; +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class AutoFilterTests + { + [Test] + public void AutoFilterExpandsWithTable() + { + using (var wb = new XLWorkbook()) + { + using (IXLWorksheet ws = wb.Worksheets.Add("Sheet1")) + { + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("1") + .CellBelow().SetValue("2"); + + IXLTable table = ws.RangeUsed().CreateTable(); + + var listOfArr = new List(); + listOfArr.Add(3); + listOfArr.Add(4); + listOfArr.Add(5); + listOfArr.Add(6); + + table.DataRange.InsertRowsBelow(listOfArr.Count - table.DataRange.RowCount()); + table.DataRange.FirstCell().InsertData(listOfArr.AsEnumerable()); + + Assert.AreEqual("A1:A5", table.AutoFilter.Range.RangeAddress.ToStringRelative()); + } + } + } + + [Test] + public void AutoFilterSortWhenNotInFirstRow() + { + using (var wb = new XLWorkbook()) + { + using (IXLWorksheet ws = wb.Worksheets.Add("Sheet1")) + { + ws.Cell(3, 3).SetValue("Names") + .CellBelow().SetValue("Manuel") + .CellBelow().SetValue("Carlos") + .CellBelow().SetValue("Dominic"); + ws.RangeUsed().SetAutoFilter().Sort(); + Assert.AreEqual(ws.Cell(4, 3).GetString(), "Carlos"); + } + } + } + + [Test] + public void CanClearAutoFilter() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("AutoFilter"); + ws.Cell("A1").Value = "Names"; + ws.Cell("A2").Value = "John"; + ws.Cell("A3").Value = "Hank"; + ws.Cell("A4").Value = "Dagny"; + + ws.AutoFilter.Clear(); // We should be able to clear a filter even if it hasn't been set. + Assert.That(!ws.AutoFilter.Enabled); + + ws.RangeUsed().SetAutoFilter(); + Assert.That(ws.AutoFilter.Enabled); + + ws.AutoFilter.Clear(); + Assert.That(!ws.AutoFilter.Enabled); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/CalcEngine/DateAndTimeTests.cs b/ClosedXML_Tests/Excel/CalcEngine/DateAndTimeTests.cs index 08e874b..e6ed681 100644 --- a/ClosedXML_Tests/Excel/CalcEngine/DateAndTimeTests.cs +++ b/ClosedXML_Tests/Excel/CalcEngine/DateAndTimeTests.cs @@ -1,509 +1,509 @@ -using System; -using System.Globalization; -using System.Threading; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel.DataValidations -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class DateAndTimeTests - { - [OneTimeSetUp] - public void SetCultureInfo() - { - Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); - } - - [Test] - public void Date() - { - Object actual = XLWorkbook.EvaluateExpr("Date(2008, 1, 1)"); - Assert.AreEqual(39448, actual); - } - - [Test] - public void Datevalue() - { - Object actual = XLWorkbook.EvaluateExpr("DateValue(\"8/22/2008\")"); - Assert.AreEqual(39682, actual); - } - - [Test] - public void Day() - { - Object actual = XLWorkbook.EvaluateExpr("Day(\"8/22/2008\")"); - Assert.AreEqual(22, actual); - } - - [Test] - public void Days() - { - Object actual = XLWorkbook.EvaluateExpr("DAYS(DATE(2016,10,1),DATE(1992,2,29))"); - Assert.AreEqual(8981, actual); - - actual = XLWorkbook.EvaluateExpr("DAYS(\"2016-10-1\",\"1992-2-29\")"); - Assert.AreEqual(8981, actual); - } - - [Test] - public void DayWithDifferentCulture() - { - CultureInfo ci = new CultureInfo(CultureInfo.InvariantCulture.LCID); - ci.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy"; - Thread.CurrentThread.CurrentCulture = ci; - Object actual = XLWorkbook.EvaluateExpr("Day(\"1/6/2008\")"); - Assert.AreEqual(1, actual); - } - - [Test] - public void Days360_Default() - { - Object actual = XLWorkbook.EvaluateExpr("Days360(\"1/30/2008\", \"2/1/2008\")"); - Assert.AreEqual(1, actual); - } - - [Test] - public void Days360_Europe1() - { - Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"1/1/2008\", \"3/31/2008\",TRUE)"); - Assert.AreEqual(89, actual); - } - - [Test] - public void Days360_Europe2() - { - Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"3/31/2008\", \"1/1/2008\",TRUE)"); - Assert.AreEqual(-89, actual); - } - - [Test] - public void Days360_US1() - { - Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"1/1/2008\", \"3/31/2008\",FALSE)"); - Assert.AreEqual(90, actual); - } - - [Test] - public void Days360_US2() - { - Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"3/31/2008\", \"1/1/2008\",FALSE)"); - Assert.AreEqual(-89, actual); - } - - [Test] - public void EDate_Negative1() - { - Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/1/2008\", -1)"); - Assert.AreEqual(new DateTime(2008, 2, 1), actual); - } - - [Test] - public void EDate_Negative2() - { - Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/31/2008\", -1)"); - Assert.AreEqual(new DateTime(2008, 2, 29), actual); - } - - [Test] - public void EDate_Positive1() - { - Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/1/2008\", 1)"); - Assert.AreEqual(new DateTime(2008, 4, 1), actual); - } - - [Test] - public void EDate_Positive2() - { - Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/31/2008\", 1)"); - Assert.AreEqual(new DateTime(2008, 4, 30), actual); - } - - [Test] - public void EOMonth_Negative() - { - Object actual = XLWorkbook.EvaluateExpr("EOMonth(\"3/1/2008\", -1)"); - Assert.AreEqual(new DateTime(2008, 2, 29), actual); - } - - [Test] - public void EOMonth_Positive() - { - Object actual = XLWorkbook.EvaluateExpr("EOMonth(\"3/31/2008\", 1)"); - Assert.AreEqual(new DateTime(2008, 4, 30), actual); - } - - [Test] - public void Hour() - { - Object actual = XLWorkbook.EvaluateExpr("Hour(\"8/22/2008 3:30:45 PM\")"); - Assert.AreEqual(15, actual); - } - - [Test] - public void Minute() - { - Object actual = XLWorkbook.EvaluateExpr("Minute(\"8/22/2008 3:30:45 AM\")"); - Assert.AreEqual(30, actual); - } - - [Test] - public void Month() - { - Object actual = XLWorkbook.EvaluateExpr("Month(\"8/22/2008\")"); - Assert.AreEqual(8, actual); - } - - [Test] - public void IsoWeekNum() - { - Object actual = XLWorkbook.EvaluateExpr("ISOWEEKNUM(DATEVALUE(\"2012-3-9\"))"); - Assert.AreEqual(10, actual); - - actual = XLWorkbook.EvaluateExpr("ISOWEEKNUM(DATE(2012,12,31))"); - Assert.AreEqual(1, actual); - } - - [Test] - public void Networkdays_MultipleHolidaysGiven() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Date") - .CellBelow().SetValue(new DateTime(2008, 10, 1)) - .CellBelow().SetValue(new DateTime(2009, 3, 1)) - .CellBelow().SetValue(new DateTime(2008, 11, 26)) - .CellBelow().SetValue(new DateTime(2008, 12, 4)) - .CellBelow().SetValue(new DateTime(2009, 1, 21)); - Object actual = ws.Evaluate("Networkdays(A2,A3,A4:A6)"); - Assert.AreEqual(105, actual); - } - - [Test] - public void Networkdays_NoHolidaysGiven() - { - Object actual = XLWorkbook.EvaluateExpr("Networkdays(\"10/01/2008\", \"3/01/2009\")"); - Assert.AreEqual(108, actual); - } - - [Test] - public void Networkdays_NegativeResult() - { - Object actual = XLWorkbook.EvaluateExpr("Networkdays(\"3/01/2009\", \"10/01/2008\")"); - Assert.AreEqual(-108, actual); - - actual = XLWorkbook.EvaluateExpr("Networkdays(\"2016-01-01\", \"2015-12-23\")"); - Assert.AreEqual(-8, actual); - } - - [Test] - public void Networkdays_OneHolidaysGiven() - { - Object actual = XLWorkbook.EvaluateExpr("Networkdays(\"10/01/2008\", \"3/01/2009\", \"11/26/2008\")"); - Assert.AreEqual(107, actual); - } - - [Test] - public void Second() - { - Object actual = XLWorkbook.EvaluateExpr("Second(\"8/22/2008 3:30:45 AM\")"); - Assert.AreEqual(45, actual); - } - - [Test] - public void Time() - { - Object actual = XLWorkbook.EvaluateExpr("Time(1,2,3)"); - Assert.AreEqual(new TimeSpan(1, 2, 3), actual); - } - - [Test] - public void TimeValue1() - { - Object actual = XLWorkbook.EvaluateExpr("TimeValue(\"2:24 AM\")"); - Assert.IsTrue(XLHelper.AreEqual(0.1, (double) actual)); - } - - [Test] - public void TimeValue2() - { - Object actual = XLWorkbook.EvaluateExpr("TimeValue(\"22-Aug-2008 6:35 AM\")"); - Assert.IsTrue(XLHelper.AreEqual(0.27430555555555558, (double) actual)); - } - - [Test] - public void Today() - { - Object actual = XLWorkbook.EvaluateExpr("Today()"); - Assert.AreEqual(DateTime.Now.Date, actual); - } - - [Test] - public void Weekday_1() - { - Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\", 1)"); - Assert.AreEqual(5, actual); - } - - [Test] - public void Weekday_2() - { - Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\", 2)"); - Assert.AreEqual(4, actual); - } - - [Test] - public void Weekday_3() - { - Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\", 3)"); - Assert.AreEqual(3, actual); - } - - [Test] - public void Weekday_Omitted() - { - Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\")"); - Assert.AreEqual(5, actual); - } - - [Test] - public void Weeknum_1() - { - Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2000\", 1)")); - } - - [Test] - public void Weeknum_10() - { - Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2004\", 2)")); - } - - [Test] - public void Weeknum_11() - { - Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2005\", 1)")); - } - - [Test] - public void Weeknum_12() - { - Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2005\", 2)")); - } - - [Test] - public void Weeknum_13() - { - Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2006\", 1)")); - } - - [Test] - public void Weeknum_14() - { - Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2006\", 2)")); - } - - [Test] - public void Weeknum_15() - { - Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2007\", 1)")); - } - - [Test] - public void Weeknum_16() - { - Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2007\", 2)")); - } - - [Test] - public void Weeknum_17() - { - Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2008\", 1)")); - } - - [Test] - public void Weeknum_18() - { - Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2008\", 2)")); - } - - [Test] - public void Weeknum_19() - { - Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2009\", 1)")); - } - - [Test] - public void Weeknum_2() - { - Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2000\", 2)")); - } - - [Test] - public void Weeknum_20() - { - Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2009\", 2)")); - } - - [Test] - public void Weeknum_3() - { - Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2001\", 1)")); - } - - [Test] - public void Weeknum_4() - { - Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2001\", 2)")); - } - - [Test] - public void Weeknum_5() - { - Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2002\", 1)")); - } - - [Test] - public void Weeknum_6() - { - Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2002\", 2)")); - } - - [Test] - public void Weeknum_7() - { - Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2003\", 1)")); - } - - [Test] - public void Weeknum_8() - { - Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2003\", 2)")); - } - - [Test] - public void Weeknum_9() - { - Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2004\", 1)")); - } - - [Test] - public void Weeknum_Default() - { - Object actual = XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2008\")"); - Assert.AreEqual(11, actual); - } - - [Test] - public void Workdays_MultipleHolidaysGiven() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Date") - .CellBelow().SetValue(new DateTime(2008, 10, 1)) - .CellBelow().SetValue(151) - .CellBelow().SetValue(new DateTime(2008, 11, 26)) - .CellBelow().SetValue(new DateTime(2008, 12, 4)) - .CellBelow().SetValue(new DateTime(2009, 1, 21)); - Object actual = ws.Evaluate("Workday(A2,A3,A4:A6)"); - Assert.AreEqual(new DateTime(2009, 5, 5), actual); - } - - - [Test] - public void Workdays_NoHolidaysGiven() - { - Object actual = XLWorkbook.EvaluateExpr("Workday(\"10/01/2008\", 151)"); - Assert.AreEqual(new DateTime(2009, 4, 30), actual); - - actual = XLWorkbook.EvaluateExpr("Workday(\"2016-01-01\", -10)"); - Assert.AreEqual(new DateTime(2015, 12, 18), actual); - } - - [Test] - public void Workdays_OneHolidaysGiven() - { - Object actual = XLWorkbook.EvaluateExpr("Workday(\"10/01/2008\", 152, \"11/26/2008\")"); - Assert.AreEqual(new DateTime(2009, 5, 4), actual); - } - - [Test] - public void Year() - { - Object actual = XLWorkbook.EvaluateExpr("Year(\"8/22/2008\")"); - Assert.AreEqual(2008, actual); - } - - [Test] - public void Yearfrac_1_base0() - { - Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",0)"); - Assert.IsTrue(XLHelper.AreEqual(0.25, (double) actual)); - } - - [Test] - public void Yearfrac_1_base1() - { - Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",1)"); - Assert.IsTrue(XLHelper.AreEqual(0.24590163934426229, (double) actual)); - } - - [Test] - public void Yearfrac_1_base2() - { - Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",2)"); - Assert.IsTrue(XLHelper.AreEqual(0.25, (double) actual)); - } - - [Test] - public void Yearfrac_1_base3() - { - Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",3)"); - Assert.IsTrue(XLHelper.AreEqual(0.24657534246575341, (double) actual)); - } - - [Test] - public void Yearfrac_1_base4() - { - Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",4)"); - Assert.IsTrue(XLHelper.AreEqual(0.24722222222222223, (double) actual)); - } - - [Test] - public void Yearfrac_2_base0() - { - Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",0)"); - Assert.IsTrue(XLHelper.AreEqual(5.25, (double) actual)); - } - - [Test] - public void Yearfrac_2_base1() - { - Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",1)"); - Assert.IsTrue(XLHelper.AreEqual(5.24452554744526, (double) actual)); - } - - [Test] - public void Yearfrac_2_base2() - { - Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",2)"); - Assert.IsTrue(XLHelper.AreEqual(5.32222222222222, (double) actual)); - } - - [Test] - public void Yearfrac_2_base3() - { - Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",3)"); - Assert.IsTrue(XLHelper.AreEqual(5.24931506849315, (double) actual)); - } - - [Test] - public void Yearfrac_2_base4() - { - Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",4)"); - Assert.IsTrue(XLHelper.AreEqual(5.24722222222222, (double) actual)); - } - } -} +using System; +using System.Globalization; +using System.Threading; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.DataValidations +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class DateAndTimeTests + { + [OneTimeSetUp] + public void SetCultureInfo() + { + Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); + } + + [Test] + public void Date() + { + Object actual = XLWorkbook.EvaluateExpr("Date(2008, 1, 1)"); + Assert.AreEqual(39448, actual); + } + + [Test] + public void Datevalue() + { + Object actual = XLWorkbook.EvaluateExpr("DateValue(\"8/22/2008\")"); + Assert.AreEqual(39682, actual); + } + + [Test] + public void Day() + { + Object actual = XLWorkbook.EvaluateExpr("Day(\"8/22/2008\")"); + Assert.AreEqual(22, actual); + } + + [Test] + public void Days() + { + Object actual = XLWorkbook.EvaluateExpr("DAYS(DATE(2016,10,1),DATE(1992,2,29))"); + Assert.AreEqual(8981, actual); + + actual = XLWorkbook.EvaluateExpr("DAYS(\"2016-10-1\",\"1992-2-29\")"); + Assert.AreEqual(8981, actual); + } + + [Test] + public void DayWithDifferentCulture() + { + CultureInfo ci = new CultureInfo(CultureInfo.InvariantCulture.LCID); + ci.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy"; + Thread.CurrentThread.CurrentCulture = ci; + Object actual = XLWorkbook.EvaluateExpr("Day(\"1/6/2008\")"); + Assert.AreEqual(1, actual); + } + + [Test] + public void Days360_Default() + { + Object actual = XLWorkbook.EvaluateExpr("Days360(\"1/30/2008\", \"2/1/2008\")"); + Assert.AreEqual(1, actual); + } + + [Test] + public void Days360_Europe1() + { + Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"1/1/2008\", \"3/31/2008\",TRUE)"); + Assert.AreEqual(89, actual); + } + + [Test] + public void Days360_Europe2() + { + Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"3/31/2008\", \"1/1/2008\",TRUE)"); + Assert.AreEqual(-89, actual); + } + + [Test] + public void Days360_US1() + { + Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"1/1/2008\", \"3/31/2008\",FALSE)"); + Assert.AreEqual(90, actual); + } + + [Test] + public void Days360_US2() + { + Object actual = XLWorkbook.EvaluateExpr("DAYS360(\"3/31/2008\", \"1/1/2008\",FALSE)"); + Assert.AreEqual(-89, actual); + } + + [Test] + public void EDate_Negative1() + { + Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/1/2008\", -1)"); + Assert.AreEqual(new DateTime(2008, 2, 1), actual); + } + + [Test] + public void EDate_Negative2() + { + Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/31/2008\", -1)"); + Assert.AreEqual(new DateTime(2008, 2, 29), actual); + } + + [Test] + public void EDate_Positive1() + { + Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/1/2008\", 1)"); + Assert.AreEqual(new DateTime(2008, 4, 1), actual); + } + + [Test] + public void EDate_Positive2() + { + Object actual = XLWorkbook.EvaluateExpr("EDate(\"3/31/2008\", 1)"); + Assert.AreEqual(new DateTime(2008, 4, 30), actual); + } + + [Test] + public void EOMonth_Negative() + { + Object actual = XLWorkbook.EvaluateExpr("EOMonth(\"3/1/2008\", -1)"); + Assert.AreEqual(new DateTime(2008, 2, 29), actual); + } + + [Test] + public void EOMonth_Positive() + { + Object actual = XLWorkbook.EvaluateExpr("EOMonth(\"3/31/2008\", 1)"); + Assert.AreEqual(new DateTime(2008, 4, 30), actual); + } + + [Test] + public void Hour() + { + Object actual = XLWorkbook.EvaluateExpr("Hour(\"8/22/2008 3:30:45 PM\")"); + Assert.AreEqual(15, actual); + } + + [Test] + public void Minute() + { + Object actual = XLWorkbook.EvaluateExpr("Minute(\"8/22/2008 3:30:45 AM\")"); + Assert.AreEqual(30, actual); + } + + [Test] + public void Month() + { + Object actual = XLWorkbook.EvaluateExpr("Month(\"8/22/2008\")"); + Assert.AreEqual(8, actual); + } + + [Test] + public void IsoWeekNum() + { + Object actual = XLWorkbook.EvaluateExpr("ISOWEEKNUM(DATEVALUE(\"2012-3-9\"))"); + Assert.AreEqual(10, actual); + + actual = XLWorkbook.EvaluateExpr("ISOWEEKNUM(DATE(2012,12,31))"); + Assert.AreEqual(1, actual); + } + + [Test] + public void Networkdays_MultipleHolidaysGiven() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Date") + .CellBelow().SetValue(new DateTime(2008, 10, 1)) + .CellBelow().SetValue(new DateTime(2009, 3, 1)) + .CellBelow().SetValue(new DateTime(2008, 11, 26)) + .CellBelow().SetValue(new DateTime(2008, 12, 4)) + .CellBelow().SetValue(new DateTime(2009, 1, 21)); + Object actual = ws.Evaluate("Networkdays(A2,A3,A4:A6)"); + Assert.AreEqual(105, actual); + } + + [Test] + public void Networkdays_NoHolidaysGiven() + { + Object actual = XLWorkbook.EvaluateExpr("Networkdays(\"10/01/2008\", \"3/01/2009\")"); + Assert.AreEqual(108, actual); + } + + [Test] + public void Networkdays_NegativeResult() + { + Object actual = XLWorkbook.EvaluateExpr("Networkdays(\"3/01/2009\", \"10/01/2008\")"); + Assert.AreEqual(-108, actual); + + actual = XLWorkbook.EvaluateExpr("Networkdays(\"2016-01-01\", \"2015-12-23\")"); + Assert.AreEqual(-8, actual); + } + + [Test] + public void Networkdays_OneHolidaysGiven() + { + Object actual = XLWorkbook.EvaluateExpr("Networkdays(\"10/01/2008\", \"3/01/2009\", \"11/26/2008\")"); + Assert.AreEqual(107, actual); + } + + [Test] + public void Second() + { + Object actual = XLWorkbook.EvaluateExpr("Second(\"8/22/2008 3:30:45 AM\")"); + Assert.AreEqual(45, actual); + } + + [Test] + public void Time() + { + Object actual = XLWorkbook.EvaluateExpr("Time(1,2,3)"); + Assert.AreEqual(new TimeSpan(1, 2, 3), actual); + } + + [Test] + public void TimeValue1() + { + Object actual = XLWorkbook.EvaluateExpr("TimeValue(\"2:24 AM\")"); + Assert.IsTrue(XLHelper.AreEqual(0.1, (double) actual)); + } + + [Test] + public void TimeValue2() + { + Object actual = XLWorkbook.EvaluateExpr("TimeValue(\"22-Aug-2008 6:35 AM\")"); + Assert.IsTrue(XLHelper.AreEqual(0.27430555555555558, (double) actual)); + } + + [Test] + public void Today() + { + Object actual = XLWorkbook.EvaluateExpr("Today()"); + Assert.AreEqual(DateTime.Now.Date, actual); + } + + [Test] + public void Weekday_1() + { + Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\", 1)"); + Assert.AreEqual(5, actual); + } + + [Test] + public void Weekday_2() + { + Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\", 2)"); + Assert.AreEqual(4, actual); + } + + [Test] + public void Weekday_3() + { + Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\", 3)"); + Assert.AreEqual(3, actual); + } + + [Test] + public void Weekday_Omitted() + { + Object actual = XLWorkbook.EvaluateExpr("Weekday(\"2/14/2008\")"); + Assert.AreEqual(5, actual); + } + + [Test] + public void Weeknum_1() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2000\", 1)")); + } + + [Test] + public void Weeknum_10() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2004\", 2)")); + } + + [Test] + public void Weeknum_11() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2005\", 1)")); + } + + [Test] + public void Weeknum_12() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2005\", 2)")); + } + + [Test] + public void Weeknum_13() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2006\", 1)")); + } + + [Test] + public void Weeknum_14() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2006\", 2)")); + } + + [Test] + public void Weeknum_15() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2007\", 1)")); + } + + [Test] + public void Weeknum_16() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2007\", 2)")); + } + + [Test] + public void Weeknum_17() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2008\", 1)")); + } + + [Test] + public void Weeknum_18() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2008\", 2)")); + } + + [Test] + public void Weeknum_19() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2009\", 1)")); + } + + [Test] + public void Weeknum_2() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2000\", 2)")); + } + + [Test] + public void Weeknum_20() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2009\", 2)")); + } + + [Test] + public void Weeknum_3() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2001\", 1)")); + } + + [Test] + public void Weeknum_4() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2001\", 2)")); + } + + [Test] + public void Weeknum_5() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2002\", 1)")); + } + + [Test] + public void Weeknum_6() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2002\", 2)")); + } + + [Test] + public void Weeknum_7() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2003\", 1)")); + } + + [Test] + public void Weeknum_8() + { + Assert.AreEqual(10, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2003\", 2)")); + } + + [Test] + public void Weeknum_9() + { + Assert.AreEqual(11, XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2004\", 1)")); + } + + [Test] + public void Weeknum_Default() + { + Object actual = XLWorkbook.EvaluateExpr("Weeknum(\"3/9/2008\")"); + Assert.AreEqual(11, actual); + } + + [Test] + public void Workdays_MultipleHolidaysGiven() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Date") + .CellBelow().SetValue(new DateTime(2008, 10, 1)) + .CellBelow().SetValue(151) + .CellBelow().SetValue(new DateTime(2008, 11, 26)) + .CellBelow().SetValue(new DateTime(2008, 12, 4)) + .CellBelow().SetValue(new DateTime(2009, 1, 21)); + Object actual = ws.Evaluate("Workday(A2,A3,A4:A6)"); + Assert.AreEqual(new DateTime(2009, 5, 5), actual); + } + + + [Test] + public void Workdays_NoHolidaysGiven() + { + Object actual = XLWorkbook.EvaluateExpr("Workday(\"10/01/2008\", 151)"); + Assert.AreEqual(new DateTime(2009, 4, 30), actual); + + actual = XLWorkbook.EvaluateExpr("Workday(\"2016-01-01\", -10)"); + Assert.AreEqual(new DateTime(2015, 12, 18), actual); + } + + [Test] + public void Workdays_OneHolidaysGiven() + { + Object actual = XLWorkbook.EvaluateExpr("Workday(\"10/01/2008\", 152, \"11/26/2008\")"); + Assert.AreEqual(new DateTime(2009, 5, 4), actual); + } + + [Test] + public void Year() + { + Object actual = XLWorkbook.EvaluateExpr("Year(\"8/22/2008\")"); + Assert.AreEqual(2008, actual); + } + + [Test] + public void Yearfrac_1_base0() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",0)"); + Assert.IsTrue(XLHelper.AreEqual(0.25, (double) actual)); + } + + [Test] + public void Yearfrac_1_base1() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",1)"); + Assert.IsTrue(XLHelper.AreEqual(0.24590163934426229, (double) actual)); + } + + [Test] + public void Yearfrac_1_base2() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",2)"); + Assert.IsTrue(XLHelper.AreEqual(0.25, (double) actual)); + } + + [Test] + public void Yearfrac_1_base3() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",3)"); + Assert.IsTrue(XLHelper.AreEqual(0.24657534246575341, (double) actual)); + } + + [Test] + public void Yearfrac_1_base4() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2008\",4)"); + Assert.IsTrue(XLHelper.AreEqual(0.24722222222222223, (double) actual)); + } + + [Test] + public void Yearfrac_2_base0() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",0)"); + Assert.IsTrue(XLHelper.AreEqual(5.25, (double) actual)); + } + + [Test] + public void Yearfrac_2_base1() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",1)"); + Assert.IsTrue(XLHelper.AreEqual(5.24452554744526, (double) actual)); + } + + [Test] + public void Yearfrac_2_base2() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",2)"); + Assert.IsTrue(XLHelper.AreEqual(5.32222222222222, (double) actual)); + } + + [Test] + public void Yearfrac_2_base3() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",3)"); + Assert.IsTrue(XLHelper.AreEqual(5.24931506849315, (double) actual)); + } + + [Test] + public void Yearfrac_2_base4() + { + Object actual = XLWorkbook.EvaluateExpr("Yearfrac(\"1/1/2008\", \"3/31/2013\",4)"); + Assert.IsTrue(XLHelper.AreEqual(5.24722222222222, (double) actual)); + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs b/ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs index 48691a6..3fca48e 100644 --- a/ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs +++ b/ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs @@ -1,620 +1,646 @@ -using System; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel.CalcEngine -{ - - [TestFixture] - public class FunctionsTests - { - [OneTimeSetUp] - public void Init() - { - // Make sure tests run on a deterministic culture - System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); - } - - [Test] - public void Asc() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr(@"Asc(""Text"")"); - Assert.AreEqual("Text", actual); - } - - [Test] - public void Clean() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr(String.Format(@"Clean(""A{0}B"")", Environment.NewLine)); - Assert.AreEqual("AB", actual); - } - - [Test] - public void Combin() - { - object actual1 = XLWorkbook.EvaluateExpr("Combin(200, 2)"); - Assert.AreEqual(19900.0, actual1); - - object actual2 = XLWorkbook.EvaluateExpr("Combin(20.1, 2.9)"); - Assert.AreEqual(190.0, actual2); - } - - [Test] - public void Degrees() - { - object actual1 = XLWorkbook.EvaluateExpr("Degrees(180)"); - Assert.IsTrue(Math.PI - (double) actual1 < XLHelper.Epsilon); - } - - [Test] - public void Dollar() - { - object actual = XLWorkbook.EvaluateExpr("Dollar(12345.123)"); - Assert.AreEqual(TestHelper.CurrencySymbol + "12,345.12", actual); - - actual = XLWorkbook.EvaluateExpr("Dollar(12345.123, 1)"); - Assert.AreEqual(TestHelper.CurrencySymbol + "12,345.1", actual); - } - - [Test] - public void Even() - { - object actual = XLWorkbook.EvaluateExpr("Even(3)"); - Assert.AreEqual(4, actual); - - actual = XLWorkbook.EvaluateExpr("Even(2)"); - Assert.AreEqual(2, actual); - - actual = XLWorkbook.EvaluateExpr("Even(-1)"); - Assert.AreEqual(-2, actual); - - actual = XLWorkbook.EvaluateExpr("Even(-2)"); - Assert.AreEqual(-2, actual); - - actual = XLWorkbook.EvaluateExpr("Even(0)"); - Assert.AreEqual(0, actual); - - actual = XLWorkbook.EvaluateExpr("Even(1.5)"); - Assert.AreEqual(2, actual); - - actual = XLWorkbook.EvaluateExpr("Even(2.01)"); - Assert.AreEqual(4, actual); - } - - [Test] - public void Exact() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr("Exact(\"A\", \"A\")"); - Assert.AreEqual(true, actual); - - actual = XLWorkbook.EvaluateExpr("Exact(\"A\", \"a\")"); - Assert.AreEqual(false, actual); - } - - [Test] - public void Fact() - { - object actual = XLWorkbook.EvaluateExpr("Fact(5.9)"); - Assert.AreEqual(120.0, actual); - } - - [Test] - public void FactDouble() - { - object actual1 = XLWorkbook.EvaluateExpr("FactDouble(6)"); - Assert.AreEqual(48.0, actual1); - object actual2 = XLWorkbook.EvaluateExpr("FactDouble(7)"); - Assert.AreEqual(105.0, actual2); - } - - [Test] - public void Fixed() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr("Fixed(12345.123)"); - Assert.AreEqual("12,345.12", actual); - - actual = XLWorkbook.EvaluateExpr("Fixed(12345.123, 1)"); - Assert.AreEqual("12,345.1", actual); - - actual = XLWorkbook.EvaluateExpr("Fixed(12345.123, 1, TRUE)"); - Assert.AreEqual("12345.1", actual); - } - - [Test] - public void Formula_from_another_sheet() - { - var wb = new XLWorkbook(); - IXLWorksheet ws1 = wb.AddWorksheet("ws1"); - ws1.FirstCell().SetValue(1).CellRight().SetFormulaA1("A1 + 1"); - IXLWorksheet ws2 = wb.AddWorksheet("ws2"); - ws2.FirstCell().SetFormulaA1("ws1!B1 + 1"); - object v = ws2.FirstCell().Value; - Assert.AreEqual(3.0, v); - } - - [Test] - public void Gcd() - { - object actual = XLWorkbook.EvaluateExpr("Gcd(24, 36)"); - Assert.AreEqual(12, actual); - - object actual1 = XLWorkbook.EvaluateExpr("Gcd(5, 0)"); - Assert.AreEqual(5, actual1); - - object actual2 = XLWorkbook.EvaluateExpr("Gcd(0, 5)"); - Assert.AreEqual(5, actual2); - - object actual3 = XLWorkbook.EvaluateExpr("Gcd(240, 360, 30)"); - Assert.AreEqual(30, actual3); - } - - [Test] - public void Lcm() - { - object actual = XLWorkbook.EvaluateExpr("Lcm(24, 36)"); - Assert.AreEqual(72, actual); - - object actual1 = XLWorkbook.EvaluateExpr("Lcm(5, 0)"); - Assert.AreEqual(0, actual1); - - object actual2 = XLWorkbook.EvaluateExpr("Lcm(0, 5)"); - Assert.AreEqual(0, actual2); - - object actual3 = XLWorkbook.EvaluateExpr("Lcm(240, 360, 30)"); - Assert.AreEqual(720, actual3); - } - - [Test] - public void MDetem() - { - IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); - ws.Cell("A1").SetValue(2).CellRight().SetValue(4); - ws.Cell("A2").SetValue(3).CellRight().SetValue(5); - - - Object actual; - - ws.Cell("A5").FormulaA1 = "MDeterm(A1:B2)"; - actual = ws.Cell("A5").Value; - - Assert.IsTrue(XLHelper.AreEqual(-2.0, (double) actual)); - - ws.Cell("A6").FormulaA1 = "Sum(A5)"; - actual = ws.Cell("A6").Value; - - Assert.IsTrue(XLHelper.AreEqual(-2.0, (double) actual)); - - ws.Cell("A7").FormulaA1 = "Sum(MDeterm(A1:B2))"; - actual = ws.Cell("A7").Value; - - Assert.IsTrue(XLHelper.AreEqual(-2.0, (double) actual)); - } - - [Test] - public void MInverse() - { - IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); - ws.Cell("A1").SetValue(1).CellRight().SetValue(2).CellRight().SetValue(1); - ws.Cell("A2").SetValue(3).CellRight().SetValue(4).CellRight().SetValue(-1); - ws.Cell("A3").SetValue(0).CellRight().SetValue(2).CellRight().SetValue(0); - - - Object actual; - - ws.Cell("A5").FormulaA1 = "MInverse(A1:C3)"; - actual = ws.Cell("A5").Value; - - Assert.IsTrue(XLHelper.AreEqual(0.25, (double) actual)); - - ws.Cell("A6").FormulaA1 = "Sum(A5)"; - actual = ws.Cell("A6").Value; - - Assert.IsTrue(XLHelper.AreEqual(0.25, (double) actual)); - - ws.Cell("A7").FormulaA1 = "Sum(MInverse(A1:C3))"; - actual = ws.Cell("A7").Value; - - Assert.IsTrue(XLHelper.AreEqual(0.5, (double) actual)); - } - - [Test] - public void MMult() - { - IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); - ws.Cell("A1").SetValue(2).CellRight().SetValue(4); - ws.Cell("A2").SetValue(3).CellRight().SetValue(5); - ws.Cell("A3").SetValue(2).CellRight().SetValue(4); - ws.Cell("A4").SetValue(3).CellRight().SetValue(5); - - Object actual; - - ws.Cell("A5").FormulaA1 = "MMult(A1:B2, A3:B4)"; - actual = ws.Cell("A5").Value; - - Assert.AreEqual(16.0, actual); - - ws.Cell("A6").FormulaA1 = "Sum(A5)"; - actual = ws.Cell("A6").Value; - - Assert.AreEqual(16.0, actual); - - ws.Cell("A7").FormulaA1 = "Sum(MMult(A1:B2, A3:B4))"; - actual = ws.Cell("A7").Value; - - Assert.AreEqual(102.0, actual); - } - - [Test] - public void MRound() - { - object actual = XLWorkbook.EvaluateExpr("MRound(10, 3)"); - Assert.AreEqual(9m, actual); - - object actual3 = XLWorkbook.EvaluateExpr("MRound(10.5, 3)"); - Assert.AreEqual(12m, actual3); - - object actual4 = XLWorkbook.EvaluateExpr("MRound(10.4, 3)"); - Assert.AreEqual(9m, actual4); - - object actual1 = XLWorkbook.EvaluateExpr("MRound(-10, -3)"); - Assert.AreEqual(-9m, actual1); - - object actual2 = XLWorkbook.EvaluateExpr("MRound(1.3, 0.2)"); - Assert.AreEqual(1.4m, actual2); - } - - [Test] - public void Mod() - { - object actual = XLWorkbook.EvaluateExpr("Mod(3, 2)"); - Assert.AreEqual(1, actual); - - object actual1 = XLWorkbook.EvaluateExpr("Mod(-3, 2)"); - Assert.AreEqual(1, actual1); - - object actual2 = XLWorkbook.EvaluateExpr("Mod(3, -2)"); - Assert.AreEqual(-1, actual2); - - object actual3 = XLWorkbook.EvaluateExpr("Mod(-3, -2)"); - Assert.AreEqual(-1, actual3); - } - - [Test] - public void Multinomial() - { - object actual = XLWorkbook.EvaluateExpr("Multinomial(2,3,4)"); - Assert.AreEqual(1260.0, actual); - } - - [Test] - public void Odd() - { - object actual = XLWorkbook.EvaluateExpr("Odd(1.5)"); - Assert.AreEqual(3, actual); - - object actual1 = XLWorkbook.EvaluateExpr("Odd(3)"); - Assert.AreEqual(3, actual1); - - object actual2 = XLWorkbook.EvaluateExpr("Odd(2)"); - Assert.AreEqual(3, actual2); - - object actual3 = XLWorkbook.EvaluateExpr("Odd(-1)"); - Assert.AreEqual(-1, actual3); - - object actual4 = XLWorkbook.EvaluateExpr("Odd(-2)"); - Assert.AreEqual(-3, actual4); - - actual = XLWorkbook.EvaluateExpr("Odd(0)"); - Assert.AreEqual(1, actual); - } - - [Test] - public void Product() - { - object actual = XLWorkbook.EvaluateExpr("Product(2,3,4)"); - Assert.AreEqual(24.0, actual); - } - - [Test] - public void Quotient() - { - object actual = XLWorkbook.EvaluateExpr("Quotient(5,2)"); - Assert.AreEqual(2, actual); - - actual = XLWorkbook.EvaluateExpr("Quotient(4.5,3.1)"); - Assert.AreEqual(1, actual); - - actual = XLWorkbook.EvaluateExpr("Quotient(-10,3)"); - Assert.AreEqual(-3, actual); - } - - [Test] - public void Radians() - { - object actual = XLWorkbook.EvaluateExpr("Radians(270)"); - Assert.IsTrue(Math.Abs(4.71238898038469 - (double) actual) < XLHelper.Epsilon); - } - - [Test] - public void Roman() - { - object actual = XLWorkbook.EvaluateExpr("Roman(3046, 1)"); - Assert.AreEqual("MMMXLVI", actual); - - actual = XLWorkbook.EvaluateExpr("Roman(270)"); - Assert.AreEqual("CCLXX", actual); - - actual = XLWorkbook.EvaluateExpr("Roman(3999, true)"); - Assert.AreEqual("MMMCMXCIX", actual); - } - - [Test] - public void Round() - { - object actual = XLWorkbook.EvaluateExpr("Round(2.15, 1)"); - Assert.AreEqual(2.2, actual); - - actual = XLWorkbook.EvaluateExpr("Round(2.149, 1)"); - Assert.AreEqual(2.1, actual); - - actual = XLWorkbook.EvaluateExpr("Round(-1.475, 2)"); - Assert.AreEqual(-1.48, actual); - - actual = XLWorkbook.EvaluateExpr("Round(21.5, -1)"); - Assert.AreEqual(20.0, actual); - - actual = XLWorkbook.EvaluateExpr("Round(626.3, -3)"); - Assert.AreEqual(1000.0, actual); - - actual = XLWorkbook.EvaluateExpr("Round(1.98, -1)"); - Assert.AreEqual(0.0, actual); - - actual = XLWorkbook.EvaluateExpr("Round(-50.55, -2)"); - Assert.AreEqual(-100.0, actual); - } - - [Test] - public void RoundDown() - { - object actual = XLWorkbook.EvaluateExpr("RoundDown(3.2, 0)"); - Assert.AreEqual(3.0, actual); - - actual = XLWorkbook.EvaluateExpr("RoundDown(76.9, 0)"); - Assert.AreEqual(76.0, actual); - - actual = XLWorkbook.EvaluateExpr("RoundDown(3.14159, 3)"); - Assert.AreEqual(3.141, actual); - - actual = XLWorkbook.EvaluateExpr("RoundDown(-3.14159, 1)"); - Assert.AreEqual(-3.1, actual); - - actual = XLWorkbook.EvaluateExpr("RoundDown(31415.92654, -2)"); - Assert.AreEqual(31400.0, actual); - - actual = XLWorkbook.EvaluateExpr("RoundDown(0, 3)"); - Assert.AreEqual(0.0, actual); - } - - [Test] - public void RoundUp() - { - object actual = XLWorkbook.EvaluateExpr("RoundUp(3.2, 0)"); - Assert.AreEqual(4.0, actual); - - actual = XLWorkbook.EvaluateExpr("RoundUp(76.9, 0)"); - Assert.AreEqual(77.0, actual); - - actual = XLWorkbook.EvaluateExpr("RoundUp(3.14159, 3)"); - Assert.AreEqual(3.142, actual); - - actual = XLWorkbook.EvaluateExpr("RoundUp(-3.14159, 1)"); - Assert.AreEqual(-3.2, actual); - - actual = XLWorkbook.EvaluateExpr("RoundUp(31415.92654, -2)"); - Assert.AreEqual(31500.0, actual); - - actual = XLWorkbook.EvaluateExpr("RoundUp(0, 3)"); - Assert.AreEqual(0.0, actual); - } - - [Test] - public void SeriesSum() - { - object actual = XLWorkbook.EvaluateExpr("SERIESSUM(2,3,4,5)"); - Assert.AreEqual(40.0, actual); - - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.Cell("A2").FormulaA1 = "PI()/4"; - ws.Cell("A3").Value = 1; - ws.Cell("A4").FormulaA1 = "-1/FACT(2)"; - ws.Cell("A5").FormulaA1 = "1/FACT(4)"; - ws.Cell("A6").FormulaA1 = "-1/FACT(6)"; - - actual = ws.Evaluate("SERIESSUM(A2,0,2,A3:A6)"); - Assert.IsTrue(Math.Abs(0.70710321482284566 - (double) actual) < XLHelper.Epsilon); - } - - [Test] - public void SqrtPi() - { - object actual = XLWorkbook.EvaluateExpr("SqrtPi(1)"); - Assert.IsTrue(Math.Abs(1.7724538509055159 - (double) actual) < XLHelper.Epsilon); - - actual = XLWorkbook.EvaluateExpr("SqrtPi(2)"); - Assert.IsTrue(Math.Abs(2.5066282746310002 - (double) actual) < XLHelper.Epsilon); - } - - [Test] - public void SubtotalAverage() - { - object actual = XLWorkbook.EvaluateExpr("Subtotal(1,2,3)"); - Assert.AreEqual(2.5, actual); - - actual = XLWorkbook.EvaluateExpr(@"Subtotal(1,""A"",3, 2)"); - Assert.AreEqual(2.5, actual); - } - - [Test] - public void SubtotalCount() - { - object actual = XLWorkbook.EvaluateExpr("Subtotal(2,2,3)"); - Assert.AreEqual(2, actual); - - actual = XLWorkbook.EvaluateExpr(@"Subtotal(2,""A"",3)"); - Assert.AreEqual(1, actual); - } - - [Test] - public void SubtotalCountA() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr("Subtotal(3,2,3)"); - Assert.AreEqual(2.0, actual); - - actual = XLWorkbook.EvaluateExpr(@"Subtotal(3,"""",3)"); - Assert.AreEqual(1.0, actual); - } - - [Test] - public void SubtotalMax() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr(@"Subtotal(4,2,3,""A"")"); - Assert.AreEqual(3.0, actual); - } - - [Test] - public void SubtotalMin() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr(@"Subtotal(5,2,3,""A"")"); - Assert.AreEqual(2.0, actual); - } - - [Test] - public void SubtotalProduct() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr(@"Subtotal(6,2,3,""A"")"); - Assert.AreEqual(6.0, actual); - } - - [Test] - public void SubtotalStDev() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr(@"Subtotal(7,2,3,""A"")"); - Assert.IsTrue(Math.Abs(0.70710678118654757 - (double) actual) < XLHelper.Epsilon); - } - - [Test] - public void SubtotalStDevP() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr(@"Subtotal(8,2,3,""A"")"); - Assert.AreEqual(0.5, actual); - } - - [Test] - public void SubtotalSum() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr(@"Subtotal(9,2,3,""A"")"); - Assert.AreEqual(5.0, actual); - } - - [Test] - public void SubtotalVar() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr(@"Subtotal(10,2,3,""A"")"); - Assert.IsTrue(Math.Abs(0.5 - (double) actual) < XLHelper.Epsilon); - } - - [Test] - public void SubtotalVarP() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr(@"Subtotal(11,2,3,""A"")"); - Assert.AreEqual(0.25, actual); - } - - [Test] - public void Sum() - { - IXLCell cell = new XLWorkbook().AddWorksheet("Sheet1").FirstCell(); - IXLCell fCell = cell.SetValue(1).CellBelow().SetValue(2).CellBelow(); - fCell.FormulaA1 = "sum(A1:A2)"; - - Assert.AreEqual(3.0, fCell.Value); - } - - [Test] - public void SumSq() - { - Object actual; - - actual = XLWorkbook.EvaluateExpr(@"SumSq(3,4)"); - Assert.AreEqual(25.0, actual); - } - - [Test] - public void TextConcat() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.Cell("A1").Value = 1; - ws.Cell("A2").Value = 1; - ws.Cell("B1").Value = 1; - ws.Cell("B2").Value = 1; - - ws.Cell("C1").FormulaA1 = "\"The total value is: \" & SUM(A1:B2)"; - - object r = ws.Cell("C1").Value; - Assert.AreEqual("The total value is: 4", r.ToString()); - } - - [Test] - public void Trim() - { - Assert.AreEqual("Test", XLWorkbook.EvaluateExpr("Trim(\"Test \")")); - - //Should not trim non breaking space - //See http://office.microsoft.com/en-us/excel-help/trim-function-HP010062581.aspx - Assert.AreEqual("Test\u00A0", XLWorkbook.EvaluateExpr("Trim(\"Test\u00A0 \")")); - } - - [Test] - public void TestEmptyTallyOperations() - { - //In these test no values have been set - XLWorkbook wb = new XLWorkbook(); - wb.Worksheets.Add("TallyTests"); - var cell = wb.Worksheet(1).Cell(1, 1).SetFormulaA1("=MAX(D1,D2)"); - Assert.AreEqual(0, cell.Value); - cell = wb.Worksheet(1).Cell(2, 1).SetFormulaA1("=MIN(D1,D2)"); - Assert.AreEqual(0, cell.Value); - cell = wb.Worksheet(1).Cell(3, 1).SetFormulaA1("=SUM(D1,D2)"); - Assert.AreEqual(0, cell.Value); - Assert.That(() => wb.Worksheet(1).Cell(3, 1).SetFormulaA1("=AVERAGE(D1,D2)").Value, Throws.Exception); - } - } -} +using System; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + + [TestFixture] + public class FunctionsTests + { + [OneTimeSetUp] + public void Init() + { + // Make sure tests run on a deterministic culture + System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); + } + + [Test] + public void Asc() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Asc(""Text"")"); + Assert.AreEqual("Text", actual); + } + + [Test] + public void Clean() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(String.Format(@"Clean(""A{0}B"")", Environment.NewLine)); + Assert.AreEqual("AB", actual); + } + + [Test] + public void Combin() + { + object actual1 = XLWorkbook.EvaluateExpr("Combin(200, 2)"); + Assert.AreEqual(19900.0, actual1); + + object actual2 = XLWorkbook.EvaluateExpr("Combin(20.1, 2.9)"); + Assert.AreEqual(190.0, actual2); + } + + [Test] + public void Degrees() + { + object actual1 = XLWorkbook.EvaluateExpr("Degrees(180)"); + Assert.IsTrue(Math.PI - (double) actual1 < XLHelper.Epsilon); + } + + [Test] + public void Dollar() + { + object actual = XLWorkbook.EvaluateExpr("Dollar(12345.123)"); + Assert.AreEqual(TestHelper.CurrencySymbol + "12,345.12", actual); + + actual = XLWorkbook.EvaluateExpr("Dollar(12345.123, 1)"); + Assert.AreEqual(TestHelper.CurrencySymbol + "12,345.1", actual); + } + + [Test] + public void Even() + { + object actual = XLWorkbook.EvaluateExpr("Even(3)"); + Assert.AreEqual(4, actual); + + actual = XLWorkbook.EvaluateExpr("Even(2)"); + Assert.AreEqual(2, actual); + + actual = XLWorkbook.EvaluateExpr("Even(-1)"); + Assert.AreEqual(-2, actual); + + actual = XLWorkbook.EvaluateExpr("Even(-2)"); + Assert.AreEqual(-2, actual); + + actual = XLWorkbook.EvaluateExpr("Even(0)"); + Assert.AreEqual(0, actual); + + actual = XLWorkbook.EvaluateExpr("Even(1.5)"); + Assert.AreEqual(2, actual); + + actual = XLWorkbook.EvaluateExpr("Even(2.01)"); + Assert.AreEqual(4, actual); + } + + [Test] + public void Exact() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr("Exact(\"A\", \"A\")"); + Assert.AreEqual(true, actual); + + actual = XLWorkbook.EvaluateExpr("Exact(\"A\", \"a\")"); + Assert.AreEqual(false, actual); + } + + [Test] + public void Fact() + { + object actual = XLWorkbook.EvaluateExpr("Fact(5.9)"); + Assert.AreEqual(120.0, actual); + } + + [Test] + public void FactDouble() + { + object actual1 = XLWorkbook.EvaluateExpr("FactDouble(6)"); + Assert.AreEqual(48.0, actual1); + object actual2 = XLWorkbook.EvaluateExpr("FactDouble(7)"); + Assert.AreEqual(105.0, actual2); + } + + [Test] + public void Fixed() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr("Fixed(12345.123)"); + Assert.AreEqual("12,345.12", actual); + + actual = XLWorkbook.EvaluateExpr("Fixed(12345.123, 1)"); + Assert.AreEqual("12,345.1", actual); + + actual = XLWorkbook.EvaluateExpr("Fixed(12345.123, 1, TRUE)"); + Assert.AreEqual("12345.1", actual); + } + + [Test] + public void Formula_from_another_sheet() + { + var wb = new XLWorkbook(); + IXLWorksheet ws1 = wb.AddWorksheet("ws1"); + ws1.FirstCell().SetValue(1).CellRight().SetFormulaA1("A1 + 1"); + IXLWorksheet ws2 = wb.AddWorksheet("ws2"); + ws2.FirstCell().SetFormulaA1("ws1!B1 + 1"); + object v = ws2.FirstCell().Value; + Assert.AreEqual(3.0, v); + } + + [Test] + public void Gcd() + { + object actual = XLWorkbook.EvaluateExpr("Gcd(24, 36)"); + Assert.AreEqual(12, actual); + + object actual1 = XLWorkbook.EvaluateExpr("Gcd(5, 0)"); + Assert.AreEqual(5, actual1); + + object actual2 = XLWorkbook.EvaluateExpr("Gcd(0, 5)"); + Assert.AreEqual(5, actual2); + + object actual3 = XLWorkbook.EvaluateExpr("Gcd(240, 360, 30)"); + Assert.AreEqual(30, actual3); + } + + [Test] + public void Lcm() + { + object actual = XLWorkbook.EvaluateExpr("Lcm(24, 36)"); + Assert.AreEqual(72, actual); + + object actual1 = XLWorkbook.EvaluateExpr("Lcm(5, 0)"); + Assert.AreEqual(0, actual1); + + object actual2 = XLWorkbook.EvaluateExpr("Lcm(0, 5)"); + Assert.AreEqual(0, actual2); + + object actual3 = XLWorkbook.EvaluateExpr("Lcm(240, 360, 30)"); + Assert.AreEqual(720, actual3); + } + + [Test] + public void MDetem() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Cell("A1").SetValue(2).CellRight().SetValue(4); + ws.Cell("A2").SetValue(3).CellRight().SetValue(5); + + + Object actual; + + ws.Cell("A5").FormulaA1 = "MDeterm(A1:B2)"; + actual = ws.Cell("A5").Value; + + Assert.IsTrue(XLHelper.AreEqual(-2.0, (double) actual)); + + ws.Cell("A6").FormulaA1 = "Sum(A5)"; + actual = ws.Cell("A6").Value; + + Assert.IsTrue(XLHelper.AreEqual(-2.0, (double) actual)); + + ws.Cell("A7").FormulaA1 = "Sum(MDeterm(A1:B2))"; + actual = ws.Cell("A7").Value; + + Assert.IsTrue(XLHelper.AreEqual(-2.0, (double) actual)); + } + + [Test] + public void MInverse() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Cell("A1").SetValue(1).CellRight().SetValue(2).CellRight().SetValue(1); + ws.Cell("A2").SetValue(3).CellRight().SetValue(4).CellRight().SetValue(-1); + ws.Cell("A3").SetValue(0).CellRight().SetValue(2).CellRight().SetValue(0); + + + Object actual; + + ws.Cell("A5").FormulaA1 = "MInverse(A1:C3)"; + actual = ws.Cell("A5").Value; + + Assert.IsTrue(XLHelper.AreEqual(0.25, (double) actual)); + + ws.Cell("A6").FormulaA1 = "Sum(A5)"; + actual = ws.Cell("A6").Value; + + Assert.IsTrue(XLHelper.AreEqual(0.25, (double) actual)); + + ws.Cell("A7").FormulaA1 = "Sum(MInverse(A1:C3))"; + actual = ws.Cell("A7").Value; + + Assert.IsTrue(XLHelper.AreEqual(0.5, (double) actual)); + } + + [Test] + public void MMult() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Cell("A1").SetValue(2).CellRight().SetValue(4); + ws.Cell("A2").SetValue(3).CellRight().SetValue(5); + ws.Cell("A3").SetValue(2).CellRight().SetValue(4); + ws.Cell("A4").SetValue(3).CellRight().SetValue(5); + + Object actual; + + ws.Cell("A5").FormulaA1 = "MMult(A1:B2, A3:B4)"; + actual = ws.Cell("A5").Value; + + Assert.AreEqual(16.0, actual); + + ws.Cell("A6").FormulaA1 = "Sum(A5)"; + actual = ws.Cell("A6").Value; + + Assert.AreEqual(16.0, actual); + + ws.Cell("A7").FormulaA1 = "Sum(MMult(A1:B2, A3:B4))"; + actual = ws.Cell("A7").Value; + + Assert.AreEqual(102.0, actual); + } + + [Test] + public void MRound() + { + object actual = XLWorkbook.EvaluateExpr("MRound(10, 3)"); + Assert.AreEqual(9m, actual); + + object actual3 = XLWorkbook.EvaluateExpr("MRound(10.5, 3)"); + Assert.AreEqual(12m, actual3); + + object actual4 = XLWorkbook.EvaluateExpr("MRound(10.4, 3)"); + Assert.AreEqual(9m, actual4); + + object actual1 = XLWorkbook.EvaluateExpr("MRound(-10, -3)"); + Assert.AreEqual(-9m, actual1); + + object actual2 = XLWorkbook.EvaluateExpr("MRound(1.3, 0.2)"); + Assert.AreEqual(1.4m, actual2); + } + + [Test] + public void Mod() + { + object actual = XLWorkbook.EvaluateExpr("Mod(3, 2)"); + Assert.AreEqual(1, actual); + + object actual1 = XLWorkbook.EvaluateExpr("Mod(-3, 2)"); + Assert.AreEqual(1, actual1); + + object actual2 = XLWorkbook.EvaluateExpr("Mod(3, -2)"); + Assert.AreEqual(-1, actual2); + + object actual3 = XLWorkbook.EvaluateExpr("Mod(-3, -2)"); + Assert.AreEqual(-1, actual3); + } + + [Test] + public void Multinomial() + { + object actual = XLWorkbook.EvaluateExpr("Multinomial(2,3,4)"); + Assert.AreEqual(1260.0, actual); + } + + [Test] + public void Odd() + { + object actual = XLWorkbook.EvaluateExpr("Odd(1.5)"); + Assert.AreEqual(3, actual); + + object actual1 = XLWorkbook.EvaluateExpr("Odd(3)"); + Assert.AreEqual(3, actual1); + + object actual2 = XLWorkbook.EvaluateExpr("Odd(2)"); + Assert.AreEqual(3, actual2); + + object actual3 = XLWorkbook.EvaluateExpr("Odd(-1)"); + Assert.AreEqual(-1, actual3); + + object actual4 = XLWorkbook.EvaluateExpr("Odd(-2)"); + Assert.AreEqual(-3, actual4); + + actual = XLWorkbook.EvaluateExpr("Odd(0)"); + Assert.AreEqual(1, actual); + } + + [Test] + public void Product() + { + object actual = XLWorkbook.EvaluateExpr("Product(2,3,4)"); + Assert.AreEqual(24.0, actual); + } + + [Test] + public void Quotient() + { + object actual = XLWorkbook.EvaluateExpr("Quotient(5,2)"); + Assert.AreEqual(2, actual); + + actual = XLWorkbook.EvaluateExpr("Quotient(4.5,3.1)"); + Assert.AreEqual(1, actual); + + actual = XLWorkbook.EvaluateExpr("Quotient(-10,3)"); + Assert.AreEqual(-3, actual); + } + + [Test] + public void Radians() + { + object actual = XLWorkbook.EvaluateExpr("Radians(270)"); + Assert.IsTrue(Math.Abs(4.71238898038469 - (double) actual) < XLHelper.Epsilon); + } + + [Test] + public void Roman() + { + object actual = XLWorkbook.EvaluateExpr("Roman(3046, 1)"); + Assert.AreEqual("MMMXLVI", actual); + + actual = XLWorkbook.EvaluateExpr("Roman(270)"); + Assert.AreEqual("CCLXX", actual); + + actual = XLWorkbook.EvaluateExpr("Roman(3999, true)"); + Assert.AreEqual("MMMCMXCIX", actual); + } + + [Test] + public void Round() + { + object actual = XLWorkbook.EvaluateExpr("Round(2.15, 1)"); + Assert.AreEqual(2.2, actual); + + actual = XLWorkbook.EvaluateExpr("Round(2.149, 1)"); + Assert.AreEqual(2.1, actual); + + actual = XLWorkbook.EvaluateExpr("Round(-1.475, 2)"); + Assert.AreEqual(-1.48, actual); + + actual = XLWorkbook.EvaluateExpr("Round(21.5, -1)"); + Assert.AreEqual(20.0, actual); + + actual = XLWorkbook.EvaluateExpr("Round(626.3, -3)"); + Assert.AreEqual(1000.0, actual); + + actual = XLWorkbook.EvaluateExpr("Round(1.98, -1)"); + Assert.AreEqual(0.0, actual); + + actual = XLWorkbook.EvaluateExpr("Round(-50.55, -2)"); + Assert.AreEqual(-100.0, actual); + + actual = XLWorkbook.EvaluateExpr("ROUND(59 * 0.535, 2)"); // (59 * 0.535) = 31.565 + Assert.AreEqual(31.57, actual); + + actual = XLWorkbook.EvaluateExpr("ROUND(59 * -0.535, 2)"); // (59 * -0.535) = -31.565 + Assert.AreEqual(-31.57, actual); + } + + [Test] + public void RoundDown() + { + object actual = XLWorkbook.EvaluateExpr("RoundDown(3.2, 0)"); + Assert.AreEqual(3.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundDown(76.9, 0)"); + Assert.AreEqual(76.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundDown(3.14159, 3)"); + Assert.AreEqual(3.141, actual); + + actual = XLWorkbook.EvaluateExpr("RoundDown(-3.14159, 1)"); + Assert.AreEqual(-3.1, actual); + + actual = XLWorkbook.EvaluateExpr("RoundDown(31415.92654, -2)"); + Assert.AreEqual(31400.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundDown(0, 3)"); + Assert.AreEqual(0.0, actual); + } + + [Test] + public void RoundUp() + { + object actual = XLWorkbook.EvaluateExpr("RoundUp(3.2, 0)"); + Assert.AreEqual(4.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundUp(76.9, 0)"); + Assert.AreEqual(77.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundUp(3.14159, 3)"); + Assert.AreEqual(3.142, actual); + + actual = XLWorkbook.EvaluateExpr("RoundUp(-3.14159, 1)"); + Assert.AreEqual(-3.2, actual); + + actual = XLWorkbook.EvaluateExpr("RoundUp(31415.92654, -2)"); + Assert.AreEqual(31500.0, actual); + + actual = XLWorkbook.EvaluateExpr("RoundUp(0, 3)"); + Assert.AreEqual(0.0, actual); + } + + [Test] + public void SeriesSum() + { + object actual = XLWorkbook.EvaluateExpr("SERIESSUM(2,3,4,5)"); + Assert.AreEqual(40.0, actual); + + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A2").FormulaA1 = "PI()/4"; + ws.Cell("A3").Value = 1; + ws.Cell("A4").FormulaA1 = "-1/FACT(2)"; + ws.Cell("A5").FormulaA1 = "1/FACT(4)"; + ws.Cell("A6").FormulaA1 = "-1/FACT(6)"; + + actual = ws.Evaluate("SERIESSUM(A2,0,2,A3:A6)"); + Assert.IsTrue(Math.Abs(0.70710321482284566 - (double) actual) < XLHelper.Epsilon); + } + + [Test] + public void SqrtPi() + { + object actual = XLWorkbook.EvaluateExpr("SqrtPi(1)"); + Assert.IsTrue(Math.Abs(1.7724538509055159 - (double) actual) < XLHelper.Epsilon); + + actual = XLWorkbook.EvaluateExpr("SqrtPi(2)"); + Assert.IsTrue(Math.Abs(2.5066282746310002 - (double) actual) < XLHelper.Epsilon); + } + + [Test] + public void SubtotalAverage() + { + object actual = XLWorkbook.EvaluateExpr("Subtotal(1,2,3)"); + Assert.AreEqual(2.5, actual); + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(1,""A"",3, 2)"); + Assert.AreEqual(2.5, actual); + } + + [Test] + public void SubtotalCount() + { + object actual = XLWorkbook.EvaluateExpr("Subtotal(2,2,3)"); + Assert.AreEqual(2, actual); + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(2,""A"",3)"); + Assert.AreEqual(1, actual); + } + + [Test] + public void SubtotalCountA() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr("Subtotal(3,2,3)"); + Assert.AreEqual(2.0, actual); + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(3,"""",3)"); + Assert.AreEqual(1.0, actual); + } + + [Test] + public void SubtotalMax() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(4,2,3,""A"")"); + Assert.AreEqual(3.0, actual); + } + + [Test] + public void SubtotalMin() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(5,2,3,""A"")"); + Assert.AreEqual(2.0, actual); + } + + [Test] + public void SubtotalProduct() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(6,2,3,""A"")"); + Assert.AreEqual(6.0, actual); + } + + [Test] + public void SubtotalStDev() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(7,2,3,""A"")"); + Assert.IsTrue(Math.Abs(0.70710678118654757 - (double) actual) < XLHelper.Epsilon); + } + + [Test] + public void SubtotalStDevP() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(8,2,3,""A"")"); + Assert.AreEqual(0.5, actual); + } + + [Test] + public void SubtotalSum() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(9,2,3,""A"")"); + Assert.AreEqual(5.0, actual); + } + + [Test] + public void SubtotalVar() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(10,2,3,""A"")"); + Assert.IsTrue(Math.Abs(0.5 - (double) actual) < XLHelper.Epsilon); + } + + [Test] + public void SubtotalVarP() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"Subtotal(11,2,3,""A"")"); + Assert.AreEqual(0.25, actual); + } + + [Test] + public void Sum() + { + IXLCell cell = new XLWorkbook().AddWorksheet("Sheet1").FirstCell(); + IXLCell fCell = cell.SetValue(1).CellBelow().SetValue(2).CellBelow(); + fCell.FormulaA1 = "sum(A1:A2)"; + + Assert.AreEqual(3.0, fCell.Value); + } + + [Test] + public void SumSq() + { + Object actual; + + actual = XLWorkbook.EvaluateExpr(@"SumSq(3,4)"); + Assert.AreEqual(25.0, actual); + } + + [Test] + public void TextConcat() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = 1; + ws.Cell("A2").Value = 1; + ws.Cell("B1").Value = 1; + ws.Cell("B2").Value = 1; + + ws.Cell("C1").FormulaA1 = "\"The total value is: \" & SUM(A1:B2)"; + + object r = ws.Cell("C1").Value; + Assert.AreEqual("The total value is: 4", r.ToString()); + } + + [Test] + public void Trim() + { + Assert.AreEqual("Test", XLWorkbook.EvaluateExpr("Trim(\"Test \")")); + + //Should not trim non breaking space + //See http://office.microsoft.com/en-us/excel-help/trim-function-HP010062581.aspx + Assert.AreEqual("Test\u00A0", XLWorkbook.EvaluateExpr("Trim(\"Test\u00A0 \")")); + } + + [Test] + public void TestEmptyTallyOperations() + { + //In these test no values have been set + XLWorkbook wb = new XLWorkbook(); + wb.Worksheets.Add("TallyTests"); + var cell = wb.Worksheet(1).Cell(1, 1).SetFormulaA1("=MAX(D1,D2)"); + Assert.AreEqual(0, cell.Value); + cell = wb.Worksheet(1).Cell(2, 1).SetFormulaA1("=MIN(D1,D2)"); + Assert.AreEqual(0, cell.Value); + cell = wb.Worksheet(1).Cell(3, 1).SetFormulaA1("=SUM(D1,D2)"); + Assert.AreEqual(0, cell.Value); + Assert.That(() => wb.Worksheet(1).Cell(3, 1).SetFormulaA1("=AVERAGE(D1,D2)").Value, Throws.Exception); + } + + [Test] + public void TestOmittedParameters() + { + using (var wb = new XLWorkbook()) + { + object value; + value = wb.Evaluate("=IF(TRUE,1)"); + Assert.AreEqual(1, value); + + value = wb.Evaluate("=IF(TRUE,1,)"); + Assert.AreEqual(1, value); + + value = wb.Evaluate("=IF(FALSE,1,)"); + Assert.AreEqual(false, value); + + value = wb.Evaluate("=IF(FALSE,,2)"); + Assert.AreEqual(2, value); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs b/ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs index 351ad70..93ad203 100644 --- a/ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs +++ b/ClosedXML_Tests/Excel/CalcEngine/InformationTests.cs @@ -1,4 +1,4 @@ -using ClosedXML.Excel; +using ClosedXML.Excel; using NUnit.Framework; using System; using System.Globalization; diff --git a/ClosedXML_Tests/Excel/CalcEngine/LogicalTests.cs b/ClosedXML_Tests/Excel/CalcEngine/LogicalTests.cs index a78ce97..9eab1f8 100644 --- a/ClosedXML_Tests/Excel/CalcEngine/LogicalTests.cs +++ b/ClosedXML_Tests/Excel/CalcEngine/LogicalTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using ClosedXML.Excel; using NUnit.Framework; diff --git a/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs b/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs index babfab0..a112f3d 100644 --- a/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs +++ b/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs @@ -1,4 +1,4 @@ -using ClosedXML.Excel; +using ClosedXML.Excel; using NUnit.Framework; using System; diff --git a/ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs b/ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs index 9285cb4..c59e34d 100644 --- a/ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs +++ b/ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs @@ -1,4 +1,4 @@ -using ClosedXML.Excel; +using ClosedXML.Excel; using NUnit.Framework; using System; using System.Linq; diff --git a/ClosedXML_Tests/Excel/CalcEngine/TextTests.cs b/ClosedXML_Tests/Excel/CalcEngine/TextTests.cs index b5a940e..3a89de2 100644 --- a/ClosedXML_Tests/Excel/CalcEngine/TextTests.cs +++ b/ClosedXML_Tests/Excel/CalcEngine/TextTests.cs @@ -1,4 +1,4 @@ -using ClosedXML.Excel; +using ClosedXML.Excel; using NUnit.Framework; using System; using System.Globalization; diff --git a/ClosedXML_Tests/Excel/CalcEngine/XLMathTests.cs b/ClosedXML_Tests/Excel/CalcEngine/XLMathTests.cs index aaade5c..5ce2ce5 100644 --- a/ClosedXML_Tests/Excel/CalcEngine/XLMathTests.cs +++ b/ClosedXML_Tests/Excel/CalcEngine/XLMathTests.cs @@ -1,26 +1,26 @@ -using ClosedXML.Excel.CalcEngine.Functions; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel.CalcEngine -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class XLMathTests - { - [Test] - public void IsEven() - { - Assert.IsTrue(XLMath.IsEven(2)); - Assert.IsFalse(XLMath.IsEven(3)); - } - - [Test] - public void IsOdd() - { - Assert.IsTrue(XLMath.IsOdd(3)); - Assert.IsFalse(XLMath.IsOdd(2)); - } - } +using ClosedXML.Excel.CalcEngine.Functions; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.CalcEngine +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class XLMathTests + { + [Test] + public void IsEven() + { + Assert.IsTrue(XLMath.IsEven(2)); + Assert.IsFalse(XLMath.IsEven(3)); + } + + [Test] + public void IsOdd() + { + Assert.IsTrue(XLMath.IsOdd(3)); + Assert.IsFalse(XLMath.IsOdd(2)); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs index d6824df..f4ed9eb 100644 --- a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs +++ b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs @@ -1,392 +1,392 @@ -using ClosedXML.Excel; -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Threading; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class XLCellTests - { - [Test] - public void CellsUsed() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - ws.Cell(1, 1); - ws.Cell(2, 2); - int count = ws.Range("A1:B2").CellsUsed().Count(); - Assert.AreEqual(0, count); - } - - [Test] - public void CellsUsedIncludeStyles1() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - ws.Row(3).Style.Fill.BackgroundColor = XLColor.Red; - ws.Column(3).Style.Fill.BackgroundColor = XLColor.Red; - ws.Cell(2, 2).Value = "ASDF"; - var range = ws.RangeUsed(true).RangeAddress.ToString(); - Assert.AreEqual("B2:C3", range); - } - - [Test] - public void CellsUsedIncludeStyles2() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - ws.Row(2).Style.Fill.BackgroundColor = XLColor.Red; - ws.Column(2).Style.Fill.BackgroundColor = XLColor.Red; - ws.Cell(3, 3).Value = "ASDF"; - var range = ws.RangeUsed(true).RangeAddress.ToString(); - Assert.AreEqual("B2:C3", range); - } - - [Test] - public void CellsUsedIncludeStyles3() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - var range = ws.RangeUsed(true); - Assert.AreEqual(null, range); - } - - [Test] - public void Double_Infinity_is_a_string() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell("A1"); - var doubleList = new List { 1.0 / 0.0 }; - - cell.Value = doubleList.AsEnumerable(); - Assert.AreNotEqual(XLCellValues.Number, cell.DataType); - } - - [Test] - public void Double_NaN_is_a_string() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell("A1"); - var doubleList = new List { 0.0 / 0.0 }; - - cell.Value = doubleList.AsEnumerable(); - Assert.AreNotEqual(XLCellValues.Number, cell.DataType); - } - - [Test] - public void InsertData1() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRange range = ws.Cell(2, 2).InsertData(new[] { "a", "b", "c" }); - Assert.AreEqual("'Sheet1'!B2:B4", range.ToString()); - } - - [Test] - public void IsEmpty1() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - bool actual = cell.IsEmpty(); - bool expected = true; - Assert.AreEqual(expected, actual); - } - - [Test] - public void IsEmpty2() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - bool actual = cell.IsEmpty(true); - bool expected = true; - Assert.AreEqual(expected, actual); - } - - [Test] - public void IsEmpty3() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.Style.Fill.BackgroundColor = XLColor.Red; - bool actual = cell.IsEmpty(); - bool expected = true; - Assert.AreEqual(expected, actual); - } - - [Test] - public void IsEmpty4() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.Style.Fill.BackgroundColor = XLColor.Red; - bool actual = cell.IsEmpty(false); - bool expected = true; - Assert.AreEqual(expected, actual); - } - - [Test] - public void IsEmpty5() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.Style.Fill.BackgroundColor = XLColor.Red; - bool actual = cell.IsEmpty(true); - bool expected = false; - Assert.AreEqual(expected, actual); - } - - [Test] - public void IsEmpty6() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.Value = "X"; - bool actual = cell.IsEmpty(); - bool expected = false; - Assert.AreEqual(expected, actual); - } - - [Test] - public void NaN_is_not_a_number() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell("A1"); - cell.Value = "NaN"; - - Assert.AreNotEqual(XLCellValues.Number, cell.DataType); - } - - [Test] - public void Nan_is_not_a_number() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell("A1"); - cell.Value = "Nan"; - - Assert.AreNotEqual(XLCellValues.Number, cell.DataType); - } - - [Test] - public void TryGetValue_Boolean_Bad() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - Boolean outValue; - IXLCell cell = ws.Cell("A1").SetValue("ABC"); - bool success = cell.TryGetValue(out outValue); - Assert.IsFalse(success); - } - - [Test] - public void TryGetValue_Boolean_False() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - Boolean outValue; - IXLCell cell = ws.Cell("A1").SetValue(false); - bool success = cell.TryGetValue(out outValue); - Assert.IsTrue(success); - Assert.IsFalse(outValue); - } - - [Test] - public void TryGetValue_Boolean_Good() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - Boolean outValue; - IXLCell cell = ws.Cell("A1").SetValue("True"); - bool success = cell.TryGetValue(out outValue); - Assert.IsTrue(success); - Assert.IsTrue(outValue); - } - - [Test] - public void TryGetValue_Boolean_True() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - Boolean outValue; - IXLCell cell = ws.Cell("A1").SetValue(true); - bool success = cell.TryGetValue(out outValue); - Assert.IsTrue(success); - Assert.IsTrue(outValue); - } - - [Test] - public void TryGetValue_DateTime_BadString() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - DateTime outValue; - var date = "ABC"; - bool success = ws.Cell("A1").SetValue(date).TryGetValue(out outValue); - Assert.IsFalse(success); - } - - - [Test] - public void TryGetValue_DateTime_BadString2() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - DateTime outValue; - var date = 5545454; - ws.FirstCell().SetValue(date).DataType = XLCellValues.DateTime; - bool success = ws.FirstCell().TryGetValue(out outValue); - Assert.IsFalse(success); - } - - [Test] - public void TryGetValue_RichText_Bad() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText outValue; - IXLCell cell = ws.Cell("A1").SetValue("Anything"); - bool success = cell.TryGetValue(out outValue); - Assert.IsTrue(success); - Assert.AreEqual(cell.RichText, outValue); - Assert.AreEqual("Anything", outValue.ToString()); - } - - [Test] - public void TryGetValue_RichText_Good() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText outValue; - IXLCell cell = ws.Cell("A1"); - cell.RichText.AddText("Anything"); - bool success = cell.TryGetValue(out outValue); - Assert.IsTrue(success); - Assert.AreEqual(cell.RichText, outValue); - } - - [Test] - public void TryGetValue_TimeSpan_BadString() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - TimeSpan outValue; - string timeSpan = "ABC"; - bool success = ws.Cell("A1").SetValue(timeSpan).TryGetValue(out outValue); - Assert.IsFalse(success); - } - - [Test] - public void TryGetValue_TimeSpan_Good() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - TimeSpan outValue; - var timeSpan = new TimeSpan(1, 1, 1); - bool success = ws.Cell("A1").SetValue(timeSpan).TryGetValue(out outValue); - Assert.IsTrue(success); - Assert.AreEqual(timeSpan, outValue); - } - - [Test] - public void TryGetValue_TimeSpan_GoodString() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - TimeSpan outValue; - var timeSpan = new TimeSpan(1, 1, 1); - bool success = ws.Cell("A1").SetValue(timeSpan.ToString()).TryGetValue(out outValue); - Assert.IsTrue(success); - Assert.AreEqual(timeSpan, outValue); - } - - [Test] - public void TryGetValue_sbyte_Bad() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - sbyte outValue; - IXLCell cell = ws.Cell("A1").SetValue(255); - bool success = cell.TryGetValue(out outValue); - Assert.IsFalse(success); - } - - [Test] - public void TryGetValue_sbyte_Bad2() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - sbyte outValue; - IXLCell cell = ws.Cell("A1").SetValue("255"); - bool success = cell.TryGetValue(out outValue); - Assert.IsFalse(success); - } - - [Test] - public void TryGetValue_sbyte_Good() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - sbyte outValue; - IXLCell cell = ws.Cell("A1").SetValue(5); - bool success = cell.TryGetValue(out outValue); - Assert.IsTrue(success); - Assert.AreEqual(5, outValue); - } - - [Test] - public void TryGetValue_sbyte_Good2() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - sbyte outValue; - IXLCell cell = ws.Cell("A1").SetValue("5"); - bool success = cell.TryGetValue(out outValue); - Assert.IsTrue(success); - Assert.AreEqual(5, outValue); - } - - [Test] - public void ValueSetToEmptyString() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.Value = new DateTime(2000, 1, 2); - cell.Value = String.Empty; - string actual = cell.GetString(); - string expected = String.Empty; - Assert.AreEqual(expected, actual); - } - - [Test] - public void ValueSetToNull() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.Value = new DateTime(2000, 1, 2); - cell.Value = null; - string actual = cell.GetString(); - string expected = String.Empty; - Assert.AreEqual(expected, actual); - } - - [Test] - public void ValueSetDateWithShortUserDateFormat() - { - // For this test to make sense, user's local date format should be dd/MM/yy (note without the 2 century digits) - // What happened previously was that the century digits got lost in .ToString() conversion and wrong century was sometimes returned. - var ci = new CultureInfo(CultureInfo.InvariantCulture.LCID); - ci.DateTimeFormat.ShortDatePattern = "dd/MM/yy"; - Thread.CurrentThread.CurrentCulture = ci; - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - var expected = DateTime.Today.AddYears(20); - cell.Value = expected; - var actual = (DateTime)cell.Value; - Assert.AreEqual(expected, actual); - } - - [Test] - public void TestInvalidXmlCharacters() - { - byte[] data; - - using (var stream = new MemoryStream()) - { - var wb = new XLWorkbook(); - wb.AddWorksheet("Sheet1").FirstCell().SetValue("\u0018"); - wb.SaveAs(stream); - data = stream.ToArray(); - } - - using (var stream = new MemoryStream(data)) - { - var wb = new XLWorkbook(stream); - Assert.AreEqual("\u0018", wb.Worksheets.First().FirstCell().Value); - } - } - } -} +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLCellTests + { + [Test] + public void CellsUsed() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Cell(1, 1); + ws.Cell(2, 2); + int count = ws.Range("A1:B2").CellsUsed().Count(); + Assert.AreEqual(0, count); + } + + [Test] + public void CellsUsedIncludeStyles1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Row(3).Style.Fill.BackgroundColor = XLColor.Red; + ws.Column(3).Style.Fill.BackgroundColor = XLColor.Red; + ws.Cell(2, 2).Value = "ASDF"; + var range = ws.RangeUsed(true).RangeAddress.ToString(); + Assert.AreEqual("B2:C3", range); + } + + [Test] + public void CellsUsedIncludeStyles2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Row(2).Style.Fill.BackgroundColor = XLColor.Red; + ws.Column(2).Style.Fill.BackgroundColor = XLColor.Red; + ws.Cell(3, 3).Value = "ASDF"; + var range = ws.RangeUsed(true).RangeAddress.ToString(); + Assert.AreEqual("B2:C3", range); + } + + [Test] + public void CellsUsedIncludeStyles3() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + var range = ws.RangeUsed(true); + Assert.AreEqual(null, range); + } + + [Test] + public void Double_Infinity_is_a_string() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1"); + var doubleList = new List { 1.0 / 0.0 }; + + cell.Value = doubleList.AsEnumerable(); + Assert.AreNotEqual(XLCellValues.Number, cell.DataType); + } + + [Test] + public void Double_NaN_is_a_string() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1"); + var doubleList = new List { 0.0 / 0.0 }; + + cell.Value = doubleList.AsEnumerable(); + Assert.AreNotEqual(XLCellValues.Number, cell.DataType); + } + + [Test] + public void InsertData1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRange range = ws.Cell(2, 2).InsertData(new[] { "a", "b", "c" }); + Assert.AreEqual("'Sheet1'!B2:B4", range.ToString()); + } + + [Test] + public void IsEmpty1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + bool actual = cell.IsEmpty(); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + bool actual = cell.IsEmpty(true); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty3() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + bool actual = cell.IsEmpty(); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty4() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + bool actual = cell.IsEmpty(false); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty5() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + bool actual = cell.IsEmpty(true); + bool expected = false; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty6() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Value = "X"; + bool actual = cell.IsEmpty(); + bool expected = false; + Assert.AreEqual(expected, actual); + } + + [Test] + public void NaN_is_not_a_number() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1"); + cell.Value = "NaN"; + + Assert.AreNotEqual(XLCellValues.Number, cell.DataType); + } + + [Test] + public void Nan_is_not_a_number() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell("A1"); + cell.Value = "Nan"; + + Assert.AreNotEqual(XLCellValues.Number, cell.DataType); + } + + [Test] + public void TryGetValue_Boolean_Bad() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + Boolean outValue; + IXLCell cell = ws.Cell("A1").SetValue("ABC"); + bool success = cell.TryGetValue(out outValue); + Assert.IsFalse(success); + } + + [Test] + public void TryGetValue_Boolean_False() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + Boolean outValue; + IXLCell cell = ws.Cell("A1").SetValue(false); + bool success = cell.TryGetValue(out outValue); + Assert.IsTrue(success); + Assert.IsFalse(outValue); + } + + [Test] + public void TryGetValue_Boolean_Good() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + Boolean outValue; + IXLCell cell = ws.Cell("A1").SetValue("True"); + bool success = cell.TryGetValue(out outValue); + Assert.IsTrue(success); + Assert.IsTrue(outValue); + } + + [Test] + public void TryGetValue_Boolean_True() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + Boolean outValue; + IXLCell cell = ws.Cell("A1").SetValue(true); + bool success = cell.TryGetValue(out outValue); + Assert.IsTrue(success); + Assert.IsTrue(outValue); + } + + [Test] + public void TryGetValue_DateTime_BadString() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + DateTime outValue; + var date = "ABC"; + bool success = ws.Cell("A1").SetValue(date).TryGetValue(out outValue); + Assert.IsFalse(success); + } + + + [Test] + public void TryGetValue_DateTime_BadString2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + DateTime outValue; + var date = 5545454; + ws.FirstCell().SetValue(date).DataType = XLCellValues.DateTime; + bool success = ws.FirstCell().TryGetValue(out outValue); + Assert.IsFalse(success); + } + + [Test] + public void TryGetValue_RichText_Bad() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText outValue; + IXLCell cell = ws.Cell("A1").SetValue("Anything"); + bool success = cell.TryGetValue(out outValue); + Assert.IsTrue(success); + Assert.AreEqual(cell.RichText, outValue); + Assert.AreEqual("Anything", outValue.ToString()); + } + + [Test] + public void TryGetValue_RichText_Good() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText outValue; + IXLCell cell = ws.Cell("A1"); + cell.RichText.AddText("Anything"); + bool success = cell.TryGetValue(out outValue); + Assert.IsTrue(success); + Assert.AreEqual(cell.RichText, outValue); + } + + [Test] + public void TryGetValue_TimeSpan_BadString() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + TimeSpan outValue; + string timeSpan = "ABC"; + bool success = ws.Cell("A1").SetValue(timeSpan).TryGetValue(out outValue); + Assert.IsFalse(success); + } + + [Test] + public void TryGetValue_TimeSpan_Good() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + TimeSpan outValue; + var timeSpan = new TimeSpan(1, 1, 1); + bool success = ws.Cell("A1").SetValue(timeSpan).TryGetValue(out outValue); + Assert.IsTrue(success); + Assert.AreEqual(timeSpan, outValue); + } + + [Test] + public void TryGetValue_TimeSpan_GoodString() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + TimeSpan outValue; + var timeSpan = new TimeSpan(1, 1, 1); + bool success = ws.Cell("A1").SetValue(timeSpan.ToString()).TryGetValue(out outValue); + Assert.IsTrue(success); + Assert.AreEqual(timeSpan, outValue); + } + + [Test] + public void TryGetValue_sbyte_Bad() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + sbyte outValue; + IXLCell cell = ws.Cell("A1").SetValue(255); + bool success = cell.TryGetValue(out outValue); + Assert.IsFalse(success); + } + + [Test] + public void TryGetValue_sbyte_Bad2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + sbyte outValue; + IXLCell cell = ws.Cell("A1").SetValue("255"); + bool success = cell.TryGetValue(out outValue); + Assert.IsFalse(success); + } + + [Test] + public void TryGetValue_sbyte_Good() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + sbyte outValue; + IXLCell cell = ws.Cell("A1").SetValue(5); + bool success = cell.TryGetValue(out outValue); + Assert.IsTrue(success); + Assert.AreEqual(5, outValue); + } + + [Test] + public void TryGetValue_sbyte_Good2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + sbyte outValue; + IXLCell cell = ws.Cell("A1").SetValue("5"); + bool success = cell.TryGetValue(out outValue); + Assert.IsTrue(success); + Assert.AreEqual(5, outValue); + } + + [Test] + public void ValueSetToEmptyString() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Value = new DateTime(2000, 1, 2); + cell.Value = String.Empty; + string actual = cell.GetString(); + string expected = String.Empty; + Assert.AreEqual(expected, actual); + } + + [Test] + public void ValueSetToNull() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Value = new DateTime(2000, 1, 2); + cell.Value = null; + string actual = cell.GetString(); + string expected = String.Empty; + Assert.AreEqual(expected, actual); + } + + [Test] + public void ValueSetDateWithShortUserDateFormat() + { + // For this test to make sense, user's local date format should be dd/MM/yy (note without the 2 century digits) + // What happened previously was that the century digits got lost in .ToString() conversion and wrong century was sometimes returned. + var ci = new CultureInfo(CultureInfo.InvariantCulture.LCID); + ci.DateTimeFormat.ShortDatePattern = "dd/MM/yy"; + Thread.CurrentThread.CurrentCulture = ci; + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + var expected = DateTime.Today.AddYears(20); + cell.Value = expected; + var actual = (DateTime)cell.Value; + Assert.AreEqual(expected, actual); + } + + [Test] + public void TestInvalidXmlCharacters() + { + byte[] data; + + using (var stream = new MemoryStream()) + { + var wb = new XLWorkbook(); + wb.AddWorksheet("Sheet1").FirstCell().SetValue("\u0018"); + wb.SaveAs(stream); + data = stream.ToArray(); + } + + using (var stream = new MemoryStream(data)) + { + var wb = new XLWorkbook(stream); + Assert.AreEqual("\u0018", wb.Worksheets.First().FirstCell().Value); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Columns/ColumnTests.cs b/ClosedXML_Tests/Excel/Columns/ColumnTests.cs index 4297a99..8505bb7 100644 --- a/ClosedXML_Tests/Excel/Columns/ColumnTests.cs +++ b/ClosedXML_Tests/Excel/Columns/ColumnTests.cs @@ -1,240 +1,240 @@ -using System; -using System.IO; -using System.Linq; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class ColumnTests - { - [Test] - public void ColumnUsed() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(2, 1).SetValue("Test"); - ws.Cell(3, 1).SetValue("Test"); - - IXLRangeColumn fromColumn = ws.Column(1).ColumnUsed(); - Assert.AreEqual("A2:A3", fromColumn.RangeAddress.ToStringRelative()); - - IXLRangeColumn fromRange = ws.Range("A1:A5").FirstColumn().ColumnUsed(); - Assert.AreEqual("A2:A3", fromRange.RangeAddress.ToStringRelative()); - } - - [Test] - public void CopyColumn() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Test").Style.Font.SetBold(); - ws.FirstColumn().CopyTo(ws.Column(2)); - - Assert.IsTrue(ws.Cell("B1").Style.Font.Bold); - } - - [Test] - public void InsertingColumnsBefore1() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - - ws.Columns("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); - ws.Column(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); - ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); - - IXLColumn column1 = ws.Column(1); - IXLColumn column2 = ws.Column(2); - IXLColumn column3 = ws.Column(3); - - IXLColumn columnIns = ws.Column(1).InsertColumnsBefore(1).First(); - - Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, ws.Column(3).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", ws.Column(3).Cell(2).GetString()); - - - Assert.AreEqual(ws.Style.Fill.BackgroundColor, columnIns.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(ws.Style.Fill.BackgroundColor, columnIns.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(ws.Style.Fill.BackgroundColor, columnIns.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, column1.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column1.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column1.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, column2.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, column2.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, column2.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column3.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column3.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", column2.Cell(2).GetString()); - } - - [Test] - public void InsertingColumnsBefore2() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - - ws.Columns("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); - ws.Column(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); - ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); - - IXLColumn column1 = ws.Column(1); - IXLColumn column2 = ws.Column(2); - IXLColumn column3 = ws.Column(3); - - IXLColumn columnIns = ws.Column(2).InsertColumnsBefore(1).First(); - string outputPath = Path.Combine(TestHelper.TestsOutputDirectory, "ForTesting", "Sandbox.xlsx"); - wb.SaveAs(outputPath, true); - - Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, ws.Column(3).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", ws.Column(3).Cell(2).GetString()); - - - Assert.AreEqual(XLColor.Red, columnIns.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, columnIns.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, columnIns.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, column1.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column1.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column1.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, column2.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, column2.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, column2.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column3.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column3.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", column2.Cell(2).GetString()); - } - - [Test] - public void InsertingColumnsBefore3() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - - ws.Columns("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); - ws.Column(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); - ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); - - IXLColumn column1 = ws.Column(1); - IXLColumn column2 = ws.Column(2); - IXLColumn column3 = ws.Column(3); - - IXLColumn columnIns = ws.Column(3).InsertColumnsBefore(1).First(); - - Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, ws.Column(2).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, ws.Column(2).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, ws.Column(2).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, ws.Column(3).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", ws.Column(2).Cell(2).GetString()); - - - Assert.AreEqual(XLColor.Yellow, columnIns.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, columnIns.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, columnIns.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, column1.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column1.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column1.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, column2.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, column2.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, column2.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column3.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, column3.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", column2.Cell(2).GetString()); - } - - [Test] - public void NoColumnsUsed() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - Int32 count = 0; - - foreach (IXLColumn row in ws.ColumnsUsed()) - count++; - - foreach (IXLRangeColumn row in ws.Range("A1:C3").ColumnsUsed()) - count++; - - Assert.AreEqual(0, count); - } - - [Test] - public void UngroupFromAll() - { - IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); - ws.Columns(1, 2).Group(); - ws.Columns(1, 2).Ungroup(true); - } - - [Test] - public void LastColumnUsed() - { - IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); - ws.Cell("A1").Value = "A1"; - ws.Cell("B1").Value = "B1"; - ws.Cell("A2").Value = "A2"; - var lastCoUsed = ws.LastColumnUsed().ColumnNumber(); - Assert.AreEqual(2, lastCoUsed); - } - } -} +using System; +using System.IO; +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class ColumnTests + { + [Test] + public void ColumnUsed() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(2, 1).SetValue("Test"); + ws.Cell(3, 1).SetValue("Test"); + + IXLRangeColumn fromColumn = ws.Column(1).ColumnUsed(); + Assert.AreEqual("A2:A3", fromColumn.RangeAddress.ToStringRelative()); + + IXLRangeColumn fromRange = ws.Range("A1:A5").FirstColumn().ColumnUsed(); + Assert.AreEqual("A2:A3", fromRange.RangeAddress.ToStringRelative()); + } + + [Test] + public void CopyColumn() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Test").Style.Font.SetBold(); + ws.FirstColumn().CopyTo(ws.Column(2)); + + Assert.IsTrue(ws.Cell("B1").Style.Font.Bold); + } + + [Test] + public void InsertingColumnsBefore1() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Columns("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Column(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLColumn column1 = ws.Column(1); + IXLColumn column2 = ws.Column(2); + IXLColumn column3 = ws.Column(3); + + IXLColumn columnIns = ws.Column(1).InsertColumnsBefore(1).First(); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Column(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Column(3).Cell(2).GetString()); + + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, columnIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, columnIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, columnIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, column2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, column2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, column2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", column2.Cell(2).GetString()); + } + + [Test] + public void InsertingColumnsBefore2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Columns("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Column(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLColumn column1 = ws.Column(1); + IXLColumn column2 = ws.Column(2); + IXLColumn column3 = ws.Column(3); + + IXLColumn columnIns = ws.Column(2).InsertColumnsBefore(1).First(); + string outputPath = Path.Combine(TestHelper.TestsOutputDirectory, "ForTesting", "Sandbox.xlsx"); + wb.SaveAs(outputPath, true); + + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Column(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Column(3).Cell(2).GetString()); + + + Assert.AreEqual(XLColor.Red, columnIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, columnIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, columnIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, column2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, column2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, column2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", column2.Cell(2).GetString()); + } + + [Test] + public void InsertingColumnsBefore3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Columns("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Column(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLColumn column1 = ws.Column(1); + IXLColumn column2 = ws.Column(2); + IXLColumn column3 = ws.Column(3); + + IXLColumn columnIns = ws.Column(3).InsertColumnsBefore(1).First(); + + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Column(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Column(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Column(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Column(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Column(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Column(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Column(2).Cell(2).GetString()); + + + Assert.AreEqual(XLColor.Yellow, columnIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, columnIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, columnIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, column2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, column2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, column2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, column3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", column2.Cell(2).GetString()); + } + + [Test] + public void NoColumnsUsed() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + Int32 count = 0; + + foreach (IXLColumn row in ws.ColumnsUsed()) + count++; + + foreach (IXLRangeColumn row in ws.Range("A1:C3").ColumnsUsed()) + count++; + + Assert.AreEqual(0, count); + } + + [Test] + public void UngroupFromAll() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Columns(1, 2).Group(); + ws.Columns(1, 2).Ungroup(true); + } + + [Test] + public void LastColumnUsed() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "A1"; + ws.Cell("B1").Value = "B1"; + ws.Cell("A2").Value = "A2"; + var lastCoUsed = ws.LastColumnUsed().ColumnNumber(); + Assert.AreEqual(2, lastCoUsed); + } + } +} diff --git a/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs b/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs index 526ae67..0c658f8 100644 --- a/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs +++ b/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs @@ -1,32 +1,32 @@ -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class XLAddressTests - { - [Test] - public void ToStringTest() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLAddress address = ws.Cell(1, 1).Address; - - Assert.AreEqual("A1", address.ToString()); - Assert.AreEqual("A1", address.ToString(XLReferenceStyle.A1)); - Assert.AreEqual("R1C1", address.ToString(XLReferenceStyle.R1C1)); - Assert.AreEqual("A1", address.ToString(XLReferenceStyle.Default)); - - Assert.AreEqual("A1", address.ToStringRelative()); - Assert.AreEqual("'Sheet1'!A1", address.ToStringRelative(true)); - - Assert.AreEqual("$A$1", address.ToStringFixed()); - Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.A1)); - Assert.AreEqual("R1C1", address.ToStringFixed(XLReferenceStyle.R1C1)); - Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.Default)); - Assert.AreEqual("'Sheet1'!$A$1", address.ToStringFixed(XLReferenceStyle.A1, true)); - Assert.AreEqual("'Sheet1'!R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true)); - Assert.AreEqual("'Sheet1'!$A$1", address.ToStringFixed(XLReferenceStyle.Default, true)); - } - } +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLAddressTests + { + [Test] + public void ToStringTest() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLAddress address = ws.Cell(1, 1).Address; + + Assert.AreEqual("A1", address.ToString()); + Assert.AreEqual("A1", address.ToString(XLReferenceStyle.A1)); + Assert.AreEqual("R1C1", address.ToString(XLReferenceStyle.R1C1)); + Assert.AreEqual("A1", address.ToString(XLReferenceStyle.Default)); + + Assert.AreEqual("A1", address.ToStringRelative()); + Assert.AreEqual("'Sheet1'!A1", address.ToStringRelative(true)); + + Assert.AreEqual("$A$1", address.ToStringFixed()); + Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("R1C1", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("$A$1", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("'Sheet1'!$A$1", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("'Sheet1'!R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + Assert.AreEqual("'Sheet1'!$A$1", address.ToStringFixed(XLReferenceStyle.Default, true)); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs b/ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs index 4a31837..a27fd8a 100644 --- a/ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs +++ b/ClosedXML_Tests/Excel/DataValidations/DataValidationTests.cs @@ -1,159 +1,159 @@ -using System.Linq; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel.DataValidations -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class DataValidationTests - { - [Test] - public void Validation_1() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Data Validation Issue"); - IXLCell cell = ws.Cell("E1"); - cell.SetValue("Value 1"); - cell = cell.CellBelow(); - cell.SetValue("Value 2"); - cell = cell.CellBelow(); - cell.SetValue("Value 3"); - cell = cell.CellBelow(); - cell.SetValue("Value 4"); - cell = cell.CellBelow(); - - ws.Cell("A1").SetValue("Cell below has Validation Only."); - cell = ws.Cell("A2"); - cell.DataValidation.List(ws.Range("$E$1:$E$4")); - - ws.Cell("B1").SetValue("Cell below has Validation with a title."); - cell = ws.Cell("B2"); - cell.DataValidation.List(ws.Range("$E$1:$E$4")); - cell.DataValidation.InputTitle = "Title for B2"; - - Assert.AreEqual(cell.DataValidation.AllowedValues, XLAllowedValues.List); - Assert.AreEqual(cell.DataValidation.Value, "'Data Validation Issue'!$E$1:$E$4"); - Assert.AreEqual(cell.DataValidation.InputTitle, "Title for B2"); - - - ws.Cell("C1").SetValue("Cell below has Validation with a message."); - cell = ws.Cell("C2"); - cell.DataValidation.List(ws.Range("$E$1:$E$4")); - cell.DataValidation.InputMessage = "Message for C2"; - - Assert.AreEqual(cell.DataValidation.AllowedValues, XLAllowedValues.List); - Assert.AreEqual(cell.DataValidation.Value, "'Data Validation Issue'!$E$1:$E$4"); - Assert.AreEqual(cell.DataValidation.InputMessage, "Message for C2"); - - ws.Cell("D1").SetValue("Cell below has Validation with title and message."); - cell = ws.Cell("D2"); - cell.DataValidation.List(ws.Range("$E$1:$E$4")); - cell.DataValidation.InputTitle = "Title for D2"; - cell.DataValidation.InputMessage = "Message for D2"; - - Assert.AreEqual(cell.DataValidation.AllowedValues, XLAllowedValues.List); - Assert.AreEqual(cell.DataValidation.Value, "'Data Validation Issue'!$E$1:$E$4"); - Assert.AreEqual(cell.DataValidation.InputTitle, "Title for D2"); - Assert.AreEqual(cell.DataValidation.InputMessage, "Message for D2"); - } - - [Test] - public void Validation_2() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell("A1").SetValue("A"); - ws.Cell("B1").SetDataValidation().Custom("Sheet1!A1"); - - IXLWorksheet ws2 = wb.AddWorksheet("Sheet2"); - ws2.Cell("A1").SetValue("B"); - ws.Cell("B1").CopyTo(ws2.Cell("B1")); - - Assert.AreEqual("Sheet1!A1", ws2.Cell("B1").DataValidation.Value); - } - - [Test] - public void Validation_3() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell("A1").SetValue("A"); - ws.Cell("B1").SetDataValidation().Custom("A1"); - ws.FirstRow().InsertRowsAbove(1); - - Assert.AreEqual("A2", ws.Cell("B2").DataValidation.Value); - } - - [Test] - public void Validation_4() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell("A1").SetValue("A"); - ws.Cell("B1").SetDataValidation().Custom("A1"); - ws.Cell("B1").CopyTo(ws.Cell("B2")); - Assert.AreEqual("A2", ws.Cell("B2").DataValidation.Value); - } - - [Test] - public void Validation_5() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell("A1").SetValue("A"); - ws.Cell("B1").SetDataValidation().Custom("A1"); - ws.FirstColumn().InsertColumnsBefore(1); - - Assert.AreEqual("B1", ws.Cell("C1").DataValidation.Value); - } - - [Test] - public void Validation_6() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell("A1").SetValue("A"); - ws.Cell("B1").SetDataValidation().Custom("A1"); - ws.Cell("B1").CopyTo(ws.Cell("C1")); - Assert.AreEqual("B1", ws.Cell("C1").DataValidation.Value); - } - - [Test] - public void Validation_persists_on_Cell_DataValidation() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("People"); - - ws.FirstCell().SetValue("Categories") - .CellBelow().SetValue("A") - .CellBelow().SetValue("B"); - - IXLTable table = ws.RangeUsed().CreateTable(); - - IXLDataValidation dv = table.DataRange.SetDataValidation(); - dv.ErrorTitle = "Error"; - - Assert.AreEqual("Error", table.DataRange.FirstCell().DataValidation.ErrorTitle); - } - - [Test] - public void Validation_persists_on_Worksheet_DataValidations() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("People"); - - ws.FirstCell().SetValue("Categories") - .CellBelow().SetValue("A"); - - IXLTable table = ws.RangeUsed().CreateTable(); - - IXLDataValidation dv = table.DataRange.SetDataValidation(); - dv.ErrorTitle = "Error"; - - Assert.AreEqual("Error", ws.DataValidations.Single().ErrorTitle); - } - } +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.DataValidations +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class DataValidationTests + { + [Test] + public void Validation_1() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Data Validation Issue"); + IXLCell cell = ws.Cell("E1"); + cell.SetValue("Value 1"); + cell = cell.CellBelow(); + cell.SetValue("Value 2"); + cell = cell.CellBelow(); + cell.SetValue("Value 3"); + cell = cell.CellBelow(); + cell.SetValue("Value 4"); + cell = cell.CellBelow(); + + ws.Cell("A1").SetValue("Cell below has Validation Only."); + cell = ws.Cell("A2"); + cell.DataValidation.List(ws.Range("$E$1:$E$4")); + + ws.Cell("B1").SetValue("Cell below has Validation with a title."); + cell = ws.Cell("B2"); + cell.DataValidation.List(ws.Range("$E$1:$E$4")); + cell.DataValidation.InputTitle = "Title for B2"; + + Assert.AreEqual(cell.DataValidation.AllowedValues, XLAllowedValues.List); + Assert.AreEqual(cell.DataValidation.Value, "'Data Validation Issue'!$E$1:$E$4"); + Assert.AreEqual(cell.DataValidation.InputTitle, "Title for B2"); + + + ws.Cell("C1").SetValue("Cell below has Validation with a message."); + cell = ws.Cell("C2"); + cell.DataValidation.List(ws.Range("$E$1:$E$4")); + cell.DataValidation.InputMessage = "Message for C2"; + + Assert.AreEqual(cell.DataValidation.AllowedValues, XLAllowedValues.List); + Assert.AreEqual(cell.DataValidation.Value, "'Data Validation Issue'!$E$1:$E$4"); + Assert.AreEqual(cell.DataValidation.InputMessage, "Message for C2"); + + ws.Cell("D1").SetValue("Cell below has Validation with title and message."); + cell = ws.Cell("D2"); + cell.DataValidation.List(ws.Range("$E$1:$E$4")); + cell.DataValidation.InputTitle = "Title for D2"; + cell.DataValidation.InputMessage = "Message for D2"; + + Assert.AreEqual(cell.DataValidation.AllowedValues, XLAllowedValues.List); + Assert.AreEqual(cell.DataValidation.Value, "'Data Validation Issue'!$E$1:$E$4"); + Assert.AreEqual(cell.DataValidation.InputTitle, "Title for D2"); + Assert.AreEqual(cell.DataValidation.InputMessage, "Message for D2"); + } + + [Test] + public void Validation_2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").SetValue("A"); + ws.Cell("B1").SetDataValidation().Custom("Sheet1!A1"); + + IXLWorksheet ws2 = wb.AddWorksheet("Sheet2"); + ws2.Cell("A1").SetValue("B"); + ws.Cell("B1").CopyTo(ws2.Cell("B1")); + + Assert.AreEqual("Sheet1!A1", ws2.Cell("B1").DataValidation.Value); + } + + [Test] + public void Validation_3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").SetValue("A"); + ws.Cell("B1").SetDataValidation().Custom("A1"); + ws.FirstRow().InsertRowsAbove(1); + + Assert.AreEqual("A2", ws.Cell("B2").DataValidation.Value); + } + + [Test] + public void Validation_4() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").SetValue("A"); + ws.Cell("B1").SetDataValidation().Custom("A1"); + ws.Cell("B1").CopyTo(ws.Cell("B2")); + Assert.AreEqual("A2", ws.Cell("B2").DataValidation.Value); + } + + [Test] + public void Validation_5() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").SetValue("A"); + ws.Cell("B1").SetDataValidation().Custom("A1"); + ws.FirstColumn().InsertColumnsBefore(1); + + Assert.AreEqual("B1", ws.Cell("C1").DataValidation.Value); + } + + [Test] + public void Validation_6() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").SetValue("A"); + ws.Cell("B1").SetDataValidation().Custom("A1"); + ws.Cell("B1").CopyTo(ws.Cell("C1")); + Assert.AreEqual("B1", ws.Cell("C1").DataValidation.Value); + } + + [Test] + public void Validation_persists_on_Cell_DataValidation() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("People"); + + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("A") + .CellBelow().SetValue("B"); + + IXLTable table = ws.RangeUsed().CreateTable(); + + IXLDataValidation dv = table.DataRange.SetDataValidation(); + dv.ErrorTitle = "Error"; + + Assert.AreEqual("Error", table.DataRange.FirstCell().DataValidation.ErrorTitle); + } + + [Test] + public void Validation_persists_on_Worksheet_DataValidations() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("People"); + + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("A"); + + IXLTable table = ws.RangeUsed().CreateTable(); + + IXLDataValidation dv = table.DataRange.SetDataValidation(); + dv.ErrorTitle = "Error"; + + Assert.AreEqual("Error", ws.DataValidations.Single().ErrorTitle); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs index bd48796..b0ba0d6 100644 --- a/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs +++ b/ClosedXML_Tests/Excel/ImageHandling/PictureTests.cs @@ -1,9 +1,11 @@ -using System; -using System.IO; -using System.Reflection; using ClosedXML.Excel; using ClosedXML.Excel.Drawings; using NUnit.Framework; +using System; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; namespace ClosedXML_Tests { @@ -11,80 +13,222 @@ public class PictureTests { [Test] + public void CanAddPictureFromBitmap() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + using (var resourceStream = Assembly.GetAssembly(typeof(ClosedXML_Examples.BasicTable)).GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) + using (var bitmap = Bitmap.FromStream(resourceStream) as Bitmap) + { + var picture = ws.AddPicture(bitmap, "MyPicture") + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(50, 50) + .WithSize(200, 200); + + Assert.AreEqual(XLPictureFormat.Jpeg, picture.Format); + Assert.AreEqual(200, picture.Width); + Assert.AreEqual(200, picture.Height); + } + } + } + + [Test] + public void CanAddPictureFromFile() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + var path = Path.ChangeExtension(Path.GetTempFileName(), "jpg"); + + try + { + using (var resourceStream = Assembly.GetAssembly(typeof(ClosedXML_Examples.BasicTable)).GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) + using (var fileStream = File.Create(path)) + { + resourceStream.Seek(0, SeekOrigin.Begin); + resourceStream.CopyTo(fileStream); + fileStream.Close(); + } + + var picture = ws.AddPicture(path) + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(50, 50); + + Assert.AreEqual(XLPictureFormat.Jpeg, picture.Format); + Assert.AreEqual(400, picture.Width); + Assert.AreEqual(400, picture.Height); + } + finally + { + if (File.Exists(path)) + File.Delete(path); + } + } + } + + [Test] + public void CanScaleImage() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + using (var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) + using (var bitmap = Bitmap.FromStream(resourceStream) as Bitmap) + { + var pic = ws.AddPicture(bitmap, "MyPicture") + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(50, 50); + + Assert.AreEqual(252, pic.OriginalWidth); + Assert.AreEqual(152, pic.OriginalHeight); + Assert.AreEqual(252, pic.Width); + Assert.AreEqual(152, pic.Height); + + pic.ScaleHeight(0.7); + pic.ScaleWidth(1.2); + + Assert.AreEqual(252, pic.OriginalWidth); + Assert.AreEqual(152, pic.OriginalHeight); + Assert.AreEqual(302, pic.Width); + Assert.AreEqual(106, pic.Height); + + pic.ScaleHeight(0.7); + pic.ScaleWidth(1.2); + + Assert.AreEqual(252, pic.OriginalWidth); + Assert.AreEqual(152, pic.OriginalHeight); + Assert.AreEqual(362, pic.Width); + Assert.AreEqual(74, pic.Height); + + pic.ScaleHeight(0.8, true); + pic.ScaleWidth(1.1, true); + + Assert.AreEqual(252, pic.OriginalWidth); + Assert.AreEqual(152, pic.OriginalHeight); + Assert.AreEqual(277, pic.Width); + Assert.AreEqual(122, pic.Height); + } + } + } + + [Test] + public void TestDefaultPictureNames() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) + { + ws.AddPicture(stream, XLPictureFormat.Png); + stream.Position = 0; + + ws.AddPicture(stream, XLPictureFormat.Png); + stream.Position = 0; + + ws.AddPicture(stream, XLPictureFormat.Png).Name = "Picture 4"; + stream.Position = 0; + + ws.AddPicture(stream, XLPictureFormat.Png); + stream.Position = 0; + } + + Assert.AreEqual("Picture 1", ws.Pictures.Skip(0).First().Name); + Assert.AreEqual("Picture 2", ws.Pictures.Skip(1).First().Name); + Assert.AreEqual("Picture 4", ws.Pictures.Skip(2).First().Name); + Assert.AreEqual("Picture 5", ws.Pictures.Skip(3).First().Name); + } + } + + [Test] public void XLMarkerTests() { IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - XLMarker firstMarker = new XLMarker - { - ColumnId = 1, - RowId = 1, - ColumnOffset = 100, - RowOffset = 0 - }; + XLMarker firstMarker = new XLMarker(ws.Cell(1, 10).Address, new Point(100, 0)); - firstMarker.ColumnId = 10; - - Assert.AreEqual(10, firstMarker.ColumnId); - Assert.AreEqual(1, firstMarker.RowId); - Assert.AreEqual(100, firstMarker.ColumnOffset); - Assert.AreEqual(0, firstMarker.RowOffset); - Assert.AreEqual(9, firstMarker.GetZeroBasedColumn()); - Assert.AreEqual(0, firstMarker.GetZeroBasedRow()); - - Assert.Throws(typeof(ArgumentOutOfRangeException), delegate { firstMarker.RowId = 0; }); - Assert.Throws(typeof(ArgumentOutOfRangeException), delegate { firstMarker.ColumnId = 0; }); - Assert.Throws(typeof(ArgumentOutOfRangeException), - delegate { firstMarker.RowId = XLHelper.MaxRowNumber + 1; }); - Assert.Throws(typeof(ArgumentOutOfRangeException), - delegate { firstMarker.ColumnId = XLHelper.MaxColumnNumber + 1; }); + Assert.AreEqual("J", firstMarker.Address.ColumnLetter); + Assert.AreEqual(1, firstMarker.Address.RowNumber); + Assert.AreEqual(100, firstMarker.Offset.X); + Assert.AreEqual(0, firstMarker.Offset.Y); } [Test] public void XLPictureTests() { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - XLMarker firstMarker = new XLMarker + using (var wb = new XLWorkbook()) { - ColumnId = 1, - RowId = 1, - ColumnOffset = 100, - RowOffset = 0 - }; + var ws = wb.Worksheets.Add("Sheet1"); - using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) - { - XLPicture pic = new XLPicture + using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Tests.Resource.Images.ImageHandling.png")) { - IsAbsolute = false, - ImageStream = fs, - Name = "Image1", - Type = "png", - OffsetX = 200, - OffsetY = 155 - }; + var pic = ws.AddPicture(stream, XLPictureFormat.Png, "Image1") + .WithPlacement(XLPicturePlacement.FreeFloating) + .MoveTo(220, 155); - fs.Position = 0; - System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(fs); + Assert.AreEqual(XLPicturePlacement.FreeFloating, pic.Placement); + Assert.AreEqual("Image1", pic.Name); + Assert.AreEqual(XLPictureFormat.Png, pic.Format); + Assert.AreEqual(252, pic.OriginalWidth); + Assert.AreEqual(152, pic.OriginalHeight); + Assert.AreEqual(252, pic.Width); + Assert.AreEqual(152, pic.Height); + Assert.AreEqual(220, pic.Left); + Assert.AreEqual(155, pic.Top); + } + } + } - // Get these values manually as they vary from machine to machine - float horizontalRes = bitmap.HorizontalResolution; - float verticalRes = bitmap.VerticalResolution; + [Test] + public void CanLoadFileWithImagesAndCopyImagesToNewSheet() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual(2, ws.Pictures.Count); - pic.AddMarker(firstMarker); + var copy = ws.CopyTo("NewSheet"); + Assert.AreEqual(2, copy.Pictures.Count); + } + } - Assert.AreEqual(false, pic.IsAbsolute); - Assert.AreEqual("Image1", pic.Name); - Assert.AreEqual("png", pic.Type); - Assert.AreEqual(1, pic.GetMarkers().Count); - Assert.AreNotEqual(null, new XLPicture().GetMarkers()); - Assert.AreEqual((long)(914400 * 252 / horizontalRes), pic.Width); - Assert.AreEqual((long)(914400 * 152 / verticalRes), pic.Height); - Assert.AreEqual(252, pic.RawWidth); - Assert.AreEqual(152, pic.RawHeight); - Assert.AreEqual((long)(914400 * 200 / horizontalRes), pic.OffsetX); - Assert.AreEqual((long)(914400 * 155 / verticalRes), pic.OffsetY); - Assert.AreEqual(200, pic.RawOffsetX); - Assert.AreEqual(155, pic.RawOffsetY); + [Test] + public void CanDeletePictures() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + ws.Pictures.Delete(ws.Pictures.First()); + + var pictureName = ws.Pictures.First().Name; + ws.Pictures.Delete(pictureName); + } + } + + [Test] + public void PictureRenameTests() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("Images3"); + var picture = ws.Pictures.First(); + Assert.AreEqual("Picture 1", picture.Name); + + picture.Name = "picture 1"; + picture.Name = "pICture 1"; + picture.Name = "Picture 1"; + + picture = ws.Pictures.Last(); + picture.Name = "new name"; + + Assert.Throws(() => picture.Name = "Picture 1"); + Assert.Throws(() => picture.Name = "picTURE 1"); } } } diff --git a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs index 9f6a359..14c588e 100644 --- a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs +++ b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs @@ -1,123 +1,179 @@ -using ClosedXML.Excel; -using NUnit.Framework; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace ClosedXML_Tests.Excel -{ - // Tests in this fixture test only the successful loading of existing Excel files, - // i.e. we test that ClosedXML doesn't choke on a given input file - // These tests DO NOT test that ClosedXML successfully recognises all the Excel parts or that it can successfully save those parts again. - [TestFixture] - public class LoadingTests - { - [Test] - public void CanSuccessfullyLoadFiles() - { - var files = new List() - { - @"Misc\TableWithCustomTheme.xlsx", - @"Misc\EmptyTable.xlsx", - @"Misc\LoadPivotTables.xlsx", - @"Misc\LoadFileWithCustomSheetViews.xlsx", - @"Misc\LoadSheetsWithCommas.xlsx", - @"Misc\InvalidPrintTitles.xlsx" - }; - - foreach (var file in files) - { - TestHelper.LoadFile(file); - } - } - - [Test] - public void CanLoadAndManipulateFileWithEmptyTable() - { - using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\EmptyTable.xlsx"))) - using (var wb = new XLWorkbook(stream)) - { - var ws = wb.Worksheets.First(); - var table = ws.Tables.First(); - table.DataRange.InsertRowsBelow(5); - } - } - - [Test] - public void CanLoadAndSaveFileWithMismatchingSheetIdAndRelId() - { - // This file's workbook.xml contains: - // - // and the mismatch between the sheetId and r:id can create problems. - using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\FileWithMismatchSheetIdAndRelId.xlsx"))) - using (var wb = new XLWorkbook(stream)) - { - using (var ms = new MemoryStream()) - { - wb.SaveAs(ms, true); - } - } - } - - [Test] - public void CanLoadBasicPivotTable() - { - using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\LoadPivotTables.xlsx"))) - using (var wb = new XLWorkbook(stream)) - { - var ws = wb.Worksheet("PivotTable1"); - var pt = ws.PivotTable("PivotTable1"); - Assert.AreEqual("PivotTable1", pt.Name); - - Assert.AreEqual(1, pt.RowLabels.Count()); - Assert.AreEqual("Name", pt.RowLabels.Single().SourceName); - - Assert.AreEqual(1, pt.ColumnLabels.Count()); - Assert.AreEqual("Month", pt.ColumnLabels.Single().SourceName); - - var pv = pt.Values.Single(); - Assert.AreEqual("Sum of NumberOfOrders", pv.CustomName); - Assert.AreEqual("NumberOfOrders", pv.SourceName); - } - } - - /// - /// For non-English locales, the default style ("Normal" in English) can be - /// another piece of text (e.g. Обычный in Russian). - /// This test ensures that the default style is correctly detected and - /// no style conflicts occur on save. - /// - [Test] - public void CanSaveFileWithDefaultStyleNameNotInEnglish() - { - using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\FileWithDefaultStyleNameNotInEnglish.xlsx"))) - using (var wb = new XLWorkbook(stream)) - { - using (var ms = new MemoryStream()) - { - wb.SaveAs(ms, true); - } - } - } - - /// - /// As per https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.cellvalues(v=office.15).aspx - /// the 'Date' DataType is available only in files saved with Microsoft Office - /// In other files, the data type will be saved as numeric - /// ClosedXML then deduces the data type by inspecting the number format string - /// - [Test] - public void CanLoadLibreOfficeFileWithDates() - { - using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\LibreOfficeFileWithDates.xlsx"))) - using (var wb = new XLWorkbook(stream)) - { - var ws = wb.Worksheets.First(); - foreach (var cell in ws.CellsUsed()) - { - Assert.AreEqual(XLCellValues.DateTime, cell.DataType); - } - } - } - } -} +using ClosedXML.Excel; +using ClosedXML.Excel.Drawings; +using NUnit.Framework; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel +{ + // Tests in this fixture test only the successful loading of existing Excel files, + // i.e. we test that ClosedXML doesn't choke on a given input file + // These tests DO NOT test that ClosedXML successfully recognises all the Excel parts or that it can successfully save those parts again. + [TestFixture] + public class LoadingTests + { + [Test] + public void CanSuccessfullyLoadFiles() + { + var files = new List() + { + @"Misc\TableWithCustomTheme.xlsx", + @"Misc\EmptyTable.xlsx", + @"Misc\LoadPivotTables.xlsx", + @"Misc\LoadFileWithCustomSheetViews.xlsx", + @"Misc\LoadSheetsWithCommas.xlsx", + @"Misc\InvalidPrintTitles.xlsx", + @"Misc\ExcelProducedWorkbookWithImages.xlsx" + }; + + foreach (var file in files) + { + TestHelper.LoadFile(file); + } + } + + [Test] + public void CanLoadAndManipulateFileWithEmptyTable() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\EmptyTable.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + var table = ws.Tables.First(); + table.DataRange.InsertRowsBelow(5); + } + } + + [Test] + public void CanLoadAndSaveFileWithMismatchingSheetIdAndRelId() + { + // This file's workbook.xml contains: + // + // and the mismatch between the sheetId and r:id can create problems. + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\FileWithMismatchSheetIdAndRelId.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + } + } + } + + [Test] + public void CanLoadBasicPivotTable() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\LoadPivotTables.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("PivotTable1"); + var pt = ws.PivotTable("PivotTable1"); + Assert.AreEqual("PivotTable1", pt.Name); + + Assert.AreEqual(1, pt.RowLabels.Count()); + Assert.AreEqual("Name", pt.RowLabels.Single().SourceName); + + Assert.AreEqual(1, pt.ColumnLabels.Count()); + Assert.AreEqual("Month", pt.ColumnLabels.Single().SourceName); + + var pv = pt.Values.Single(); + Assert.AreEqual("Sum of NumberOfOrders", pv.CustomName); + Assert.AreEqual("NumberOfOrders", pv.SourceName); + } + } + + /// + /// For non-English locales, the default style ("Normal" in English) can be + /// another piece of text (e.g. Обычный in Russian). + /// This test ensures that the default style is correctly detected and + /// no style conflicts occur on save. + /// + [Test] + public void CanSaveFileWithDefaultStyleNameNotInEnglish() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\FileWithDefaultStyleNameNotInEnglish.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + } + } + } + + /// + /// As per https://msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.cellvalues(v=office.15).aspx + /// the 'Date' DataType is available only in files saved with Microsoft Office + /// In other files, the data type will be saved as numeric + /// ClosedXML then deduces the data type by inspecting the number format string + /// + [Test] + public void CanLoadLibreOfficeFileWithDates() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\LibreOfficeFileWithDates.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + foreach (var cell in ws.CellsUsed()) + { + Assert.AreEqual(XLCellValues.DateTime, cell.DataType); + } + } + } + + [Test] + public void CanLoadFileWithImagesWithCorrectAnchorTypes() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual(2, ws.Pictures.Count); + Assert.AreEqual(XLPicturePlacement.FreeFloating, ws.Pictures.First().Placement); + Assert.AreEqual(XLPicturePlacement.Move, ws.Pictures.Skip(1).First().Placement); + + var ws2 = wb.Worksheets.Skip(1).First(); + Assert.AreEqual(1, ws2.Pictures.Count); + Assert.AreEqual(XLPicturePlacement.MoveAndSize, ws2.Pictures.First().Placement); + } +} + + [Test] + public void CanLoadFileWithImagesWithCorrectImageType() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageFormats.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual(1, ws.Pictures.Count); + Assert.AreEqual(XLPictureFormat.Jpeg, ws.Pictures.First().Format); + + var ws2 = wb.Worksheets.Skip(1).First(); + Assert.AreEqual(1, ws2.Pictures.Count); + Assert.AreEqual(XLPictureFormat.Png, ws2.Pictures.First().Format); + } + } + + [Test] + public void CanLoadAndDeduceAnchorsFromExcelGeneratedFile() + { + // This file was produced by Excel. It contains 3 images, but the latter 2 were copied from the first. + // There is actually only 1 embedded image if you inspect the file's internals. + // Additionally, Excel saves all image anchors as TwoCellAnchor, but uses the EditAs attribute to distinguish the types + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\ExcelProducedWorkbookWithImages.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + Assert.AreEqual(3, ws.Pictures.Count); + + Assert.AreEqual(XLPicturePlacement.MoveAndSize, ws.Picture("Picture 1").Placement); + Assert.AreEqual(XLPicturePlacement.Move, ws.Picture("Picture 2").Placement); + Assert.AreEqual(XLPicturePlacement.FreeFloating, ws.Picture("Picture 3").Placement); + + using (var ms = new MemoryStream()) + wb.SaveAs(ms, true); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Misc/CopyContentsTests.cs b/ClosedXML_Tests/Excel/Misc/CopyContentsTests.cs index c9c77f6..ff63bb8 100644 --- a/ClosedXML_Tests/Excel/Misc/CopyContentsTests.cs +++ b/ClosedXML_Tests/Excel/Misc/CopyContentsTests.cs @@ -1,119 +1,119 @@ -using System.Linq; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel.Misc -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class CopyContentsTests - { - private static void CopyRowAsRange(IXLWorksheet originalSheet, int originalRowNumber, IXLWorksheet destSheet, - int destRowNumber) - { - { - IXLRow destinationRow = destSheet.Row(destRowNumber); - destinationRow.Clear(); - - IXLRow originalRow = originalSheet.Row(originalRowNumber); - int columnNumber = originalRow.LastCellUsed(true).Address.ColumnNumber; - - IXLRange originalRange = originalSheet.Range(originalRowNumber, 1, originalRowNumber, columnNumber); - IXLRange destRange = destSheet.Range(destRowNumber, 1, destRowNumber, columnNumber); - originalRange.CopyTo(destRange); - } - } - - [Test] - public void CopyConditionalFormatsCount() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().AddConditionalFormat().WhenContains("1").Fill.SetBackgroundColor(XLColor.Blue); - ws.Cell("A2").Value = ws.FirstCell(); - Assert.AreEqual(2, ws.ConditionalFormats.Count()); - } - - [Test] - public void CopyConditionalFormatsFixedNum() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.Cell("A1").Value = "1"; - ws.Cell("B1").Value = "1"; - ws.Cell("A1").AddConditionalFormat().WhenEquals(1).Fill.SetBackgroundColor(XLColor.Blue); - ws.Cell("A2").Value = ws.Cell("A1"); - Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); - Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); - } - - [Test] - public void CopyConditionalFormatsFixedString() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.Cell("A1").Value = "A"; - ws.Cell("B1").Value = "B"; - ws.Cell("A1").AddConditionalFormat().WhenEquals("A").Fill.SetBackgroundColor(XLColor.Blue); - ws.Cell("A2").Value = ws.Cell("A1"); - Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "A" && !v.Value.IsFormula))); - Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "A" && !v.Value.IsFormula))); - } - - [Test] - public void CopyConditionalFormatsFixedStringNum() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.Cell("A1").Value = "1"; - ws.Cell("B1").Value = "1"; - ws.Cell("A1").AddConditionalFormat().WhenEquals("1").Fill.SetBackgroundColor(XLColor.Blue); - ws.Cell("A2").Value = ws.Cell("A1"); - Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); - Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); - } - - [Test] - public void CopyConditionalFormatsRelative() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.Cell("A1").Value = "1"; - ws.Cell("B1").Value = "1"; - ws.Cell("A1").AddConditionalFormat().WhenEquals("=B1").Fill.SetBackgroundColor(XLColor.Blue); - ws.Cell("A2").Value = ws.Cell("A1"); - Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "B1" && v.Value.IsFormula))); - Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "B2" && v.Value.IsFormula))); - } - - [Test] - public void TestRowCopyContents() - { - var workbook = new XLWorkbook(); - IXLWorksheet originalSheet = workbook.Worksheets.Add("original"); - IXLWorksheet copyRowSheet = workbook.Worksheets.Add("copy row"); - IXLWorksheet copyRowAsRangeSheet = workbook.Worksheets.Add("copy row as range"); - IXLWorksheet copyRangeSheet = workbook.Worksheets.Add("copy range"); - - originalSheet.Cell("A2").SetValue("test value"); - originalSheet.Range("A2:E2").Merge(); - - { - IXLRange originalRange = originalSheet.Range("A2:E2"); - IXLRange destinationRange = copyRangeSheet.Range("A2:E2"); - - originalRange.CopyTo(destinationRange); - } - CopyRowAsRange(originalSheet, 2, copyRowAsRangeSheet, 3); - { - IXLRow originalRow = originalSheet.Row(2); - IXLRow destinationRow = copyRowSheet.Row(2); - copyRowSheet.Cell("G2").Value = "must be removed after copy"; - originalRow.CopyTo(destinationRow); - } - TestHelper.SaveWorkbook(workbook, "Misc", "CopyRowContents.xlsx"); - } - } +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.Misc +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class CopyContentsTests + { + private static void CopyRowAsRange(IXLWorksheet originalSheet, int originalRowNumber, IXLWorksheet destSheet, + int destRowNumber) + { + { + IXLRow destinationRow = destSheet.Row(destRowNumber); + destinationRow.Clear(); + + IXLRow originalRow = originalSheet.Row(originalRowNumber); + int columnNumber = originalRow.LastCellUsed(true).Address.ColumnNumber; + + IXLRange originalRange = originalSheet.Range(originalRowNumber, 1, originalRowNumber, columnNumber); + IXLRange destRange = destSheet.Range(destRowNumber, 1, destRowNumber, columnNumber); + originalRange.CopyTo(destRange); + } + } + + [Test] + public void CopyConditionalFormatsCount() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().AddConditionalFormat().WhenContains("1").Fill.SetBackgroundColor(XLColor.Blue); + ws.Cell("A2").Value = ws.FirstCell(); + Assert.AreEqual(2, ws.ConditionalFormats.Count()); + } + + [Test] + public void CopyConditionalFormatsFixedNum() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "1"; + ws.Cell("B1").Value = "1"; + ws.Cell("A1").AddConditionalFormat().WhenEquals(1).Fill.SetBackgroundColor(XLColor.Blue); + ws.Cell("A2").Value = ws.Cell("A1"); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); + } + + [Test] + public void CopyConditionalFormatsFixedString() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "A"; + ws.Cell("B1").Value = "B"; + ws.Cell("A1").AddConditionalFormat().WhenEquals("A").Fill.SetBackgroundColor(XLColor.Blue); + ws.Cell("A2").Value = ws.Cell("A1"); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "A" && !v.Value.IsFormula))); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "A" && !v.Value.IsFormula))); + } + + [Test] + public void CopyConditionalFormatsFixedStringNum() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "1"; + ws.Cell("B1").Value = "1"; + ws.Cell("A1").AddConditionalFormat().WhenEquals("1").Fill.SetBackgroundColor(XLColor.Blue); + ws.Cell("A2").Value = ws.Cell("A1"); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "1" && !v.Value.IsFormula))); + } + + [Test] + public void CopyConditionalFormatsRelative() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "1"; + ws.Cell("B1").Value = "1"; + ws.Cell("A1").AddConditionalFormat().WhenEquals("=B1").Fill.SetBackgroundColor(XLColor.Blue); + ws.Cell("A2").Value = ws.Cell("A1"); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "B1" && v.Value.IsFormula))); + Assert.IsTrue(ws.ConditionalFormats.Any(cf => cf.Values.Any(v => v.Value.Value == "B2" && v.Value.IsFormula))); + } + + [Test] + public void TestRowCopyContents() + { + var workbook = new XLWorkbook(); + IXLWorksheet originalSheet = workbook.Worksheets.Add("original"); + IXLWorksheet copyRowSheet = workbook.Worksheets.Add("copy row"); + IXLWorksheet copyRowAsRangeSheet = workbook.Worksheets.Add("copy row as range"); + IXLWorksheet copyRangeSheet = workbook.Worksheets.Add("copy range"); + + originalSheet.Cell("A2").SetValue("test value"); + originalSheet.Range("A2:E2").Merge(); + + { + IXLRange originalRange = originalSheet.Range("A2:E2"); + IXLRange destinationRange = copyRangeSheet.Range("A2:E2"); + + originalRange.CopyTo(destinationRange); + } + CopyRowAsRange(originalSheet, 2, copyRowAsRangeSheet, 3); + { + IXLRow originalRow = originalSheet.Row(2); + IXLRow destinationRow = copyRowSheet.Row(2); + copyRowSheet.Cell("G2").Value = "must be removed after copy"; + originalRow.CopyTo(destinationRow); + } + TestHelper.SaveWorkbook(workbook, "Misc", "CopyRowContents.xlsx"); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Misc/ExtensionsTests.cs b/ClosedXML_Tests/Excel/Misc/ExtensionsTests.cs index ed82689..21be4ff 100644 --- a/ClosedXML_Tests/Excel/Misc/ExtensionsTests.cs +++ b/ClosedXML_Tests/Excel/Misc/ExtensionsTests.cs @@ -1,37 +1,37 @@ -using System; -using ClosedXML.Excel; -using NUnit.Framework; -using DocumentFormat.OpenXml; - -namespace ClosedXML_Tests.Excel -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class ExtensionsTests - { - [Test] - public void FixNewLines() - { - Assert.AreEqual("\n".FixNewLines(), Environment.NewLine); - Assert.AreEqual("\r\n".FixNewLines(), Environment.NewLine); - Assert.AreEqual("\rS\n".FixNewLines(), "\rS" + Environment.NewLine); - Assert.AreEqual("\r\n\n".FixNewLines(), Environment.NewLine + Environment.NewLine); - } - - [Test] - public void DoubleSaveRound() - { - Double value = 1234.1234567; - Assert.AreEqual(value.SaveRound(), Math.Round(value, 6)); - } - - [Test] - public void DoubleValueSaveRound() - { - Double value = 1234.1234567; - Assert.AreEqual(new DoubleValue(value).SaveRound().Value, Math.Round(value, 6)); - } - } +using System; +using ClosedXML.Excel; +using NUnit.Framework; +using DocumentFormat.OpenXml; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class ExtensionsTests + { + [Test] + public void FixNewLines() + { + Assert.AreEqual("\n".FixNewLines(), Environment.NewLine); + Assert.AreEqual("\r\n".FixNewLines(), Environment.NewLine); + Assert.AreEqual("\rS\n".FixNewLines(), "\rS" + Environment.NewLine); + Assert.AreEqual("\r\n\n".FixNewLines(), Environment.NewLine + Environment.NewLine); + } + + [Test] + public void DoubleSaveRound() + { + Double value = 1234.1234567; + Assert.AreEqual(value.SaveRound(), Math.Round(value, 6)); + } + + [Test] + public void DoubleValueSaveRound() + { + Double value = 1234.1234567; + Assert.AreEqual(new DoubleValue(value).SaveRound().Value, Math.Round(value, 6)); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Misc/FormulaTests.cs b/ClosedXML_Tests/Excel/Misc/FormulaTests.cs index 9cfaf7e..8d2d470 100644 --- a/ClosedXML_Tests/Excel/Misc/FormulaTests.cs +++ b/ClosedXML_Tests/Excel/Misc/FormulaTests.cs @@ -1,160 +1,160 @@ -using ClosedXML.Excel; -using NUnit.Framework; -using System; -using System.Linq; - -namespace ClosedXML_Tests.Excel -{ - [TestFixture] - public class FormulaTests - { - [Test] - public void CopyFormula() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell("A1").FormulaA1 = "B1"; - ws.Cell("A1").CopyTo("A2"); - Assert.AreEqual("B2", ws.Cell("A2").FormulaA1); - } - - [Test] - public void CopyFormula2() - { - using (var wb = new XLWorkbook()) - { - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - - ws.Cell("A1").FormulaA1 = "A2-1"; - ws.Cell("A1").CopyTo("B1"); - Assert.AreEqual("R[1]C-1", ws.Cell("A1").FormulaR1C1); - Assert.AreEqual("R[1]C-1", ws.Cell("B1").FormulaR1C1); - Assert.AreEqual("B2-1", ws.Cell("B1").FormulaA1); - - ws.Cell("A1").FormulaA1 = "B1+1"; - ws.Cell("A1").CopyTo("A2"); - Assert.AreEqual("RC[1]+1", ws.Cell("A1").FormulaR1C1); - Assert.AreEqual("RC[1]+1", ws.Cell("A2").FormulaR1C1); - Assert.AreEqual("B2+1", ws.Cell("A2").FormulaA1); - } - } - - [Test] - public void CopyFormulaWithSheetNameThatResemblesFormula() - { - using (var wb = new XLWorkbook()) - { - IXLWorksheet ws = wb.Worksheets.Add("S10 Data"); - ws.Cell("A1").Value = "Some value"; - ws.Cell("A2").Value = 123; - - ws = wb.Worksheets.Add("Summary"); - ws.Cell("A1").FormulaA1 = "='S10 Data'!A1"; - Assert.AreEqual("Some value", ws.Cell("A1").Value); - - ws.Cell("A1").CopyTo("A2"); - Assert.AreEqual("'S10 Data'!A2", ws.Cell("A2").FormulaA1); - - ws.Cell("A1").CopyTo("B1"); - Assert.AreEqual("'S10 Data'!B1", ws.Cell("B1").FormulaA1); - - ws.Cell("A3").FormulaA1 = "=SUM('S10 Data'!A2)"; - Assert.AreEqual(123, ws.Cell("A3").Value); - } - } - - [Test] - public void FormulaWithReferenceIncludingSheetName() - { - using (var wb = new XLWorkbook()) - { - object value; - var ws = wb.AddWorksheet("Sheet1"); - ws.Cell("A1").InsertData(Enumerable.Range(1, 50)); - ws.Cell("B1").FormulaA1 = "=SUM(A1:A50)"; - value = ws.Cell("B1").Value; - Assert.AreEqual(1275, value); - - ws = wb.AddWorksheet("Sheet2"); - - ws.Cell("A1").FormulaA1 = "=SUM(Sheet1!A1:Sheet1!A50)"; - value = ws.Cell("A1").Value; - Assert.AreEqual(1275, value); - - ws.Cell("B1").FormulaA1 = "=SUM(Sheet1!A1:A50)"; - value = ws.Cell("B1").Value; - Assert.AreEqual(1275, value); - } - } - - [Test] - public void InvalidReferences() - { - using (var wb = new XLWorkbook()) - { - var ws = wb.AddWorksheet("Sheet1"); - ws.Cell("A1").InsertData(Enumerable.Range(1, 50)); - ws = wb.AddWorksheet("Sheet2"); - - ws.Cell("A1").FormulaA1 = "=SUM(Sheet1!A1:Sheet2!A50)"; - Assert.That(() => ws.Cell("A1").Value, Throws.InstanceOf()); - - ws.Cell("B1").FormulaA1 = "=SUM(Sheet1!A1:UnknownSheet!A50)"; - Assert.That(() => ws.Cell("B1").Value, Throws.InstanceOf()); - } - } - - [Test] - public void DateAgainstStringComparison() - { - using (var wb = new XLWorkbook()) - { - var ws = wb.AddWorksheet("Sheet1"); - ws.Cell("A1").Value = new DateTime(2016, 1, 1); - ws.Cell("A1").DataType = XLCellValues.DateTime; - - ws.Cell("A2").FormulaA1 = @"=IF(A1 = """", ""A"", ""B"")"; - var actual = ws.Cell("A2").Value; - Assert.AreEqual(actual, "B"); - - ws.Cell("A3").FormulaA1 = @"=IF("""" = A1, ""A"", ""B"")"; - actual = ws.Cell("A3").Value; - Assert.AreEqual(actual, "B"); - } - } - - [Test] - public void FormulaThatReferencesEntireRow() - { - using (var wb = new XLWorkbook()) - { - var ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().Value = 1; - ws.FirstCell().CellRight().Value = 2; - ws.FirstCell().CellRight(5).Value = 3; - - ws.FirstCell().CellBelow().FormulaA1 = "=SUM(1:1)"; - - var actual = ws.FirstCell().CellBelow().Value; - Assert.AreEqual(6, actual); - } - } - - [Test] - public void FormulaThatReferencesEntireColumn() - { - using (var wb = new XLWorkbook()) - { - var ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().Value = 1; - ws.FirstCell().CellBelow().Value = 2; - ws.FirstCell().CellBelow(5).Value = 3; - - ws.FirstCell().CellRight().FormulaA1 = "=SUM(A:A)"; - - var actual = ws.FirstCell().CellRight().Value; - Assert.AreEqual(6, actual); - } - } - } -} +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Linq; + +namespace ClosedXML_Tests.Excel +{ + [TestFixture] + public class FormulaTests + { + [Test] + public void CopyFormula() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell("A1").FormulaA1 = "B1"; + ws.Cell("A1").CopyTo("A2"); + Assert.AreEqual("B2", ws.Cell("A2").FormulaA1); + } + + [Test] + public void CopyFormula2() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Cell("A1").FormulaA1 = "A2-1"; + ws.Cell("A1").CopyTo("B1"); + Assert.AreEqual("R[1]C-1", ws.Cell("A1").FormulaR1C1); + Assert.AreEqual("R[1]C-1", ws.Cell("B1").FormulaR1C1); + Assert.AreEqual("B2-1", ws.Cell("B1").FormulaA1); + + ws.Cell("A1").FormulaA1 = "B1+1"; + ws.Cell("A1").CopyTo("A2"); + Assert.AreEqual("RC[1]+1", ws.Cell("A1").FormulaR1C1); + Assert.AreEqual("RC[1]+1", ws.Cell("A2").FormulaR1C1); + Assert.AreEqual("B2+1", ws.Cell("A2").FormulaA1); + } + } + + [Test] + public void CopyFormulaWithSheetNameThatResemblesFormula() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws = wb.Worksheets.Add("S10 Data"); + ws.Cell("A1").Value = "Some value"; + ws.Cell("A2").Value = 123; + + ws = wb.Worksheets.Add("Summary"); + ws.Cell("A1").FormulaA1 = "='S10 Data'!A1"; + Assert.AreEqual("Some value", ws.Cell("A1").Value); + + ws.Cell("A1").CopyTo("A2"); + Assert.AreEqual("'S10 Data'!A2", ws.Cell("A2").FormulaA1); + + ws.Cell("A1").CopyTo("B1"); + Assert.AreEqual("'S10 Data'!B1", ws.Cell("B1").FormulaA1); + + ws.Cell("A3").FormulaA1 = "=SUM('S10 Data'!A2)"; + Assert.AreEqual(123, ws.Cell("A3").Value); + } + } + + [Test] + public void FormulaWithReferenceIncludingSheetName() + { + using (var wb = new XLWorkbook()) + { + object value; + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").InsertData(Enumerable.Range(1, 50)); + ws.Cell("B1").FormulaA1 = "=SUM(A1:A50)"; + value = ws.Cell("B1").Value; + Assert.AreEqual(1275, value); + + ws = wb.AddWorksheet("Sheet2"); + + ws.Cell("A1").FormulaA1 = "=SUM(Sheet1!A1:Sheet1!A50)"; + value = ws.Cell("A1").Value; + Assert.AreEqual(1275, value); + + ws.Cell("B1").FormulaA1 = "=SUM(Sheet1!A1:A50)"; + value = ws.Cell("B1").Value; + Assert.AreEqual(1275, value); + } + } + + [Test] + public void InvalidReferences() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").InsertData(Enumerable.Range(1, 50)); + ws = wb.AddWorksheet("Sheet2"); + + ws.Cell("A1").FormulaA1 = "=SUM(Sheet1!A1:Sheet2!A50)"; + Assert.That(() => ws.Cell("A1").Value, Throws.InstanceOf()); + + ws.Cell("B1").FormulaA1 = "=SUM(Sheet1!A1:UnknownSheet!A50)"; + Assert.That(() => ws.Cell("B1").Value, Throws.InstanceOf()); + } + } + + [Test] + public void DateAgainstStringComparison() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = new DateTime(2016, 1, 1); + ws.Cell("A1").DataType = XLCellValues.DateTime; + + ws.Cell("A2").FormulaA1 = @"=IF(A1 = """", ""A"", ""B"")"; + var actual = ws.Cell("A2").Value; + Assert.AreEqual(actual, "B"); + + ws.Cell("A3").FormulaA1 = @"=IF("""" = A1, ""A"", ""B"")"; + actual = ws.Cell("A3").Value; + Assert.AreEqual(actual, "B"); + } + } + + [Test] + public void FormulaThatReferencesEntireRow() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().Value = 1; + ws.FirstCell().CellRight().Value = 2; + ws.FirstCell().CellRight(5).Value = 3; + + ws.FirstCell().CellBelow().FormulaA1 = "=SUM(1:1)"; + + var actual = ws.FirstCell().CellBelow().Value; + Assert.AreEqual(6, actual); + } + } + + [Test] + public void FormulaThatReferencesEntireColumn() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().Value = 1; + ws.FirstCell().CellBelow().Value = 2; + ws.FirstCell().CellBelow(5).Value = 3; + + ws.FirstCell().CellRight().FormulaA1 = "=SUM(A:A)"; + + var actual = ws.FirstCell().CellRight().Value; + Assert.AreEqual(6, actual); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Misc/StylesTests.cs b/ClosedXML_Tests/Excel/Misc/StylesTests.cs index d60e69f..3e0c779 100644 --- a/ClosedXML_Tests/Excel/Misc/StylesTests.cs +++ b/ClosedXML_Tests/Excel/Misc/StylesTests.cs @@ -1,81 +1,81 @@ -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel.Misc -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class StylesTests - { - private static void SetupBorders(IXLRange range) - { - range.FirstRow().Cell(1).Style.Border.TopBorder = XLBorderStyleValues.None; - range.FirstRow().Cell(2).Style.Border.TopBorder = XLBorderStyleValues.Thick; - range.FirstRow().Cell(3).Style.Border.TopBorder = XLBorderStyleValues.Double; - - range.LastRow().Cell(1).Style.Border.BottomBorder = XLBorderStyleValues.None; - range.LastRow().Cell(2).Style.Border.BottomBorder = XLBorderStyleValues.Thick; - range.LastRow().Cell(3).Style.Border.BottomBorder = XLBorderStyleValues.Double; - - range.FirstColumn().Cell(1).Style.Border.LeftBorder = XLBorderStyleValues.None; - range.FirstColumn().Cell(2).Style.Border.LeftBorder = XLBorderStyleValues.Thick; - range.FirstColumn().Cell(3).Style.Border.LeftBorder = XLBorderStyleValues.Double; - - range.LastColumn().Cell(1).Style.Border.RightBorder = XLBorderStyleValues.None; - range.LastColumn().Cell(2).Style.Border.RightBorder = XLBorderStyleValues.Thick; - range.LastColumn().Cell(3).Style.Border.RightBorder = XLBorderStyleValues.Double; - } - - [Test] - public void InsideBorderTest() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - IXLRange range = ws.Range("B2:D4"); - - SetupBorders(range); - - range.Style.Border.InsideBorder = XLBorderStyleValues.Thin; - range.Style.Border.InsideBorderColor = XLColor.Red; - - IXLCell center = range.Cell(2, 2); - - Assert.AreEqual(XLColor.Red, center.Style.Border.TopBorderColor); - Assert.AreEqual(XLColor.Red, center.Style.Border.BottomBorderColor); - Assert.AreEqual(XLColor.Red, center.Style.Border.LeftBorderColor); - Assert.AreEqual(XLColor.Red, center.Style.Border.RightBorderColor); - - Assert.AreEqual(XLBorderStyleValues.None, range.FirstRow().Cell(1).Style.Border.TopBorder); - Assert.AreEqual(XLBorderStyleValues.Thick, range.FirstRow().Cell(2).Style.Border.TopBorder); - Assert.AreEqual(XLBorderStyleValues.Double, range.FirstRow().Cell(3).Style.Border.TopBorder); - - Assert.AreEqual(XLBorderStyleValues.None, range.LastRow().Cell(1).Style.Border.BottomBorder); - Assert.AreEqual(XLBorderStyleValues.Thick, range.LastRow().Cell(2).Style.Border.BottomBorder); - Assert.AreEqual(XLBorderStyleValues.Double, range.LastRow().Cell(3).Style.Border.BottomBorder); - - Assert.AreEqual(XLBorderStyleValues.None, range.FirstColumn().Cell(1).Style.Border.LeftBorder); - Assert.AreEqual(XLBorderStyleValues.Thick, range.FirstColumn().Cell(2).Style.Border.LeftBorder); - Assert.AreEqual(XLBorderStyleValues.Double, range.FirstColumn().Cell(3).Style.Border.LeftBorder); - - Assert.AreEqual(XLBorderStyleValues.None, range.LastColumn().Cell(1).Style.Border.RightBorder); - Assert.AreEqual(XLBorderStyleValues.Thick, range.LastColumn().Cell(2).Style.Border.RightBorder); - Assert.AreEqual(XLBorderStyleValues.Double, range.LastColumn().Cell(3).Style.Border.RightBorder); - } - - [Test] - public void ResolveThemeColors() - { - using (var wb = new XLWorkbook()) - { - string color; - color = wb.Theme.ResolveThemeColor(XLThemeColor.Accent1).Color.ToHex(); - Assert.AreEqual("FF4F81BD", color); - - color = wb.Theme.ResolveThemeColor(XLThemeColor.Background1).Color.ToHex(); - Assert.AreEqual("FFFFFFFF", color); - } - } - } -} +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel.Misc +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class StylesTests + { + private static void SetupBorders(IXLRange range) + { + range.FirstRow().Cell(1).Style.Border.TopBorder = XLBorderStyleValues.None; + range.FirstRow().Cell(2).Style.Border.TopBorder = XLBorderStyleValues.Thick; + range.FirstRow().Cell(3).Style.Border.TopBorder = XLBorderStyleValues.Double; + + range.LastRow().Cell(1).Style.Border.BottomBorder = XLBorderStyleValues.None; + range.LastRow().Cell(2).Style.Border.BottomBorder = XLBorderStyleValues.Thick; + range.LastRow().Cell(3).Style.Border.BottomBorder = XLBorderStyleValues.Double; + + range.FirstColumn().Cell(1).Style.Border.LeftBorder = XLBorderStyleValues.None; + range.FirstColumn().Cell(2).Style.Border.LeftBorder = XLBorderStyleValues.Thick; + range.FirstColumn().Cell(3).Style.Border.LeftBorder = XLBorderStyleValues.Double; + + range.LastColumn().Cell(1).Style.Border.RightBorder = XLBorderStyleValues.None; + range.LastColumn().Cell(2).Style.Border.RightBorder = XLBorderStyleValues.Thick; + range.LastColumn().Cell(3).Style.Border.RightBorder = XLBorderStyleValues.Double; + } + + [Test] + public void InsideBorderTest() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + IXLRange range = ws.Range("B2:D4"); + + SetupBorders(range); + + range.Style.Border.InsideBorder = XLBorderStyleValues.Thin; + range.Style.Border.InsideBorderColor = XLColor.Red; + + IXLCell center = range.Cell(2, 2); + + Assert.AreEqual(XLColor.Red, center.Style.Border.TopBorderColor); + Assert.AreEqual(XLColor.Red, center.Style.Border.BottomBorderColor); + Assert.AreEqual(XLColor.Red, center.Style.Border.LeftBorderColor); + Assert.AreEqual(XLColor.Red, center.Style.Border.RightBorderColor); + + Assert.AreEqual(XLBorderStyleValues.None, range.FirstRow().Cell(1).Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.FirstRow().Cell(2).Style.Border.TopBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.FirstRow().Cell(3).Style.Border.TopBorder); + + Assert.AreEqual(XLBorderStyleValues.None, range.LastRow().Cell(1).Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.LastRow().Cell(2).Style.Border.BottomBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.LastRow().Cell(3).Style.Border.BottomBorder); + + Assert.AreEqual(XLBorderStyleValues.None, range.FirstColumn().Cell(1).Style.Border.LeftBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.FirstColumn().Cell(2).Style.Border.LeftBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.FirstColumn().Cell(3).Style.Border.LeftBorder); + + Assert.AreEqual(XLBorderStyleValues.None, range.LastColumn().Cell(1).Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.Thick, range.LastColumn().Cell(2).Style.Border.RightBorder); + Assert.AreEqual(XLBorderStyleValues.Double, range.LastColumn().Cell(3).Style.Border.RightBorder); + } + + [Test] + public void ResolveThemeColors() + { + using (var wb = new XLWorkbook()) + { + string color; + color = wb.Theme.ResolveThemeColor(XLThemeColor.Accent1).Color.ToHex(); + Assert.AreEqual("FF4F81BD", color); + + color = wb.Theme.ResolveThemeColor(XLThemeColor.Background1).Color.ToHex(); + Assert.AreEqual("FFFFFFFF", color); + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs b/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs index 601bc06..48f5225 100644 --- a/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs +++ b/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs @@ -1,259 +1,259 @@ -using System; -using System.Linq; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class XLWorkbookTests - { - [Test] - public void Cell1() - { - var wb = new XLWorkbook(); - IXLCell cell = wb.Cell("ABC"); - Assert.IsNull(cell); - } - - [Test] - public void Cell2() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); - IXLCell cell = wb.Cell("Sheet1!Result"); - Assert.IsNotNull(cell); - Assert.AreEqual(1, cell.GetValue()); - } - - [Test] - public void Cell3() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue(1).AddToNamed("Result"); - IXLCell cell = wb.Cell("Sheet1!Result"); - Assert.IsNotNull(cell); - Assert.AreEqual(1, cell.GetValue()); - } - - [Test] - public void Cells1() - { - var wb = new XLWorkbook(); - IXLCells cells = wb.Cells("ABC"); - Assert.IsNotNull(cells); - Assert.AreEqual(0, cells.Count()); - } - - [Test] - public void Cells2() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); - IXLCells cells = wb.Cells("Sheet1!Result, ABC"); - Assert.IsNotNull(cells); - Assert.AreEqual(1, cells.Count()); - Assert.AreEqual(1, cells.First().GetValue()); - } - - [Test] - public void Cells3() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue(1).AddToNamed("Result"); - IXLCells cells = wb.Cells("Sheet1!Result, ABC"); - Assert.IsNotNull(cells); - Assert.AreEqual(1, cells.Count()); - Assert.AreEqual(1, cells.First().GetValue()); - } - - [Test] - public void NamedRange1() - { - var wb = new XLWorkbook(); - IXLNamedRange range = wb.NamedRange("ABC"); - Assert.IsNull(range); - } - - [Test] - public void NamedRange2() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); - IXLNamedRange range = wb.NamedRange("Sheet1!Result"); - Assert.IsNotNull(range); - Assert.AreEqual(1, range.Ranges.Count); - Assert.AreEqual(1, range.Ranges.Cells().Count()); - Assert.AreEqual(1, range.Ranges.First().FirstCell().GetValue()); - } - - [Test] - public void NamedRange3() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - IXLNamedRange range = wb.NamedRange("Sheet1!Result"); - Assert.IsNull(range); - } - - [Test] - public void NamedRange4() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue(1).AddToNamed("Result"); - IXLNamedRange range = wb.NamedRange("Sheet1!Result"); - Assert.IsNotNull(range); - Assert.AreEqual(1, range.Ranges.Count); - Assert.AreEqual(1, range.Ranges.Cells().Count()); - Assert.AreEqual(1, range.Ranges.First().FirstCell().GetValue()); - } - - [Test] - public void Range1() - { - var wb = new XLWorkbook(); - IXLRange range = wb.Range("ABC"); - Assert.IsNull(range); - } - - [Test] - public void Range2() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); - IXLRange range = wb.Range("Sheet1!Result"); - Assert.IsNotNull(range); - Assert.AreEqual(1, range.Cells().Count()); - Assert.AreEqual(1, range.FirstCell().GetValue()); - } - - [Test] - public void Range3() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue(1).AddToNamed("Result"); - IXLRange range = wb.Range("Sheet1!Result"); - Assert.IsNotNull(range); - Assert.AreEqual(1, range.Cells().Count()); - Assert.AreEqual(1, range.FirstCell().GetValue()); - } - - [Test] - public void Ranges1() - { - var wb = new XLWorkbook(); - IXLRanges ranges = wb.Ranges("ABC"); - Assert.IsNotNull(ranges); - Assert.AreEqual(0, ranges.Count()); - } - - [Test] - public void Ranges2() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); - IXLRanges ranges = wb.Ranges("Sheet1!Result, ABC"); - Assert.IsNotNull(ranges); - Assert.AreEqual(1, ranges.Cells().Count()); - Assert.AreEqual(1, ranges.First().FirstCell().GetValue()); - } - - [Test] - public void Ranges3() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue(1).AddToNamed("Result"); - IXLRanges ranges = wb.Ranges("Sheet1!Result, ABC"); - Assert.IsNotNull(ranges); - Assert.AreEqual(1, ranges.Cells().Count()); - Assert.AreEqual(1, ranges.First().FirstCell().GetValue()); - } - - [Test] - public void WbNamedCell() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell"); - Assert.AreEqual("Test", wb.Cell("TestCell").GetString()); - Assert.AreEqual("Test", ws.Cell("TestCell").GetString()); - } - - [Test] - public void WbNamedCells() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell"); - ws.Cell(2, 1).SetValue("B").AddToNamed("Test2"); - IXLCells wbCells = wb.Cells("TestCell, Test2"); - Assert.AreEqual("Test", wbCells.First().GetString()); - Assert.AreEqual("B", wbCells.Last().GetString()); - - IXLCells wsCells = ws.Cells("TestCell, Test2"); - Assert.AreEqual("Test", wsCells.First().GetString()); - Assert.AreEqual("B", wsCells.Last().GetString()); - } - - [Test] - public void WbNamedRange() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(1, 1).SetValue("A"); - ws.Cell(2, 1).SetValue("B"); - IXLRange original = ws.Range("A1:A2"); - original.AddToNamed("TestRange"); - Assert.AreEqual(original.RangeAddress.ToStringFixed(), wb.Range("TestRange").RangeAddress.ToString()); - Assert.AreEqual(original.RangeAddress.ToStringFixed(), ws.Range("TestRange").RangeAddress.ToString()); - } - - [Test] - public void WbNamedRanges() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(1, 1).SetValue("A"); - ws.Cell(2, 1).SetValue("B"); - ws.Cell(3, 1).SetValue("C").AddToNamed("Test2"); - IXLRange original = ws.Range("A1:A2"); - original.AddToNamed("TestRange"); - IXLRanges wbRanges = wb.Ranges("TestRange, Test2"); - Assert.AreEqual(original.RangeAddress.ToStringFixed(), wbRanges.First().RangeAddress.ToString()); - Assert.AreEqual("$A$3:$A$3", wbRanges.Last().RangeAddress.ToStringFixed()); - - IXLRanges wsRanges = wb.Ranges("TestRange, Test2"); - Assert.AreEqual(original.RangeAddress.ToStringFixed(), wsRanges.First().RangeAddress.ToString()); - Assert.AreEqual("$A$3:$A$3", wsRanges.Last().RangeAddress.ToStringFixed()); - } - - [Test] - public void WbNamedRangesOneString() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - wb.NamedRanges.Add("TestRange", "Sheet1!$A$1,Sheet1!$A$3"); - - IXLRanges wbRanges = ws.Ranges("TestRange"); - Assert.AreEqual("$A$1:$A$1", wbRanges.First().RangeAddress.ToStringFixed()); - Assert.AreEqual("$A$3:$A$3", wbRanges.Last().RangeAddress.ToStringFixed()); - - IXLRanges wsRanges = ws.Ranges("TestRange"); - Assert.AreEqual("$A$1:$A$1", wsRanges.First().RangeAddress.ToStringFixed()); - Assert.AreEqual("$A$3:$A$3", wsRanges.Last().RangeAddress.ToStringFixed()); - } - } +using System; +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class XLWorkbookTests + { + [Test] + public void Cell1() + { + var wb = new XLWorkbook(); + IXLCell cell = wb.Cell("ABC"); + Assert.IsNull(cell); + } + + [Test] + public void Cell2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + IXLCell cell = wb.Cell("Sheet1!Result"); + Assert.IsNotNull(cell); + Assert.AreEqual(1, cell.GetValue()); + } + + [Test] + public void Cell3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result"); + IXLCell cell = wb.Cell("Sheet1!Result"); + Assert.IsNotNull(cell); + Assert.AreEqual(1, cell.GetValue()); + } + + [Test] + public void Cells1() + { + var wb = new XLWorkbook(); + IXLCells cells = wb.Cells("ABC"); + Assert.IsNotNull(cells); + Assert.AreEqual(0, cells.Count()); + } + + [Test] + public void Cells2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + IXLCells cells = wb.Cells("Sheet1!Result, ABC"); + Assert.IsNotNull(cells); + Assert.AreEqual(1, cells.Count()); + Assert.AreEqual(1, cells.First().GetValue()); + } + + [Test] + public void Cells3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result"); + IXLCells cells = wb.Cells("Sheet1!Result, ABC"); + Assert.IsNotNull(cells); + Assert.AreEqual(1, cells.Count()); + Assert.AreEqual(1, cells.First().GetValue()); + } + + [Test] + public void NamedRange1() + { + var wb = new XLWorkbook(); + IXLNamedRange range = wb.NamedRange("ABC"); + Assert.IsNull(range); + } + + [Test] + public void NamedRange2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + IXLNamedRange range = wb.NamedRange("Sheet1!Result"); + Assert.IsNotNull(range); + Assert.AreEqual(1, range.Ranges.Count); + Assert.AreEqual(1, range.Ranges.Cells().Count()); + Assert.AreEqual(1, range.Ranges.First().FirstCell().GetValue()); + } + + [Test] + public void NamedRange3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + IXLNamedRange range = wb.NamedRange("Sheet1!Result"); + Assert.IsNull(range); + } + + [Test] + public void NamedRange4() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result"); + IXLNamedRange range = wb.NamedRange("Sheet1!Result"); + Assert.IsNotNull(range); + Assert.AreEqual(1, range.Ranges.Count); + Assert.AreEqual(1, range.Ranges.Cells().Count()); + Assert.AreEqual(1, range.Ranges.First().FirstCell().GetValue()); + } + + [Test] + public void Range1() + { + var wb = new XLWorkbook(); + IXLRange range = wb.Range("ABC"); + Assert.IsNull(range); + } + + [Test] + public void Range2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + IXLRange range = wb.Range("Sheet1!Result"); + Assert.IsNotNull(range); + Assert.AreEqual(1, range.Cells().Count()); + Assert.AreEqual(1, range.FirstCell().GetValue()); + } + + [Test] + public void Range3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result"); + IXLRange range = wb.Range("Sheet1!Result"); + Assert.IsNotNull(range); + Assert.AreEqual(1, range.Cells().Count()); + Assert.AreEqual(1, range.FirstCell().GetValue()); + } + + [Test] + public void Ranges1() + { + var wb = new XLWorkbook(); + IXLRanges ranges = wb.Ranges("ABC"); + Assert.IsNotNull(ranges); + Assert.AreEqual(0, ranges.Count()); + } + + [Test] + public void Ranges2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result", XLScope.Worksheet); + IXLRanges ranges = wb.Ranges("Sheet1!Result, ABC"); + Assert.IsNotNull(ranges); + Assert.AreEqual(1, ranges.Cells().Count()); + Assert.AreEqual(1, ranges.First().FirstCell().GetValue()); + } + + [Test] + public void Ranges3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue(1).AddToNamed("Result"); + IXLRanges ranges = wb.Ranges("Sheet1!Result, ABC"); + Assert.IsNotNull(ranges); + Assert.AreEqual(1, ranges.Cells().Count()); + Assert.AreEqual(1, ranges.First().FirstCell().GetValue()); + } + + [Test] + public void WbNamedCell() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell"); + Assert.AreEqual("Test", wb.Cell("TestCell").GetString()); + Assert.AreEqual("Test", ws.Cell("TestCell").GetString()); + } + + [Test] + public void WbNamedCells() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell"); + ws.Cell(2, 1).SetValue("B").AddToNamed("Test2"); + IXLCells wbCells = wb.Cells("TestCell, Test2"); + Assert.AreEqual("Test", wbCells.First().GetString()); + Assert.AreEqual("B", wbCells.Last().GetString()); + + IXLCells wsCells = ws.Cells("TestCell, Test2"); + Assert.AreEqual("Test", wsCells.First().GetString()); + Assert.AreEqual("B", wsCells.Last().GetString()); + } + + [Test] + public void WbNamedRange() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("A"); + ws.Cell(2, 1).SetValue("B"); + IXLRange original = ws.Range("A1:A2"); + original.AddToNamed("TestRange"); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), wb.Range("TestRange").RangeAddress.ToString()); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), ws.Range("TestRange").RangeAddress.ToString()); + } + + [Test] + public void WbNamedRanges() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("A"); + ws.Cell(2, 1).SetValue("B"); + ws.Cell(3, 1).SetValue("C").AddToNamed("Test2"); + IXLRange original = ws.Range("A1:A2"); + original.AddToNamed("TestRange"); + IXLRanges wbRanges = wb.Ranges("TestRange, Test2"); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), wbRanges.First().RangeAddress.ToString()); + Assert.AreEqual("$A$3:$A$3", wbRanges.Last().RangeAddress.ToStringFixed()); + + IXLRanges wsRanges = wb.Ranges("TestRange, Test2"); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), wsRanges.First().RangeAddress.ToString()); + Assert.AreEqual("$A$3:$A$3", wsRanges.Last().RangeAddress.ToStringFixed()); + } + + [Test] + public void WbNamedRangesOneString() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + wb.NamedRanges.Add("TestRange", "Sheet1!$A$1,Sheet1!$A$3"); + + IXLRanges wbRanges = ws.Ranges("TestRange"); + Assert.AreEqual("$A$1:$A$1", wbRanges.First().RangeAddress.ToStringFixed()); + Assert.AreEqual("$A$3:$A$3", wbRanges.Last().RangeAddress.ToStringFixed()); + + IXLRanges wsRanges = ws.Ranges("TestRange"); + Assert.AreEqual("$A$1:$A$1", wsRanges.First().RangeAddress.ToStringFixed()); + Assert.AreEqual("$A$3:$A$3", wsRanges.Last().RangeAddress.ToStringFixed()); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Misc/XlHelperTests.cs b/ClosedXML_Tests/Excel/Misc/XlHelperTests.cs index 98e4685..20853d6 100644 --- a/ClosedXML_Tests/Excel/Misc/XlHelperTests.cs +++ b/ClosedXML_Tests/Excel/Misc/XlHelperTests.cs @@ -1,95 +1,95 @@ -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class XlHelperTests - { - private static void CheckColumnNumber(int column) - { - Assert.AreEqual(column, XLHelper.GetColumnNumberFromLetter(XLHelper.GetColumnLetterFromNumber(column))); - } - - [Test] - public void InvalidA1Addresses() - { - Assert.IsFalse(XLHelper.IsValidA1Address("")); - Assert.IsFalse(XLHelper.IsValidA1Address("A")); - Assert.IsFalse(XLHelper.IsValidA1Address("a")); - Assert.IsFalse(XLHelper.IsValidA1Address("1")); - Assert.IsFalse(XLHelper.IsValidA1Address("-1")); - Assert.IsFalse(XLHelper.IsValidA1Address("AAAA1")); - Assert.IsFalse(XLHelper.IsValidA1Address("XFG1")); - - Assert.IsFalse(XLHelper.IsValidA1Address("@A1")); - Assert.IsFalse(XLHelper.IsValidA1Address("@AA1")); - Assert.IsFalse(XLHelper.IsValidA1Address("@AAA1")); - Assert.IsFalse(XLHelper.IsValidA1Address("[A1")); - Assert.IsFalse(XLHelper.IsValidA1Address("[AA1")); - Assert.IsFalse(XLHelper.IsValidA1Address("[AAA1")); - Assert.IsFalse(XLHelper.IsValidA1Address("{A1")); - Assert.IsFalse(XLHelper.IsValidA1Address("{AA1")); - Assert.IsFalse(XLHelper.IsValidA1Address("{AAA1")); - - Assert.IsFalse(XLHelper.IsValidA1Address("A1@")); - Assert.IsFalse(XLHelper.IsValidA1Address("AA1@")); - Assert.IsFalse(XLHelper.IsValidA1Address("AAA1@")); - Assert.IsFalse(XLHelper.IsValidA1Address("A1[")); - Assert.IsFalse(XLHelper.IsValidA1Address("AA1[")); - Assert.IsFalse(XLHelper.IsValidA1Address("AAA1[")); - Assert.IsFalse(XLHelper.IsValidA1Address("A1{")); - Assert.IsFalse(XLHelper.IsValidA1Address("AA1{")); - Assert.IsFalse(XLHelper.IsValidA1Address("AAA1{")); - - Assert.IsFalse(XLHelper.IsValidA1Address("@A1@")); - Assert.IsFalse(XLHelper.IsValidA1Address("@AA1@")); - Assert.IsFalse(XLHelper.IsValidA1Address("@AAA1@")); - Assert.IsFalse(XLHelper.IsValidA1Address("[A1[")); - Assert.IsFalse(XLHelper.IsValidA1Address("[AA1[")); - Assert.IsFalse(XLHelper.IsValidA1Address("[AAA1[")); - Assert.IsFalse(XLHelper.IsValidA1Address("{A1{")); - Assert.IsFalse(XLHelper.IsValidA1Address("{AA1{")); - Assert.IsFalse(XLHelper.IsValidA1Address("{AAA1{")); - } - - [Test] - public void PlusAA1_Is_Not_an_address() - { - Assert.IsFalse(XLHelper.IsValidA1Address("+AA1")); - } - - [Test] - public void TestConvertColumnLetterToNumberAnd() - { - CheckColumnNumber(1); - CheckColumnNumber(27); - CheckColumnNumber(28); - CheckColumnNumber(52); - CheckColumnNumber(53); - CheckColumnNumber(1000); - } - - [Test] - public void ValidA1Addresses() - { - Assert.IsTrue(XLHelper.IsValidA1Address("A1")); - Assert.IsTrue(XLHelper.IsValidA1Address("A" + XLHelper.MaxRowNumber)); - Assert.IsTrue(XLHelper.IsValidA1Address("Z1")); - Assert.IsTrue(XLHelper.IsValidA1Address("Z" + XLHelper.MaxRowNumber)); - - Assert.IsTrue(XLHelper.IsValidA1Address("AA1")); - Assert.IsTrue(XLHelper.IsValidA1Address("AA" + XLHelper.MaxRowNumber)); - Assert.IsTrue(XLHelper.IsValidA1Address("ZZ1")); - Assert.IsTrue(XLHelper.IsValidA1Address("ZZ" + XLHelper.MaxRowNumber)); - - Assert.IsTrue(XLHelper.IsValidA1Address("AAA1")); - Assert.IsTrue(XLHelper.IsValidA1Address("AAA" + XLHelper.MaxRowNumber)); - Assert.IsTrue(XLHelper.IsValidA1Address(XLHelper.MaxColumnLetter + "1")); - Assert.IsTrue(XLHelper.IsValidA1Address(XLHelper.MaxColumnLetter + XLHelper.MaxRowNumber)); - } - } +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class XlHelperTests + { + private static void CheckColumnNumber(int column) + { + Assert.AreEqual(column, XLHelper.GetColumnNumberFromLetter(XLHelper.GetColumnLetterFromNumber(column))); + } + + [Test] + public void InvalidA1Addresses() + { + Assert.IsFalse(XLHelper.IsValidA1Address("")); + Assert.IsFalse(XLHelper.IsValidA1Address("A")); + Assert.IsFalse(XLHelper.IsValidA1Address("a")); + Assert.IsFalse(XLHelper.IsValidA1Address("1")); + Assert.IsFalse(XLHelper.IsValidA1Address("-1")); + Assert.IsFalse(XLHelper.IsValidA1Address("AAAA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("XFG1")); + + Assert.IsFalse(XLHelper.IsValidA1Address("@A1")); + Assert.IsFalse(XLHelper.IsValidA1Address("@AA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("@AAA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("[A1")); + Assert.IsFalse(XLHelper.IsValidA1Address("[AA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("[AAA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("{A1")); + Assert.IsFalse(XLHelper.IsValidA1Address("{AA1")); + Assert.IsFalse(XLHelper.IsValidA1Address("{AAA1")); + + Assert.IsFalse(XLHelper.IsValidA1Address("A1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("AA1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("AAA1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("A1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("AA1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("AAA1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("A1{")); + Assert.IsFalse(XLHelper.IsValidA1Address("AA1{")); + Assert.IsFalse(XLHelper.IsValidA1Address("AAA1{")); + + Assert.IsFalse(XLHelper.IsValidA1Address("@A1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("@AA1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("@AAA1@")); + Assert.IsFalse(XLHelper.IsValidA1Address("[A1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("[AA1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("[AAA1[")); + Assert.IsFalse(XLHelper.IsValidA1Address("{A1{")); + Assert.IsFalse(XLHelper.IsValidA1Address("{AA1{")); + Assert.IsFalse(XLHelper.IsValidA1Address("{AAA1{")); + } + + [Test] + public void PlusAA1_Is_Not_an_address() + { + Assert.IsFalse(XLHelper.IsValidA1Address("+AA1")); + } + + [Test] + public void TestConvertColumnLetterToNumberAnd() + { + CheckColumnNumber(1); + CheckColumnNumber(27); + CheckColumnNumber(28); + CheckColumnNumber(52); + CheckColumnNumber(53); + CheckColumnNumber(1000); + } + + [Test] + public void ValidA1Addresses() + { + Assert.IsTrue(XLHelper.IsValidA1Address("A1")); + Assert.IsTrue(XLHelper.IsValidA1Address("A" + XLHelper.MaxRowNumber)); + Assert.IsTrue(XLHelper.IsValidA1Address("Z1")); + Assert.IsTrue(XLHelper.IsValidA1Address("Z" + XLHelper.MaxRowNumber)); + + Assert.IsTrue(XLHelper.IsValidA1Address("AA1")); + Assert.IsTrue(XLHelper.IsValidA1Address("AA" + XLHelper.MaxRowNumber)); + Assert.IsTrue(XLHelper.IsValidA1Address("ZZ1")); + Assert.IsTrue(XLHelper.IsValidA1Address("ZZ" + XLHelper.MaxRowNumber)); + + Assert.IsTrue(XLHelper.IsValidA1Address("AAA1")); + Assert.IsTrue(XLHelper.IsValidA1Address("AAA" + XLHelper.MaxRowNumber)); + Assert.IsTrue(XLHelper.IsValidA1Address(XLHelper.MaxColumnLetter + "1")); + Assert.IsTrue(XLHelper.IsValidA1Address(XLHelper.MaxColumnLetter + XLHelper.MaxRowNumber)); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Misc/XmlEncoderTests.cs b/ClosedXML_Tests/Excel/Misc/XmlEncoderTests.cs index d6bac0a..546b04e 100644 --- a/ClosedXML_Tests/Excel/Misc/XmlEncoderTests.cs +++ b/ClosedXML_Tests/Excel/Misc/XmlEncoderTests.cs @@ -1,4 +1,4 @@ -using ClosedXML.Utils; +using ClosedXML.Utils; using NUnit.Framework; namespace ClosedXML_Tests.Excel diff --git a/ClosedXML_Tests/Excel/NamedRanges/NamedRangesTests.cs b/ClosedXML_Tests/Excel/NamedRanges/NamedRangesTests.cs index be482fb..da78aab 100644 --- a/ClosedXML_Tests/Excel/NamedRanges/NamedRangesTests.cs +++ b/ClosedXML_Tests/Excel/NamedRanges/NamedRangesTests.cs @@ -1,112 +1,112 @@ -using System; -using System.Linq; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class NamedRangesTests - { - [Test] - public void MovingRanges() - { - var wb = new XLWorkbook(); - - IXLWorksheet sheet1 = wb.Worksheets.Add("Sheet1"); - IXLWorksheet sheet2 = wb.Worksheets.Add("Sheet2"); - - wb.NamedRanges.Add("wbNamedRange", - "Sheet1!$B$2,Sheet1!$B$3:$C$3,Sheet2!$D$3:$D$4,Sheet1!$6:$7,Sheet1!$F:$G"); - sheet1.NamedRanges.Add("sheet1NamedRange", - "Sheet1!$B$2,Sheet1!$B$3:$C$3,Sheet2!$D$3:$D$4,Sheet1!$6:$7,Sheet1!$F:$G"); - sheet2.NamedRanges.Add("sheet2NamedRange", "Sheet1!A1,Sheet2!A1"); - - sheet1.Row(1).InsertRowsAbove(2); - sheet1.Row(1).Delete(); - sheet1.Column(1).InsertColumnsBefore(2); - sheet1.Column(1).Delete(); - - - Assert.AreEqual("'Sheet1'!$C$3,'Sheet1'!$C$4:$D$4,Sheet2!$D$3:$D$4,'Sheet1'!$7:$8,'Sheet1'!$G:$H", - wb.NamedRanges.First().RefersTo); - Assert.AreEqual("'Sheet1'!$C$3,'Sheet1'!$C$4:$D$4,Sheet2!$D$3:$D$4,'Sheet1'!$7:$8,'Sheet1'!$G:$H", - sheet1.NamedRanges.First().RefersTo); - Assert.AreEqual("'Sheet1'!B2,Sheet2!A1", sheet2.NamedRanges.First().RefersTo); - } - - [Test] - public void WbContainsWsNamedRange() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().AddToNamed("Name", XLScope.Worksheet); - - Assert.IsTrue(wb.NamedRanges.Contains("Sheet1!Name")); - Assert.IsFalse(wb.NamedRanges.Contains("Sheet1!NameX")); - - Assert.IsNotNull(wb.NamedRange("Sheet1!Name")); - Assert.IsNull(wb.NamedRange("Sheet1!NameX")); - - IXLNamedRange range1; - Boolean result1 = wb.NamedRanges.TryGetValue("Sheet1!Name", out range1); - Assert.IsTrue(result1); - Assert.IsNotNull(range1); - - IXLNamedRange range2; - Boolean result2 = wb.NamedRanges.TryGetValue("Sheet1!NameX", out range2); - Assert.IsFalse(result2); - Assert.IsNull(range2); - } - - [Test] - public void WorkbookContainsNamedRange() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().AddToNamed("Name"); - - Assert.IsTrue(wb.NamedRanges.Contains("Name")); - Assert.IsFalse(wb.NamedRanges.Contains("NameX")); - - Assert.IsNotNull(wb.NamedRange("Name")); - Assert.IsNull(wb.NamedRange("NameX")); - - IXLNamedRange range1; - Boolean result1 = wb.NamedRanges.TryGetValue("Name", out range1); - Assert.IsTrue(result1); - Assert.IsNotNull(range1); - - IXLNamedRange range2; - Boolean result2 = wb.NamedRanges.TryGetValue("NameX", out range2); - Assert.IsFalse(result2); - Assert.IsNull(range2); - } - - [Test] - public void WorksheetContainsNamedRange() - { - IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); - ws.FirstCell().AddToNamed("Name", XLScope.Worksheet); - - Assert.IsTrue(ws.NamedRanges.Contains("Name")); - Assert.IsFalse(ws.NamedRanges.Contains("NameX")); - - Assert.IsNotNull(ws.NamedRange("Name")); - Assert.IsNull(ws.NamedRange("NameX")); - - IXLNamedRange range1; - Boolean result1 = ws.NamedRanges.TryGetValue("Name", out range1); - Assert.IsTrue(result1); - Assert.IsNotNull(range1); - - IXLNamedRange range2; - Boolean result2 = ws.NamedRanges.TryGetValue("NameX", out range2); - Assert.IsFalse(result2); - Assert.IsNull(range2); - } - } +using System; +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class NamedRangesTests + { + [Test] + public void MovingRanges() + { + var wb = new XLWorkbook(); + + IXLWorksheet sheet1 = wb.Worksheets.Add("Sheet1"); + IXLWorksheet sheet2 = wb.Worksheets.Add("Sheet2"); + + wb.NamedRanges.Add("wbNamedRange", + "Sheet1!$B$2,Sheet1!$B$3:$C$3,Sheet2!$D$3:$D$4,Sheet1!$6:$7,Sheet1!$F:$G"); + sheet1.NamedRanges.Add("sheet1NamedRange", + "Sheet1!$B$2,Sheet1!$B$3:$C$3,Sheet2!$D$3:$D$4,Sheet1!$6:$7,Sheet1!$F:$G"); + sheet2.NamedRanges.Add("sheet2NamedRange", "Sheet1!A1,Sheet2!A1"); + + sheet1.Row(1).InsertRowsAbove(2); + sheet1.Row(1).Delete(); + sheet1.Column(1).InsertColumnsBefore(2); + sheet1.Column(1).Delete(); + + + Assert.AreEqual("'Sheet1'!$C$3,'Sheet1'!$C$4:$D$4,Sheet2!$D$3:$D$4,'Sheet1'!$7:$8,'Sheet1'!$G:$H", + wb.NamedRanges.First().RefersTo); + Assert.AreEqual("'Sheet1'!$C$3,'Sheet1'!$C$4:$D$4,Sheet2!$D$3:$D$4,'Sheet1'!$7:$8,'Sheet1'!$G:$H", + sheet1.NamedRanges.First().RefersTo); + Assert.AreEqual("'Sheet1'!B2,Sheet2!A1", sheet2.NamedRanges.First().RefersTo); + } + + [Test] + public void WbContainsWsNamedRange() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().AddToNamed("Name", XLScope.Worksheet); + + Assert.IsTrue(wb.NamedRanges.Contains("Sheet1!Name")); + Assert.IsFalse(wb.NamedRanges.Contains("Sheet1!NameX")); + + Assert.IsNotNull(wb.NamedRange("Sheet1!Name")); + Assert.IsNull(wb.NamedRange("Sheet1!NameX")); + + IXLNamedRange range1; + Boolean result1 = wb.NamedRanges.TryGetValue("Sheet1!Name", out range1); + Assert.IsTrue(result1); + Assert.IsNotNull(range1); + + IXLNamedRange range2; + Boolean result2 = wb.NamedRanges.TryGetValue("Sheet1!NameX", out range2); + Assert.IsFalse(result2); + Assert.IsNull(range2); + } + + [Test] + public void WorkbookContainsNamedRange() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().AddToNamed("Name"); + + Assert.IsTrue(wb.NamedRanges.Contains("Name")); + Assert.IsFalse(wb.NamedRanges.Contains("NameX")); + + Assert.IsNotNull(wb.NamedRange("Name")); + Assert.IsNull(wb.NamedRange("NameX")); + + IXLNamedRange range1; + Boolean result1 = wb.NamedRanges.TryGetValue("Name", out range1); + Assert.IsTrue(result1); + Assert.IsNotNull(range1); + + IXLNamedRange range2; + Boolean result2 = wb.NamedRanges.TryGetValue("NameX", out range2); + Assert.IsFalse(result2); + Assert.IsNull(range2); + } + + [Test] + public void WorksheetContainsNamedRange() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.FirstCell().AddToNamed("Name", XLScope.Worksheet); + + Assert.IsTrue(ws.NamedRanges.Contains("Name")); + Assert.IsFalse(ws.NamedRanges.Contains("NameX")); + + Assert.IsNotNull(ws.NamedRange("Name")); + Assert.IsNull(ws.NamedRange("NameX")); + + IXLNamedRange range1; + Boolean result1 = ws.NamedRanges.TryGetValue("Name", out range1); + Assert.IsTrue(result1); + Assert.IsNotNull(range1); + + IXLNamedRange range2; + Boolean result2 = ws.NamedRanges.TryGetValue("NameX", out range2); + Assert.IsFalse(result2); + Assert.IsNull(range2); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/PageSetup/PageBreaksTests.cs b/ClosedXML_Tests/Excel/PageSetup/PageBreaksTests.cs index 04d7464..ff1673c 100644 --- a/ClosedXML_Tests/Excel/PageSetup/PageBreaksTests.cs +++ b/ClosedXML_Tests/Excel/PageSetup/PageBreaksTests.cs @@ -1,4 +1,4 @@ -using System.Diagnostics; +using System.Diagnostics; using ClosedXML.Excel; using NUnit.Framework; diff --git a/ClosedXML_Tests/Excel/PivotTables/XLPivotTableTests.cs b/ClosedXML_Tests/Excel/PivotTables/XLPivotTableTests.cs index 345daa6..0ca0d40 100644 --- a/ClosedXML_Tests/Excel/PivotTables/XLPivotTableTests.cs +++ b/ClosedXML_Tests/Excel/PivotTables/XLPivotTableTests.cs @@ -1,15 +1,15 @@ -using ClosedXML_Examples; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class XLPivotTableTests - { - [Test] - public void PivotTables() - { - TestHelper.RunTestExample(@"PivotTables\PivotTables.xlsx"); - } - } -} +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLPivotTableTests + { + [Test] + public void PivotTables() + { + TestHelper.RunTestExample(@"PivotTables\PivotTables.xlsx"); + } + } +} diff --git a/ClosedXML_Tests/Excel/Ranges/CopyingRangesTests.cs b/ClosedXML_Tests/Excel/Ranges/CopyingRangesTests.cs index 99c9aaf..426daf5 100644 --- a/ClosedXML_Tests/Excel/Ranges/CopyingRangesTests.cs +++ b/ClosedXML_Tests/Excel/Ranges/CopyingRangesTests.cs @@ -1,86 +1,86 @@ -using System.Drawing; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class CopyingRangesTests - { - [Test] - public void CopyingColumns() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet"); - - IXLColumn column1 = ws.Column(1); - column1.Cell(1).Style.Fill.SetBackgroundColor(XLColor.Red); - column1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.FromArgb(1, 1, 1)); - column1.Cell(3).Style.Fill.SetBackgroundColor(XLColor.FromHtml("#CCCCCC")); - column1.Cell(4).Style.Fill.SetBackgroundColor(XLColor.FromIndex(26)); - column1.Cell(5).Style.Fill.SetBackgroundColor(XLColor.FromKnownColor(KnownColor.MediumSeaGreen)); - column1.Cell(6).Style.Fill.SetBackgroundColor(XLColor.FromName("Blue")); - column1.Cell(7).Style.Fill.SetBackgroundColor(XLColor.FromTheme(XLThemeColor.Accent3)); - - ws.Cell(1, 2).Value = column1; - ws.Cell(1, 3).Value = column1.Column(1, 7); - - IXLColumn column2 = ws.Column(2); - Assert.AreEqual(XLColor.Red, column2.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromArgb(1, 1, 1), column2.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), column2.Cell(3).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromIndex(26), column2.Cell(4).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromKnownColor(KnownColor.MediumSeaGreen), - column2.Cell(5).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromName("Blue"), column2.Cell(6).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), column2.Cell(7).Style.Fill.BackgroundColor); - - IXLColumn column3 = ws.Column(3); - Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromArgb(1, 1, 1), column3.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), column3.Cell(3).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromIndex(26), column3.Cell(4).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromKnownColor(KnownColor.MediumSeaGreen), - column3.Cell(5).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromName("Blue"), column3.Cell(6).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), column3.Cell(7).Style.Fill.BackgroundColor); - } - - [Test] - public void CopyingRows() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet"); - - IXLRow row1 = ws.Row(1); - row1.Cell(1).Style.Fill.SetBackgroundColor(XLColor.Red); - row1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.FromArgb(1, 1, 1)); - row1.Cell(3).Style.Fill.SetBackgroundColor(XLColor.FromHtml("#CCCCCC")); - row1.Cell(4).Style.Fill.SetBackgroundColor(XLColor.FromIndex(26)); - row1.Cell(5).Style.Fill.SetBackgroundColor(XLColor.FromKnownColor(KnownColor.MediumSeaGreen)); - row1.Cell(6).Style.Fill.SetBackgroundColor(XLColor.FromName("Blue")); - row1.Cell(7).Style.Fill.SetBackgroundColor(XLColor.FromTheme(XLThemeColor.Accent3)); - - ws.Cell(2, 1).Value = row1; - ws.Cell(3, 1).Value = row1.Row(1, 7); - - IXLRow row2 = ws.Row(2); - Assert.AreEqual(XLColor.Red, row2.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromArgb(1, 1, 1), row2.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), row2.Cell(3).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromIndex(26), row2.Cell(4).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromKnownColor(KnownColor.MediumSeaGreen), row2.Cell(5).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromName("Blue"), row2.Cell(6).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), row2.Cell(7).Style.Fill.BackgroundColor); - - IXLRow row3 = ws.Row(3); - Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromArgb(1, 1, 1), row3.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), row3.Cell(3).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromIndex(26), row3.Cell(4).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromKnownColor(KnownColor.MediumSeaGreen), row3.Cell(5).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromName("Blue"), row3.Cell(6).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), row3.Cell(7).Style.Fill.BackgroundColor); - } - } +using System.Drawing; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class CopyingRangesTests + { + [Test] + public void CopyingColumns() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + IXLColumn column1 = ws.Column(1); + column1.Cell(1).Style.Fill.SetBackgroundColor(XLColor.Red); + column1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.FromArgb(1, 1, 1)); + column1.Cell(3).Style.Fill.SetBackgroundColor(XLColor.FromHtml("#CCCCCC")); + column1.Cell(4).Style.Fill.SetBackgroundColor(XLColor.FromIndex(26)); + column1.Cell(5).Style.Fill.SetBackgroundColor(XLColor.FromKnownColor(KnownColor.MediumSeaGreen)); + column1.Cell(6).Style.Fill.SetBackgroundColor(XLColor.FromName("Blue")); + column1.Cell(7).Style.Fill.SetBackgroundColor(XLColor.FromTheme(XLThemeColor.Accent3)); + + ws.Cell(1, 2).Value = column1; + ws.Cell(1, 3).Value = column1.Column(1, 7); + + IXLColumn column2 = ws.Column(2); + Assert.AreEqual(XLColor.Red, column2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromArgb(1, 1, 1), column2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), column2.Cell(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromIndex(26), column2.Cell(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromKnownColor(KnownColor.MediumSeaGreen), + column2.Cell(5).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromName("Blue"), column2.Cell(6).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), column2.Cell(7).Style.Fill.BackgroundColor); + + IXLColumn column3 = ws.Column(3); + Assert.AreEqual(XLColor.Red, column3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromArgb(1, 1, 1), column3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), column3.Cell(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromIndex(26), column3.Cell(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromKnownColor(KnownColor.MediumSeaGreen), + column3.Cell(5).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromName("Blue"), column3.Cell(6).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), column3.Cell(7).Style.Fill.BackgroundColor); + } + + [Test] + public void CopyingRows() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + IXLRow row1 = ws.Row(1); + row1.Cell(1).Style.Fill.SetBackgroundColor(XLColor.Red); + row1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.FromArgb(1, 1, 1)); + row1.Cell(3).Style.Fill.SetBackgroundColor(XLColor.FromHtml("#CCCCCC")); + row1.Cell(4).Style.Fill.SetBackgroundColor(XLColor.FromIndex(26)); + row1.Cell(5).Style.Fill.SetBackgroundColor(XLColor.FromKnownColor(KnownColor.MediumSeaGreen)); + row1.Cell(6).Style.Fill.SetBackgroundColor(XLColor.FromName("Blue")); + row1.Cell(7).Style.Fill.SetBackgroundColor(XLColor.FromTheme(XLThemeColor.Accent3)); + + ws.Cell(2, 1).Value = row1; + ws.Cell(3, 1).Value = row1.Row(1, 7); + + IXLRow row2 = ws.Row(2); + Assert.AreEqual(XLColor.Red, row2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromArgb(1, 1, 1), row2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), row2.Cell(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromIndex(26), row2.Cell(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromKnownColor(KnownColor.MediumSeaGreen), row2.Cell(5).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromName("Blue"), row2.Cell(6).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), row2.Cell(7).Style.Fill.BackgroundColor); + + IXLRow row3 = ws.Row(3); + Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromArgb(1, 1, 1), row3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromHtml("#CCCCCC"), row3.Cell(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromIndex(26), row3.Cell(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromKnownColor(KnownColor.MediumSeaGreen), row3.Cell(5).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromName("Blue"), row3.Cell(6).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FromTheme(XLThemeColor.Accent3), row3.Cell(7).Style.Fill.BackgroundColor); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Ranges/InsertingRangesTests.cs b/ClosedXML_Tests/Excel/Ranges/InsertingRangesTests.cs index a614b55..fb0c98f 100644 --- a/ClosedXML_Tests/Excel/Ranges/InsertingRangesTests.cs +++ b/ClosedXML_Tests/Excel/Ranges/InsertingRangesTests.cs @@ -1,113 +1,113 @@ -using System.Linq; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class InsertingRangesTests - { - [Test] - public void InsertingColumnsPreservesFormatting() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet"); - IXLColumn column1 = ws.Column(1); - column1.Style.Fill.SetBackgroundColor(XLColor.FrenchLilac); - column1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.Fulvous); - IXLColumn column2 = ws.Column(2); - column2.Style.Fill.SetBackgroundColor(XLColor.Xanadu); - column2.Cell(2).Style.Fill.SetBackgroundColor(XLColor.MacaroniAndCheese); - - column1.InsertColumnsAfter(1); - column1.InsertColumnsBefore(1); - column2.InsertColumnsBefore(1); - - Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FrenchLilac, ws.Column(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FrenchLilac, ws.Column(3).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FrenchLilac, ws.Column(4).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Xanadu, ws.Column(5).Style.Fill.BackgroundColor); - - Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Cell(2, 1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 3).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 4).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.MacaroniAndCheese, ws.Cell(2, 5).Style.Fill.BackgroundColor); - } - - [Test] - public void InsertingRowsAbove() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet"); - - ws.Cell("B3").SetValue("X") - .CellBelow().SetValue("B"); - - IXLRangeRow r = ws.Range("B4").InsertRowsAbove(1).First(); - r.Cell(1).SetValue("A"); - - Assert.AreEqual("X", ws.Cell("B3").GetString()); - Assert.AreEqual("A", ws.Cell("B4").GetString()); - Assert.AreEqual("B", ws.Cell("B5").GetString()); - } - - [Test] - public void InsertingRowsPreservesFormatting() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet"); - IXLRow row1 = ws.Row(1); - row1.Style.Fill.SetBackgroundColor(XLColor.FrenchLilac); - row1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.Fulvous); - IXLRow row2 = ws.Row(2); - row2.Style.Fill.SetBackgroundColor(XLColor.Xanadu); - row2.Cell(2).Style.Fill.SetBackgroundColor(XLColor.MacaroniAndCheese); - - row1.InsertRowsBelow(1); - row1.InsertRowsAbove(1); - row2.InsertRowsAbove(1); - - Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FrenchLilac, ws.Row(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FrenchLilac, ws.Row(3).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.FrenchLilac, ws.Row(4).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Xanadu, ws.Row(5).Style.Fill.BackgroundColor); - - Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Cell(1, 2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Fulvous, ws.Cell(3, 2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Fulvous, ws.Cell(4, 2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.MacaroniAndCheese, ws.Cell(5, 2).Style.Fill.BackgroundColor); - } - - [Test] - public void InsertingRowsPreservesComments() - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Sheet1"); - - ws.Cell("A1").SetValue("Insert Below"); - ws.Cell("A2").SetValue("Already existing cell"); - ws.Cell("A3").SetValue("Cell with comment").Comment.AddText("Comment here"); - - ws.Row(1).InsertRowsBelow(2); - Assert.AreEqual("Comment here", ws.Cell("A5").Comment.Text); - } - - [Test] - public void InsertingColumnsPreservesComments() - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Sheet1"); - - ws.Cell("A1").SetValue("Insert to the right"); - ws.Cell("B1").SetValue("Already existing cell"); - ws.Cell("C1").SetValue("Cell with comment").Comment.AddText("Comment here"); - - ws.Column(1).InsertColumnsAfter(2); - Assert.AreEqual("Comment here", ws.Cell("E1").Comment.Text); - } - } -} +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class InsertingRangesTests + { + [Test] + public void InsertingColumnsPreservesFormatting() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + IXLColumn column1 = ws.Column(1); + column1.Style.Fill.SetBackgroundColor(XLColor.FrenchLilac); + column1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.Fulvous); + IXLColumn column2 = ws.Column(2); + column2.Style.Fill.SetBackgroundColor(XLColor.Xanadu); + column2.Cell(2).Style.Fill.SetBackgroundColor(XLColor.MacaroniAndCheese); + + column1.InsertColumnsAfter(1); + column1.InsertColumnsBefore(1); + column2.InsertColumnsBefore(1); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Column(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Column(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Column(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Column(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Xanadu, ws.Column(5).Style.Fill.BackgroundColor); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Cell(2, 1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.MacaroniAndCheese, ws.Cell(2, 5).Style.Fill.BackgroundColor); + } + + [Test] + public void InsertingRowsAbove() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + + ws.Cell("B3").SetValue("X") + .CellBelow().SetValue("B"); + + IXLRangeRow r = ws.Range("B4").InsertRowsAbove(1).First(); + r.Cell(1).SetValue("A"); + + Assert.AreEqual("X", ws.Cell("B3").GetString()); + Assert.AreEqual("A", ws.Cell("B4").GetString()); + Assert.AreEqual("B", ws.Cell("B5").GetString()); + } + + [Test] + public void InsertingRowsPreservesFormatting() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + IXLRow row1 = ws.Row(1); + row1.Style.Fill.SetBackgroundColor(XLColor.FrenchLilac); + row1.Cell(2).Style.Fill.SetBackgroundColor(XLColor.Fulvous); + IXLRow row2 = ws.Row(2); + row2.Style.Fill.SetBackgroundColor(XLColor.Xanadu); + row2.Cell(2).Style.Fill.SetBackgroundColor(XLColor.MacaroniAndCheese); + + row1.InsertRowsBelow(1); + row1.InsertRowsAbove(1); + row2.InsertRowsAbove(1); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Row(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Row(3).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.FrenchLilac, ws.Row(4).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Xanadu, ws.Row(5).Style.Fill.BackgroundColor); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Cell(1, 2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(2, 2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(3, 2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Fulvous, ws.Cell(4, 2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.MacaroniAndCheese, ws.Cell(5, 2).Style.Fill.BackgroundColor); + } + + [Test] + public void InsertingRowsPreservesComments() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + + ws.Cell("A1").SetValue("Insert Below"); + ws.Cell("A2").SetValue("Already existing cell"); + ws.Cell("A3").SetValue("Cell with comment").Comment.AddText("Comment here"); + + ws.Row(1).InsertRowsBelow(2); + Assert.AreEqual("Comment here", ws.Cell("A5").Comment.Text); + } + + [Test] + public void InsertingColumnsPreservesComments() + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + + ws.Cell("A1").SetValue("Insert to the right"); + ws.Cell("B1").SetValue("Already existing cell"); + ws.Cell("C1").SetValue("Cell with comment").Comment.AddText("Comment here"); + + ws.Column(1).InsertColumnsAfter(2); + Assert.AreEqual("Comment here", ws.Cell("E1").Comment.Text); + } + } +} diff --git a/ClosedXML_Tests/Excel/Ranges/MergedRangesTests.cs b/ClosedXML_Tests/Excel/Ranges/MergedRangesTests.cs index fad6c2e..41c128c 100644 --- a/ClosedXML_Tests/Excel/Ranges/MergedRangesTests.cs +++ b/ClosedXML_Tests/Excel/Ranges/MergedRangesTests.cs @@ -1,23 +1,23 @@ -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class MergedRangesTests - { - [Test] - public void LastCellFromMerge() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet"); - ws.Range("B2:D4").Merge(); - - string first = ws.FirstCellUsed(true).Address.ToStringRelative(); - string last = ws.LastCellUsed(true).Address.ToStringRelative(); - - Assert.AreEqual("B2", first); - Assert.AreEqual("D4", last); - } - } +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class MergedRangesTests + { + [Test] + public void LastCellFromMerge() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet"); + ws.Range("B2:D4").Merge(); + + string first = ws.FirstCellUsed(true).Address.ToStringRelative(); + string last = ws.LastCellUsed(true).Address.ToStringRelative(); + + Assert.AreEqual("B2", first); + Assert.AreEqual("D4", last); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Ranges/RangeUsedTests.cs b/ClosedXML_Tests/Excel/Ranges/RangeUsedTests.cs index 5ec0500..3c69051 100644 --- a/ClosedXML_Tests/Excel/Ranges/RangeUsedTests.cs +++ b/ClosedXML_Tests/Excel/Ranges/RangeUsedTests.cs @@ -1,36 +1,36 @@ -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class RangeUsedTests - { - [Test] - public void CanGetNamedFromAnother() - { - var wb = new XLWorkbook(); - var ws1 = wb.Worksheets.Add("Sheet1"); - ws1.Cell("A1").SetValue(1).AddToNamed("value1"); - - Assert.AreEqual(1, wb.Cell("value1").GetValue()); - Assert.AreEqual(1, wb.Range("value1").FirstCell().GetValue()); - - Assert.AreEqual(1, ws1.Cell("value1").GetValue()); - Assert.AreEqual(1, ws1.Range("value1").FirstCell().GetValue()); - - var ws2 = wb.Worksheets.Add("Sheet2"); - - ws2.Cell("A1").SetFormulaA1("=value1").AddToNamed("value2"); - - Assert.AreEqual(1, wb.Cell("value2").GetValue()); - Assert.AreEqual(1, wb.Range("value2").FirstCell().GetValue()); - - Assert.AreEqual(1, ws2.Cell("value1").GetValue()); - Assert.AreEqual(1, ws2.Range("value1").FirstCell().GetValue()); - - Assert.AreEqual(1, ws2.Cell("value2").GetValue()); - Assert.AreEqual(1, ws2.Range("value2").FirstCell().GetValue()); - } - } +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class RangeUsedTests + { + [Test] + public void CanGetNamedFromAnother() + { + var wb = new XLWorkbook(); + var ws1 = wb.Worksheets.Add("Sheet1"); + ws1.Cell("A1").SetValue(1).AddToNamed("value1"); + + Assert.AreEqual(1, wb.Cell("value1").GetValue()); + Assert.AreEqual(1, wb.Range("value1").FirstCell().GetValue()); + + Assert.AreEqual(1, ws1.Cell("value1").GetValue()); + Assert.AreEqual(1, ws1.Range("value1").FirstCell().GetValue()); + + var ws2 = wb.Worksheets.Add("Sheet2"); + + ws2.Cell("A1").SetFormulaA1("=value1").AddToNamed("value2"); + + Assert.AreEqual(1, wb.Cell("value2").GetValue()); + Assert.AreEqual(1, wb.Range("value2").FirstCell().GetValue()); + + Assert.AreEqual(1, ws2.Cell("value1").GetValue()); + Assert.AreEqual(1, ws2.Range("value1").FirstCell().GetValue()); + + Assert.AreEqual(1, ws2.Cell("value2").GetValue()); + Assert.AreEqual(1, ws2.Range("value2").FirstCell().GetValue()); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Ranges/UsedAndUnusedCellsTests.cs b/ClosedXML_Tests/Excel/Ranges/UsedAndUnusedCellsTests.cs index a096c33..a4442c6 100644 --- a/ClosedXML_Tests/Excel/Ranges/UsedAndUnusedCellsTests.cs +++ b/ClosedXML_Tests/Excel/Ranges/UsedAndUnusedCellsTests.cs @@ -1,4 +1,4 @@ -using ClosedXML.Excel; +using ClosedXML.Excel; using NUnit.Framework; using System; using System.Collections.Generic; diff --git a/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs b/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs index f4e223a..0d74a60 100644 --- a/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs +++ b/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs @@ -1,29 +1,29 @@ -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class XLRangeAddressTests - { - [Test] - public void ToStringTest() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRangeAddress address = ws.Cell(1, 1).AsRange().RangeAddress; - - Assert.AreEqual("A1:A1", address.ToString()); - - Assert.AreEqual("A1:A1", address.ToStringRelative()); - Assert.AreEqual("'Sheet1'!A1:A1", address.ToStringRelative(true)); - - Assert.AreEqual("$A$1:$A$1", address.ToStringFixed()); - Assert.AreEqual("$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.A1)); - Assert.AreEqual("R1C1:R1C1", address.ToStringFixed(XLReferenceStyle.R1C1)); - Assert.AreEqual("$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.Default)); - Assert.AreEqual("'Sheet1'!$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.A1, true)); - Assert.AreEqual("'Sheet1'!R1C1:R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true)); - Assert.AreEqual("'Sheet1'!$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.Default, true)); - } - } +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLRangeAddressTests + { + [Test] + public void ToStringTest() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRangeAddress address = ws.Cell(1, 1).AsRange().RangeAddress; + + Assert.AreEqual("A1:A1", address.ToString()); + + Assert.AreEqual("A1:A1", address.ToStringRelative()); + Assert.AreEqual("'Sheet1'!A1:A1", address.ToStringRelative(true)); + + Assert.AreEqual("$A$1:$A$1", address.ToStringFixed()); + Assert.AreEqual("$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.A1)); + Assert.AreEqual("R1C1:R1C1", address.ToStringFixed(XLReferenceStyle.R1C1)); + Assert.AreEqual("$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.Default)); + Assert.AreEqual("'Sheet1'!$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("'Sheet1'!R1C1:R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + Assert.AreEqual("'Sheet1'!$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.Default, true)); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs b/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs index 22bd7c6..348b213 100644 --- a/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs +++ b/ClosedXML_Tests/Excel/Ranges/XLRangeBaseTests.cs @@ -1,190 +1,190 @@ -using System; -using System.Linq; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class XLRangeBaseTests - { - [Test] - public void IsEmpty1() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - IXLRange range = ws.Range("A1:B2"); - bool actual = range.IsEmpty(); - bool expected = true; - Assert.AreEqual(expected, actual); - } - - [Test] - public void IsEmpty2() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - IXLRange range = ws.Range("A1:B2"); - bool actual = range.IsEmpty(true); - bool expected = true; - Assert.AreEqual(expected, actual); - } - - [Test] - public void IsEmpty3() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.Style.Fill.BackgroundColor = XLColor.Red; - IXLRange range = ws.Range("A1:B2"); - bool actual = range.IsEmpty(); - bool expected = true; - Assert.AreEqual(expected, actual); - } - - [Test] - public void IsEmpty4() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.Style.Fill.BackgroundColor = XLColor.Red; - IXLRange range = ws.Range("A1:B2"); - bool actual = range.IsEmpty(false); - bool expected = true; - Assert.AreEqual(expected, actual); - } - - [Test] - public void IsEmpty5() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.Style.Fill.BackgroundColor = XLColor.Red; - IXLRange range = ws.Range("A1:B2"); - bool actual = range.IsEmpty(true); - bool expected = false; - Assert.AreEqual(expected, actual); - } - - [Test] - public void IsEmpty6() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.Value = "X"; - IXLRange range = ws.Range("A1:B2"); - bool actual = range.IsEmpty(); - bool expected = false; - Assert.AreEqual(expected, actual); - } - - [Test] - public void SingleCell() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(1, 1).Value = "Hello World!"; - wb.NamedRanges.Add("SingleCell", "Sheet1!$A$1"); - IXLRange range = wb.Range("SingleCell"); - Assert.AreEqual(1, range.CellsUsed().Count()); - Assert.AreEqual("Hello World!", range.CellsUsed().Single().GetString()); - } - - [Test] - public void TableRange() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - IXLRangeColumn rangeColumn = ws.Column(1).Column(1, 4); - rangeColumn.Cell(1).Value = "FName"; - rangeColumn.Cell(2).Value = "John"; - rangeColumn.Cell(3).Value = "Hank"; - rangeColumn.Cell(4).Value = "Dagny"; - IXLTable table = rangeColumn.CreateTable(); - wb.NamedRanges.Add("FNameColumn", String.Format("{0}[{1}]", table.Name, "FName")); - - IXLRange namedRange = wb.Range("FNameColumn"); - Assert.AreEqual(3, namedRange.Cells().Count()); - Assert.IsTrue( - namedRange.CellsUsed().Select(cell => cell.GetString()).SequenceEqual(new[] {"John", "Hank", "Dagny"})); - } - - [Test] - public void WsNamedCell() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell", XLScope.Worksheet); - Assert.AreEqual("Test", ws.Cell("TestCell").GetString()); - } - - [Test] - public void WsNamedCells() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell", XLScope.Worksheet); - ws.Cell(2, 1).SetValue("B"); - IXLCells cells = ws.Cells("TestCell, A2"); - Assert.AreEqual("Test", cells.First().GetString()); - Assert.AreEqual("B", cells.Last().GetString()); - } - - [Test] - public void WsNamedRange() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(1, 1).SetValue("A"); - ws.Cell(2, 1).SetValue("B"); - IXLRange original = ws.Range("A1:A2"); - original.AddToNamed("TestRange", XLScope.Worksheet); - IXLRange named = ws.Range("TestRange"); - Assert.AreEqual(original.RangeAddress.ToStringFixed(), named.RangeAddress.ToString()); - } - - [Test] - public void WsNamedRanges() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(1, 1).SetValue("A"); - ws.Cell(2, 1).SetValue("B"); - ws.Cell(3, 1).SetValue("C"); - IXLRange original = ws.Range("A1:A2"); - original.AddToNamed("TestRange", XLScope.Worksheet); - IXLRanges namedRanges = ws.Ranges("TestRange, A3"); - Assert.AreEqual(original.RangeAddress.ToStringFixed(), namedRanges.First().RangeAddress.ToString()); - Assert.AreEqual("$A$3:$A$3", namedRanges.Last().RangeAddress.ToStringFixed()); - } - - [Test] - public void WsNamedRangesOneString() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.NamedRanges.Add("TestRange", "Sheet1!$A$1,Sheet1!$A$3"); - IXLRanges namedRanges = ws.Ranges("TestRange"); - - Assert.AreEqual("$A$1:$A$1", namedRanges.First().RangeAddress.ToStringFixed()); - Assert.AreEqual("$A$3:$A$3", namedRanges.Last().RangeAddress.ToStringFixed()); - } - - //[Test] - //public void WsNamedRangeLiteral() - //{ - // var wb = new XLWorkbook(); - // var ws = wb.Worksheets.Add("Sheet1"); - // ws.NamedRanges.Add("TestRange", "\"Hello\""); - // using (MemoryStream memoryStream = new MemoryStream()) - // { - // wb.SaveAs(memoryStream, true); - // var wb2 = new XLWorkbook(memoryStream); - // var text = wb2.Worksheet("Sheet1").NamedRanges.First() - // memoryStream.Close(); - // } - - - //} - } -} +using System; +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLRangeBaseTests + { + [Test] + public void IsEmpty1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(true); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty3() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty4() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(false); + bool expected = true; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty5() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Style.Fill.BackgroundColor = XLColor.Red; + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(true); + bool expected = false; + Assert.AreEqual(expected, actual); + } + + [Test] + public void IsEmpty6() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.Value = "X"; + IXLRange range = ws.Range("A1:B2"); + bool actual = range.IsEmpty(); + bool expected = false; + Assert.AreEqual(expected, actual); + } + + [Test] + public void SingleCell() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).Value = "Hello World!"; + wb.NamedRanges.Add("SingleCell", "Sheet1!$A$1"); + IXLRange range = wb.Range("SingleCell"); + Assert.AreEqual(1, range.CellsUsed().Count()); + Assert.AreEqual("Hello World!", range.CellsUsed().Single().GetString()); + } + + [Test] + public void TableRange() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + IXLRangeColumn rangeColumn = ws.Column(1).Column(1, 4); + rangeColumn.Cell(1).Value = "FName"; + rangeColumn.Cell(2).Value = "John"; + rangeColumn.Cell(3).Value = "Hank"; + rangeColumn.Cell(4).Value = "Dagny"; + IXLTable table = rangeColumn.CreateTable(); + wb.NamedRanges.Add("FNameColumn", String.Format("{0}[{1}]", table.Name, "FName")); + + IXLRange namedRange = wb.Range("FNameColumn"); + Assert.AreEqual(3, namedRange.Cells().Count()); + Assert.IsTrue( + namedRange.CellsUsed().Select(cell => cell.GetString()).SequenceEqual(new[] {"John", "Hank", "Dagny"})); + } + + [Test] + public void WsNamedCell() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell", XLScope.Worksheet); + Assert.AreEqual("Test", ws.Cell("TestCell").GetString()); + } + + [Test] + public void WsNamedCells() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("Test").AddToNamed("TestCell", XLScope.Worksheet); + ws.Cell(2, 1).SetValue("B"); + IXLCells cells = ws.Cells("TestCell, A2"); + Assert.AreEqual("Test", cells.First().GetString()); + Assert.AreEqual("B", cells.Last().GetString()); + } + + [Test] + public void WsNamedRange() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("A"); + ws.Cell(2, 1).SetValue("B"); + IXLRange original = ws.Range("A1:A2"); + original.AddToNamed("TestRange", XLScope.Worksheet); + IXLRange named = ws.Range("TestRange"); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), named.RangeAddress.ToString()); + } + + [Test] + public void WsNamedRanges() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).SetValue("A"); + ws.Cell(2, 1).SetValue("B"); + ws.Cell(3, 1).SetValue("C"); + IXLRange original = ws.Range("A1:A2"); + original.AddToNamed("TestRange", XLScope.Worksheet); + IXLRanges namedRanges = ws.Ranges("TestRange, A3"); + Assert.AreEqual(original.RangeAddress.ToStringFixed(), namedRanges.First().RangeAddress.ToString()); + Assert.AreEqual("$A$3:$A$3", namedRanges.Last().RangeAddress.ToStringFixed()); + } + + [Test] + public void WsNamedRangesOneString() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.NamedRanges.Add("TestRange", "Sheet1!$A$1,Sheet1!$A$3"); + IXLRanges namedRanges = ws.Ranges("TestRange"); + + Assert.AreEqual("$A$1:$A$1", namedRanges.First().RangeAddress.ToStringFixed()); + Assert.AreEqual("$A$3:$A$3", namedRanges.Last().RangeAddress.ToStringFixed()); + } + + //[Test] + //public void WsNamedRangeLiteral() + //{ + // var wb = new XLWorkbook(); + // var ws = wb.Worksheets.Add("Sheet1"); + // ws.NamedRanges.Add("TestRange", "\"Hello\""); + // using (MemoryStream memoryStream = new MemoryStream()) + // { + // wb.SaveAs(memoryStream, true); + // var wb2 = new XLWorkbook(memoryStream); + // var text = wb2.Worksheet("Sheet1").NamedRanges.First() + // memoryStream.Close(); + // } + + + //} + } +} diff --git a/ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs b/ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs index 729d680..0bef674 100644 --- a/ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs +++ b/ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs @@ -1,672 +1,672 @@ -using System; -using System.Linq; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - /// - /// This is a test class for XLRichStringTests and is intended - /// to contain all XLRichStringTests Unit Tests - /// - [TestFixture] - public class XLRichStringTests - { - [Test] - public void AccessRichTextTest1() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.RichText.AddText("12"); - cell.DataType = XLCellValues.Number; - - Assert.AreEqual(12.0, cell.GetDouble()); - - IXLRichText richText = cell.RichText; - - Assert.AreEqual("12", richText.ToString()); - - richText.AddText("34"); - - Assert.AreEqual("1234", cell.GetString()); - - Assert.AreEqual(XLCellValues.Number, cell.DataType); - - Assert.AreEqual(1234.0, cell.GetDouble()); - } - - /// - /// A test for AddText - /// - [Test] - public void AddTextTest1() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - IXLRichText richString = cell.RichText; - - string text = "Hello"; - richString.AddText(text).SetBold().SetFontColor(XLColor.Red); - - Assert.AreEqual(cell.GetString(), text); - Assert.AreEqual(cell.RichText.First().Bold, true); - Assert.AreEqual(cell.RichText.First().FontColor, XLColor.Red); - - Assert.AreEqual(1, richString.Count); - - richString.AddText("World"); - Assert.AreEqual(richString.First().Text, text, "Item in collection is not the same as the one returned"); - } - - [Test] - public void AddTextTest2() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - Int32 number = 123; - - cell.SetValue(number).Style - .Font.SetBold() - .Font.SetFontColor(XLColor.Red); - - string text = number.ToString(); - - Assert.AreEqual(cell.RichText.ToString(), text); - Assert.AreEqual(cell.RichText.First().Bold, true); - Assert.AreEqual(cell.RichText.First().FontColor, XLColor.Red); - - Assert.AreEqual(1, cell.RichText.Count); - - cell.RichText.AddText("World"); - Assert.AreEqual(cell.RichText.First().Text, text, "Item in collection is not the same as the one returned"); - } - - [Test] - public void AddTextTest3() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - Int32 number = 123; - cell.Value = number; - cell.Style - .Font.SetBold() - .Font.SetFontColor(XLColor.Red); - - string text = number.ToString(); - - Assert.AreEqual(cell.RichText.ToString(), text); - Assert.AreEqual(cell.RichText.First().Bold, true); - Assert.AreEqual(cell.RichText.First().FontColor, XLColor.Red); - - Assert.AreEqual(1, cell.RichText.Count); - - cell.RichText.AddText("World"); - Assert.AreEqual(cell.RichText.First().Text, text, "Item in collection is not the same as the one returned"); - } - - /// - /// A test for Clear - /// - [Test] - public void ClearTest() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Hello"); - richString.AddText(" "); - richString.AddText("World!"); - - richString.ClearText(); - String expected = String.Empty; - String actual = richString.ToString(); - Assert.AreEqual(expected, actual); - - Assert.AreEqual(0, richString.Count); - } - - [Test] - public void CountTest() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Hello"); - richString.AddText(" "); - richString.AddText("World!"); - - Assert.AreEqual(3, richString.Count); - } - - [Test] - public void HasRichTextTest1() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLCell cell = ws.Cell(1, 1); - cell.RichText.AddText("123"); - - Assert.AreEqual(true, cell.HasRichText); - - cell.DataType = XLCellValues.Text; - - Assert.AreEqual(true, cell.HasRichText); - - cell.DataType = XLCellValues.Number; - - Assert.AreEqual(false, cell.HasRichText); - - cell.RichText.AddText("123"); - - Assert.AreEqual(true, cell.HasRichText); - - cell.Value = 123; - - Assert.AreEqual(false, cell.HasRichText); - - cell.RichText.AddText("123"); - - Assert.AreEqual(true, cell.HasRichText); - - cell.SetValue("123"); - - Assert.AreEqual(false, cell.HasRichText); - } - - /// - /// A test for Characters - /// - [Test] - public void Substring_All_From_OneString() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Hello"); - - IXLFormattedText actual = richString.Substring(0); - - Assert.AreEqual(richString.First(), actual.First()); - - Assert.AreEqual(1, actual.Count); - - actual.First().SetBold(); - - Assert.AreEqual(true, ws.Cell(1, 1).RichText.First().Bold); - } - - [Test] - public void Substring_All_From_ThreeStrings() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Good Morning"); - richString.AddText(" my "); - richString.AddText("neighbors!"); - - IXLFormattedText actual = richString.Substring(0); - - Assert.AreEqual(richString.ElementAt(0), actual.ElementAt(0)); - Assert.AreEqual(richString.ElementAt(1), actual.ElementAt(1)); - Assert.AreEqual(richString.ElementAt(2), actual.ElementAt(2)); - - Assert.AreEqual(3, actual.Count); - Assert.AreEqual(3, richString.Count); - - actual.First().SetBold(); - - Assert.AreEqual(true, ws.Cell(1, 1).RichText.First().Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.Last().Bold); - } - - [Test] - public void Substring_From_OneString_End() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Hello"); - - IXLFormattedText actual = richString.Substring(2); - - Assert.AreEqual(1, actual.Count); // substring was in one piece - - Assert.AreEqual(2, richString.Count); // The text was split because of the substring - - Assert.AreEqual("llo", actual.First().Text); - - Assert.AreEqual("He", richString.First().Text); - Assert.AreEqual("llo", richString.Last().Text); - - actual.First().SetBold(); - - Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Bold); - Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Bold); - - richString.Last().SetItalic(); - - Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Italic); - Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Italic); - - Assert.AreEqual(true, actual.First().Italic); - - richString.SetFontSize(20); - - Assert.AreEqual(20, ws.Cell(1, 1).RichText.First().FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.Last().FontSize); - - Assert.AreEqual(20, actual.First().FontSize); - } - - [Test] - public void Substring_From_OneString_Middle() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Hello"); - - IXLFormattedText actual = richString.Substring(2, 2); - - Assert.AreEqual(1, actual.Count); // substring was in one piece - - Assert.AreEqual(3, richString.Count); // The text was split because of the substring - - Assert.AreEqual("ll", actual.First().Text); - - Assert.AreEqual("He", richString.First().Text); - Assert.AreEqual("ll", richString.ElementAt(1).Text); - Assert.AreEqual("o", richString.Last().Text); - - actual.First().SetBold(); - - Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Bold); - Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(1).Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.Last().Bold); - - richString.Last().SetItalic(); - - Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Italic); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); - Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Italic); - - Assert.AreEqual(false, actual.First().Italic); - - richString.SetFontSize(20); - - Assert.AreEqual(20, ws.Cell(1, 1).RichText.First().FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.Last().FontSize); - - Assert.AreEqual(20, actual.First().FontSize); - } - - [Test] - public void Substring_From_OneString_Start() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Hello"); - - IXLFormattedText actual = richString.Substring(0, 2); - - Assert.AreEqual(1, actual.Count); // substring was in one piece - - Assert.AreEqual(2, richString.Count); // The text was split because of the substring - - Assert.AreEqual("He", actual.First().Text); - - Assert.AreEqual("He", richString.First().Text); - Assert.AreEqual("llo", richString.Last().Text); - - actual.First().SetBold(); - - Assert.AreEqual(true, ws.Cell(1, 1).RichText.First().Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.Last().Bold); - - richString.Last().SetItalic(); - - Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Italic); - Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Italic); - - Assert.AreEqual(false, actual.First().Italic); - - richString.SetFontSize(20); - - Assert.AreEqual(20, ws.Cell(1, 1).RichText.First().FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.Last().FontSize); - - Assert.AreEqual(20, actual.First().FontSize); - } - - [Test] - public void Substring_From_ThreeStrings_End1() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Good Morning"); - richString.AddText(" my "); - richString.AddText("neighbors!"); - - IXLFormattedText actual = richString.Substring(21); - - Assert.AreEqual(1, actual.Count); // substring was in one piece - - Assert.AreEqual(4, richString.Count); // The text was split because of the substring - - Assert.AreEqual("bors!", actual.First().Text); - - Assert.AreEqual("Good Morning", richString.ElementAt(0).Text); - Assert.AreEqual(" my ", richString.ElementAt(1).Text); - Assert.AreEqual("neigh", richString.ElementAt(2).Text); - Assert.AreEqual("bors!", richString.ElementAt(3).Text); - - actual.First().SetBold(); - - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); - Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Bold); - - richString.Last().SetItalic(); - - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Italic); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); - Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Italic); - - Assert.AreEqual(true, actual.First().Italic); - - richString.SetFontSize(20); - - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); - - Assert.AreEqual(20, actual.First().FontSize); - } - - [Test] - public void Substring_From_ThreeStrings_End2() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Good Morning"); - richString.AddText(" my "); - richString.AddText("neighbors!"); - - IXLFormattedText actual = richString.Substring(13); - - Assert.AreEqual(2, actual.Count); - - Assert.AreEqual(4, richString.Count); // The text was split because of the substring - - Assert.AreEqual("my ", actual.ElementAt(0).Text); - Assert.AreEqual("neighbors!", actual.ElementAt(1).Text); - - Assert.AreEqual("Good Morning", richString.ElementAt(0).Text); - Assert.AreEqual(" ", richString.ElementAt(1).Text); - Assert.AreEqual("my ", richString.ElementAt(2).Text); - Assert.AreEqual("neighbors!", richString.ElementAt(3).Text); - - actual.ElementAt(1).SetBold(); - - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); - Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Bold); - - richString.Last().SetItalic(); - - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Italic); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); - Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Italic); - - Assert.AreEqual(false, actual.ElementAt(0).Italic); - Assert.AreEqual(true, actual.ElementAt(1).Italic); - - richString.SetFontSize(20); - - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); - - Assert.AreEqual(20, actual.ElementAt(0).FontSize); - Assert.AreEqual(20, actual.ElementAt(1).FontSize); - } - - [Test] - public void Substring_From_ThreeStrings_Mid1() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Good Morning"); - richString.AddText(" my "); - richString.AddText("neighbors!"); - - IXLFormattedText actual = richString.Substring(5, 10); - - Assert.AreEqual(2, actual.Count); - - Assert.AreEqual(5, richString.Count); // The text was split because of the substring - - Assert.AreEqual("Morning", actual.ElementAt(0).Text); - Assert.AreEqual(" my", actual.ElementAt(1).Text); - - Assert.AreEqual("Good ", richString.ElementAt(0).Text); - Assert.AreEqual("Morning", richString.ElementAt(1).Text); - Assert.AreEqual(" my", richString.ElementAt(2).Text); - Assert.AreEqual(" ", richString.ElementAt(3).Text); - Assert.AreEqual("neighbors!", richString.ElementAt(4).Text); - } - - [Test] - public void Substring_From_ThreeStrings_Mid2() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Good Morning"); - richString.AddText(" my "); - richString.AddText("neighbors!"); - - IXLFormattedText actual = richString.Substring(5, 15); - - Assert.AreEqual(3, actual.Count); - - Assert.AreEqual(5, richString.Count); // The text was split because of the substring - - Assert.AreEqual("Morning", actual.ElementAt(0).Text); - Assert.AreEqual(" my ", actual.ElementAt(1).Text); - Assert.AreEqual("neig", actual.ElementAt(2).Text); - - Assert.AreEqual("Good ", richString.ElementAt(0).Text); - Assert.AreEqual("Morning", richString.ElementAt(1).Text); - Assert.AreEqual(" my ", richString.ElementAt(2).Text); - Assert.AreEqual("neig", richString.ElementAt(3).Text); - Assert.AreEqual("hbors!", richString.ElementAt(4).Text); - } - - [Test] - public void Substring_From_ThreeStrings_Start1() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Good Morning"); - richString.AddText(" my "); - richString.AddText("neighbors!"); - - IXLFormattedText actual = richString.Substring(0, 4); - - Assert.AreEqual(1, actual.Count); // substring was in one piece - - Assert.AreEqual(4, richString.Count); // The text was split because of the substring - - Assert.AreEqual("Good", actual.First().Text); - - Assert.AreEqual("Good", richString.ElementAt(0).Text); - Assert.AreEqual(" Morning", richString.ElementAt(1).Text); - Assert.AreEqual(" my ", richString.ElementAt(2).Text); - Assert.AreEqual("neighbors!", richString.ElementAt(3).Text); - - actual.First().SetBold(); - - Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(0).Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Bold); - - richString.First().SetItalic(); - - Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(0).Italic); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Italic); - - Assert.AreEqual(true, actual.First().Italic); - - richString.SetFontSize(20); - - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); - - Assert.AreEqual(20, actual.First().FontSize); - } - - [Test] - public void Substring_From_ThreeStrings_Start2() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Good Morning"); - richString.AddText(" my "); - richString.AddText("neighbors!"); - - IXLFormattedText actual = richString.Substring(0, 15); - - Assert.AreEqual(2, actual.Count); - - Assert.AreEqual(4, richString.Count); // The text was split because of the substring - - Assert.AreEqual("Good Morning", actual.ElementAt(0).Text); - Assert.AreEqual(" my", actual.ElementAt(1).Text); - - Assert.AreEqual("Good Morning", richString.ElementAt(0).Text); - Assert.AreEqual(" my", richString.ElementAt(1).Text); - Assert.AreEqual(" ", richString.ElementAt(2).Text); - Assert.AreEqual("neighbors!", richString.ElementAt(3).Text); - - actual.ElementAt(1).SetBold(); - - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Bold); - Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(1).Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Bold); - - richString.First().SetItalic(); - - Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(0).Italic); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); - Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Italic); - - Assert.AreEqual(true, actual.ElementAt(0).Italic); - Assert.AreEqual(false, actual.ElementAt(1).Italic); - - richString.SetFontSize(20); - - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); - Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); - - Assert.AreEqual(20, actual.ElementAt(0).FontSize); - Assert.AreEqual(20, actual.ElementAt(1).FontSize); - } - - [Test] - public void Substring_IndexOutsideRange1() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Hello"); - - Assert.That(() => richString.Substring(50), Throws.TypeOf()); - } - - [Test] - public void Substring_IndexOutsideRange2() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Hello"); - richString.AddText("World"); - - Assert.That(() => richString.Substring(50), Throws.TypeOf()); - } - - [Test] - public void Substring_IndexOutsideRange3() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Hello"); - - Assert.That(() => richString.Substring(1, 10), Throws.TypeOf()); - } - - [Test] - public void Substring_IndexOutsideRange4() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Hello"); - richString.AddText("World"); - - Assert.That(() => richString.Substring(5, 20), Throws.TypeOf()); - } - - /// - /// A test for ToString - /// - [Test] - public void ToStringTest() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - IXLRichText richString = ws.Cell(1, 1).RichText; - - richString.AddText("Hello"); - richString.AddText(" "); - richString.AddText("World"); - string expected = "Hello World"; - string actual = richString.ToString(); - Assert.AreEqual(expected, actual); - - richString.AddText("!"); - expected = "Hello World!"; - actual = richString.ToString(); - Assert.AreEqual(expected, actual); - - richString.ClearText(); - expected = String.Empty; - actual = richString.ToString(); - Assert.AreEqual(expected, actual); - } - } +using System; +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + /// + /// This is a test class for XLRichStringTests and is intended + /// to contain all XLRichStringTests Unit Tests + /// + [TestFixture] + public class XLRichStringTests + { + [Test] + public void AccessRichTextTest1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.RichText.AddText("12"); + cell.DataType = XLCellValues.Number; + + Assert.AreEqual(12.0, cell.GetDouble()); + + IXLRichText richText = cell.RichText; + + Assert.AreEqual("12", richText.ToString()); + + richText.AddText("34"); + + Assert.AreEqual("1234", cell.GetString()); + + Assert.AreEqual(XLCellValues.Number, cell.DataType); + + Assert.AreEqual(1234.0, cell.GetDouble()); + } + + /// + /// A test for AddText + /// + [Test] + public void AddTextTest1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + IXLRichText richString = cell.RichText; + + string text = "Hello"; + richString.AddText(text).SetBold().SetFontColor(XLColor.Red); + + Assert.AreEqual(cell.GetString(), text); + Assert.AreEqual(cell.RichText.First().Bold, true); + Assert.AreEqual(cell.RichText.First().FontColor, XLColor.Red); + + Assert.AreEqual(1, richString.Count); + + richString.AddText("World"); + Assert.AreEqual(richString.First().Text, text, "Item in collection is not the same as the one returned"); + } + + [Test] + public void AddTextTest2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + Int32 number = 123; + + cell.SetValue(number).Style + .Font.SetBold() + .Font.SetFontColor(XLColor.Red); + + string text = number.ToString(); + + Assert.AreEqual(cell.RichText.ToString(), text); + Assert.AreEqual(cell.RichText.First().Bold, true); + Assert.AreEqual(cell.RichText.First().FontColor, XLColor.Red); + + Assert.AreEqual(1, cell.RichText.Count); + + cell.RichText.AddText("World"); + Assert.AreEqual(cell.RichText.First().Text, text, "Item in collection is not the same as the one returned"); + } + + [Test] + public void AddTextTest3() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + Int32 number = 123; + cell.Value = number; + cell.Style + .Font.SetBold() + .Font.SetFontColor(XLColor.Red); + + string text = number.ToString(); + + Assert.AreEqual(cell.RichText.ToString(), text); + Assert.AreEqual(cell.RichText.First().Bold, true); + Assert.AreEqual(cell.RichText.First().FontColor, XLColor.Red); + + Assert.AreEqual(1, cell.RichText.Count); + + cell.RichText.AddText("World"); + Assert.AreEqual(cell.RichText.First().Text, text, "Item in collection is not the same as the one returned"); + } + + /// + /// A test for Clear + /// + [Test] + public void ClearTest() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + richString.AddText(" "); + richString.AddText("World!"); + + richString.ClearText(); + String expected = String.Empty; + String actual = richString.ToString(); + Assert.AreEqual(expected, actual); + + Assert.AreEqual(0, richString.Count); + } + + [Test] + public void CountTest() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + richString.AddText(" "); + richString.AddText("World!"); + + Assert.AreEqual(3, richString.Count); + } + + [Test] + public void HasRichTextTest1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLCell cell = ws.Cell(1, 1); + cell.RichText.AddText("123"); + + Assert.AreEqual(true, cell.HasRichText); + + cell.DataType = XLCellValues.Text; + + Assert.AreEqual(true, cell.HasRichText); + + cell.DataType = XLCellValues.Number; + + Assert.AreEqual(false, cell.HasRichText); + + cell.RichText.AddText("123"); + + Assert.AreEqual(true, cell.HasRichText); + + cell.Value = 123; + + Assert.AreEqual(false, cell.HasRichText); + + cell.RichText.AddText("123"); + + Assert.AreEqual(true, cell.HasRichText); + + cell.SetValue("123"); + + Assert.AreEqual(false, cell.HasRichText); + } + + /// + /// A test for Characters + /// + [Test] + public void Substring_All_From_OneString() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + IXLFormattedText actual = richString.Substring(0); + + Assert.AreEqual(richString.First(), actual.First()); + + Assert.AreEqual(1, actual.Count); + + actual.First().SetBold(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.First().Bold); + } + + [Test] + public void Substring_All_From_ThreeStrings() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(0); + + Assert.AreEqual(richString.ElementAt(0), actual.ElementAt(0)); + Assert.AreEqual(richString.ElementAt(1), actual.ElementAt(1)); + Assert.AreEqual(richString.ElementAt(2), actual.ElementAt(2)); + + Assert.AreEqual(3, actual.Count); + Assert.AreEqual(3, richString.Count); + + actual.First().SetBold(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.First().Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.Last().Bold); + } + + [Test] + public void Substring_From_OneString_End() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + IXLFormattedText actual = richString.Substring(2); + + Assert.AreEqual(1, actual.Count); // substring was in one piece + + Assert.AreEqual(2, richString.Count); // The text was split because of the substring + + Assert.AreEqual("llo", actual.First().Text); + + Assert.AreEqual("He", richString.First().Text); + Assert.AreEqual("llo", richString.Last().Text); + + actual.First().SetBold(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Bold); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Bold); + + richString.Last().SetItalic(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Italic); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Italic); + + Assert.AreEqual(true, actual.First().Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.First().FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.Last().FontSize); + + Assert.AreEqual(20, actual.First().FontSize); + } + + [Test] + public void Substring_From_OneString_Middle() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + IXLFormattedText actual = richString.Substring(2, 2); + + Assert.AreEqual(1, actual.Count); // substring was in one piece + + Assert.AreEqual(3, richString.Count); // The text was split because of the substring + + Assert.AreEqual("ll", actual.First().Text); + + Assert.AreEqual("He", richString.First().Text); + Assert.AreEqual("ll", richString.ElementAt(1).Text); + Assert.AreEqual("o", richString.Last().Text); + + actual.First().SetBold(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Bold); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.Last().Bold); + + richString.Last().SetItalic(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Italic); + + Assert.AreEqual(false, actual.First().Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.First().FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.Last().FontSize); + + Assert.AreEqual(20, actual.First().FontSize); + } + + [Test] + public void Substring_From_OneString_Start() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + IXLFormattedText actual = richString.Substring(0, 2); + + Assert.AreEqual(1, actual.Count); // substring was in one piece + + Assert.AreEqual(2, richString.Count); // The text was split because of the substring + + Assert.AreEqual("He", actual.First().Text); + + Assert.AreEqual("He", richString.First().Text); + Assert.AreEqual("llo", richString.Last().Text); + + actual.First().SetBold(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.First().Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.Last().Bold); + + richString.Last().SetItalic(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.First().Italic); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.Last().Italic); + + Assert.AreEqual(false, actual.First().Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.First().FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.Last().FontSize); + + Assert.AreEqual(20, actual.First().FontSize); + } + + [Test] + public void Substring_From_ThreeStrings_End1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(21); + + Assert.AreEqual(1, actual.Count); // substring was in one piece + + Assert.AreEqual(4, richString.Count); // The text was split because of the substring + + Assert.AreEqual("bors!", actual.First().Text); + + Assert.AreEqual("Good Morning", richString.ElementAt(0).Text); + Assert.AreEqual(" my ", richString.ElementAt(1).Text); + Assert.AreEqual("neigh", richString.ElementAt(2).Text); + Assert.AreEqual("bors!", richString.ElementAt(3).Text); + + actual.First().SetBold(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Bold); + + richString.Last().SetItalic(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Italic); + + Assert.AreEqual(true, actual.First().Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); + + Assert.AreEqual(20, actual.First().FontSize); + } + + [Test] + public void Substring_From_ThreeStrings_End2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(13); + + Assert.AreEqual(2, actual.Count); + + Assert.AreEqual(4, richString.Count); // The text was split because of the substring + + Assert.AreEqual("my ", actual.ElementAt(0).Text); + Assert.AreEqual("neighbors!", actual.ElementAt(1).Text); + + Assert.AreEqual("Good Morning", richString.ElementAt(0).Text); + Assert.AreEqual(" ", richString.ElementAt(1).Text); + Assert.AreEqual("my ", richString.ElementAt(2).Text); + Assert.AreEqual("neighbors!", richString.ElementAt(3).Text); + + actual.ElementAt(1).SetBold(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Bold); + + richString.Last().SetItalic(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(3).Italic); + + Assert.AreEqual(false, actual.ElementAt(0).Italic); + Assert.AreEqual(true, actual.ElementAt(1).Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); + + Assert.AreEqual(20, actual.ElementAt(0).FontSize); + Assert.AreEqual(20, actual.ElementAt(1).FontSize); + } + + [Test] + public void Substring_From_ThreeStrings_Mid1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(5, 10); + + Assert.AreEqual(2, actual.Count); + + Assert.AreEqual(5, richString.Count); // The text was split because of the substring + + Assert.AreEqual("Morning", actual.ElementAt(0).Text); + Assert.AreEqual(" my", actual.ElementAt(1).Text); + + Assert.AreEqual("Good ", richString.ElementAt(0).Text); + Assert.AreEqual("Morning", richString.ElementAt(1).Text); + Assert.AreEqual(" my", richString.ElementAt(2).Text); + Assert.AreEqual(" ", richString.ElementAt(3).Text); + Assert.AreEqual("neighbors!", richString.ElementAt(4).Text); + } + + [Test] + public void Substring_From_ThreeStrings_Mid2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(5, 15); + + Assert.AreEqual(3, actual.Count); + + Assert.AreEqual(5, richString.Count); // The text was split because of the substring + + Assert.AreEqual("Morning", actual.ElementAt(0).Text); + Assert.AreEqual(" my ", actual.ElementAt(1).Text); + Assert.AreEqual("neig", actual.ElementAt(2).Text); + + Assert.AreEqual("Good ", richString.ElementAt(0).Text); + Assert.AreEqual("Morning", richString.ElementAt(1).Text); + Assert.AreEqual(" my ", richString.ElementAt(2).Text); + Assert.AreEqual("neig", richString.ElementAt(3).Text); + Assert.AreEqual("hbors!", richString.ElementAt(4).Text); + } + + [Test] + public void Substring_From_ThreeStrings_Start1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(0, 4); + + Assert.AreEqual(1, actual.Count); // substring was in one piece + + Assert.AreEqual(4, richString.Count); // The text was split because of the substring + + Assert.AreEqual("Good", actual.First().Text); + + Assert.AreEqual("Good", richString.ElementAt(0).Text); + Assert.AreEqual(" Morning", richString.ElementAt(1).Text); + Assert.AreEqual(" my ", richString.ElementAt(2).Text); + Assert.AreEqual("neighbors!", richString.ElementAt(3).Text); + + actual.First().SetBold(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(0).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Bold); + + richString.First().SetItalic(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(0).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Italic); + + Assert.AreEqual(true, actual.First().Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); + + Assert.AreEqual(20, actual.First().FontSize); + } + + [Test] + public void Substring_From_ThreeStrings_Start2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Good Morning"); + richString.AddText(" my "); + richString.AddText("neighbors!"); + + IXLFormattedText actual = richString.Substring(0, 15); + + Assert.AreEqual(2, actual.Count); + + Assert.AreEqual(4, richString.Count); // The text was split because of the substring + + Assert.AreEqual("Good Morning", actual.ElementAt(0).Text); + Assert.AreEqual(" my", actual.ElementAt(1).Text); + + Assert.AreEqual("Good Morning", richString.ElementAt(0).Text); + Assert.AreEqual(" my", richString.ElementAt(1).Text); + Assert.AreEqual(" ", richString.ElementAt(2).Text); + Assert.AreEqual("neighbors!", richString.ElementAt(3).Text); + + actual.ElementAt(1).SetBold(); + + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(0).Bold); + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(1).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Bold); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Bold); + + richString.First().SetItalic(); + + Assert.AreEqual(true, ws.Cell(1, 1).RichText.ElementAt(0).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(1).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(2).Italic); + Assert.AreEqual(false, ws.Cell(1, 1).RichText.ElementAt(3).Italic); + + Assert.AreEqual(true, actual.ElementAt(0).Italic); + Assert.AreEqual(false, actual.ElementAt(1).Italic); + + richString.SetFontSize(20); + + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(0).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(1).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(2).FontSize); + Assert.AreEqual(20, ws.Cell(1, 1).RichText.ElementAt(3).FontSize); + + Assert.AreEqual(20, actual.ElementAt(0).FontSize); + Assert.AreEqual(20, actual.ElementAt(1).FontSize); + } + + [Test] + public void Substring_IndexOutsideRange1() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + Assert.That(() => richString.Substring(50), Throws.TypeOf()); + } + + [Test] + public void Substring_IndexOutsideRange2() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + richString.AddText("World"); + + Assert.That(() => richString.Substring(50), Throws.TypeOf()); + } + + [Test] + public void Substring_IndexOutsideRange3() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + + Assert.That(() => richString.Substring(1, 10), Throws.TypeOf()); + } + + [Test] + public void Substring_IndexOutsideRange4() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + richString.AddText("World"); + + Assert.That(() => richString.Substring(5, 20), Throws.TypeOf()); + } + + /// + /// A test for ToString + /// + [Test] + public void ToStringTest() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + IXLRichText richString = ws.Cell(1, 1).RichText; + + richString.AddText("Hello"); + richString.AddText(" "); + richString.AddText("World"); + string expected = "Hello World"; + string actual = richString.ToString(); + Assert.AreEqual(expected, actual); + + richString.AddText("!"); + expected = "Hello World!"; + actual = richString.ToString(); + Assert.AreEqual(expected, actual); + + richString.ClearText(); + expected = String.Empty; + actual = richString.ToString(); + Assert.AreEqual(expected, actual); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Rows/RowTests.cs b/ClosedXML_Tests/Excel/Rows/RowTests.cs index 2afe01f..17cddeb 100644 --- a/ClosedXML_Tests/Excel/Rows/RowTests.cs +++ b/ClosedXML_Tests/Excel/Rows/RowTests.cs @@ -1,227 +1,227 @@ -using System; -using System.Linq; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class RowTests - { - [Test] - public void CopyRow() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Test").Style.Font.SetBold(); - ws.FirstRow().CopyTo(ws.Row(2)); - - Assert.IsTrue(ws.Cell("A2").Style.Font.Bold); - } - - [Test] - public void InsertingRowsAbove1() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - - ws.Rows("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); - ws.Row(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); - ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); - - IXLRow row1 = ws.Row(1); - IXLRow row2 = ws.Row(2); - IXLRow row3 = ws.Row(3); - - IXLRow rowIns = ws.Row(1).InsertRowsAbove(1).First(); - - Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, ws.Row(3).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", ws.Row(3).Cell(2).GetString()); - - - Assert.AreEqual(ws.Style.Fill.BackgroundColor, rowIns.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(ws.Style.Fill.BackgroundColor, rowIns.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(ws.Style.Fill.BackgroundColor, rowIns.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, row1.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row1.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row1.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, row2.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, row2.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, row2.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row3.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row3.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", row2.Cell(2).GetString()); - } - - [Test] - public void InsertingRowsAbove2() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - - ws.Rows("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); - ws.Row(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); - ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); - - IXLRow row1 = ws.Row(1); - IXLRow row2 = ws.Row(2); - IXLRow row3 = ws.Row(3); - - IXLRow rowIns = ws.Row(2).InsertRowsAbove(1).First(); - - Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, ws.Row(3).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", ws.Row(3).Cell(2).GetString()); - - - Assert.AreEqual(XLColor.Red, rowIns.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, rowIns.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, rowIns.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, row1.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row1.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row1.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, row2.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, row2.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, row2.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row3.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row3.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", row2.Cell(2).GetString()); - } - - [Test] - public void InsertingRowsAbove3() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - - ws.Rows("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); - ws.Row(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); - ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); - - IXLRow row1 = ws.Row(1); - IXLRow row2 = ws.Row(2); - IXLRow row3 = ws.Row(3); - - IXLRow rowIns = ws.Row(3).InsertRowsAbove(1).First(); - - Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, ws.Row(2).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, ws.Row(2).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, ws.Row(2).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, ws.Row(3).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", ws.Row(2).Cell(2).GetString()); - - - Assert.AreEqual(XLColor.Yellow, rowIns.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, rowIns.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, rowIns.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, row1.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row1.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row1.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Yellow, row2.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Green, row2.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Yellow, row2.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row3.Cell(2).Style.Fill.BackgroundColor); - Assert.AreEqual(XLColor.Red, row3.Cell(3).Style.Fill.BackgroundColor); - - Assert.AreEqual("X", row2.Cell(2).GetString()); - } - - [Test] - public void NoRowsUsed() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - Int32 count = 0; - - foreach (IXLRow row in ws.RowsUsed()) - count++; - - foreach (IXLRangeRow row in ws.Range("A1:C3").RowsUsed()) - count++; - - Assert.AreEqual(0, count); - } - - [Test] - public void RowUsed() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(1, 2).SetValue("Test"); - ws.Cell(1, 3).SetValue("Test"); - - IXLRangeRow fromRow = ws.Row(1).RowUsed(); - Assert.AreEqual("B1:C1", fromRow.RangeAddress.ToStringRelative()); - - IXLRangeRow fromRange = ws.Range("A1:E1").FirstRow().RowUsed(); - Assert.AreEqual("B1:C1", fromRange.RangeAddress.ToStringRelative()); - } - - - [Test] - public void UngroupFromAll() - { - IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); - ws.Rows(1, 2).Group(); - ws.Rows(1, 2).Ungroup(true); - } - } +using System; +using System.Linq; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class RowTests + { + [Test] + public void CopyRow() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Test").Style.Font.SetBold(); + ws.FirstRow().CopyTo(ws.Row(2)); + + Assert.IsTrue(ws.Cell("A2").Style.Font.Bold); + } + + [Test] + public void InsertingRowsAbove1() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Rows("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Row(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLRow row1 = ws.Row(1); + IXLRow row2 = ws.Row(2); + IXLRow row3 = ws.Row(3); + + IXLRow rowIns = ws.Row(1).InsertRowsAbove(1).First(); + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, ws.Row(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Row(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Row(3).Cell(2).GetString()); + + + Assert.AreEqual(ws.Style.Fill.BackgroundColor, rowIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, rowIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(ws.Style.Fill.BackgroundColor, rowIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, row2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, row2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, row2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", row2.Cell(2).GetString()); + } + + [Test] + public void InsertingRowsAbove2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Rows("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Row(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLRow row1 = ws.Row(1); + IXLRow row2 = ws.Row(2); + IXLRow row3 = ws.Row(3); + + IXLRow rowIns = ws.Row(2).InsertRowsAbove(1).First(); + + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Row(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Row(3).Cell(2).GetString()); + + + Assert.AreEqual(XLColor.Red, rowIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, rowIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, rowIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, row2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, row2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, row2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", row2.Cell(2).GetString()); + } + + [Test] + public void InsertingRowsAbove3() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + + ws.Rows("1,3").Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Row(2).Style.Fill.SetBackgroundColor(XLColor.Yellow); + ws.Cell(2, 2).SetValue("X").Style.Fill.SetBackgroundColor(XLColor.Green); + + IXLRow row1 = ws.Row(1); + IXLRow row2 = ws.Row(2); + IXLRow row3 = ws.Row(3); + + IXLRow rowIns = ws.Row(3).InsertRowsAbove(1).First(); + + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(1).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Row(2).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Row(2).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Row(2).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, ws.Row(3).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, ws.Row(3).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, ws.Row(4).Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", ws.Row(2).Cell(2).GetString()); + + + Assert.AreEqual(XLColor.Yellow, rowIns.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, rowIns.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, rowIns.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row1.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row1.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Yellow, row2.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Green, row2.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Yellow, row2.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual(XLColor.Red, row3.Cell(1).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(2).Style.Fill.BackgroundColor); + Assert.AreEqual(XLColor.Red, row3.Cell(3).Style.Fill.BackgroundColor); + + Assert.AreEqual("X", row2.Cell(2).GetString()); + } + + [Test] + public void NoRowsUsed() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + Int32 count = 0; + + foreach (IXLRow row in ws.RowsUsed()) + count++; + + foreach (IXLRangeRow row in ws.Range("A1:C3").RowsUsed()) + count++; + + Assert.AreEqual(0, count); + } + + [Test] + public void RowUsed() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 2).SetValue("Test"); + ws.Cell(1, 3).SetValue("Test"); + + IXLRangeRow fromRow = ws.Row(1).RowUsed(); + Assert.AreEqual("B1:C1", fromRow.RangeAddress.ToStringRelative()); + + IXLRangeRow fromRange = ws.Range("A1:E1").FirstRow().RowUsed(); + Assert.AreEqual("B1:C1", fromRange.RangeAddress.ToStringRelative()); + } + + + [Test] + public void UngroupFromAll() + { + IXLWorksheet ws = new XLWorkbook().AddWorksheet("Sheet1"); + ws.Rows(1, 2).Group(); + ws.Rows(1, 2).Ungroup(true); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Saving/SavingTests.cs b/ClosedXML_Tests/Excel/Saving/SavingTests.cs index 064c912..ca2fd98 100644 --- a/ClosedXML_Tests/Excel/Saving/SavingTests.cs +++ b/ClosedXML_Tests/Excel/Saving/SavingTests.cs @@ -1,4 +1,4 @@ -using ClosedXML.Excel; +using ClosedXML.Excel; using NUnit.Framework; using System.Globalization; using System.IO; diff --git a/ClosedXML_Tests/Excel/Styles/ColorTests.cs b/ClosedXML_Tests/Excel/Styles/ColorTests.cs index 33be493..72cbb27 100644 --- a/ClosedXML_Tests/Excel/Styles/ColorTests.cs +++ b/ClosedXML_Tests/Excel/Styles/ColorTests.cs @@ -1,42 +1,42 @@ -using System.Drawing; -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class ColorTests - { - [Test] - public void ColorEqualOperatorInPlace() - { - Assert.IsTrue(XLColor.Black == XLColor.Black); - } - - [Test] - public void ColorNotEqualOperatorInPlace() - { - Assert.IsFalse(XLColor.Black != XLColor.Black); - } - - [Test] - public void ColorNamedVsHTML() - { - Assert.IsTrue(XLColor.Black == XLColor.FromHtml("#000000")); - } - - [Test] - public void DefaultColorIndex64isTransparentWhite() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - XLColor color = ws.FirstCell().Style.Fill.BackgroundColor; - Assert.AreEqual(XLColorType.Indexed, color.ColorType); - Assert.AreEqual(64, color.Indexed); - Assert.AreEqual(Color.Transparent, color.Color); - } - } +using System.Drawing; +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class ColorTests + { + [Test] + public void ColorEqualOperatorInPlace() + { + Assert.IsTrue(XLColor.Black == XLColor.Black); + } + + [Test] + public void ColorNotEqualOperatorInPlace() + { + Assert.IsFalse(XLColor.Black != XLColor.Black); + } + + [Test] + public void ColorNamedVsHTML() + { + Assert.IsTrue(XLColor.Black == XLColor.FromHtml("#000000")); + } + + [Test] + public void DefaultColorIndex64isTransparentWhite() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + XLColor color = ws.FirstCell().Style.Fill.BackgroundColor; + Assert.AreEqual(XLColorType.Indexed, color.ColorType); + Assert.AreEqual(64, color.Indexed); + Assert.AreEqual(Color.Transparent, color.Color); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs b/ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs index cf3aa2b..3c94664 100644 --- a/ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs +++ b/ClosedXML_Tests/Excel/Styles/NumberFormatTests.cs @@ -1,4 +1,4 @@ -using ClosedXML.Excel; +using ClosedXML.Excel; using NUnit.Framework; using System; using System.Data; diff --git a/ClosedXML_Tests/Excel/Styles/XLFillTests.cs b/ClosedXML_Tests/Excel/Styles/XLFillTests.cs index 37d06c7..6177890 100644 --- a/ClosedXML_Tests/Excel/Styles/XLFillTests.cs +++ b/ClosedXML_Tests/Excel/Styles/XLFillTests.cs @@ -1,65 +1,65 @@ -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests.Excel -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class XLFillTests - { - [Test] - public void BackgroundColorSetsPattern() - { - var fill = new XLFill {BackgroundColor = XLColor.Blue}; - Assert.AreEqual(XLFillPatternValues.Solid, fill.PatternType); - } - - [Test] - public void BackgroundNoColorSetsPatternNone() - { - var fill = new XLFill {BackgroundColor = XLColor.NoColor}; - Assert.AreEqual(XLFillPatternValues.None, fill.PatternType); - } - - [Test] - public void BackgroundPatternEqualCheck() - { - var fill1 = new XLFill {PatternBackgroundColor = XLColor.Blue}; - var fill2 = new XLFill {PatternBackgroundColor = XLColor.Blue}; - Assert.IsTrue(fill1.Equals(fill2)); - } - - [Test] - public void BackgroundPatternNotEqualCheck() - { - var fill1 = new XLFill {PatternBackgroundColor = XLColor.Blue}; - var fill2 = new XLFill {PatternBackgroundColor = XLColor.Red}; - Assert.IsFalse(fill1.Equals(fill2)); - } - - [Test] - public void BackgroundWithConditionalFormat() - { - var workbook = new XLWorkbook(); - var worksheet = workbook.AddWorksheet("Test"); - worksheet.Cell(2, 2).SetValue("Text"); - var cf = worksheet.Cell(2, 2).AddConditionalFormat(); - var style = cf.WhenNotBlank(); - style - .Border.SetOutsideBorder(XLBorderStyleValues.Thick) - .Border.SetOutsideBorderColor(XLColor.Blue); - - Assert.AreEqual(style.Border.BottomBorder, XLBorderStyleValues.Thick); - Assert.AreEqual(style.Border.TopBorder, XLBorderStyleValues.Thick); - Assert.AreEqual(style.Border.LeftBorder, XLBorderStyleValues.Thick); - Assert.AreEqual(style.Border.RightBorder, XLBorderStyleValues.Thick); - - Assert.AreEqual(style.Border.BottomBorderColor, XLColor.Blue); - Assert.AreEqual(style.Border.TopBorderColor, XLColor.Blue); - Assert.AreEqual(style.Border.LeftBorderColor, XLColor.Blue); - Assert.AreEqual(style.Border.RightBorderColor, XLColor.Blue); - } - } +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class XLFillTests + { + [Test] + public void BackgroundColorSetsPattern() + { + var fill = new XLFill {BackgroundColor = XLColor.Blue}; + Assert.AreEqual(XLFillPatternValues.Solid, fill.PatternType); + } + + [Test] + public void BackgroundNoColorSetsPatternNone() + { + var fill = new XLFill {BackgroundColor = XLColor.NoColor}; + Assert.AreEqual(XLFillPatternValues.None, fill.PatternType); + } + + [Test] + public void BackgroundPatternEqualCheck() + { + var fill1 = new XLFill {PatternBackgroundColor = XLColor.Blue}; + var fill2 = new XLFill {PatternBackgroundColor = XLColor.Blue}; + Assert.IsTrue(fill1.Equals(fill2)); + } + + [Test] + public void BackgroundPatternNotEqualCheck() + { + var fill1 = new XLFill {PatternBackgroundColor = XLColor.Blue}; + var fill2 = new XLFill {PatternBackgroundColor = XLColor.Red}; + Assert.IsFalse(fill1.Equals(fill2)); + } + + [Test] + public void BackgroundWithConditionalFormat() + { + var workbook = new XLWorkbook(); + var worksheet = workbook.AddWorksheet("Test"); + worksheet.Cell(2, 2).SetValue("Text"); + var cf = worksheet.Cell(2, 2).AddConditionalFormat(); + var style = cf.WhenNotBlank(); + style + .Border.SetOutsideBorder(XLBorderStyleValues.Thick) + .Border.SetOutsideBorderColor(XLColor.Blue); + + Assert.AreEqual(style.Border.BottomBorder, XLBorderStyleValues.Thick); + Assert.AreEqual(style.Border.TopBorder, XLBorderStyleValues.Thick); + Assert.AreEqual(style.Border.LeftBorder, XLBorderStyleValues.Thick); + Assert.AreEqual(style.Border.RightBorder, XLBorderStyleValues.Thick); + + Assert.AreEqual(style.Border.BottomBorderColor, XLColor.Blue); + Assert.AreEqual(style.Border.TopBorderColor, XLColor.Blue); + Assert.AreEqual(style.Border.LeftBorderColor, XLColor.Blue); + Assert.AreEqual(style.Border.RightBorderColor, XLColor.Blue); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Excel/Tables/TablesTests.cs b/ClosedXML_Tests/Excel/Tables/TablesTests.cs index d1054c5..ddc7b84 100644 --- a/ClosedXML_Tests/Excel/Tables/TablesTests.cs +++ b/ClosedXML_Tests/Excel/Tables/TablesTests.cs @@ -1,366 +1,366 @@ -using ClosedXML.Attributes; -using ClosedXML.Excel; -using NUnit.Framework; -using System; -using System.Collections.Generic; -using System.Data; -using System.IO; -using System.Linq; - -namespace ClosedXML_Tests.Excel -{ - /// - /// Summary description for UnitTest1 - /// - [TestFixture] - public class TablesTests - { - public class TestObjectWithoutAttributes - { - public String Column1 { get; set; } - public String Column2 { get; set; } - } - - public class TestObjectWithAttributes - { - public int UnOrderedColumn { get; set; } - - [XLColumn(Header = "SecondColumn", Order = 1)] - public String Column1 { get; set; } - - [XLColumn(Header = "FirstColumn", Order = 0)] - public String Column2 { get; set; } - - [XLColumn(Header = "SomeFieldNotProperty", Order = 2)] - public int MyField; - } - - [Test] - public void CanSaveTableCreatedFromEmptyDataTable() - { - var dt = new DataTable("sheet1"); - dt.Columns.Add("col1", typeof(string)); - dt.Columns.Add("col2", typeof(double)); - - var wb = new XLWorkbook(); - wb.AddWorksheet(dt); - - using (var ms = new MemoryStream()) - wb.SaveAs(ms, true); - } - - [Test] - public void CanSaveTableCreatedFromSingleRow() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Title"); - ws.Range("A1").CreateTable(); - - using (var ms = new MemoryStream()) - wb.SaveAs(ms, true); - } - - [Test] - public void CreatingATableFromHeadersPushCellsBelow() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Title") - .CellBelow().SetValue("X"); - ws.Range("A1").CreateTable(); - - Assert.AreEqual(ws.Cell("A2").GetString(), String.Empty); - Assert.AreEqual(ws.Cell("A3").GetString(), "X"); - } - - [Test] - public void Inserting_Column_Sets_Header() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Categories") - .CellBelow().SetValue("A") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C"); - - IXLTable table = ws.RangeUsed().CreateTable(); - table.InsertColumnsAfter(1); - Assert.AreEqual("Column2", table.HeadersRow().LastCell().GetString()); - } - - [Test] - public void SavingLoadingTableWithNewLineInHeader() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - string columnName = "Line1" + Environment.NewLine + "Line2"; - ws.FirstCell().SetValue(columnName) - .CellBelow().SetValue("A"); - ws.RangeUsed().CreateTable(); - using (var ms = new MemoryStream()) - { - wb.SaveAs(ms, true); - var wb2 = new XLWorkbook(ms); - IXLWorksheet ws2 = wb2.Worksheet(1); - IXLTable table2 = ws2.Table(0); - string fieldName = table2.Field(0).Name; - Assert.AreEqual("Line1\nLine2", fieldName); - } - } - - [Test] - public void SavingLoadingTableWithNewLineInHeader2() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Test"); - - var dt = new DataTable(); - string columnName = "Line1" + Environment.NewLine + "Line2"; - dt.Columns.Add(columnName); - - DataRow dr = dt.NewRow(); - dr[columnName] = "some text"; - dt.Rows.Add(dr); - ws.Cell(1, 1).InsertTable(dt.AsEnumerable()); - - IXLTable table1 = ws.Table(0); - string fieldName1 = table1.Field(0).Name; - Assert.AreEqual(columnName, fieldName1); - - using (var ms = new MemoryStream()) - { - wb.SaveAs(ms, true); - var wb2 = new XLWorkbook(ms); - IXLWorksheet ws2 = wb2.Worksheet(1); - IXLTable table2 = ws2.Table(0); - string fieldName2 = table2.Field(0).Name; - Assert.AreEqual("Line1\nLine2", fieldName2); - } - } - - [Test] - public void TableCreatedFromEmptyDataTable() - { - var dt = new DataTable("sheet1"); - dt.Columns.Add("col1", typeof(string)); - dt.Columns.Add("col2", typeof(double)); - - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().InsertTable(dt); - Assert.AreEqual(2, ws.Tables.First().ColumnCount()); - } - - [Test] - public void TableCreatedFromEmptyListOfInt() - { - var l = new List(); - - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().InsertTable(l); - Assert.AreEqual(1, ws.Tables.First().ColumnCount()); - } - - [Test] - public void TableCreatedFromEmptyListOfObject() - { - var l = new List(); - - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().InsertTable(l); - Assert.AreEqual(2, ws.Tables.First().ColumnCount()); - } - - [Test] - public void TableCreatedFromListOfObjectWithPropertyAttributes() - { - var l = new List() - { - new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, - new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } - }; - - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().InsertTable(l); - Assert.AreEqual(4, ws.Tables.First().ColumnCount()); - Assert.AreEqual("FirstColumn", ws.FirstCell().Value); - Assert.AreEqual("SecondColumn", ws.FirstCell().CellRight().Value); - Assert.AreEqual("SomeFieldNotProperty", ws.FirstCell().CellRight().CellRight().Value); - Assert.AreEqual("UnOrderedColumn", ws.FirstCell().CellRight().CellRight().CellRight().Value); - } - - [Test] - public void TableInsertAboveFromData() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Value"); - - IXLTable table = ws.Range("A1:A2").CreateTable(); - table.SetShowTotalsRow() - .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; - - IXLTableRow row = table.DataRange.FirstRow(); - row.Field("Value").Value = 3; - row = table.DataRange.InsertRowsAbove(1).First(); - row.Field("Value").Value = 2; - row = table.DataRange.InsertRowsAbove(1).First(); - row.Field("Value").Value = 1; - - Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); - Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); - Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); - } - - [Test] - public void TableInsertAboveFromRows() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Value"); - - IXLTable table = ws.Range("A1:A2").CreateTable(); - table.SetShowTotalsRow() - .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; - - IXLTableRow row = table.DataRange.FirstRow(); - row.Field("Value").Value = 3; - row = row.InsertRowsAbove(1).First(); - row.Field("Value").Value = 2; - row = row.InsertRowsAbove(1).First(); - row.Field("Value").Value = 1; - - Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); - Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); - Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); - } - - [Test] - public void TableInsertBelowFromData() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Value"); - - IXLTable table = ws.Range("A1:A2").CreateTable(); - table.SetShowTotalsRow() - .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; - - IXLTableRow row = table.DataRange.FirstRow(); - row.Field("Value").Value = 1; - row = table.DataRange.InsertRowsBelow(1).First(); - row.Field("Value").Value = 2; - row = table.DataRange.InsertRowsBelow(1).First(); - row.Field("Value").Value = 3; - - Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); - Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); - Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); - } - - [Test] - public void TableInsertBelowFromRows() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Value"); - - IXLTable table = ws.Range("A1:A2").CreateTable(); - table.SetShowTotalsRow() - .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; - - IXLTableRow row = table.DataRange.FirstRow(); - row.Field("Value").Value = 1; - row = row.InsertRowsBelow(1).First(); - row.Field("Value").Value = 2; - row = row.InsertRowsBelow(1).First(); - row.Field("Value").Value = 3; - - Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); - Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); - Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); - } - - [Test] - public void TableShowHeader() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().SetValue("Categories") - .CellBelow().SetValue("A") - .CellBelow().SetValue("B") - .CellBelow().SetValue("C"); - - IXLTable table = ws.RangeUsed().CreateTable(); - - Assert.AreEqual("Categories", table.Fields.First().Name); - - table.SetShowHeaderRow(false); - - Assert.AreEqual("Categories", table.Fields.First().Name); - - Assert.IsTrue(ws.Cell(1, 1).IsEmpty(true)); - Assert.AreEqual(null, table.HeadersRow()); - Assert.AreEqual("A", table.DataRange.FirstRow().Field("Categories").GetString()); - Assert.AreEqual("C", table.DataRange.LastRow().Field("Categories").GetString()); - Assert.AreEqual("A", table.DataRange.FirstCell().GetString()); - Assert.AreEqual("C", table.DataRange.LastCell().GetString()); - - table.SetShowHeaderRow(); - IXLRangeRow headerRow = table.HeadersRow(); - Assert.AreNotEqual(null, headerRow); - Assert.AreEqual("Categories", headerRow.Cell(1).GetString()); - - table.SetShowHeaderRow(false); - - ws.FirstCell().SetValue("x"); - - table.SetShowHeaderRow(); - - Assert.AreEqual("x", ws.FirstCell().GetString()); - Assert.AreEqual("Categories", ws.Cell("A2").GetString()); - Assert.AreNotEqual(null, headerRow); - Assert.AreEqual("A", table.DataRange.FirstRow().Field("Categories").GetString()); - Assert.AreEqual("C", table.DataRange.LastRow().Field("Categories").GetString()); - Assert.AreEqual("A", table.DataRange.FirstCell().GetString()); - Assert.AreEqual("C", table.DataRange.LastCell().GetString()); - } - - [Test] - public void ChangeFieldName() - { - XLWorkbook wb = new XLWorkbook(); - - var ws = wb.AddWorksheet("Sheet"); - ws.Cell("A1").SetValue("FName") - .CellBelow().SetValue("John"); - - ws.Cell("B1").SetValue("LName") - .CellBelow().SetValue("Doe"); - - var tbl = ws.RangeUsed().CreateTable(); - var nameBefore = tbl.Field(tbl.Fields.Last().Index).Name; - tbl.Field(tbl.Fields.Last().Index).Name = "LastName"; - var nameAfter = tbl.Field(tbl.Fields.Last().Index).Name; - - var cellValue = ws.Cell("B1").GetString(); - - Assert.AreEqual("LName", nameBefore); - Assert.AreEqual("LastName", nameAfter); - Assert.AreEqual("LastName", cellValue); - - tbl.ShowHeaderRow = false; - tbl.Field(tbl.Fields.Last().Index).Name = "LastNameChanged"; - nameAfter = tbl.Field(tbl.Fields.Last().Index).Name; - Assert.AreEqual("LastNameChanged", nameAfter); - - tbl.SetShowHeaderRow(true); - nameAfter = tbl.Cell("B1").Value.ToString(); - Assert.AreEqual("LastNameChanged", nameAfter); - } - } -} +using ClosedXML.Attributes; +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.Excel +{ + /// + /// Summary description for UnitTest1 + /// + [TestFixture] + public class TablesTests + { + public class TestObjectWithoutAttributes + { + public String Column1 { get; set; } + public String Column2 { get; set; } + } + + public class TestObjectWithAttributes + { + public int UnOrderedColumn { get; set; } + + [XLColumn(Header = "SecondColumn", Order = 1)] + public String Column1 { get; set; } + + [XLColumn(Header = "FirstColumn", Order = 0)] + public String Column2 { get; set; } + + [XLColumn(Header = "SomeFieldNotProperty", Order = 2)] + public int MyField; + } + + [Test] + public void CanSaveTableCreatedFromEmptyDataTable() + { + var dt = new DataTable("sheet1"); + dt.Columns.Add("col1", typeof(string)); + dt.Columns.Add("col2", typeof(double)); + + var wb = new XLWorkbook(); + wb.AddWorksheet(dt); + + using (var ms = new MemoryStream()) + wb.SaveAs(ms, true); + } + + [Test] + public void CanSaveTableCreatedFromSingleRow() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Title"); + ws.Range("A1").CreateTable(); + + using (var ms = new MemoryStream()) + wb.SaveAs(ms, true); + } + + [Test] + public void CreatingATableFromHeadersPushCellsBelow() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Title") + .CellBelow().SetValue("X"); + ws.Range("A1").CreateTable(); + + Assert.AreEqual(ws.Cell("A2").GetString(), String.Empty); + Assert.AreEqual(ws.Cell("A3").GetString(), "X"); + } + + [Test] + public void Inserting_Column_Sets_Header() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("A") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C"); + + IXLTable table = ws.RangeUsed().CreateTable(); + table.InsertColumnsAfter(1); + Assert.AreEqual("Column2", table.HeadersRow().LastCell().GetString()); + } + + [Test] + public void SavingLoadingTableWithNewLineInHeader() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + string columnName = "Line1" + Environment.NewLine + "Line2"; + ws.FirstCell().SetValue(columnName) + .CellBelow().SetValue("A"); + ws.RangeUsed().CreateTable(); + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + var wb2 = new XLWorkbook(ms); + IXLWorksheet ws2 = wb2.Worksheet(1); + IXLTable table2 = ws2.Table(0); + string fieldName = table2.Field(0).Name; + Assert.AreEqual("Line1\nLine2", fieldName); + } + } + + [Test] + public void SavingLoadingTableWithNewLineInHeader2() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Test"); + + var dt = new DataTable(); + string columnName = "Line1" + Environment.NewLine + "Line2"; + dt.Columns.Add(columnName); + + DataRow dr = dt.NewRow(); + dr[columnName] = "some text"; + dt.Rows.Add(dr); + ws.Cell(1, 1).InsertTable(dt.AsEnumerable()); + + IXLTable table1 = ws.Table(0); + string fieldName1 = table1.Field(0).Name; + Assert.AreEqual(columnName, fieldName1); + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + var wb2 = new XLWorkbook(ms); + IXLWorksheet ws2 = wb2.Worksheet(1); + IXLTable table2 = ws2.Table(0); + string fieldName2 = table2.Field(0).Name; + Assert.AreEqual("Line1\nLine2", fieldName2); + } + } + + [Test] + public void TableCreatedFromEmptyDataTable() + { + var dt = new DataTable("sheet1"); + dt.Columns.Add("col1", typeof(string)); + dt.Columns.Add("col2", typeof(double)); + + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(dt); + Assert.AreEqual(2, ws.Tables.First().ColumnCount()); + } + + [Test] + public void TableCreatedFromEmptyListOfInt() + { + var l = new List(); + + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(l); + Assert.AreEqual(1, ws.Tables.First().ColumnCount()); + } + + [Test] + public void TableCreatedFromEmptyListOfObject() + { + var l = new List(); + + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(l); + Assert.AreEqual(2, ws.Tables.First().ColumnCount()); + } + + [Test] + public void TableCreatedFromListOfObjectWithPropertyAttributes() + { + var l = new List() + { + new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 }, + new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 } + }; + + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().InsertTable(l); + Assert.AreEqual(4, ws.Tables.First().ColumnCount()); + Assert.AreEqual("FirstColumn", ws.FirstCell().Value); + Assert.AreEqual("SecondColumn", ws.FirstCell().CellRight().Value); + Assert.AreEqual("SomeFieldNotProperty", ws.FirstCell().CellRight().CellRight().Value); + Assert.AreEqual("UnOrderedColumn", ws.FirstCell().CellRight().CellRight().CellRight().Value); + } + + [Test] + public void TableInsertAboveFromData() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Value"); + + IXLTable table = ws.Range("A1:A2").CreateTable(); + table.SetShowTotalsRow() + .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; + + IXLTableRow row = table.DataRange.FirstRow(); + row.Field("Value").Value = 3; + row = table.DataRange.InsertRowsAbove(1).First(); + row.Field("Value").Value = 2; + row = table.DataRange.InsertRowsAbove(1).First(); + row.Field("Value").Value = 1; + + Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); + Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); + Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); + } + + [Test] + public void TableInsertAboveFromRows() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Value"); + + IXLTable table = ws.Range("A1:A2").CreateTable(); + table.SetShowTotalsRow() + .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; + + IXLTableRow row = table.DataRange.FirstRow(); + row.Field("Value").Value = 3; + row = row.InsertRowsAbove(1).First(); + row.Field("Value").Value = 2; + row = row.InsertRowsAbove(1).First(); + row.Field("Value").Value = 1; + + Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); + Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); + Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); + } + + [Test] + public void TableInsertBelowFromData() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Value"); + + IXLTable table = ws.Range("A1:A2").CreateTable(); + table.SetShowTotalsRow() + .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; + + IXLTableRow row = table.DataRange.FirstRow(); + row.Field("Value").Value = 1; + row = table.DataRange.InsertRowsBelow(1).First(); + row.Field("Value").Value = 2; + row = table.DataRange.InsertRowsBelow(1).First(); + row.Field("Value").Value = 3; + + Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); + Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); + Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); + } + + [Test] + public void TableInsertBelowFromRows() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Value"); + + IXLTable table = ws.Range("A1:A2").CreateTable(); + table.SetShowTotalsRow() + .Field(0).TotalsRowFunction = XLTotalsRowFunction.Sum; + + IXLTableRow row = table.DataRange.FirstRow(); + row.Field("Value").Value = 1; + row = row.InsertRowsBelow(1).First(); + row.Field("Value").Value = 2; + row = row.InsertRowsBelow(1).First(); + row.Field("Value").Value = 3; + + Assert.AreEqual(1, ws.Cell(2, 1).GetDouble()); + Assert.AreEqual(2, ws.Cell(3, 1).GetDouble()); + Assert.AreEqual(3, ws.Cell(4, 1).GetDouble()); + } + + [Test] + public void TableShowHeader() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Categories") + .CellBelow().SetValue("A") + .CellBelow().SetValue("B") + .CellBelow().SetValue("C"); + + IXLTable table = ws.RangeUsed().CreateTable(); + + Assert.AreEqual("Categories", table.Fields.First().Name); + + table.SetShowHeaderRow(false); + + Assert.AreEqual("Categories", table.Fields.First().Name); + + Assert.IsTrue(ws.Cell(1, 1).IsEmpty(true)); + Assert.AreEqual(null, table.HeadersRow()); + Assert.AreEqual("A", table.DataRange.FirstRow().Field("Categories").GetString()); + Assert.AreEqual("C", table.DataRange.LastRow().Field("Categories").GetString()); + Assert.AreEqual("A", table.DataRange.FirstCell().GetString()); + Assert.AreEqual("C", table.DataRange.LastCell().GetString()); + + table.SetShowHeaderRow(); + IXLRangeRow headerRow = table.HeadersRow(); + Assert.AreNotEqual(null, headerRow); + Assert.AreEqual("Categories", headerRow.Cell(1).GetString()); + + table.SetShowHeaderRow(false); + + ws.FirstCell().SetValue("x"); + + table.SetShowHeaderRow(); + + Assert.AreEqual("x", ws.FirstCell().GetString()); + Assert.AreEqual("Categories", ws.Cell("A2").GetString()); + Assert.AreNotEqual(null, headerRow); + Assert.AreEqual("A", table.DataRange.FirstRow().Field("Categories").GetString()); + Assert.AreEqual("C", table.DataRange.LastRow().Field("Categories").GetString()); + Assert.AreEqual("A", table.DataRange.FirstCell().GetString()); + Assert.AreEqual("C", table.DataRange.LastCell().GetString()); + } + + [Test] + public void ChangeFieldName() + { + XLWorkbook wb = new XLWorkbook(); + + var ws = wb.AddWorksheet("Sheet"); + ws.Cell("A1").SetValue("FName") + .CellBelow().SetValue("John"); + + ws.Cell("B1").SetValue("LName") + .CellBelow().SetValue("Doe"); + + var tbl = ws.RangeUsed().CreateTable(); + var nameBefore = tbl.Field(tbl.Fields.Last().Index).Name; + tbl.Field(tbl.Fields.Last().Index).Name = "LastName"; + var nameAfter = tbl.Field(tbl.Fields.Last().Index).Name; + + var cellValue = ws.Cell("B1").GetString(); + + Assert.AreEqual("LName", nameBefore); + Assert.AreEqual("LastName", nameAfter); + Assert.AreEqual("LastName", cellValue); + + tbl.ShowHeaderRow = false; + tbl.Field(tbl.Fields.Last().Index).Name = "LastNameChanged"; + nameAfter = tbl.Field(tbl.Fields.Last().Index).Name; + Assert.AreEqual("LastNameChanged", nameAfter); + + tbl.SetShowHeaderRow(true); + nameAfter = tbl.Cell("B1").Value.ToString(); + Assert.AreEqual("LastNameChanged", nameAfter); + } + } +} diff --git a/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs b/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs index b259da7..38615bf 100644 --- a/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs +++ b/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs @@ -1,129 +1,129 @@ -using ClosedXML.Excel; -using NUnit.Framework; -using System; -using System.Linq; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class XLWorksheetTests - { - [Test] - public void ColumnCountTime() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - DateTime start = DateTime.Now; - ws.ColumnCount(); - DateTime end = DateTime.Now; - Assert.IsTrue((end - start).TotalMilliseconds < 500); - } - - [Test] - public void CopyConditionalFormatsCount() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.AddWorksheet("Sheet1"); - ws.FirstCell().AddConditionalFormat().WhenContains("1").Fill.SetBackgroundColor(XLColor.Blue); - IXLWorksheet ws2 = ws.CopyTo("Sheet2"); - Assert.AreEqual(1, ws2.ConditionalFormats.Count()); - } - - [Test] - public void DeletingSheets1() - { - var wb = new XLWorkbook(); - wb.Worksheets.Add("Sheet3"); - wb.Worksheets.Add("Sheet2"); - wb.Worksheets.Add("Sheet1", 1); - - wb.Worksheet("Sheet3").Delete(); - - Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); - Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); - Assert.AreEqual(2, wb.Worksheets.Count); - } - - [Test] - public void InsertingSheets1() - { - var wb = new XLWorkbook(); - wb.Worksheets.Add("Sheet1"); - wb.Worksheets.Add("Sheet2"); - wb.Worksheets.Add("Sheet3"); - - Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); - Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); - Assert.AreEqual("Sheet3", wb.Worksheet(3).Name); - } - - [Test] - public void InsertingSheets2() - { - var wb = new XLWorkbook(); - wb.Worksheets.Add("Sheet2"); - wb.Worksheets.Add("Sheet1", 1); - wb.Worksheets.Add("Sheet3"); - - Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); - Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); - Assert.AreEqual("Sheet3", wb.Worksheet(3).Name); - } - - [Test] - public void InsertingSheets3() - { - var wb = new XLWorkbook(); - wb.Worksheets.Add("Sheet3"); - wb.Worksheets.Add("Sheet2", 1); - wb.Worksheets.Add("Sheet1", 1); - - Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); - Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); - Assert.AreEqual("Sheet3", wb.Worksheet(3).Name); - } - - [Test] - public void MergedRanges() - { - IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); - ws.Range("A1:B2").Merge(); - ws.Range("C1:D3").Merge(); - ws.Range("D2:E2").Merge(); - - Assert.AreEqual(2, ws.MergedRanges.Count); - Assert.AreEqual("A1:B2", ws.MergedRanges.First().RangeAddress.ToStringRelative()); - Assert.AreEqual("D2:E2", ws.MergedRanges.Last().RangeAddress.ToStringRelative()); - } - - [Test] - public void RowCountTime() - { - var wb = new XLWorkbook(); - IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); - DateTime start = DateTime.Now; - ws.RowCount(); - DateTime end = DateTime.Now; - Assert.IsTrue((end - start).TotalMilliseconds < 500); - } - - [Test] - public void SheetsWithCommas() - { - using (var wb = new XLWorkbook()) - { - var sourceSheetName = "Sheet1, Sheet3"; - var ws = wb.Worksheets.Add(sourceSheetName); - ws.Cell("A1").Value = 1; - ws.Cell("A2").Value = 2; - ws.Cell("B2").Value = 3; - - ws = wb.Worksheets.Add("Formula"); - ws.FirstCell().FormulaA1 = string.Format("=SUM('{0}'!A1:A2,'{0}'!B1:B2)", sourceSheetName); - - var value = ws.FirstCell().Value; - Assert.AreEqual(6, value); - } - } - } -} +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Linq; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLWorksheetTests + { + [Test] + public void ColumnCountTime() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + DateTime start = DateTime.Now; + ws.ColumnCount(); + DateTime end = DateTime.Now; + Assert.IsTrue((end - start).TotalMilliseconds < 500); + } + + [Test] + public void CopyConditionalFormatsCount() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().AddConditionalFormat().WhenContains("1").Fill.SetBackgroundColor(XLColor.Blue); + IXLWorksheet ws2 = ws.CopyTo("Sheet2"); + Assert.AreEqual(1, ws2.ConditionalFormats.Count()); + } + + [Test] + public void DeletingSheets1() + { + var wb = new XLWorkbook(); + wb.Worksheets.Add("Sheet3"); + wb.Worksheets.Add("Sheet2"); + wb.Worksheets.Add("Sheet1", 1); + + wb.Worksheet("Sheet3").Delete(); + + Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); + Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); + Assert.AreEqual(2, wb.Worksheets.Count); + } + + [Test] + public void InsertingSheets1() + { + var wb = new XLWorkbook(); + wb.Worksheets.Add("Sheet1"); + wb.Worksheets.Add("Sheet2"); + wb.Worksheets.Add("Sheet3"); + + Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); + Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); + Assert.AreEqual("Sheet3", wb.Worksheet(3).Name); + } + + [Test] + public void InsertingSheets2() + { + var wb = new XLWorkbook(); + wb.Worksheets.Add("Sheet2"); + wb.Worksheets.Add("Sheet1", 1); + wb.Worksheets.Add("Sheet3"); + + Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); + Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); + Assert.AreEqual("Sheet3", wb.Worksheet(3).Name); + } + + [Test] + public void InsertingSheets3() + { + var wb = new XLWorkbook(); + wb.Worksheets.Add("Sheet3"); + wb.Worksheets.Add("Sheet2", 1); + wb.Worksheets.Add("Sheet1", 1); + + Assert.AreEqual("Sheet1", wb.Worksheet(1).Name); + Assert.AreEqual("Sheet2", wb.Worksheet(2).Name); + Assert.AreEqual("Sheet3", wb.Worksheet(3).Name); + } + + [Test] + public void MergedRanges() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1"); + ws.Range("A1:B2").Merge(); + ws.Range("C1:D3").Merge(); + ws.Range("D2:E2").Merge(); + + Assert.AreEqual(2, ws.MergedRanges.Count); + Assert.AreEqual("A1:B2", ws.MergedRanges.First().RangeAddress.ToStringRelative()); + Assert.AreEqual("D2:E2", ws.MergedRanges.Last().RangeAddress.ToStringRelative()); + } + + [Test] + public void RowCountTime() + { + var wb = new XLWorkbook(); + IXLWorksheet ws = wb.Worksheets.Add("Sheet1"); + DateTime start = DateTime.Now; + ws.RowCount(); + DateTime end = DateTime.Now; + Assert.IsTrue((end - start).TotalMilliseconds < 500); + } + + [Test] + public void SheetsWithCommas() + { + using (var wb = new XLWorkbook()) + { + var sourceSheetName = "Sheet1, Sheet3"; + var ws = wb.Worksheets.Add(sourceSheetName); + ws.Cell("A1").Value = 1; + ws.Cell("A2").Value = 2; + ws.Cell("B2").Value = 3; + + ws = wb.Worksheets.Add("Formula"); + ws.FirstCell().FormulaA1 = string.Format("=SUM('{0}'!A1:A2,'{0}'!B1:B2)", sourceSheetName); + + var value = ws.FirstCell().Value; + Assert.AreEqual(6, value); + } + } + } +} diff --git a/ClosedXML_Tests/ExcelDocsComparerTests.cs b/ClosedXML_Tests/ExcelDocsComparerTests.cs index ed16735..ac2fa36 100644 --- a/ClosedXML_Tests/ExcelDocsComparerTests.cs +++ b/ClosedXML_Tests/ExcelDocsComparerTests.cs @@ -1,61 +1,61 @@ -using System.IO; -using ClosedXML_Examples; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class ExcelDocsComparerTests - { - [Test] - public void CheckEqual() - { - string left = ExampleHelper.GetTempFilePath("left.xlsx"); - string right = ExampleHelper.GetTempFilePath("right.xlsx"); - try - { - new BasicTable().Create(left); - new BasicTable().Create(right); - string message; - Assert.IsTrue(ExcelDocsComparer.Compare(left, right, TestHelper.IsRunningOnUnix, out message)); - } - finally - { - if (File.Exists(left)) - { - File.Delete(left); - } - if (File.Exists(right)) - { - File.Delete(right); - } - } - } - - [Test] - public void CheckNonEqual() - { - string left = ExampleHelper.GetTempFilePath("left.xlsx"); - string right = ExampleHelper.GetTempFilePath("right.xlsx"); - try - { - new BasicTable().Create(left); - new HelloWorld().Create(right); - - string message; - Assert.IsFalse(ExcelDocsComparer.Compare(left, right, TestHelper.IsRunningOnUnix, out message)); - } - finally - { - if (File.Exists(left)) - { - File.Delete(left); - } - if (File.Exists(right)) - { - File.Delete(right); - } - } - } - } +using System.IO; +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class ExcelDocsComparerTests + { + [Test] + public void CheckEqual() + { + string left = ExampleHelper.GetTempFilePath("left.xlsx"); + string right = ExampleHelper.GetTempFilePath("right.xlsx"); + try + { + new BasicTable().Create(left); + new BasicTable().Create(right); + string message; + Assert.IsTrue(ExcelDocsComparer.Compare(left, right, TestHelper.IsRunningOnUnix, out message)); + } + finally + { + if (File.Exists(left)) + { + File.Delete(left); + } + if (File.Exists(right)) + { + File.Delete(right); + } + } + } + + [Test] + public void CheckNonEqual() + { + string left = ExampleHelper.GetTempFilePath("left.xlsx"); + string right = ExampleHelper.GetTempFilePath("right.xlsx"); + try + { + new BasicTable().Create(left); + new HelloWorld().Create(right); + + string message; + Assert.IsFalse(ExcelDocsComparer.Compare(left, right, TestHelper.IsRunningOnUnix, out message)); + } + finally + { + if (File.Exists(left)) + { + File.Delete(left); + } + if (File.Exists(right)) + { + File.Delete(right); + } + } + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Properties/AssemblyInfo.cs b/ClosedXML_Tests/Properties/AssemblyInfo.cs index f11097e..03e5d3c 100644 --- a/ClosedXML_Tests/Properties/AssemblyInfo.cs +++ b/ClosedXML_Tests/Properties/AssemblyInfo.cs @@ -1,38 +1,38 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. - -[assembly: AssemblyTitle("ClosedXML_Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("ClosedXML_Tests")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2011")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. - -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM - -[assembly: Guid("a16b867e-6b00-4ccc-a368-c9f9b14e0e6a")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.0")] +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. + +[assembly: AssemblyTitle("ClosedXML_Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("ClosedXML_Tests")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2011")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM + +[assembly: Guid("a16b867e-6b00-4ccc-a368-c9f9b14e0e6a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/ClosedXML_Tests/Resource/Examples/AutoFilter/CustomAutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/AutoFilter/CustomAutoFilter.xlsx index 12e3646..2ee0c8d 100644 --- a/ClosedXML_Tests/Resource/Examples/AutoFilter/CustomAutoFilter.xlsx +++ b/ClosedXML_Tests/Resource/Examples/AutoFilter/CustomAutoFilter.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/AutoFilter/DynamicAutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/AutoFilter/DynamicAutoFilter.xlsx index 7e82d6b..0b2fb27 100644 --- a/ClosedXML_Tests/Resource/Examples/AutoFilter/DynamicAutoFilter.xlsx +++ b/ClosedXML_Tests/Resource/Examples/AutoFilter/DynamicAutoFilter.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/AutoFilter/RegularAutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/AutoFilter/RegularAutoFilter.xlsx index e74cd54..7221dae 100644 --- a/ClosedXML_Tests/Resource/Examples/AutoFilter/RegularAutoFilter.xlsx +++ b/ClosedXML_Tests/Resource/Examples/AutoFilter/RegularAutoFilter.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/AutoFilter/TopBottomAutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/AutoFilter/TopBottomAutoFilter.xlsx index 8570228..4e069ba 100644 --- a/ClosedXML_Tests/Resource/Examples/AutoFilter/TopBottomAutoFilter.xlsx +++ b/ClosedXML_Tests/Resource/Examples/AutoFilter/TopBottomAutoFilter.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Columns/ColumnCells.xlsx b/ClosedXML_Tests/Resource/Examples/Columns/ColumnCells.xlsx index 464d657..2e35af2 100644 --- a/ClosedXML_Tests/Resource/Examples/Columns/ColumnCells.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Columns/ColumnCells.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Columns/ColumnCollection.xlsx b/ClosedXML_Tests/Resource/Examples/Columns/ColumnCollection.xlsx index af8b936..8210ecf 100644 --- a/ClosedXML_Tests/Resource/Examples/Columns/ColumnCollection.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Columns/ColumnCollection.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Columns/ColumnSettings.xlsx b/ClosedXML_Tests/Resource/Examples/Columns/ColumnSettings.xlsx index 5e599eb..d729b73 100644 --- a/ClosedXML_Tests/Resource/Examples/Columns/ColumnSettings.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Columns/ColumnSettings.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Columns/DeletingColumns.xlsx b/ClosedXML_Tests/Resource/Examples/Columns/DeletingColumns.xlsx index 376a2ec..bac6e30 100644 --- a/ClosedXML_Tests/Resource/Examples/Columns/DeletingColumns.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Columns/DeletingColumns.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Comments/AddingComments.xlsx b/ClosedXML_Tests/Resource/Examples/Comments/AddingComments.xlsx index b31b4df..3879998 100644 --- a/ClosedXML_Tests/Resource/Examples/Comments/AddingComments.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Comments/AddingComments.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowHigh.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowHigh.xlsx index 090eb37..8e28b85 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowHigh.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowHigh.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowMidHigh.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowMidHigh.xlsx index 9bc4eb6..a9216c5 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowMidHigh.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleLowMidHigh.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleMinimumMaximum.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleMinimumMaximum.xlsx index ef35d8b..965c332 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleMinimumMaximum.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFColorScaleMinimumMaximum.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFContains.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFContains.xlsx index f28c424..4721b41 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFContains.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFContains.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBar.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBar.xlsx index c98b5dd..4db382d 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBar.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBar.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEndsWith.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEndsWith.xlsx index c8fb0a8..e2d4308 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEndsWith.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEndsWith.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEqualsNumber.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEqualsNumber.xlsx index d581542..a75c503 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEqualsNumber.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEqualsNumber.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEqualsString.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEqualsString.xlsx index f17ce56..07e8628 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEqualsString.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEqualsString.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIconSet.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIconSet.xlsx index c239c29..fb91ef7 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIconSet.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIconSet.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsBlank.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsBlank.xlsx index 3878859..80be4ab 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsBlank.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsBlank.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsError.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsError.xlsx index 58db21c..e952a7f 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsError.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFIsError.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFMultipleConditions.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFMultipleConditions.xlsx index 4a5e54a..0d31d2a 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFMultipleConditions.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFMultipleConditions.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotBlank.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotBlank.xlsx index cdc0d3b..5f4f6ce 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotBlank.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotBlank.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotContains.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotContains.xlsx index 9cc4378..1b3b379 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotContains.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotContains.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsNumber.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsNumber.xlsx index f0b3c45..7d1bd15 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsNumber.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsNumber.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsString.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsString.xlsx index ddd478d..531411d 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsString.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotEqualsString.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotError.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotError.xlsx index 158e8e7..9b07849 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotError.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFNotError.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStartsWith.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStartsWith.xlsx index 1921ef3..e19f30e 100644 --- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStartsWith.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStartsWith.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Delete/DeleteFewWorksheets.xlsx b/ClosedXML_Tests/Resource/Examples/Delete/DeleteFewWorksheets.xlsx index 617ed94..0bfcae5 100644 --- a/ClosedXML_Tests/Resource/Examples/Delete/DeleteFewWorksheets.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Delete/DeleteFewWorksheets.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Delete/RemoveRows.xlsx b/ClosedXML_Tests/Resource/Examples/Delete/RemoveRows.xlsx index 7a22bb6..3a4822a 100644 --- a/ClosedXML_Tests/Resource/Examples/Delete/RemoveRows.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Delete/RemoveRows.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageAnchors.xlsx b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageAnchors.xlsx index 89fb86d..53aa802 100644 --- a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageAnchors.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageAnchors.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageFormats.xlsx b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageFormats.xlsx index ff05efe..237d910 100644 --- a/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageFormats.xlsx +++ b/ClosedXML_Tests/Resource/Examples/ImageHandling/ImageFormats.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Loading/ChangingBasicTable.xlsx b/ClosedXML_Tests/Resource/Examples/Loading/ChangingBasicTable.xlsx index e620dd7..30a397a 100644 --- a/ClosedXML_Tests/Resource/Examples/Loading/ChangingBasicTable.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Loading/ChangingBasicTable.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/AddingDataSet.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/AddingDataSet.xlsx index 1c3d359..c5abda2 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/AddingDataSet.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/AddingDataSet.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/AddingDataTableAsWorksheet.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/AddingDataTableAsWorksheet.xlsx index 21de466..3dcec19 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/AddingDataTableAsWorksheet.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/AddingDataTableAsWorksheet.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/AdjustToContents.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/AdjustToContents.xlsx index 26c33b7..ec9111e 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/AdjustToContents.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/AdjustToContents.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/AdjustToContentsWithAutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/AdjustToContentsWithAutoFilter.xlsx index 739fe19..c71500f 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/AdjustToContentsWithAutoFilter.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/AdjustToContentsWithAutoFilter.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/AutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/AutoFilter.xlsx index 9fbb825..e18cf50 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/AutoFilter.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/AutoFilter.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/BasicTable.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/BasicTable.xlsx index e3fc96b..7109c2e 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/BasicTable.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/BasicTable.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/BlankCells.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/BlankCells.xlsx index f96c55b..21ea101 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/BlankCells.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/BlankCells.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/CellValues.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/CellValues.xlsx index a438a52..ec4c484 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/CellValues.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/CellValues.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/Collections.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/Collections.xlsx index 1d83aad..9da08d6 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/Collections.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/Collections.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/CopyingRowsAndColumns.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/CopyingRowsAndColumns.xlsx index 4873b02..961f52c 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/CopyingRowsAndColumns.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/CopyingRowsAndColumns.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/CopyingWorksheets.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/CopyingWorksheets.xlsx index 027c1a7..6d14038 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/CopyingWorksheets.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/CopyingWorksheets.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/DataTypes.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/DataTypes.xlsx index 9b03a64..87f74be 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/DataTypes.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/DataTypes.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx index 0221170..5d0b538 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/DataValidation.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/DataValidation.xlsx index 923ade1..d2e119b 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/DataValidation.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/DataValidation.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/Formulas.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/Formulas.xlsx index 3a48083..e478c28 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/Formulas.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/Formulas.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/FreezePanes.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/FreezePanes.xlsx index 25af911..65e4082 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/FreezePanes.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/FreezePanes.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/HideSheets.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/HideSheets.xlsx index d380837..084e291 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/HideSheets.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/HideSheets.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/HideUnhide.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/HideUnhide.xlsx index 6889270..a3c6ea5 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/HideUnhide.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/HideUnhide.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/Hyperlinks.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/Hyperlinks.xlsx index d5ffe20..67ea273 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/Hyperlinks.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/Hyperlinks.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/InsertingData.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/InsertingData.xlsx index b6aa478..9e9d20f 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/InsertingData.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/InsertingData.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/InsertingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/InsertingTables.xlsx index 80c7c3d..212cbfe 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/InsertingTables.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/InsertingTables.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/LambdaExpressions.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/LambdaExpressions.xlsx index c168493..939001d 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/LambdaExpressions.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/LambdaExpressions.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/MergeCells.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/MergeCells.xlsx index 854f1d2..e5120d4 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/MergeCells.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/MergeCells.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx index badd03a..9839a6f 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/MergeMoves.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/Outline.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/Outline.xlsx index a510de9..4590850 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/Outline.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/Outline.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/RightToLeft.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/RightToLeft.xlsx index 1faf041..235f17a 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/RightToLeft.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/RightToLeft.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/SheetProtection.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/SheetProtection.xlsx index d48f690..abeeb15 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/SheetProtection.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/SheetProtection.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/SheetViews.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/SheetViews.xlsx index 723756a..9102f0a 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/SheetViews.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/SheetViews.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx index f1bf8e5..81bc2a4 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/ShiftingFormulas.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/ShowCase.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/ShowCase.xlsx index a9d4499..b02ab54 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/ShowCase.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/ShowCase.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/TabColors.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/TabColors.xlsx index 6a57c8c..3b08f53 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/TabColors.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/TabColors.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Misc/WorkbookProperties.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/WorkbookProperties.xlsx index 01a8aee..7e28ec6 100644 --- a/ClosedXML_Tests/Resource/Examples/Misc/WorkbookProperties.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Misc/WorkbookProperties.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/PageSetup/HeaderFooters.xlsx b/ClosedXML_Tests/Resource/Examples/PageSetup/HeaderFooters.xlsx index 3363190..5464356 100644 --- a/ClosedXML_Tests/Resource/Examples/PageSetup/HeaderFooters.xlsx +++ b/ClosedXML_Tests/Resource/Examples/PageSetup/HeaderFooters.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/PageSetup/Margins.xlsx b/ClosedXML_Tests/Resource/Examples/PageSetup/Margins.xlsx index ee1148f..062d427 100644 --- a/ClosedXML_Tests/Resource/Examples/PageSetup/Margins.xlsx +++ b/ClosedXML_Tests/Resource/Examples/PageSetup/Margins.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/PageSetup/Page.xlsx b/ClosedXML_Tests/Resource/Examples/PageSetup/Page.xlsx index 7204d1e..13debb0 100644 --- a/ClosedXML_Tests/Resource/Examples/PageSetup/Page.xlsx +++ b/ClosedXML_Tests/Resource/Examples/PageSetup/Page.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/PageSetup/SheetTab.xlsx b/ClosedXML_Tests/Resource/Examples/PageSetup/SheetTab.xlsx index 34e10ac..e03a6b5 100644 --- a/ClosedXML_Tests/Resource/Examples/PageSetup/SheetTab.xlsx +++ b/ClosedXML_Tests/Resource/Examples/PageSetup/SheetTab.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/PageSetup/Sheets.xlsx b/ClosedXML_Tests/Resource/Examples/PageSetup/Sheets.xlsx index 1a6bd98..fd83a80 100644 --- a/ClosedXML_Tests/Resource/Examples/PageSetup/Sheets.xlsx +++ b/ClosedXML_Tests/Resource/Examples/PageSetup/Sheets.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/PageSetup/TwoPages.xlsx b/ClosedXML_Tests/Resource/Examples/PageSetup/TwoPages.xlsx index 76199d6..03fb5e2 100644 --- a/ClosedXML_Tests/Resource/Examples/PageSetup/TwoPages.xlsx +++ b/ClosedXML_Tests/Resource/Examples/PageSetup/TwoPages.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/PivotTables/PivotTables.xlsx b/ClosedXML_Tests/Resource/Examples/PivotTables/PivotTables.xlsx index 5bc0db9..c582a15 100644 --- a/ClosedXML_Tests/Resource/Examples/PivotTables/PivotTables.xlsx +++ b/ClosedXML_Tests/Resource/Examples/PivotTables/PivotTables.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/AddingRowToTables.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/AddingRowToTables.xlsx index 02e82ea..95291f8 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/AddingRowToTables.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/AddingRowToTables.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx index 3b6ee5a..c1c9431 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/ClearingRanges.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/CopyingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/CopyingRanges.xlsx index b8f8666..064601a 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/CopyingRanges.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/CopyingRanges.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/CurrentRowColumn.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/CurrentRowColumn.xlsx index ec28739..6148e44 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/CurrentRowColumn.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/CurrentRowColumn.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/DefiningRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/DefiningRanges.xlsx index 90f926e..8e79c44 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/DefiningRanges.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/DefiningRanges.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/DeletingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/DeletingRanges.xlsx index 28bc2a1..1fbbe5a 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/DeletingRanges.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/DeletingRanges.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingColumns.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingColumns.xlsx index d79dc56..dabfb5f 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingColumns.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingColumns.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingRows.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingRows.xlsx index 3666e2c..6cdd101 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingRows.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/InsertingDeletingRows.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/MultipleRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/MultipleRanges.xlsx index 82630be..e3717c5 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/MultipleRanges.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/MultipleRanges.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/NamedRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/NamedRanges.xlsx index 27bb627..c1109bf 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/NamedRanges.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/NamedRanges.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx index 7cf80c7..a33e2a6 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/SelectingRanges.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/ShiftingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/ShiftingRanges.xlsx index 771b125..3f1bafd 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/ShiftingRanges.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/ShiftingRanges.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/SortExample.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/SortExample.xlsx index a49315e..8b26d86 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/SortExample.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/SortExample.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/Sorting.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/Sorting.xlsx index ca67cc6..08344e9 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/Sorting.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/Sorting.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRanges.xlsx index 678bb4a..4d136e2 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRanges.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRanges.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRangesPlus.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRangesPlus.xlsx index f2c3ad9..44fbbbe 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRangesPlus.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/TransposeRangesPlus.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/UsingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/UsingTables.xlsx index 6e89783..288d1fe 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/UsingTables.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/UsingTables.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx index 68c5013..4a705f7 100644 --- a/ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Rows/RowCells.xlsx b/ClosedXML_Tests/Resource/Examples/Rows/RowCells.xlsx index f4656a5..2f0be53 100644 --- a/ClosedXML_Tests/Resource/Examples/Rows/RowCells.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Rows/RowCells.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Rows/RowCollection.xlsx b/ClosedXML_Tests/Resource/Examples/Rows/RowCollection.xlsx index 0923251..5c98025 100644 --- a/ClosedXML_Tests/Resource/Examples/Rows/RowCollection.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Rows/RowCollection.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Rows/RowSettings.xlsx b/ClosedXML_Tests/Resource/Examples/Rows/RowSettings.xlsx index bac9032..69a0c15 100644 --- a/ClosedXML_Tests/Resource/Examples/Rows/RowSettings.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Rows/RowSettings.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Styles/DefaultStyles.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/DefaultStyles.xlsx index 3e095c1..86e20d3 100644 --- a/ClosedXML_Tests/Resource/Examples/Styles/DefaultStyles.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Styles/DefaultStyles.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Styles/PurpleWorksheet.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/PurpleWorksheet.xlsx index 2cb3f03..4422537 100644 --- a/ClosedXML_Tests/Resource/Examples/Styles/PurpleWorksheet.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Styles/PurpleWorksheet.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleAlignment.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleAlignment.xlsx index 94bcaac..abe42a8 100644 --- a/ClosedXML_Tests/Resource/Examples/Styles/StyleAlignment.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Styles/StyleAlignment.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleBorder.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleBorder.xlsx index 61a40ef..2af3891 100644 --- a/ClosedXML_Tests/Resource/Examples/Styles/StyleBorder.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Styles/StyleBorder.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleFill.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleFill.xlsx index 9b84531..389f0f6 100644 --- a/ClosedXML_Tests/Resource/Examples/Styles/StyleFill.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Styles/StyleFill.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleFont.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleFont.xlsx index 04267cc..0dadd37 100644 --- a/ClosedXML_Tests/Resource/Examples/Styles/StyleFont.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Styles/StyleFont.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleNumberFormat.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleNumberFormat.xlsx index aebbfa8..5a5ee64 100644 --- a/ClosedXML_Tests/Resource/Examples/Styles/StyleNumberFormat.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Styles/StyleNumberFormat.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleRowsColumns.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleRowsColumns.xlsx index 9faa831..472f826 100644 --- a/ClosedXML_Tests/Resource/Examples/Styles/StyleRowsColumns.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Styles/StyleRowsColumns.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Styles/StyleWorksheet.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/StyleWorksheet.xlsx index b1dba83..407d189 100644 --- a/ClosedXML_Tests/Resource/Examples/Styles/StyleWorksheet.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Styles/StyleWorksheet.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Styles/UsingColors.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/UsingColors.xlsx index b0c01ef..f7421af 100644 --- a/ClosedXML_Tests/Resource/Examples/Styles/UsingColors.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Styles/UsingColors.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Examples/Styles/UsingRichText.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/UsingRichText.xlsx index c44ada1..90ef8fc 100644 --- a/ClosedXML_Tests/Resource/Examples/Styles/UsingRichText.xlsx +++ b/ClosedXML_Tests/Resource/Examples/Styles/UsingRichText.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Misc/ExcelProducedWorkbookWithImages.xlsx b/ClosedXML_Tests/Resource/Misc/ExcelProducedWorkbookWithImages.xlsx new file mode 100644 index 0000000..62a8107 --- /dev/null +++ b/ClosedXML_Tests/Resource/Misc/ExcelProducedWorkbookWithImages.xlsx Binary files differ diff --git a/ClosedXML_Tests/TestHelper.cs b/ClosedXML_Tests/TestHelper.cs index 477facf..431d6ef 100644 --- a/ClosedXML_Tests/TestHelper.cs +++ b/ClosedXML_Tests/TestHelper.cs @@ -1,130 +1,132 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.IO; -using System.Threading; -using ClosedXML.Excel; -using ClosedXML_Examples; -using DocumentFormat.OpenXml.Drawing; -using NUnit.Framework; -using Path = System.IO.Path; - -namespace ClosedXML_Tests -{ - internal static class TestHelper - { - public static string CurrencySymbol - { - get { return Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol; } - } - - //Note: Run example tests parameters - public static string TestsOutputDirectory - { - get - { - return Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); - } - - } - - public const string ActualTestResultPostFix = ""; - public static readonly string TestsExampleOutputDirectory = Path.Combine(TestsOutputDirectory, "Examples"); - - private const bool CompareWithResources = true; - - private static readonly ResourceFileExtractor _extractor = new ResourceFileExtractor(null, ".Resource.Examples."); - - public static void SaveWorkbook(XLWorkbook workbook, params string[] fileNameParts) - { - workbook.SaveAs(Path.Combine(new string[] { TestsOutputDirectory }.Concat(fileNameParts).ToArray()), true); - } - - // Because different fonts are installed on Unix, - // the columns widths after AdjustToContents() will - // cause the tests to fail. - // Therefore we ignore the width attribute when running on Unix - public static bool IsRunningOnUnix - { - get - { - int p = (int)Environment.OSVersion.Platform; - return ((p == 4) || (p == 6) || (p == 128)); - } - } - - public static void RunTestExample(string filePartName) - where T : IXLExample, new() - { - // Make sure tests run on a deterministic culture - Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); - - var example = new T(); - string[] pathParts = filePartName.Split(new char[] {'\\'}); - string filePath1 = Path.Combine(new List() { TestsExampleOutputDirectory }.Concat(pathParts).ToArray()); - - var extension = Path.GetExtension(filePath1); - var directory = Path.GetDirectoryName(filePath1); - - var fileName= Path.GetFileNameWithoutExtension(filePath1); - fileName += ActualTestResultPostFix; - fileName = Path.ChangeExtension(fileName, extension); - - filePath1 = Path.Combine(directory, "z" + fileName); - var filePath2 = Path.Combine(directory, fileName); - //Run test - example.Create(filePath1); - new XLWorkbook(filePath1).SaveAs(filePath2, true); - bool success = true; -#pragma warning disable 162 - try - { - //Compare - // ReSharper disable ConditionIsAlwaysTrueOrFalse - if (CompareWithResources) - // ReSharper restore ConditionIsAlwaysTrueOrFalse - - { - string resourcePath = filePartName.Replace('\\', '.').TrimStart('.'); - using (var streamExpected = _extractor.ReadFileFromResToStream(resourcePath)) - using (var streamActual = File.OpenRead(filePath2)) - { - string message; - success = ExcelDocsComparer.Compare(streamActual, streamExpected, TestHelper.IsRunningOnUnix, out message); - var formattedMessage = - String.Format( - "Actual file '{0}' is different than the expected file '{1}'. The difference is: '{2}'", - filePath2, resourcePath, message); - - Assert.IsTrue(success, formattedMessage); - } - } - } - finally - { - //if (success && File.Exists(filePath)) File.Delete(filePath); - } -#pragma warning restore 162 - } - - public static string GetResourcePath(string filePartName) - { - return filePartName.Replace('\\', '.').TrimStart('.'); - } - - public static Stream GetStreamFromResource(string resourcePath) - { - var extractor = new ResourceFileExtractor(null, ".Resource."); - return extractor.ReadFileFromResToStream(resourcePath); - } - - public static void LoadFile(string filePartName) - { - using (var stream = GetStreamFromResource(GetResourcePath(filePartName))) - { - var wb = new XLWorkbook(stream); - wb.Dispose(); - } - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using System.Threading; +using ClosedXML.Excel; +using ClosedXML_Examples; +using DocumentFormat.OpenXml.Drawing; +using NUnit.Framework; +using Path = System.IO.Path; + +namespace ClosedXML_Tests +{ + internal static class TestHelper + { + public static string CurrencySymbol + { + get { return Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol; } + } + + //Note: Run example tests parameters + public static string TestsOutputDirectory + { + get + { + return Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + } + + } + + public const string ActualTestResultPostFix = ""; + public static readonly string TestsExampleOutputDirectory = Path.Combine(TestsOutputDirectory, "Examples"); + + private const bool CompareWithResources = true; + + private static readonly ResourceFileExtractor _extractor = new ResourceFileExtractor(null, ".Resource.Examples."); + + public static void SaveWorkbook(XLWorkbook workbook, params string[] fileNameParts) + { + workbook.SaveAs(Path.Combine(new string[] { TestsOutputDirectory }.Concat(fileNameParts).ToArray()), true); + } + + // Because different fonts are installed on Unix, + // the columns widths after AdjustToContents() will + // cause the tests to fail. + // Therefore we ignore the width attribute when running on Unix + public static bool IsRunningOnUnix + { + get + { + int p = (int)Environment.OSVersion.Platform; + return ((p == 4) || (p == 6) || (p == 128)); + } + } + + public static void RunTestExample(string filePartName) + where T : IXLExample, new() + { + // Make sure tests run on a deterministic culture + Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); + + var example = new T(); + string[] pathParts = filePartName.Split(new char[] {'\\'}); + string filePath1 = Path.Combine(new List() { TestsExampleOutputDirectory }.Concat(pathParts).ToArray()); + + var extension = Path.GetExtension(filePath1); + var directory = Path.GetDirectoryName(filePath1); + + var fileName= Path.GetFileNameWithoutExtension(filePath1); + fileName += ActualTestResultPostFix; + fileName = Path.ChangeExtension(fileName, extension); + + filePath1 = Path.Combine(directory, "z" + fileName); + var filePath2 = Path.Combine(directory, fileName); + //Run test + example.Create(filePath1); + using (var wb = new XLWorkbook(filePath1)) + wb.SaveAs(filePath2); + + bool success = true; +#pragma warning disable 162 + try + { + //Compare + // ReSharper disable ConditionIsAlwaysTrueOrFalse + if (CompareWithResources) + // ReSharper restore ConditionIsAlwaysTrueOrFalse + + { + string resourcePath = filePartName.Replace('\\', '.').TrimStart('.'); + using (var streamExpected = _extractor.ReadFileFromResToStream(resourcePath)) + using (var streamActual = File.OpenRead(filePath2)) + { + string message; + success = ExcelDocsComparer.Compare(streamActual, streamExpected, TestHelper.IsRunningOnUnix, out message); + var formattedMessage = + String.Format( + "Actual file '{0}' is different than the expected file '{1}'. The difference is: '{2}'", + filePath2, resourcePath, message); + + Assert.IsTrue(success, formattedMessage); + } + } + } + finally + { + //if (success && File.Exists(filePath)) File.Delete(filePath); + } +#pragma warning restore 162 + } + + public static string GetResourcePath(string filePartName) + { + return filePartName.Replace('\\', '.').TrimStart('.'); + } + + public static Stream GetStreamFromResource(string resourcePath) + { + var extractor = new ResourceFileExtractor(null, ".Resource."); + return extractor.ReadFileFromResToStream(resourcePath); + } + + public static void LoadFile(string filePartName) + { + using (var stream = GetStreamFromResource(GetResourcePath(filePartName))) + { + var wb = new XLWorkbook(stream); + wb.Dispose(); + } + } + } +} diff --git a/ClosedXML_Tests/Utils/ExcelDocsComparer.cs b/ClosedXML_Tests/Utils/ExcelDocsComparer.cs index 0bbeafd..2ad4ab2 100644 --- a/ClosedXML_Tests/Utils/ExcelDocsComparer.cs +++ b/ClosedXML_Tests/Utils/ExcelDocsComparer.cs @@ -1,42 +1,42 @@ -using System; -using System.IO; -using System.IO.Packaging; - -namespace ClosedXML_Tests -{ - internal static class ExcelDocsComparer - { - public static bool Compare(string left, string right, bool stripColumnWidths, out string message) - { - using (FileStream leftStream = File.OpenRead(left)) - { - using (FileStream rightStream = File.OpenRead(right)) - { - return Compare(leftStream, rightStream, stripColumnWidths, out message); - } - } - } - - public static bool Compare(Stream left, Stream right, bool stripColumnWidths, out string message) - { - using (Package leftPackage = Package.Open(left)) - { - using (Package rightPackage = Package.Open(right)) - { - return PackageHelper.Compare(leftPackage, rightPackage, false, ExcludeMethod, stripColumnWidths, out message); - } - } - } - - private static bool ExcludeMethod(Uri uri) - { - //Exclude service data - if (uri.OriginalString.EndsWith(".rels") || - uri.OriginalString.EndsWith(".psmdcp")) - { - return true; - } - return false; - } - } +using System; +using System.IO; +using System.IO.Packaging; + +namespace ClosedXML_Tests +{ + internal static class ExcelDocsComparer + { + public static bool Compare(string left, string right, bool stripColumnWidths, out string message) + { + using (FileStream leftStream = File.OpenRead(left)) + { + using (FileStream rightStream = File.OpenRead(right)) + { + return Compare(leftStream, rightStream, stripColumnWidths, out message); + } + } + } + + public static bool Compare(Stream left, Stream right, bool stripColumnWidths, out string message) + { + using (Package leftPackage = Package.Open(left)) + { + using (Package rightPackage = Package.Open(right)) + { + return PackageHelper.Compare(leftPackage, rightPackage, false, ExcludeMethod, stripColumnWidths, out message); + } + } + } + + private static bool ExcludeMethod(Uri uri) + { + //Exclude service data + if (uri.OriginalString.EndsWith(".rels") || + uri.OriginalString.EndsWith(".psmdcp")) + { + return true; + } + return false; + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Utils/PackageHelper.cs b/ClosedXML_Tests/Utils/PackageHelper.cs index 33ba3e4..3def760 100644 --- a/ClosedXML_Tests/Utils/PackageHelper.cs +++ b/ClosedXML_Tests/Utils/PackageHelper.cs @@ -1,510 +1,510 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.IO.Packaging; -using System.Linq; -using System.Net.Mime; -using System.Text; -using System.Xml.Serialization; - -namespace ClosedXML_Tests -{ - public static class PackageHelper - { - public static void WriteXmlPart(Package package, Uri uri, object content, XmlSerializer serializer) - { - if (package.PartExists(uri)) - { - package.DeletePart(uri); - } - PackagePart part = package.CreatePart(uri, MediaTypeNames.Text.Xml, CompressionOption.Fast); - using (Stream stream = part.GetStream()) - { - serializer.Serialize(stream, content); - } - } - - public static object ReadXmlPart(Package package, Uri uri, XmlSerializer serializer) - { - if (!package.PartExists(uri)) - { - throw new ApplicationException(string.Format("Package part '{0}' doesn't exists!", uri.OriginalString)); - } - PackagePart part = package.GetPart(uri); - using (Stream stream = part.GetStream()) - { - return serializer.Deserialize(stream); - } - } - - public static void WriteBinaryPart(Package package, Uri uri, Stream content) - { - if (package.PartExists(uri)) - { - package.DeletePart(uri); - } - PackagePart part = package.CreatePart(uri, MediaTypeNames.Application.Octet, CompressionOption.Fast); - using (Stream stream = part.GetStream()) - { - StreamHelper.StreamToStreamAppend(content, stream); - } - } - - /// - /// Returns part's stream - /// - /// - /// - /// - public static Stream ReadBinaryPart(Package package, Uri uri) - { - if (!package.PartExists(uri)) - { - throw new ApplicationException("Package part doesn't exists!"); - } - PackagePart part = package.GetPart(uri); - return part.GetStream(); - } - - public static void CopyPart(Uri uri, Package source, Package dest) - { - CopyPart(uri, source, dest, true); - } - - public static void CopyPart(Uri uri, Package source, Package dest, bool overwrite) - { - #region Check - - if (ReferenceEquals(uri, null)) - { - throw new ArgumentNullException("uri"); - } - if (ReferenceEquals(source, null)) - { - throw new ArgumentNullException("source"); - } - if (ReferenceEquals(dest, null)) - { - throw new ArgumentNullException("dest"); - } - - #endregion - - if (dest.PartExists(uri)) - { - if (!overwrite) - { - throw new ArgumentException("Specified part already exists", "uri"); - } - dest.DeletePart(uri); - } - - PackagePart sourcePart = source.GetPart(uri); - PackagePart destPart = dest.CreatePart(uri, sourcePart.ContentType, sourcePart.CompressionOption); - - using (Stream sourceStream = sourcePart.GetStream()) - { - using (Stream destStream = destPart.GetStream()) - { - StreamHelper.StreamToStreamAppend(sourceStream, destStream); - } - } - } - - public static void WritePart(Package package, PackagePartDescriptor descriptor, T content, - Action serializeAction) - { - #region Check - - if (ReferenceEquals(package, null)) - { - throw new ArgumentNullException("package"); - } - if (ReferenceEquals(descriptor, null)) - { - throw new ArgumentNullException("descriptor"); - } - if (ReferenceEquals(serializeAction, null)) - { - throw new ArgumentNullException("serializeAction"); - } - - #endregion - - if (package.PartExists(descriptor.Uri)) - { - package.DeletePart(descriptor.Uri); - } - PackagePart part = package.CreatePart(descriptor.Uri, descriptor.ContentType, descriptor.CompressOption); - using (Stream stream = part.GetStream()) - { - serializeAction(stream, content); - } - } - - public static void WritePart(Package package, PackagePartDescriptor descriptor, Action serializeAction) - { - #region Check - - if (ReferenceEquals(package, null)) - { - throw new ArgumentNullException("package"); - } - if (ReferenceEquals(descriptor, null)) - { - throw new ArgumentNullException("descriptor"); - } - if (ReferenceEquals(serializeAction, null)) - { - throw new ArgumentNullException("serializeAction"); - } - - #endregion - - if (package.PartExists(descriptor.Uri)) - { - package.DeletePart(descriptor.Uri); - } - PackagePart part = package.CreatePart(descriptor.Uri, descriptor.ContentType, descriptor.CompressOption); - using (Stream stream = part.GetStream()) - { - serializeAction(stream); - } - } - - public static T ReadPart(Package package, Uri uri, Func deserializeFunc) - { - #region Check - - if (ReferenceEquals(package, null)) - { - throw new ArgumentNullException("package"); - } - if (ReferenceEquals(uri, null)) - { - throw new ArgumentNullException("uri"); - } - if (ReferenceEquals(deserializeFunc, null)) - { - throw new ArgumentNullException("deserializeFunc"); - } - - #endregion - - if (!package.PartExists(uri)) - { - throw new ApplicationException(string.Format("Package part '{0}' doesn't exists!", uri.OriginalString)); - } - PackagePart part = package.GetPart(uri); - using (Stream stream = part.GetStream()) - { - return deserializeFunc(stream); - } - } - - public static void ReadPart(Package package, Uri uri, Action deserializeAction) - { - #region Check - - if (ReferenceEquals(package, null)) - { - throw new ArgumentNullException("package"); - } - if (ReferenceEquals(uri, null)) - { - throw new ArgumentNullException("uri"); - } - if (ReferenceEquals(deserializeAction, null)) - { - throw new ArgumentNullException("deserializeAction"); - } - - #endregion - - if (!package.PartExists(uri)) - { - throw new ApplicationException(string.Format("Package part '{0}' doesn't exists!", uri.OriginalString)); - } - PackagePart part = package.GetPart(uri); - using (Stream stream = part.GetStream()) - { - deserializeAction(stream); - } - } - - public static bool TryReadPart(Package package, Uri uri, Action deserializeAction) - { - #region Check - - if (ReferenceEquals(package, null)) - { - throw new ArgumentNullException("package"); - } - if (ReferenceEquals(uri, null)) - { - throw new ArgumentNullException("uri"); - } - if (ReferenceEquals(deserializeAction, null)) - { - throw new ArgumentNullException("deserializeAction"); - } - - #endregion - - if (!package.PartExists(uri)) - { - return false; - } - PackagePart part = package.GetPart(uri); - using (Stream stream = part.GetStream()) - { - deserializeAction(stream); - } - return true; - } - - /// - /// Compare to packages by parts like streams - /// - /// - /// - /// - /// - /// - /// - public static bool Compare(Package left, Package right, bool compareToFirstDifference, bool stripColumnWidths, out string message) - { - return Compare(left, right, compareToFirstDifference, null, stripColumnWidths, out message); - } - - /// - /// Compare to packages by parts like streams - /// - /// - /// - /// - /// - /// - /// - public static bool Compare(Package left, Package right, bool compareToFirstDifference, - Func excludeMethod, bool stripColumnWidths, out string message) - { - #region Check - - if (left == null) - { - throw new ArgumentNullException("left"); - } - if (right == null) - { - throw new ArgumentNullException("right"); - } - - #endregion - - excludeMethod = excludeMethod ?? (uri => false); - PackagePartCollection leftParts = left.GetParts(); - PackagePartCollection rightParts = right.GetParts(); - - var pairs = new Dictionary(); - foreach (PackagePart part in leftParts) - { - if (excludeMethod(part.Uri)) - { - continue; - } - pairs.Add(part.Uri, new PartPair(part.Uri, CompareStatus.OnlyOnLeft)); - } - foreach (PackagePart part in rightParts) - { - if (excludeMethod(part.Uri)) - { - continue; - } - PartPair pair; - if (pairs.TryGetValue(part.Uri, out pair)) - { - pair.Status = CompareStatus.Equal; - } - else - { - pairs.Add(part.Uri, new PartPair(part.Uri, CompareStatus.OnlyOnRight)); - } - } - - if (compareToFirstDifference && pairs.Any(pair => pair.Value.Status != CompareStatus.Equal)) - { - goto EXIT; - } - - foreach (PartPair pair in pairs.Values) - { - if (pair.Status != CompareStatus.Equal) - { - continue; - } - var leftPart = left.GetPart(pair.Uri); - var rightPart = right.GetPart(pair.Uri); - using (Stream oneStream = leftPart.GetStream(FileMode.Open, FileAccess.Read)) - using (Stream otherStream = rightPart.GetStream(FileMode.Open, FileAccess.Read)) - { - bool stripColumnWidthsFromSheet = stripColumnWidths && - leftPart.ContentType == @"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" && - rightPart.ContentType == @"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"; - - if (!StreamHelper.Compare(oneStream, otherStream, stripColumnWidthsFromSheet)) - { - pair.Status = CompareStatus.NonEqual; - if (compareToFirstDifference) - { - goto EXIT; - } - } - } - } - - EXIT: - List sortedPairs = pairs.Values.ToList(); - sortedPairs.Sort((one, other) => one.Uri.OriginalString.CompareTo(other.Uri.OriginalString)); - var sbuilder = new StringBuilder(); - foreach (PartPair pair in sortedPairs) - { - if (pair.Status == CompareStatus.Equal) - { - continue; - } - sbuilder.AppendFormat("{0} :{1}", pair.Uri, pair.Status); - sbuilder.AppendLine(); - } - message = sbuilder.ToString(); - return message.Length == 0; - } - - #region Nested type: PackagePartDescriptor - - public sealed class PackagePartDescriptor - { - #region Private fields - - [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly CompressionOption _compressOption; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly string _contentType; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly Uri _uri; - - #endregion - - #region Constructor - - /// - /// Instance constructor - /// - /// Part uri - /// Content type from - /// - public PackagePartDescriptor(Uri uri, string contentType, CompressionOption compressOption) - { - #region Check - - if (ReferenceEquals(uri, null)) - { - throw new ArgumentNullException("uri"); - } - if (string.IsNullOrEmpty(contentType)) - { - throw new ArgumentNullException("contentType"); - } - - #endregion - - _uri = uri; - _contentType = contentType; - _compressOption = compressOption; - } - - #endregion - - #region Public properties - - public Uri Uri - { - [DebuggerStepThrough] get { return _uri; } - } - - public string ContentType - { - [DebuggerStepThrough] get { return _contentType; } - } - - public CompressionOption CompressOption - { - [DebuggerStepThrough] get { return _compressOption; } - } - - #endregion - - #region Public methods - - public override string ToString() - { - return string.Format("Uri:{0} ContentType: {1}, Compression: {2}", _uri, _contentType, _compressOption); - } - - #endregion - } - - #endregion - - #region Nested type: CompareStatus - - private enum CompareStatus - { - OnlyOnLeft, - OnlyOnRight, - Equal, - NonEqual - } - - #endregion - - #region Nested type: PartPair - - private sealed class PartPair - { - #region Private fields - - [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly Uri _uri; - [DebuggerBrowsable(DebuggerBrowsableState.Never)] private CompareStatus _status; - - #endregion - - #region Constructor - - public PartPair(Uri uri, CompareStatus status) - { - _uri = uri; - _status = status; - } - - #endregion - - #region Public properties - - public Uri Uri - { - [DebuggerStepThrough] get { return _uri; } - } - - public CompareStatus Status - { - [DebuggerStepThrough] get { return _status; } - [DebuggerStepThrough] set { _status = value; } - } - - #endregion - } - - #endregion - - //-- - } +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.IO.Packaging; +using System.Linq; +using System.Net.Mime; +using System.Text; +using System.Xml.Serialization; + +namespace ClosedXML_Tests +{ + public static class PackageHelper + { + public static void WriteXmlPart(Package package, Uri uri, object content, XmlSerializer serializer) + { + if (package.PartExists(uri)) + { + package.DeletePart(uri); + } + PackagePart part = package.CreatePart(uri, MediaTypeNames.Text.Xml, CompressionOption.Fast); + using (Stream stream = part.GetStream()) + { + serializer.Serialize(stream, content); + } + } + + public static object ReadXmlPart(Package package, Uri uri, XmlSerializer serializer) + { + if (!package.PartExists(uri)) + { + throw new ApplicationException(string.Format("Package part '{0}' doesn't exists!", uri.OriginalString)); + } + PackagePart part = package.GetPart(uri); + using (Stream stream = part.GetStream()) + { + return serializer.Deserialize(stream); + } + } + + public static void WriteBinaryPart(Package package, Uri uri, Stream content) + { + if (package.PartExists(uri)) + { + package.DeletePart(uri); + } + PackagePart part = package.CreatePart(uri, MediaTypeNames.Application.Octet, CompressionOption.Fast); + using (Stream stream = part.GetStream()) + { + StreamHelper.StreamToStreamAppend(content, stream); + } + } + + /// + /// Returns part's stream + /// + /// + /// + /// + public static Stream ReadBinaryPart(Package package, Uri uri) + { + if (!package.PartExists(uri)) + { + throw new ApplicationException("Package part doesn't exists!"); + } + PackagePart part = package.GetPart(uri); + return part.GetStream(); + } + + public static void CopyPart(Uri uri, Package source, Package dest) + { + CopyPart(uri, source, dest, true); + } + + public static void CopyPart(Uri uri, Package source, Package dest, bool overwrite) + { + #region Check + + if (ReferenceEquals(uri, null)) + { + throw new ArgumentNullException("uri"); + } + if (ReferenceEquals(source, null)) + { + throw new ArgumentNullException("source"); + } + if (ReferenceEquals(dest, null)) + { + throw new ArgumentNullException("dest"); + } + + #endregion + + if (dest.PartExists(uri)) + { + if (!overwrite) + { + throw new ArgumentException("Specified part already exists", "uri"); + } + dest.DeletePart(uri); + } + + PackagePart sourcePart = source.GetPart(uri); + PackagePart destPart = dest.CreatePart(uri, sourcePart.ContentType, sourcePart.CompressionOption); + + using (Stream sourceStream = sourcePart.GetStream()) + { + using (Stream destStream = destPart.GetStream()) + { + StreamHelper.StreamToStreamAppend(sourceStream, destStream); + } + } + } + + public static void WritePart(Package package, PackagePartDescriptor descriptor, T content, + Action serializeAction) + { + #region Check + + if (ReferenceEquals(package, null)) + { + throw new ArgumentNullException("package"); + } + if (ReferenceEquals(descriptor, null)) + { + throw new ArgumentNullException("descriptor"); + } + if (ReferenceEquals(serializeAction, null)) + { + throw new ArgumentNullException("serializeAction"); + } + + #endregion + + if (package.PartExists(descriptor.Uri)) + { + package.DeletePart(descriptor.Uri); + } + PackagePart part = package.CreatePart(descriptor.Uri, descriptor.ContentType, descriptor.CompressOption); + using (Stream stream = part.GetStream()) + { + serializeAction(stream, content); + } + } + + public static void WritePart(Package package, PackagePartDescriptor descriptor, Action serializeAction) + { + #region Check + + if (ReferenceEquals(package, null)) + { + throw new ArgumentNullException("package"); + } + if (ReferenceEquals(descriptor, null)) + { + throw new ArgumentNullException("descriptor"); + } + if (ReferenceEquals(serializeAction, null)) + { + throw new ArgumentNullException("serializeAction"); + } + + #endregion + + if (package.PartExists(descriptor.Uri)) + { + package.DeletePart(descriptor.Uri); + } + PackagePart part = package.CreatePart(descriptor.Uri, descriptor.ContentType, descriptor.CompressOption); + using (Stream stream = part.GetStream()) + { + serializeAction(stream); + } + } + + public static T ReadPart(Package package, Uri uri, Func deserializeFunc) + { + #region Check + + if (ReferenceEquals(package, null)) + { + throw new ArgumentNullException("package"); + } + if (ReferenceEquals(uri, null)) + { + throw new ArgumentNullException("uri"); + } + if (ReferenceEquals(deserializeFunc, null)) + { + throw new ArgumentNullException("deserializeFunc"); + } + + #endregion + + if (!package.PartExists(uri)) + { + throw new ApplicationException(string.Format("Package part '{0}' doesn't exists!", uri.OriginalString)); + } + PackagePart part = package.GetPart(uri); + using (Stream stream = part.GetStream()) + { + return deserializeFunc(stream); + } + } + + public static void ReadPart(Package package, Uri uri, Action deserializeAction) + { + #region Check + + if (ReferenceEquals(package, null)) + { + throw new ArgumentNullException("package"); + } + if (ReferenceEquals(uri, null)) + { + throw new ArgumentNullException("uri"); + } + if (ReferenceEquals(deserializeAction, null)) + { + throw new ArgumentNullException("deserializeAction"); + } + + #endregion + + if (!package.PartExists(uri)) + { + throw new ApplicationException(string.Format("Package part '{0}' doesn't exists!", uri.OriginalString)); + } + PackagePart part = package.GetPart(uri); + using (Stream stream = part.GetStream()) + { + deserializeAction(stream); + } + } + + public static bool TryReadPart(Package package, Uri uri, Action deserializeAction) + { + #region Check + + if (ReferenceEquals(package, null)) + { + throw new ArgumentNullException("package"); + } + if (ReferenceEquals(uri, null)) + { + throw new ArgumentNullException("uri"); + } + if (ReferenceEquals(deserializeAction, null)) + { + throw new ArgumentNullException("deserializeAction"); + } + + #endregion + + if (!package.PartExists(uri)) + { + return false; + } + PackagePart part = package.GetPart(uri); + using (Stream stream = part.GetStream()) + { + deserializeAction(stream); + } + return true; + } + + /// + /// Compare to packages by parts like streams + /// + /// + /// + /// + /// + /// + /// + public static bool Compare(Package left, Package right, bool compareToFirstDifference, bool stripColumnWidths, out string message) + { + return Compare(left, right, compareToFirstDifference, null, stripColumnWidths, out message); + } + + /// + /// Compare to packages by parts like streams + /// + /// + /// + /// + /// + /// + /// + public static bool Compare(Package left, Package right, bool compareToFirstDifference, + Func excludeMethod, bool stripColumnWidths, out string message) + { + #region Check + + if (left == null) + { + throw new ArgumentNullException("left"); + } + if (right == null) + { + throw new ArgumentNullException("right"); + } + + #endregion + + excludeMethod = excludeMethod ?? (uri => false); + PackagePartCollection leftParts = left.GetParts(); + PackagePartCollection rightParts = right.GetParts(); + + var pairs = new Dictionary(); + foreach (PackagePart part in leftParts) + { + if (excludeMethod(part.Uri)) + { + continue; + } + pairs.Add(part.Uri, new PartPair(part.Uri, CompareStatus.OnlyOnLeft)); + } + foreach (PackagePart part in rightParts) + { + if (excludeMethod(part.Uri)) + { + continue; + } + PartPair pair; + if (pairs.TryGetValue(part.Uri, out pair)) + { + pair.Status = CompareStatus.Equal; + } + else + { + pairs.Add(part.Uri, new PartPair(part.Uri, CompareStatus.OnlyOnRight)); + } + } + + if (compareToFirstDifference && pairs.Any(pair => pair.Value.Status != CompareStatus.Equal)) + { + goto EXIT; + } + + foreach (PartPair pair in pairs.Values) + { + if (pair.Status != CompareStatus.Equal) + { + continue; + } + var leftPart = left.GetPart(pair.Uri); + var rightPart = right.GetPart(pair.Uri); + using (Stream oneStream = leftPart.GetStream(FileMode.Open, FileAccess.Read)) + using (Stream otherStream = rightPart.GetStream(FileMode.Open, FileAccess.Read)) + { + bool stripColumnWidthsFromSheet = stripColumnWidths && + leftPart.ContentType == @"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" && + rightPart.ContentType == @"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"; + + if (!StreamHelper.Compare(oneStream, otherStream, stripColumnWidthsFromSheet)) + { + pair.Status = CompareStatus.NonEqual; + if (compareToFirstDifference) + { + goto EXIT; + } + } + } + } + + EXIT: + List sortedPairs = pairs.Values.ToList(); + sortedPairs.Sort((one, other) => one.Uri.OriginalString.CompareTo(other.Uri.OriginalString)); + var sbuilder = new StringBuilder(); + foreach (PartPair pair in sortedPairs) + { + if (pair.Status == CompareStatus.Equal) + { + continue; + } + sbuilder.AppendFormat("{0} :{1}", pair.Uri, pair.Status); + sbuilder.AppendLine(); + } + message = sbuilder.ToString(); + return message.Length == 0; + } + + #region Nested type: PackagePartDescriptor + + public sealed class PackagePartDescriptor + { + #region Private fields + + [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly CompressionOption _compressOption; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly string _contentType; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly Uri _uri; + + #endregion + + #region Constructor + + /// + /// Instance constructor + /// + /// Part uri + /// Content type from + /// + public PackagePartDescriptor(Uri uri, string contentType, CompressionOption compressOption) + { + #region Check + + if (ReferenceEquals(uri, null)) + { + throw new ArgumentNullException("uri"); + } + if (string.IsNullOrEmpty(contentType)) + { + throw new ArgumentNullException("contentType"); + } + + #endregion + + _uri = uri; + _contentType = contentType; + _compressOption = compressOption; + } + + #endregion + + #region Public properties + + public Uri Uri + { + [DebuggerStepThrough] get { return _uri; } + } + + public string ContentType + { + [DebuggerStepThrough] get { return _contentType; } + } + + public CompressionOption CompressOption + { + [DebuggerStepThrough] get { return _compressOption; } + } + + #endregion + + #region Public methods + + public override string ToString() + { + return string.Format("Uri:{0} ContentType: {1}, Compression: {2}", _uri, _contentType, _compressOption); + } + + #endregion + } + + #endregion + + #region Nested type: CompareStatus + + private enum CompareStatus + { + OnlyOnLeft, + OnlyOnRight, + Equal, + NonEqual + } + + #endregion + + #region Nested type: PartPair + + private sealed class PartPair + { + #region Private fields + + [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly Uri _uri; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] private CompareStatus _status; + + #endregion + + #region Constructor + + public PartPair(Uri uri, CompareStatus status) + { + _uri = uri; + _status = status; + } + + #endregion + + #region Public properties + + public Uri Uri + { + [DebuggerStepThrough] get { return _uri; } + } + + public CompareStatus Status + { + [DebuggerStepThrough] get { return _status; } + [DebuggerStepThrough] set { _status = value; } + } + + #endregion + } + + #endregion + + //-- + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Utils/ResourceFileExtractor.cs b/ClosedXML_Tests/Utils/ResourceFileExtractor.cs index 0083f5a..c6c4c9a 100644 --- a/ClosedXML_Tests/Utils/ResourceFileExtractor.cs +++ b/ClosedXML_Tests/Utils/ResourceFileExtractor.cs @@ -1,238 +1,238 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Reflection; - -namespace ClosedXML_Tests -{ - /// - /// Summary description for ResourceFileExtractor. - /// - public sealed class ResourceFileExtractor - { - #region Static - #region Private fields - private static readonly Dictionary ms_defaultExtractors = - new Dictionary(); - #endregion - #region Public properties - /// Instance of resource extractor for executing assembly - public static ResourceFileExtractor Instance - { - get - { - ResourceFileExtractor _return; - Assembly _assembly = Assembly.GetCallingAssembly(); - string _key = _assembly.GetName().FullName; - if (!ms_defaultExtractors.TryGetValue(_key, out _return)) - { - lock (ms_defaultExtractors) - { - if (!ms_defaultExtractors.TryGetValue(_key, out _return)) - { - _return = new ResourceFileExtractor(_assembly, true, null); - ms_defaultExtractors.Add(_key, _return); - } - } - } - return _return; - } - } - #endregion - #region Public methods - #endregion - #endregion - #region Private fields - private readonly Assembly m_assembly; - private readonly ResourceFileExtractor m_baseExtractor; - private readonly string m_assemblyName; - - private bool m_isStatic; - private string m_resourceFilePath; - #endregion - #region Constructors - /// - /// Create instance - /// - /// ResourceFilePath in assembly. Example: .Properties.Scripts. - /// - public ResourceFileExtractor(string resourceFilePath, ResourceFileExtractor baseExtractor) - : this(Assembly.GetCallingAssembly(), baseExtractor) - { - m_resourceFilePath = resourceFilePath; - } - /// - /// Create instance - /// - /// - public ResourceFileExtractor(ResourceFileExtractor baseExtractor) - : this(Assembly.GetCallingAssembly(), baseExtractor) - { - } - /// - /// Create instance - /// - /// ResourceFilePath in assembly. Example: .Properties.Scripts. - public ResourceFileExtractor(string resourcePath) - : this(Assembly.GetCallingAssembly(), resourcePath) - { - } - /// - /// Instance constructor - /// - /// - /// - public ResourceFileExtractor(Assembly assembly, string resourcePath) - : this(assembly ?? Assembly.GetCallingAssembly()) - { - m_resourceFilePath = resourcePath; - } - /// - /// Instance constructor - /// - public ResourceFileExtractor() - : this(Assembly.GetCallingAssembly()) - { - } - /// - /// Instance constructor - /// - /// - public ResourceFileExtractor(Assembly assembly) - : this(assembly ?? Assembly.GetCallingAssembly(), (ResourceFileExtractor) null) - { - } - /// - /// Instance constructor - /// - /// - /// - public ResourceFileExtractor(Assembly assembly, ResourceFileExtractor baseExtractor) - : this(assembly ?? Assembly.GetCallingAssembly(), false, baseExtractor) - { - } - /// - /// Instance constructor - /// - /// - /// - /// - /// Argument is null. - private ResourceFileExtractor(Assembly assembly, bool isStatic, ResourceFileExtractor baseExtractor) - { - #region Check - if (ReferenceEquals(assembly, null)) - { - throw new ArgumentNullException("assembly"); - } - #endregion - m_assembly = assembly; - m_baseExtractor = baseExtractor; - m_assemblyName = Assembly.GetName().Name; - IsStatic = isStatic; - m_resourceFilePath = ".Resources."; - } - #endregion - #region Public properties - /// Work assembly - public Assembly Assembly - { - [DebuggerStepThrough] - get { return m_assembly; } - } - /// Work assembly name - public string AssemblyName - { - [DebuggerStepThrough] - get { return m_assemblyName; } - } - /// - /// Path to read resource files. Example: .Resources.Upgrades. - /// - public string ResourceFilePath - { - [DebuggerStepThrough] - get { return m_resourceFilePath; } - [DebuggerStepThrough] - set { m_resourceFilePath = value; } - } - public bool IsStatic - { - [DebuggerStepThrough] - get { return m_isStatic; } - [DebuggerStepThrough] - set { m_isStatic = value; } - } - public IEnumerable GetFileNames() - { - string _path = AssemblyName + m_resourceFilePath; - foreach (string _resourceName in Assembly.GetManifestResourceNames()) - { - if (_resourceName.StartsWith(_path)) - { - yield return _resourceName.Replace(_path, string.Empty); - } - } - } - #endregion - #region Public methods - public string ReadFileFromRes(string fileName) - { - Stream _stream = ReadFileFromResToStream(fileName); - string _result; - StreamReader sr = new StreamReader(_stream); - try - { - _result = sr.ReadToEnd(); - } - finally - { - sr.Close(); - } - return _result; - } - - public string ReadFileFromResFormat(string fileName, params object[] formatArgs) - { - return string.Format(ReadFileFromRes(fileName), formatArgs); - } - - /// - /// Read file in current assembly by specific path - /// - /// Specific path - /// Read file name - /// - public string ReadSpecificFileFromRes(string specificPath, string fileName) - { - ResourceFileExtractor _ext = new ResourceFileExtractor(Assembly, specificPath); - return _ext.ReadFileFromRes(fileName); - } - /// - /// Read file in current assembly by specific file name - /// - /// - /// - /// ApplicationException. - public Stream ReadFileFromResToStream(string fileName) - { - string _nameResFile = AssemblyName + m_resourceFilePath + fileName; - Stream _stream = Assembly.GetManifestResourceStream(_nameResFile); - #region Not found - if (ReferenceEquals(_stream, null)) - { - #region Get from base extractor - if (!ReferenceEquals(m_baseExtractor, null)) - { - return m_baseExtractor.ReadFileFromResToStream(fileName); - } - #endregion - throw new ApplicationException("Can't find resource file " + _nameResFile); - } - #endregion - return _stream; - } - #endregion - } +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace ClosedXML_Tests +{ + /// + /// Summary description for ResourceFileExtractor. + /// + public sealed class ResourceFileExtractor + { + #region Static + #region Private fields + private static readonly Dictionary ms_defaultExtractors = + new Dictionary(); + #endregion + #region Public properties + /// Instance of resource extractor for executing assembly + public static ResourceFileExtractor Instance + { + get + { + ResourceFileExtractor _return; + Assembly _assembly = Assembly.GetCallingAssembly(); + string _key = _assembly.GetName().FullName; + if (!ms_defaultExtractors.TryGetValue(_key, out _return)) + { + lock (ms_defaultExtractors) + { + if (!ms_defaultExtractors.TryGetValue(_key, out _return)) + { + _return = new ResourceFileExtractor(_assembly, true, null); + ms_defaultExtractors.Add(_key, _return); + } + } + } + return _return; + } + } + #endregion + #region Public methods + #endregion + #endregion + #region Private fields + private readonly Assembly m_assembly; + private readonly ResourceFileExtractor m_baseExtractor; + private readonly string m_assemblyName; + + private bool m_isStatic; + private string m_resourceFilePath; + #endregion + #region Constructors + /// + /// Create instance + /// + /// ResourceFilePath in assembly. Example: .Properties.Scripts. + /// + public ResourceFileExtractor(string resourceFilePath, ResourceFileExtractor baseExtractor) + : this(Assembly.GetCallingAssembly(), baseExtractor) + { + m_resourceFilePath = resourceFilePath; + } + /// + /// Create instance + /// + /// + public ResourceFileExtractor(ResourceFileExtractor baseExtractor) + : this(Assembly.GetCallingAssembly(), baseExtractor) + { + } + /// + /// Create instance + /// + /// ResourceFilePath in assembly. Example: .Properties.Scripts. + public ResourceFileExtractor(string resourcePath) + : this(Assembly.GetCallingAssembly(), resourcePath) + { + } + /// + /// Instance constructor + /// + /// + /// + public ResourceFileExtractor(Assembly assembly, string resourcePath) + : this(assembly ?? Assembly.GetCallingAssembly()) + { + m_resourceFilePath = resourcePath; + } + /// + /// Instance constructor + /// + public ResourceFileExtractor() + : this(Assembly.GetCallingAssembly()) + { + } + /// + /// Instance constructor + /// + /// + public ResourceFileExtractor(Assembly assembly) + : this(assembly ?? Assembly.GetCallingAssembly(), (ResourceFileExtractor) null) + { + } + /// + /// Instance constructor + /// + /// + /// + public ResourceFileExtractor(Assembly assembly, ResourceFileExtractor baseExtractor) + : this(assembly ?? Assembly.GetCallingAssembly(), false, baseExtractor) + { + } + /// + /// Instance constructor + /// + /// + /// + /// + /// Argument is null. + private ResourceFileExtractor(Assembly assembly, bool isStatic, ResourceFileExtractor baseExtractor) + { + #region Check + if (ReferenceEquals(assembly, null)) + { + throw new ArgumentNullException("assembly"); + } + #endregion + m_assembly = assembly; + m_baseExtractor = baseExtractor; + m_assemblyName = Assembly.GetName().Name; + IsStatic = isStatic; + m_resourceFilePath = ".Resources."; + } + #endregion + #region Public properties + /// Work assembly + public Assembly Assembly + { + [DebuggerStepThrough] + get { return m_assembly; } + } + /// Work assembly name + public string AssemblyName + { + [DebuggerStepThrough] + get { return m_assemblyName; } + } + /// + /// Path to read resource files. Example: .Resources.Upgrades. + /// + public string ResourceFilePath + { + [DebuggerStepThrough] + get { return m_resourceFilePath; } + [DebuggerStepThrough] + set { m_resourceFilePath = value; } + } + public bool IsStatic + { + [DebuggerStepThrough] + get { return m_isStatic; } + [DebuggerStepThrough] + set { m_isStatic = value; } + } + public IEnumerable GetFileNames() + { + string _path = AssemblyName + m_resourceFilePath; + foreach (string _resourceName in Assembly.GetManifestResourceNames()) + { + if (_resourceName.StartsWith(_path)) + { + yield return _resourceName.Replace(_path, string.Empty); + } + } + } + #endregion + #region Public methods + public string ReadFileFromRes(string fileName) + { + Stream _stream = ReadFileFromResToStream(fileName); + string _result; + StreamReader sr = new StreamReader(_stream); + try + { + _result = sr.ReadToEnd(); + } + finally + { + sr.Close(); + } + return _result; + } + + public string ReadFileFromResFormat(string fileName, params object[] formatArgs) + { + return string.Format(ReadFileFromRes(fileName), formatArgs); + } + + /// + /// Read file in current assembly by specific path + /// + /// Specific path + /// Read file name + /// + public string ReadSpecificFileFromRes(string specificPath, string fileName) + { + ResourceFileExtractor _ext = new ResourceFileExtractor(Assembly, specificPath); + return _ext.ReadFileFromRes(fileName); + } + /// + /// Read file in current assembly by specific file name + /// + /// + /// + /// ApplicationException. + public Stream ReadFileFromResToStream(string fileName) + { + string _nameResFile = AssemblyName + m_resourceFilePath + fileName; + Stream _stream = Assembly.GetManifestResourceStream(_nameResFile); + #region Not found + if (ReferenceEquals(_stream, null)) + { + #region Get from base extractor + if (!ReferenceEquals(m_baseExtractor, null)) + { + return m_baseExtractor.ReadFileFromResToStream(fileName); + } + #endregion + throw new ApplicationException("Can't find resource file " + _nameResFile); + } + #endregion + return _stream; + } + #endregion + } } \ No newline at end of file diff --git a/ClosedXML_Tests/Utils/StreamHelper.cs b/ClosedXML_Tests/Utils/StreamHelper.cs index 05a057e..b68a11f 100644 --- a/ClosedXML_Tests/Utils/StreamHelper.cs +++ b/ClosedXML_Tests/Utils/StreamHelper.cs @@ -1,171 +1,171 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; - -namespace ClosedXML_Tests -{ - /// - /// Help methods for work with streams - /// - public static class StreamHelper - { - /// - /// Convert stream to byte array - /// - /// Stream - /// Byte array - public static byte[] StreamToArray(Stream pStream) - { - long iLength = pStream.Length; - var bytes = new byte[iLength]; - for (int i = 0; i < iLength; i++) - { - bytes[i] = (byte)pStream.ReadByte(); - } - pStream.Close(); - return bytes; - } - - /// - /// Convert byte array to stream - /// - /// Byte array - /// Open stream - /// - public static Stream ArrayToStreamAppend(byte[] pBynaryArray, Stream pStream) - { - #region Check params - - if (ReferenceEquals(pBynaryArray, null)) - { - throw new ArgumentNullException("pBynaryArray"); - } - if (ReferenceEquals(pStream, null)) - { - throw new ArgumentNullException("pStream"); - } - if (!pStream.CanWrite) - { - throw new ArgumentException("Can't write to stream", "pStream"); - } - - #endregion - - foreach (byte b in pBynaryArray) - { - pStream.WriteByte(b); - } - return pStream; - } - - public static void StreamToStreamAppend(Stream streamIn, Stream streamToWrite) - { - StreamToStreamAppend(streamIn, streamToWrite, 0); - } - - public static void StreamToStreamAppend(Stream streamIn, Stream streamToWrite, long dataLength) - { - #region Check params - - if (ReferenceEquals(streamIn, null)) - { - throw new ArgumentNullException("streamIn"); - } - if (ReferenceEquals(streamToWrite, null)) - { - throw new ArgumentNullException("streamToWrite"); - } - if (!streamIn.CanRead) - { - throw new ArgumentException("Can't read from stream", "streamIn"); - } - if (!streamToWrite.CanWrite) - { - throw new ArgumentException("Can't write to stream", "streamToWrite"); - } - - #endregion - - var buf = new byte[512]; - long length; - if (dataLength == 0) - { - length = streamIn.Length - streamIn.Position; - } - else - { - length = dataLength; - } - long rest = length; - while (rest > 0) - { - int len1 = streamIn.Read(buf, 0, rest >= 512 ? 512 : (int)rest); - streamToWrite.Write(buf, 0, len1); - rest -= len1; - } - } - - /// - /// Compare two streams by converting them to strings and comparing the strings - /// - /// - /// - /// /// - /// - public static bool Compare(Stream one, Stream other, bool stripColumnWidths) - { - #region Check - - if (one == null) - { - throw new ArgumentNullException("one"); - } - if (other == null) - { - throw new ArgumentNullException("other"); - } - if (one.Position != 0) - { - throw new ArgumentException("Must be in position 0", "one"); - } - if (other.Position != 0) - { - throw new ArgumentException("Must be in position 0", "other"); - } - - #endregion - - var stringOne = new StreamReader(one).ReadToEnd().StripColumnWidths(stripColumnWidths); - var stringOther = new StreamReader(other).ReadToEnd().StripColumnWidths(stripColumnWidths); - return stringOne == stringOther; - } - - private static Regex columnRegex = new Regex("", RegexOptions.Compiled); - private static Regex widthRegex = new Regex("width=\"\\d+(\\.\\d+)?\"\\s+", RegexOptions.Compiled); - - private static string StripColumnWidths(this string s, bool stripIt) - { - if (!stripIt) - return s; - else - { - var replacements = new Dictionary(); - - foreach (var m in columnRegex.Matches(s).OfType()) - { - var original = m.Groups[0].Value; - var replacement = widthRegex.Replace(original, ""); - replacements.Add(original, replacement); - } - - foreach (var r in replacements) - { - s = s.Replace(r.Key, r.Value); - } - return s; - } - } - } +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; + +namespace ClosedXML_Tests +{ + /// + /// Help methods for work with streams + /// + public static class StreamHelper + { + /// + /// Convert stream to byte array + /// + /// Stream + /// Byte array + public static byte[] StreamToArray(Stream pStream) + { + long iLength = pStream.Length; + var bytes = new byte[iLength]; + for (int i = 0; i < iLength; i++) + { + bytes[i] = (byte)pStream.ReadByte(); + } + pStream.Close(); + return bytes; + } + + /// + /// Convert byte array to stream + /// + /// Byte array + /// Open stream + /// + public static Stream ArrayToStreamAppend(byte[] pBynaryArray, Stream pStream) + { + #region Check params + + if (ReferenceEquals(pBynaryArray, null)) + { + throw new ArgumentNullException("pBynaryArray"); + } + if (ReferenceEquals(pStream, null)) + { + throw new ArgumentNullException("pStream"); + } + if (!pStream.CanWrite) + { + throw new ArgumentException("Can't write to stream", "pStream"); + } + + #endregion + + foreach (byte b in pBynaryArray) + { + pStream.WriteByte(b); + } + return pStream; + } + + public static void StreamToStreamAppend(Stream streamIn, Stream streamToWrite) + { + StreamToStreamAppend(streamIn, streamToWrite, 0); + } + + public static void StreamToStreamAppend(Stream streamIn, Stream streamToWrite, long dataLength) + { + #region Check params + + if (ReferenceEquals(streamIn, null)) + { + throw new ArgumentNullException("streamIn"); + } + if (ReferenceEquals(streamToWrite, null)) + { + throw new ArgumentNullException("streamToWrite"); + } + if (!streamIn.CanRead) + { + throw new ArgumentException("Can't read from stream", "streamIn"); + } + if (!streamToWrite.CanWrite) + { + throw new ArgumentException("Can't write to stream", "streamToWrite"); + } + + #endregion + + var buf = new byte[512]; + long length; + if (dataLength == 0) + { + length = streamIn.Length - streamIn.Position; + } + else + { + length = dataLength; + } + long rest = length; + while (rest > 0) + { + int len1 = streamIn.Read(buf, 0, rest >= 512 ? 512 : (int)rest); + streamToWrite.Write(buf, 0, len1); + rest -= len1; + } + } + + /// + /// Compare two streams by converting them to strings and comparing the strings + /// + /// + /// + /// /// + /// + public static bool Compare(Stream one, Stream other, bool stripColumnWidths) + { + #region Check + + if (one == null) + { + throw new ArgumentNullException("one"); + } + if (other == null) + { + throw new ArgumentNullException("other"); + } + if (one.Position != 0) + { + throw new ArgumentException("Must be in position 0", "one"); + } + if (other.Position != 0) + { + throw new ArgumentException("Must be in position 0", "other"); + } + + #endregion + + var stringOne = new StreamReader(one).ReadToEnd().StripColumnWidths(stripColumnWidths); + var stringOther = new StreamReader(other).ReadToEnd().StripColumnWidths(stripColumnWidths); + return stringOne == stringOther; + } + + private static Regex columnRegex = new Regex("", RegexOptions.Compiled); + private static Regex widthRegex = new Regex("width=\"\\d+(\\.\\d+)?\"\\s+", RegexOptions.Compiled); + + private static string StripColumnWidths(this string s, bool stripIt) + { + if (!stripIt) + return s; + else + { + var replacements = new Dictionary(); + + foreach (var m in columnRegex.Matches(s).OfType()) + { + var original = m.Groups[0].Value; + var replacement = widthRegex.Replace(original, ""); + replacements.Add(original, replacement); + } + + foreach (var r in replacements) + { + s = s.Replace(r.Key, r.Value); + } + return s; + } + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/XLHelperTests.cs b/ClosedXML_Tests/XLHelperTests.cs index a73cc75..18e43dd 100644 --- a/ClosedXML_Tests/XLHelperTests.cs +++ b/ClosedXML_Tests/XLHelperTests.cs @@ -1,152 +1,152 @@ -using ClosedXML.Excel; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - /// - /// This is a test class for XLHelperTests and is intended - /// to contain all XLHelperTests Unit Tests - /// - [TestFixture] - public class XLHelperTests - { - /// - /// Gets or sets the test context which provides - /// information about and functionality for the current test run. - /// - public TestContext TestContext { get; set; } - - // - //You can use the following additional attributes as you write your tests: - // - //Use ClassInitialize to run code before running the first test in the class - //[ClassInitialize()] - //public static void MyClassInitialize(TestContext testContext) - //{ - //} - // - //Use ClassCleanup to run code after all tests in a class have run - //[ClassCleanup()] - //public static void MyClassCleanup() - //{ - //} - // - //Use TestInitialize to run code before running each test - //[TestInitialize()] - //public void MyTestInitialize() - //{ - //} - // - //Use TestCleanup to run code after each test has run - //[TestCleanup()] - //public void MyTestCleanup() - //{ - //} - // - - /// - /// A test for IsValidColumn - /// - [Test] - public void IsValidColumnTest() - { - Assert.AreEqual(false, XLHelper.IsValidColumn("")); - Assert.AreEqual(false, XLHelper.IsValidColumn("1")); - Assert.AreEqual(false, XLHelper.IsValidColumn("A1")); - Assert.AreEqual(false, XLHelper.IsValidColumn("AA1")); - Assert.AreEqual(true, XLHelper.IsValidColumn("A")); - Assert.AreEqual(true, XLHelper.IsValidColumn("AA")); - Assert.AreEqual(true, XLHelper.IsValidColumn("AAA")); - Assert.AreEqual(true, XLHelper.IsValidColumn("Z")); - Assert.AreEqual(true, XLHelper.IsValidColumn("ZZ")); - Assert.AreEqual(true, XLHelper.IsValidColumn("XFD")); - Assert.AreEqual(false, XLHelper.IsValidColumn("ZAA")); - Assert.AreEqual(false, XLHelper.IsValidColumn("XZA")); - Assert.AreEqual(false, XLHelper.IsValidColumn("XFZ")); - } - - [Test] - public void ReplaceRelative1() - { - string result = XLHelper.ReplaceRelative("A1", 2, "B"); - Assert.AreEqual("B2", result); - } - - [Test] - public void ReplaceRelative2() - { - string result = XLHelper.ReplaceRelative("$A1", 2, "B"); - Assert.AreEqual("$A2", result); - } - - [Test] - public void ReplaceRelative3() - { - string result = XLHelper.ReplaceRelative("A$1", 2, "B"); - Assert.AreEqual("B$1", result); - } - - [Test] - public void ReplaceRelative4() - { - string result = XLHelper.ReplaceRelative("$A$1", 2, "B"); - Assert.AreEqual("$A$1", result); - } - - [Test] - public void ReplaceRelative5() - { - string result = XLHelper.ReplaceRelative("1:1", 2, "B"); - Assert.AreEqual("2:2", result); - } - - [Test] - public void ReplaceRelative6() - { - string result = XLHelper.ReplaceRelative("$1:1", 2, "B"); - Assert.AreEqual("$1:2", result); - } - - [Test] - public void ReplaceRelative7() - { - string result = XLHelper.ReplaceRelative("1:$1", 2, "B"); - Assert.AreEqual("2:$1", result); - } - - [Test] - public void ReplaceRelative8() - { - string result = XLHelper.ReplaceRelative("$1:$1", 2, "B"); - Assert.AreEqual("$1:$1", result); - } - - [Test] - public void ReplaceRelative9() - { - string result = XLHelper.ReplaceRelative("A:A", 2, "B"); - Assert.AreEqual("B:B", result); - } - - [Test] - public void ReplaceRelativeA() - { - string result = XLHelper.ReplaceRelative("$A:A", 2, "B"); - Assert.AreEqual("$A:B", result); - } - - [Test] - public void ReplaceRelativeB() - { - string result = XLHelper.ReplaceRelative("A:$A", 2, "B"); - Assert.AreEqual("B:$A", result); - } - - [Test] - public void ReplaceRelativeC() - { - string result = XLHelper.ReplaceRelative("$A:$A", 2, "B"); - Assert.AreEqual("$A:$A", result); - } - } +using ClosedXML.Excel; +using NUnit.Framework; + +namespace ClosedXML_Tests +{ + /// + /// This is a test class for XLHelperTests and is intended + /// to contain all XLHelperTests Unit Tests + /// + [TestFixture] + public class XLHelperTests + { + /// + /// Gets or sets the test context which provides + /// information about and functionality for the current test run. + /// + public TestContext TestContext { get; set; } + + // + //You can use the following additional attributes as you write your tests: + // + //Use ClassInitialize to run code before running the first test in the class + //[ClassInitialize()] + //public static void MyClassInitialize(TestContext testContext) + //{ + //} + // + //Use ClassCleanup to run code after all tests in a class have run + //[ClassCleanup()] + //public static void MyClassCleanup() + //{ + //} + // + //Use TestInitialize to run code before running each test + //[TestInitialize()] + //public void MyTestInitialize() + //{ + //} + // + //Use TestCleanup to run code after each test has run + //[TestCleanup()] + //public void MyTestCleanup() + //{ + //} + // + + /// + /// A test for IsValidColumn + /// + [Test] + public void IsValidColumnTest() + { + Assert.AreEqual(false, XLHelper.IsValidColumn("")); + Assert.AreEqual(false, XLHelper.IsValidColumn("1")); + Assert.AreEqual(false, XLHelper.IsValidColumn("A1")); + Assert.AreEqual(false, XLHelper.IsValidColumn("AA1")); + Assert.AreEqual(true, XLHelper.IsValidColumn("A")); + Assert.AreEqual(true, XLHelper.IsValidColumn("AA")); + Assert.AreEqual(true, XLHelper.IsValidColumn("AAA")); + Assert.AreEqual(true, XLHelper.IsValidColumn("Z")); + Assert.AreEqual(true, XLHelper.IsValidColumn("ZZ")); + Assert.AreEqual(true, XLHelper.IsValidColumn("XFD")); + Assert.AreEqual(false, XLHelper.IsValidColumn("ZAA")); + Assert.AreEqual(false, XLHelper.IsValidColumn("XZA")); + Assert.AreEqual(false, XLHelper.IsValidColumn("XFZ")); + } + + [Test] + public void ReplaceRelative1() + { + string result = XLHelper.ReplaceRelative("A1", 2, "B"); + Assert.AreEqual("B2", result); + } + + [Test] + public void ReplaceRelative2() + { + string result = XLHelper.ReplaceRelative("$A1", 2, "B"); + Assert.AreEqual("$A2", result); + } + + [Test] + public void ReplaceRelative3() + { + string result = XLHelper.ReplaceRelative("A$1", 2, "B"); + Assert.AreEqual("B$1", result); + } + + [Test] + public void ReplaceRelative4() + { + string result = XLHelper.ReplaceRelative("$A$1", 2, "B"); + Assert.AreEqual("$A$1", result); + } + + [Test] + public void ReplaceRelative5() + { + string result = XLHelper.ReplaceRelative("1:1", 2, "B"); + Assert.AreEqual("2:2", result); + } + + [Test] + public void ReplaceRelative6() + { + string result = XLHelper.ReplaceRelative("$1:1", 2, "B"); + Assert.AreEqual("$1:2", result); + } + + [Test] + public void ReplaceRelative7() + { + string result = XLHelper.ReplaceRelative("1:$1", 2, "B"); + Assert.AreEqual("2:$1", result); + } + + [Test] + public void ReplaceRelative8() + { + string result = XLHelper.ReplaceRelative("$1:$1", 2, "B"); + Assert.AreEqual("$1:$1", result); + } + + [Test] + public void ReplaceRelative9() + { + string result = XLHelper.ReplaceRelative("A:A", 2, "B"); + Assert.AreEqual("B:B", result); + } + + [Test] + public void ReplaceRelativeA() + { + string result = XLHelper.ReplaceRelative("$A:A", 2, "B"); + Assert.AreEqual("$A:B", result); + } + + [Test] + public void ReplaceRelativeB() + { + string result = XLHelper.ReplaceRelative("A:$A", 2, "B"); + Assert.AreEqual("B:$A", result); + } + + [Test] + public void ReplaceRelativeC() + { + string result = XLHelper.ReplaceRelative("$A:$A", 2, "B"); + Assert.AreEqual("$A:$A", result); + } + } } \ No newline at end of file diff --git a/ClosedXML_Tests/packages.config b/ClosedXML_Tests/packages.config index df4f149..00ed3b8 100644 --- a/ClosedXML_Tests/packages.config +++ b/ClosedXML_Tests/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/README.md b/README.md index 961bba2..2e5ed79 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # ClosedXML [![Build status](https://ci.appveyor.com/api/projects/status/wobbmnlbukxejjgb?svg=true)](https://ci.appveyor.com/project/Pyropace/closedxml) -ClosedXML makes it easier for developers to create Excel 2007/2010/2013 files. It provides a nice object oriented way to manipulate the files (similar to VBA) without dealing with the hassles of XML Documents. It can be used by any .NET language like C# and Visual Basic (VB). +ClosedXML makes it easier for developers to create Excel 2007+ (.xlsx, .xlsm, etc) files. It provides a nice object oriented way to manipulate the files (similar to VBA) without dealing with the hassles of XML Documents. It can be used by any .NET language like C# and Visual Basic (VB). [For more information see the wiki](https://github.com/closedxml/closedxml/wiki) @@ -18,7 +18,7 @@ ### What can you do with this? -ClosedXML allows you to create Excel 2007/2010/2013 files without the Excel application. The typical example is creating Excel reports on a web server. +ClosedXML allows you to create Excel 2007+ (.xlsx, .xlsm, etc) files without the Excel application. The typical example is creating Excel reports on a web server. If you've ever used the Microsoft Open XML Format SDK you know just how much code you have to write to get the same results as the following 4 lines of code. @@ -28,3 +28,14 @@ worksheet.Cell("A1").Value = "Hello World!"; workbook.SaveAs("HelloWorld.xlsx"); ``` + +### Extensions +Be sure to check out our `ClosedXML` extension projects +- https://github.com/ClosedXML/ClosedXML.Extensions.AspNet +- https://github.com/ClosedXML/ClosedXML.Extensions.Mvc + +## Developer guidelines +_Full guidelines to follow later_ +* Please submit pull requests that are based on the `develop` branch. +* Where possible, pull requests should include unit tests that cover as many uses cases as possible. This is especially relevant when implementing Excel functions. +* Install [NUnit 3.0 Test Adapter](https://github.com/nunit/docs/wiki/Adapter-Installation) if you want to run the test suite in Visual Studio.