diff --git a/.gitattributes b/.gitattributes index 5b587f0..307f7d6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,11 +4,11 @@ # 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 +*.csproj text eol=crlf # Denote all files that are truly binary and should not be modified. *.png binary @@ -16,5 +16,6 @@ *.dll binary *.gif binary *.ico binary +*.xlsx binary core.autocrlf=true diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index e5313db..984600d 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -2,6 +2,10 @@ - [x] Bug - [ ] Feature +**Version of ClosedXML** + +e.g. 0.87.1 + **What is the current behavior?** **If the current behavior is a bug, please provide the steps to reproduce and 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..526dcb0 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; @@ -23,7 +23,7 @@ { var attribute = GetXLColumnAttribute(mi); if (attribute == null) return null; - return XLHelper.IsNullOrWhiteSpace(attribute.Header) ? null : attribute.Header; + return String.IsNullOrWhiteSpace(attribute.Header) ? null : attribute.Header; } internal static Int32 GetOrder(MemberInfo mi) diff --git a/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML.csproj index 4c64ff7..97f6610 100644 --- a/ClosedXML/ClosedXML.csproj +++ b/ClosedXML/ClosedXML.csproj @@ -1,48 +1,52 @@ - - - - - netstandard2.0;net452;net461 - 0.9 - Manuel de Leon, Amir Ghezelbash, Francois Botha - - - 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). - MIT - https://github.com/ClosedXML/ClosedXML/blob/master/LICENSE - https://github.com/ClosedXML/ClosedXML - https://github.com/ClosedXML/ClosedXML - - - - $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ - - - - $(DefineConstants);_NETFRAMEWORK_;_NET452_ - - - - $(DefineConstants);_NETFRAMEWORK_;_NET461_ - - - - - - - - - - - - - - - - - - - - - - + + + + + netstandard2.0;net452;net461 + 0.9 + Manuel de Leon, Amir Ghezelbash, Francois Botha + + + 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). + MIT + https://github.com/ClosedXML/ClosedXML/blob/master/LICENSE + https://github.com/ClosedXML/ClosedXML + https://github.com/ClosedXML/ClosedXML + + + + $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET452_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET461_ + + + + + + + + + + + + + + + + + + + + + + + + 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..18c2c9d 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/DateAndTime.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/DateAndTime.cs @@ -1,362 +1,381 @@ -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]; + + // Excel allows months and days outside the normal range, and adjusts the date accordingly + if (month > 12 || month < 1) + { + year += (int)Math.Floor((double)(month - 1d) / 12.0); + month -= (int)Math.Floor((double)(month - 1d) / 12.0) * 12; + } + + int daysAdjustment = 0; + if (day > DateTime.DaysInMonth(year, month)) + { + daysAdjustment = day - DateTime.DaysInMonth(year, month); + day = DateTime.DaysInMonth(year, month); + } + else if (day < 1) + { + daysAdjustment = day - 1; + day = 1; + } + + return (int)Math.Floor(new DateTime(year, month, day).AddDays(daysAdjustment).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..6d5dc53 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 (String.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 af5899e..488e2eb 100644 --- a/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/Excel/Cells/XLCell.cs @@ -1,2627 +1,2597 @@ -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.Rows.Cast(), 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 FastMember; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; + +namespace ClosedXML.Excel +{ + using Attributes; + using ClosedXML.Extensions; + + 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 (!String.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 (String.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 String.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 (String.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.Rows.Cast(), 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 (String.IsNullOrWhiteSpace(_formulaA1)) + { + if (!String.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 = String.IsNullOrWhiteSpace(value) ? null : value; + + _formulaR1C1 = null; + } + } + + public string FormulaR1C1 + { + get + { + if (String.IsNullOrWhiteSpace(_formulaR1C1)) + _formulaR1C1 = GetFormulaR1C1(FormulaA1); + + return _formulaR1C1; + } + + set + { + _formulaR1C1 = String.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 + && String.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 (String.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 (String.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 + + 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 (String.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 = "$" + + (XLHelper.TrimRowNumber(Int32.Parse(row1String.Substring(1)) + rowsShifted)).ToInvariantString(); + } + else + row1 = (XLHelper.TrimRowNumber(Int32.Parse(row1String) + rowsShifted)).ToInvariantString(); + + string row2; + if (row2String[0] == '$') + { + row2 = "$" + + (XLHelper.TrimRowNumber(Int32.Parse(row2String.Substring(1)) + rowsShifted)).ToInvariantString(); + } + else + row2 = (XLHelper.TrimRowNumber(Int32.Parse(row2String) + rowsShifted)).ToInvariantString(); + + sb.Append(useSheetName + ? String.Format("{0}!{1}:{2}", sheetName.WrapSheetNameInQuotesIfRequired(), 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.WrapSheetNameInQuotesIfRequired(), + new XLAddress(worksheetInAction, + XLHelper.TrimRowNumber(matchRange.RangeAddress.FirstAddress.RowNumber + rowsShifted), + matchRange.RangeAddress. + FirstAddress.ColumnLetter, + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn), + new XLAddress(worksheetInAction, + XLHelper.TrimRowNumber(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, + XLHelper.TrimRowNumber(matchRange.RangeAddress.FirstAddress.RowNumber + rowsShifted), + matchRange.RangeAddress. + FirstAddress.ColumnLetter, + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn), + new XLAddress(worksheetInAction, + XLHelper.TrimRowNumber(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.WrapSheetNameInQuotesIfRequired(), + new XLAddress(worksheetInAction, + XLHelper.TrimRowNumber(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, + XLHelper.TrimRowNumber(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.WrapSheetNameInQuotesIfRequired(), + matchRange.RangeAddress.FirstAddress, + new XLAddress(worksheetInAction, + XLHelper.TrimRowNumber(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, + XLHelper.TrimRowNumber(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 (String.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, true); + } + else + { + column1 = + XLHelper.GetColumnLetterFromNumber( + XLHelper.GetColumnNumberFromLetter(column1String) + + columnsShifted, true); + } + + string column2; + if (column2String[0] == '$') + { + column2 = "$" + + XLHelper.GetColumnLetterFromNumber( + XLHelper.GetColumnNumberFromLetter( + column2String.Substring(1)) + columnsShifted, true); + } + else + { + column2 = + XLHelper.GetColumnLetterFromNumber( + XLHelper.GetColumnNumberFromLetter(column2String) + + columnsShifted, true); + } + + sb.Append(useSheetName + ? String.Format("{0}!{1}:{2}", sheetName.WrapSheetNameInQuotesIfRequired(), 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.WrapSheetNameInQuotesIfRequired(), + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + FirstAddress.RowNumber, + XLHelper.TrimColumnNumber(matchRange.RangeAddress.FirstAddress.ColumnNumber + columnsShifted), + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn), + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + LastAddress.RowNumber, + XLHelper.TrimColumnNumber(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, + XLHelper.TrimColumnNumber(matchRange.RangeAddress.FirstAddress.ColumnNumber + columnsShifted), + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn), + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + LastAddress.RowNumber, + XLHelper.TrimColumnNumber(matchRange.RangeAddress.LastAddress.ColumnNumber + columnsShifted), + matchRange.RangeAddress. + LastAddress.FixedRow, + matchRange.RangeAddress. + LastAddress.FixedColumn))); + } + } + else + { + if (useSheetName) + { + sb.Append(String.Format("{0}!{1}", + sheetName.WrapSheetNameInQuotesIfRequired(), + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + FirstAddress.RowNumber, + XLHelper.TrimColumnNumber(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, + XLHelper.TrimColumnNumber(matchRange.RangeAddress.FirstAddress.ColumnNumber + columnsShifted), + matchRange.RangeAddress. + FirstAddress.FixedRow, + matchRange.RangeAddress. + FirstAddress.FixedColumn))); + } + } + } + else + { + if (useSheetName) + { + sb.Append(String.Format("{0}!{1}:{2}", + sheetName.WrapSheetNameInQuotesIfRequired(), + matchRange.RangeAddress.FirstAddress, + new XLAddress(worksheetInAction, + matchRange.RangeAddress. + LastAddress.RowNumber, + XLHelper.TrimColumnNumber(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, + XLHelper.TrimColumnNumber(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 !String.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 0d37776..657f33a 100644 --- a/ClosedXML/Excel/Columns/XLColumn.cs +++ b/ClosedXML/Excel/Columns/XLColumn.cs @@ -1,834 +1,834 @@ -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) - { -#if _NETFRAMEWORK_ - var fontCache = new Dictionary(); -#endif - - 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) -#if _NETFRAMEWORK_ - runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition), fontCache); -#else - runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition)); -#endif - - if (runningWidth > thisWidthMax) - thisWidthMax = runningWidth; - - runningWidth = newLinePosition < formattedString.Length - 2 -#if _NETFRAMEWORK_ - ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) -#else - ? f.GetWidth(formattedString.Substring(newLinePosition + 2)) -#endif - : 0; - } - else -#if _NETFRAMEWORK_ - runningWidth += f.GetWidth(formattedString, fontCache); -#else - runningWidth += f.GetWidth(formattedString); -#endif - -#endregion - } - else - { -#region if (textRotation == 255) - - if (textRotation == 255) - { - if (runningWidth <= 0) -#if _NETFRAMEWORK_ - runningWidth = f.GetWidth("X", fontCache); -#else - runningWidth = f.GetWidth("X"); -#endif - - if (newLinePosition >= 0) -#if _NETFRAMEWORK_ - runningWidth += f.GetWidth("X", fontCache); -#else - runningWidth += f.GetWidth("X"); -#endif - } - else - { - rotated = true; -#if _NETFRAMEWORK_ - Double vWidth = f.GetWidth("X", fontCache); -#else - Double vWidth = f.GetWidth("X"); -#endif - if (vWidth > maxLineWidth) - maxLineWidth = vWidth; - - if (newLinePosition >= 0) - { - lineCount++; - - if (newLinePosition > 0) -#if _NETFRAMEWORK_ - runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition), fontCache); -#else - runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition)); -#endif - - if (runningWidth > thisWidthMax) - thisWidthMax = runningWidth; - - runningWidth = newLinePosition < formattedString.Length - 2 -#if _NETFRAMEWORK_ - ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) -#else - ? f.GetWidth(formattedString.Substring(newLinePosition + 2)) -#endif - : 0; - } - else -#if _NETFRAMEWORK_ - runningWidth += f.GetWidth(formattedString, fontCache); -#else - runningWidth += f.GetWidth(formattedString); -#endif - } - -#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 -#if _NETFRAMEWORK_ - thisWidthMax = c.Style.Font.GetWidth(c.GetFormattedString(), fontCache); -#else - thisWidthMax = c.Style.Font.GetWidth(c.GetFormattedString()); -#endif - 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; - -#if _NETFRAMEWORK_ - foreach (IDisposable font in fontCache.Values) - { - font.Dispose(); - } -#endif - 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) + { +#if _NETFRAMEWORK_ + var fontCache = new Dictionary(); +#endif + + 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) +#if _NETFRAMEWORK_ + runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition), fontCache); +#else + runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition)); +#endif + + if (runningWidth > thisWidthMax) + thisWidthMax = runningWidth; + + runningWidth = newLinePosition < formattedString.Length - 2 +#if _NETFRAMEWORK_ + ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) +#else + ? f.GetWidth(formattedString.Substring(newLinePosition + 2)) +#endif + : 0; + } + else +#if _NETFRAMEWORK_ + runningWidth += f.GetWidth(formattedString, fontCache); +#else + runningWidth += f.GetWidth(formattedString); +#endif + +#endregion + } + else + { +#region if (textRotation == 255) + + if (textRotation == 255) + { + if (runningWidth <= 0) +#if _NETFRAMEWORK_ + runningWidth = f.GetWidth("X", fontCache); +#else + runningWidth = f.GetWidth("X"); +#endif + + if (newLinePosition >= 0) +#if _NETFRAMEWORK_ + runningWidth += f.GetWidth("X", fontCache); +#else + runningWidth += f.GetWidth("X"); +#endif + } + else + { + rotated = true; +#if _NETFRAMEWORK_ + Double vWidth = f.GetWidth("X", fontCache); +#else + Double vWidth = f.GetWidth("X"); +#endif + if (vWidth > maxLineWidth) + maxLineWidth = vWidth; + + if (newLinePosition >= 0) + { + lineCount++; + + if (newLinePosition > 0) +#if _NETFRAMEWORK_ + runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition), fontCache); +#else + runningWidth += f.GetWidth(formattedString.Substring(0, newLinePosition)); +#endif + + if (runningWidth > thisWidthMax) + thisWidthMax = runningWidth; + + runningWidth = newLinePosition < formattedString.Length - 2 +#if _NETFRAMEWORK_ + ? f.GetWidth(formattedString.Substring(newLinePosition + 2), fontCache) +#else + ? f.GetWidth(formattedString.Substring(newLinePosition + 2)) +#endif + : 0; + } + else +#if _NETFRAMEWORK_ + runningWidth += f.GetWidth(formattedString, fontCache); +#else + runningWidth += f.GetWidth(formattedString); +#endif + } + +#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 +#if _NETFRAMEWORK_ + thisWidthMax = c.Style.Font.GetWidth(c.GetFormattedString(), fontCache); +#else + thisWidthMax = c.Style.Font.GetWidth(c.GetFormattedString()); +#endif + 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; + +#if _NETFRAMEWORK_ + foreach (IDisposable font in fontCache.Values) + { + font.Dispose(); + } +#endif + 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 697e479..058d97d 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFColorScaleConverter.cs @@ -1,44 +1,44 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml; -using DocumentFormat.OpenXml.Spreadsheet; - -#if _NETSTANDARD_ -using ClosedXML.NetStandard; -#endif - -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; + +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif + +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 0467e00..88959e8 100644 --- a/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs +++ b/ClosedXML/Excel/ConditionalFormats/Save/XLCFDataBarConverter.cs @@ -1,38 +1,38 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using DocumentFormat.OpenXml; -using DocumentFormat.OpenXml.Spreadsheet; - -#if _NETSTANDARD_ -using ClosedXML.NetStandard; -#endif - -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; + +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif + +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..b1d7ff8 100644 --- a/ClosedXML/Excel/Coordinates/XLAddress.cs +++ b/ClosedXML/Excel/Coordinates/XLAddress.cs @@ -1,383 +1,384 @@ -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 ClosedXML.Extensions; +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.WrapSheetNameInQuotesIfRequired(), + 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.WrapSheetNameInQuotesIfRequired(), + 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..17164c0 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 && + (!String.IsNullOrWhiteSpace(InputTitle) || !String.IsNullOrWhiteSpace(InputMessage))) + ||(ShowErrorMessage && + (!String.IsNullOrWhiteSpace(ErrorTitle) || !String.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..dd1133d --- /dev/null +++ b/ClosedXML/Excel/Drawings/IXLPictures.cs @@ -0,0 +1,37 @@ +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); + +#if _NETFRAMEWORK_ + IXLPicture Add(Bitmap bitmap); + + IXLPicture Add(Bitmap bitmap, String name); +#endif + 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 a0f246d..4427664 100644 --- a/ClosedXML/Excel/Drawings/XLPicture.cs +++ b/ClosedXML/Excel/Drawings/XLPicture.cs @@ -1,248 +1,372 @@ -using System; +using System; using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; + +#if _NETFRAMEWORK_ +using System.Drawing.Imaging; +#endif + 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 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() - { - 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; - } - - public long MaxWidth - { - get - { - return ConvertToEmu(iMaxWidth, iHorizontalResolution); - } - set - { - iMaxWidth = value; - isResized = false; - } - } - - - public long MaxHeight - { - get - { - return ConvertToEmu(iMaxHeight, iVerticalResolution); - } - set - { - iMaxHeight = value; - isResized = false; - } - } - - public long Width - { - get - { - if (!isResized) - { - Resize(); - } - return ConvertToEmu(iWidth, iHorizontalResolution); - } - 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 _NETFRAMEWORK_ - if (imgStream == null) - { - imgStream = new MemoryStream(); - } - else - { - imgStream.Dispose(); - imgStream = new MemoryStream(); - } - value.CopyTo(imgStream); - imgStream.Seek(0, SeekOrigin.Begin); + private static IDictionary FormatMap; + static XLPicture() + { + 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 + ); + } +#endif - using (var bitmap = new System.Drawing.Bitmap(imgStream)) + 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); + +#if _NETFRAMEWORK_ + using (var bitmap = new Bitmap(ImageStream)) { - iWidth = (long)bitmap.Width; - iHeight = (long)bitmap.Height; - iHorizontalResolution = bitmap.HorizontalResolution; - iVerticalResolution = bitmap.VerticalResolution; + 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); } - imgStream.Seek(0, SeekOrigin.Begin); -#else - throw new NotImplementedException("System.Drawing.Bitmap is not implemented in .NET Standard 2.0"); + ImageStream.Seek(0, SeekOrigin.Begin); +#endif + + } + } + + 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); + +#if _NETFRAMEWORK_ + 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); #endif } } - public List GetMarkers() +#if _NETFRAMEWORK_ + internal XLPicture(IXLWorksheet worksheet, Bitmap bitmap) + : this(worksheet) { - return Markers != null ? Markers : new List(); + 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; } - public void AddMarker(IXLMarker marker) +#endif + + private XLPicture(IXLWorksheet worksheet) { - if (Markers == null) + if (worksheet == null) throw new ArgumentNullException(nameof(worksheet)); + this._worksheet = worksheet; + this.Placement = XLPicturePlacement.MoveAndSize; + this.Markers = new Dictionary() { - Markers = new List(); + [XLMarkerPosition.TopLeft] = null, + [XLMarkerPosition.BottomRight] = null + }; + } + + public IXLAddress BottomRightCellAddress + { + get + { + return Markers[XLMarkerPosition.BottomRight].Address; } - Markers.Add(marker); + + 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 + { + 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 Int32 Left + { + get { return Markers[XLMarkerPosition.TopLeft]?.Offset.X ?? 0; } + set + { + if (this.Placement != XLPicturePlacement.FreeFloating) + throw new ArgumentException("To set the left-hand offset, the placement should be FreeFloating"); + + Markers[XLMarkerPosition.TopLeft] = new XLMarker(_worksheet.Cell(1, 1).Address, new Point(value, this.Top)); + } } 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 (String.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; + } + +#if _NETFRAMEWORK_ + 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; } +#endif } } diff --git a/ClosedXML/Excel/Drawings/XLPictures.cs b/ClosedXML/Excel/Drawings/XLPictures.cs new file mode 100644 index 0000000..aa62fee --- /dev/null +++ b/ClosedXML/Excel/Drawings/XLPictures.cs @@ -0,0 +1,154 @@ +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; + } + +#if _NETFRAMEWORK_ + 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; + } +#endif + + public IXLPicture Add(string imageFile) + { +#if _NETFRAMEWORK_ + + using (var bitmap = Image.FromFile(imageFile) as Bitmap) + { + var picture = new XLPicture(_worksheet, bitmap); + _pictures.Add(picture); + picture.Name = GetNextPictureName(); + return picture; + } +#else + throw new NotImplementedException("System.Drawing.Image is not supported in .NET Standard"); +#endif + } + + 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..c347d16 100644 --- a/ClosedXML/Excel/Hyperlinks/XLHyperlink_public.cs +++ b/ClosedXML/Excel/Hyperlinks/XLHyperlink_public.cs @@ -1,102 +1,106 @@ -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 +using ClosedXML.Extensions; +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('!')) + .WrapSheetNameInQuotesIfRequired(), + _internalAddress.Substring(_internalAddress.IndexOf('!') + 1)) + : _internalAddress; + } + return String.Format("{0}!{1}", Worksheet.Name.WrapSheetNameInQuotesIfRequired(), _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; + } + } +} 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 0255eb1..b506e22 100644 --- a/ClosedXML/Excel/IXLTheme.cs +++ b/ClosedXML/Excel/IXLTheme.cs @@ -1,20 +1,20 @@ -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); - } -} +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..a242d32 100644 --- a/ClosedXML/Excel/IXLWorksheet.cs +++ b/ClosedXML/Excel/IXLWorksheet.cs @@ -1,381 +1,457 @@ -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); + +#if _NETFRAMEWORK_ + IXLPicture AddPicture(Bitmap bitmap); + + IXLPicture AddPicture(Bitmap bitmap, String name); +#endif + + 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..8027667 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 = !String.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..a7b191f 100644 --- a/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs +++ b/ClosedXML/Excel/NamedRanges/XLNamedRanges.cs @@ -1,106 +1,154 @@ -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 + { + private readonly Dictionary _namedRanges = new Dictionary(); + internal XLWorkbook Workbook { get; set; } + internal XLWorksheet Worksheet { get; set; } + + public XLNamedRanges(XLWorksheet worksheet) + : this(worksheet.Workbook) + { + Worksheet = worksheet; + } + + 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) + { + return Add(rangeName, rangeAddress, comment, false); + } + + /// + /// Adds the specified range name. + /// + /// Name of the range. + /// The range address. + /// The comment. + /// if set to true range address will not be checked for validity. Necessary when loading files as is. + /// + /// For named ranges in the workbook scope, specify the sheet name in the reference. + internal IXLNamedRange Add(String rangeName, String rangeAddress, String comment, bool acceptInvalidReferences) + { + if (!acceptInvalidReferences) + { + var match = XLHelper.NamedRangeReferenceRegex.Match(rangeAddress); + + if (!match.Success) + { + if (Worksheet == null || !XLHelper.NamedRangeReferenceRegex.Match(Worksheet.Range(rangeAddress).ToString()).Success) + throw new ArgumentException("For named ranges in the workbook scope, specify the sheet name in the reference."); + else + rangeAddress = Worksheet.Range(rangeAddress).ToString(); + } + } + + 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 IXLNamedRanges Members + + #region IEnumerable Members + + public IEnumerator GetEnumerator() + { + return _namedRanges.Values.GetEnumerator(); + } + + #endregion IEnumerable Members + + #region IEnumerable Members + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + #endregion IEnumerable Members + + public Boolean TryGetValue(String name, out IXLNamedRange range) + { + if (_namedRanges.TryGetValue(name, out range)) return true; + + if (Worksheet != null) + range = Worksheet.NamedRange(name); + else + range = Workbook.NamedRange(name); + + return range != null; + } + + public Boolean Contains(String name) + { + if (_namedRanges.ContainsKey(name)) return true; + + if (Worksheet != null) + return Worksheet.NamedRange(name) != null; + else + 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 293e7c4..78cb5a6 100644 --- a/ClosedXML/Excel/PageSetup/XLHFText.cs +++ b/ClosedXML/Excel/PageSetup/XLHFText.cs @@ -1,107 +1,107 @@ -using System; -using System.Text; - -#if _NETSTANDARD_ -using ClosedXML.NetStandard; -#endif - -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; + +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif + +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..df631ec 100644 --- a/ClosedXML/Excel/Ranges/XLRangeAddress.cs +++ b/ClosedXML/Excel/Ranges/XLRangeAddress.cs @@ -1,191 +1,192 @@ -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 +using ClosedXML.Extensions; +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.WrapSheetNameInQuotesIfRequired(), + _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.WrapSheetNameInQuotesIfRequired(), + _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 + } +} diff --git a/ClosedXML/Excel/Ranges/XLRangeBase.cs b/ClosedXML/Excel/Ranges/XLRangeBase.cs index 8251bcd..9e9b20e 100644 --- a/ClosedXML/Excel/Ranges/XLRangeBase.cs +++ b/ClosedXML/Excel/Ranges/XLRangeBase.cs @@ -1,2025 +1,2037 @@ -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) - { - string tAddress = RangeAddress.ToString(); - foreach (var mergedRange in Worksheet.Internals.MergedRanges) - { - if (mergedRange.Intersects(tAddress)) - 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 ClosedXML.Extensions; +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; + + 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(this.Worksheet, + absRow, + absColumn, + cellAddressInRange.FixedRow, + cellAddressInRange.FixedColumn); + + Int32 newCellStyleId = styleId; + + // If the default style for this range base is empty, but the worksheet + // has a default style, use the worksheet's default style + if (styleId == 0 && worksheetStyleId != 0) + newCellStyleId = worksheetStyleId; + + var newCell = new XLCell(Worksheet, absoluteAddress, newCellStyleId); + 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 => !String.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 => !String.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 => !String.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.WrapSheetNameInQuotesIfRequired(), 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 (String.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 4d4d6bc..ac095ee 100644 --- a/ClosedXML/Excel/Rows/XLRow.cs +++ b/ClosedXML/Excel/Rows/XLRow.cs @@ -1,731 +1,731 @@ -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) - { -#if _NETFRAMEWORK_ - var fontCache = new Dictionary(); -#endif - 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); -#if _NETFRAMEWORK_ - Double maxHeightCol = kpList.Max(kp => kp.Key.GetHeight(fontCache)); -#else - Double maxHeightCol = kpList.Max(kp => kp.Key.GetHeight()); -#endif - 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 -#if _NETFRAMEWORK_ - thisHeight = c.Style.Font.GetHeight(fontCache); -#else - thisHeight = c.Style.Font.GetHeight(); -#endif - if (thisHeight >= maxHeight) - { - rowMaxHeight = maxHeight; - break; - } - if (thisHeight > rowMaxHeight) - rowMaxHeight = thisHeight; - } - - if (rowMaxHeight <= 0) - rowMaxHeight = Worksheet.RowHeight; - - Height = rowMaxHeight; - -#if _NETFRAMEWORK_ - foreach (IDisposable font in fontCache.Values) - { - font.Dispose(); - } -#endif - 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) + { +#if _NETFRAMEWORK_ + var fontCache = new Dictionary(); +#endif + 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); +#if _NETFRAMEWORK_ + Double maxHeightCol = kpList.Max(kp => kp.Key.GetHeight(fontCache)); +#else + Double maxHeightCol = kpList.Max(kp => kp.Key.GetHeight()); +#endif + 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 +#if _NETFRAMEWORK_ + thisHeight = c.Style.Font.GetHeight(fontCache); +#else + thisHeight = c.Style.Font.GetHeight(); +#endif + if (thisHeight >= maxHeight) + { + rowMaxHeight = maxHeight; + break; + } + if (thisHeight > rowMaxHeight) + rowMaxHeight = thisHeight; + } + + if (rowMaxHeight <= 0) + rowMaxHeight = Worksheet.RowHeight; + + Height = rowMaxHeight; + +#if _NETFRAMEWORK_ + foreach (IDisposable font in fontCache.Values) + { + font.Dispose(); + } +#endif + 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 60a349b..da69ef5 100644 --- a/ClosedXML/Excel/Style/Colors/XLColor_Public.cs +++ b/ClosedXML/Excel/Style/Colors/XLColor_Public.cs @@ -1,177 +1,188 @@ -using System; -using System.Drawing; - -#if _NETSTANDARD_ -using ClosedXML.NetStandard; -#endif - -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; + +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif + +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 + { + /// + /// Usually indexed colors are limited to max 63 + /// Index 81 is some special case. + /// Some people claim it's the index for tooltip color. + /// We'll return normal black when index 81 is found. + /// + private const Int32 TOOLTIPCOLORINDEX = 81; + + 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) + if (_indexed == TOOLTIPCOLORINDEX) + return Color.FromArgb(255, Color.Black); + else + 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); + } + } +} diff --git a/ClosedXML/Excel/Style/Colors/XLColor_Static.cs b/ClosedXML/Excel/Style/Colors/XLColor_Static.cs index 5798893..13ce341 100644 --- a/ClosedXML/Excel/Style/Colors/XLColor_Static.cs +++ b/ClosedXML/Excel/Style/Colors/XLColor_Static.cs @@ -1,945 +1,945 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using DocumentFormat.OpenXml.Presentation; - -#if _NETSTANDARD_ -using ClosedXML.NetStandard; -#endif - -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)); - } - -#if _NETFRAMEWORK_ - public static XLColor FromKnownColor(KnownColor color) - { - return FromColor(Color.FromKnownColor(color)); - } -#endif - public static XLColor FromName(String name) - { - return FromColor(Color.FromName(name)); - } - public static XLColor FromHtml(String htmlColor) - { -#if _NETFRAMEWORK_ - return FromColor(ColorTranslator.FromHtml(htmlColor)); -#else - return FromColor(XLColorTranslator.FromHtml(htmlColor)); -#endif - } - - 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; + +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif + +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)); + } + +#if _NETFRAMEWORK_ + public static XLColor FromKnownColor(KnownColor color) + { + return FromColor(Color.FromKnownColor(color)); + } +#endif + public static XLColor FromName(String name) + { + return FromColor(Color.FromName(name)); + } + public static XLColor FromHtml(String htmlColor) + { +#if _NETFRAMEWORK_ + return FromColor(ColorTranslator.FromHtml(htmlColor)); +#else + return FromColor(XLColorTranslator.FromHtml(htmlColor)); +#endif + } + + 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 61e7254..e23deb0 100644 --- a/ClosedXML/Excel/Style/IXLFontBase.cs +++ b/ClosedXML/Excel/Style/IXLFontBase.cs @@ -1,18 +1,18 @@ -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..61f8063 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 (String.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 (String.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 (String.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 8d3a62b..d9fb9bf 100644 --- a/ClosedXML/Excel/XLWorkbook.cs +++ b/ClosedXML/Excel/XLWorkbook.cs @@ -1,881 +1,928 @@ -using System; -using System.Collections.Generic; -using System.IO; -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); - } - } - } - - 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); - } - 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 ClosedXML.Excel.CalcEngine; +using ClosedXML.Extensions; +using DocumentFormat.OpenXml; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; + +namespace ClosedXML.Excel +{ + + 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, false); +#else + Save(false, false); +#endif + } + + /// + /// Saves the current workbook and optionally performs validation + /// + public void Save(Boolean validate, Boolean evaluateFormulae = false) + { + 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, evaluateFormulae); + } + else + CreatePackage(_originalFile, _spreadsheetDocumentType, validate, evaluateFormulae); + } + + /// + /// Saves the current workbook to a file. + /// + public void SaveAs(String file) + { +#if DEBUG + SaveAs(file, true, false); +#else + SaveAs(file, false, false); +#endif + } + + /// + /// Saves the current workbook to a file and optionally validates it. + /// + public void SaveAs(String file, Boolean validate, Boolean evaluateFormulae = false) + { + checkForWorksheetsPresent(); + PathHelper.CreateDirectory(Path.GetDirectoryName(file)); + if (_loadSource == XLLoadSource.New) + { + if (File.Exists(file)) + File.Delete(file); + + CreatePackage(file, GetSpreadsheetDocumentType(file), validate, evaluateFormulae); + } + else if (_loadSource == XLLoadSource.File) + { + if (String.Compare(_originalFile.Trim(), file.Trim(), true) != 0) + File.Copy(_originalFile, file, true); + + CreatePackage(file, GetSpreadsheetDocumentType(file), validate, evaluateFormulae); + } + 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, evaluateFormulae); + } + } + } + + 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, false); +#else + SaveAs(stream, false, false); +#endif + } + + /// + /// Saves the current workbook to a stream and optionally validates it. + /// + public void SaveAs(Stream stream, Boolean validate, Boolean evaluateFormulae = false) + { + 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, evaluateFormulae); + } + else + { + // the harder way + MemoryStream ms = new MemoryStream(); + CreatePackage(ms, true, _spreadsheetDocumentType, validate, evaluateFormulae); + // 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); + } + CreatePackage(stream, false, _spreadsheetDocumentType, validate, evaluateFormulae); + } + else if (_loadSource == XLLoadSource.Stream) + { + _originalStream.Position = 0; + if (_originalStream != stream) + CopyStream(_originalStream, stream); + + CreatePackage(stream, false, _spreadsheetDocumentType, validate, evaluateFormulae); + } + } + + 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; } + internal HexBinaryValue LockPassword { get; set; } + public Boolean IsPasswordProtected { get { return LockPassword != null; } } + + public void Protect(Boolean lockStructure, Boolean lockWindows, String workbookPassword) + { + if (IsPasswordProtected && workbookPassword == null) + throw new InvalidOperationException("The workbook is password protected"); + + var hashPassword = workbookPassword.HashPassword(); + if (IsPasswordProtected && LockPassword != hashPassword) + throw new ArgumentException("Invalid password"); + + if (IsPasswordProtected && (lockStructure || lockWindows)) + throw new InvalidOperationException("The workbook is already protected"); + + if (IsPasswordProtected && hashPassword != null && !lockStructure && !lockWindows) + { + // Workbook currently protected, but we're unsetting the 2 flags + // Hence unprotect workbook using password. + LockPassword = null; + } + + + if (!IsPasswordProtected && hashPassword != null && (lockStructure || lockWindows)) + { + //Protect workbook using password. + LockPassword = hashPassword; + } + + LockStructure = lockStructure; + LockWindows = lockWindows; + } + + public void Protect() + { + Protect(true); + } + + public void Protect(string workbookPassword) + { + Protect(true, false, workbookPassword); + } + + public void Protect(Boolean lockStructure) + { + Protect(lockStructure, false); + } + + public void Protect(Boolean lockStructure, Boolean lockWindows) + { + Protect(lockStructure, lockWindows, null); + } + + public void Unprotect() + { + Protect(false, false); + } + + public void Unprotect(string workbookPassword) + { + Protect(false, false, workbookPassword); +} + } +} 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 4d1afbe..d8ebf53 100644 --- a/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -1,2299 +1,2401 @@ -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; - -#if _NETSTANDARD_ -using ClosedXML.NetStandard; -#endif -namespace ClosedXML.Excel -{ - using Ap; - using Op; - using System.Drawing; - - 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 (DefinedName definedName in workbook.DefinedNames) - { - 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("[")) - { - String tableName = area.Substring(0, area.IndexOf("[")); - 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) - { - 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.OrdinalIgnoreCase); - 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.OrdinalIgnoreCase); - 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.OrdinalIgnoreCase); - } - 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)) - { -#if _NETFRAMEWORK_ - thisColor = ColorTranslator.FromHtml(htmlColor); -#else - thisColor = XLColorTranslator.FromHtml(htmlColor); -#endif - _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; - } - } -} +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; + +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif +namespace ClosedXML.Excel +{ + using Ap; + using Drawings; + using Op; + using System.Drawing; + + 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; + if (wbProtection.WorkbookPassword != null) + LockPassword = wbProtection.WorkbookPassword.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); + + //If imgId is null, we're probably dealing with a TextBox (or another shape) instead of a picture + if (imgId == null) continue; + + 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 as XLNamedRanges).Add(name, text, comment, true).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('!'); + if (sections.Count() == 1) + { + sheetName = string.Empty; + sheetArea = item; + } + else + { + 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 && !String.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 (cell.CellValue != null && !String.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) + { + if (cell.CellValue != null) + xlCell._cellValue = cell.CellValue.Text; + xlCell._dataType = XLCellValues.Boolean; + } + else if (cell.DataType == CellValues.Number) + { + if (cell.CellValue != null && !String.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 (!String.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 (!String.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.OrdinalIgnoreCase); + 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.OrdinalIgnoreCase); + 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.OrdinalIgnoreCase); + } + 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 (String.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 && !String.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)) + { +#if _NETFRAMEWORK_ + thisColor = ColorTranslator.FromHtml(htmlColor); +#else + thisColor = XLColorTranslator.FromHtml(htmlColor); +#endif + _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; + } + } +} \ No newline at end of file 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 39f2272..a7d1aa5 100644 --- a/ClosedXML/Excel/XLWorkbook_Save.cs +++ b/ClosedXML/Excel/XLWorkbook_Save.cs @@ -1,5016 +1,5054 @@ -#if _NETSTANDARD_ -using ClosedXML.NetStandard; -#endif -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.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; +using ClosedXML.Extensions; + +#if _NETSTANDARD_ +using ClosedXML.NetStandard; +#endif + +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 GetCellValueType(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, bool evaluateFormulae) + { + PathHelper.CreateDirectory(Path.GetDirectoryName(filePath)); + var package = File.Exists(filePath) + ? SpreadsheetDocument.Open(filePath, true) + : SpreadsheetDocument.Create(filePath, spreadsheetDocumentType); + + using (package) + { + CreateParts(package, evaluateFormulae); + if (validate) Validate(package); + } + } + + private void CreatePackage(Stream stream, bool newStream, SpreadsheetDocumentType spreadsheetDocumentType, bool validate, bool evaluateFormulae) + { + var package = newStream + ? SpreadsheetDocument.Create(stream, spreadsheetDocumentType) + : SpreadsheetDocument.Open(stream, true); + + using (package) + { + CreateParts(package, evaluateFormulae); + 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, bool evaluateFormulae) + { + 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 => !String.IsNullOrWhiteSpace(ws.RelId)).Select(ws => ws.RelId), RelType.Workbook); + context.RelIdGenerator.AddValues(WorksheetsInternal.Cast().Where(ws => !String.IsNullOrWhiteSpace(ws.LegacyDrawingId)).Select(ws => ws.LegacyDrawingId), RelType.Workbook); + context.RelIdGenerator.AddValues(WorksheetsInternal + .Cast() + .SelectMany(ws => ws.Tables.Cast()) + .Where(t => !String.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 (String.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, evaluateFormulae, 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 (!String.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 (!String.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 + + #region WorkbookProtection + + if (LockStructure || LockWindows) + { + if (workbook.WorkbookProtection == null) + workbook.WorkbookProtection = new WorkbookProtection(); + + workbook.WorkbookProtection.LockStructure = LockStructure; + workbook.WorkbookProtection.LockWindows = LockWindows; + + if (LockPassword != null) + workbook.WorkbookProtection.WorkbookPassword = LockPassword; + } + else + { + workbook.WorkbookProtection = null; + } + + #endregion + + 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 && String.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 (String.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 (!String.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 (!String.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 + && String.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 (String.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 (!String.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 (!String.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 (String.IsNullOrWhiteSpace(pt.WorkbookCacheRelId)) + pivotCaches.AppendChild(pivotCache); + + PivotTablePart pivotTablePart; + if (String.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 (String.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()); + } + + if (rowItems.Any()) + { + 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); + } + + if (dataFields.Any()) + { + 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 (!String.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(914400L * 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.Position = 0; + 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); + if (props != null) + 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 (!String.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 && !String.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, bool evaluateFormulae, 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 xlCell in xlWorksheet.Internals.CellsCollection.RowsCollection[distinctRow].Values + .OrderBy(c => c.Address.ColumnNumber) + .Select(c => c)) + { + var styleId = context.SharedStyles[xlCell.GetStyleId()].StyleId; + var cellReference = (xlCell.Address).GetTrimmedAddress(); + var isEmpty = xlCell.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 = xlCell.FormulaA1; + if (xlCell.HasFormula) + { + if (formula.StartsWith("{")) + { + formula = formula.Substring(1, formula.Length - 2); + var f = new CellFormula { FormulaType = CellFormulaValues.Array }; + + if (xlCell.FormulaReference == null) + xlCell.FormulaReference = xlCell.AsRange().RangeAddress; + if (xlCell.FormulaReference.FirstAddress.Equals(xlCell.Address)) + { + f.Text = formula; + f.Reference = xlCell.FormulaReference.ToStringRelative(); + } + + cell.CellFormula = f; + } + else + { + cell.CellFormula = new CellFormula(); + cell.CellFormula.Text = formula; + } + + cell.CellValue = null; + } + else + { + cell.CellFormula = null; + cell.DataType = xlCell.DataType == XLCellValues.DateTime ? null : GetCellValueType(xlCell); + } + + if (!xlCell.HasFormula || evaluateFormulae) + SetCellValue(xlCell, cell); + + } + } + 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 (!String.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 (!String.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 (!String.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 SetCellValue(XLCell xlCell, Cell openXmlCell) + { + if (xlCell.HasFormula) + { + var cellValue = new CellValue(); + try + { + cellValue.Text = xlCell.Value.ToString(); + openXmlCell.DataType = new EnumValue(CellValues.String); + } + catch + { + cellValue = null; + } + + openXmlCell.CellValue = cellValue; + return; + } + + var dataType = xlCell.DataType; + if (dataType == XLCellValues.Text) + { + if (xlCell.InnerText.Length == 0) + openXmlCell.CellValue = null; + else + { + if (xlCell.ShareString) + { + var cellValue = new CellValue(); + cellValue.Text = xlCell.SharedStringId.ToString(); + openXmlCell.CellValue = cellValue; + } + else + { + var text = xlCell.GetString(); + var t = new Text(text); + if (text.PreserveSpaces()) + t.Space = SpaceProcessingModeValues.Preserve; + + openXmlCell.InlineString = new InlineString { Text = t }; + } + } + } + else if (dataType == XLCellValues.TimeSpan) + { + var timeSpan = xlCell.GetTimeSpan(); + var cellValue = new CellValue(); + cellValue.Text = + XLCell.BaseDate.Add(timeSpan).ToOADate().ToInvariantString(); + openXmlCell.CellValue = cellValue; + } + else if (dataType == XLCellValues.DateTime || dataType == XLCellValues.Number) + { + if (!String.IsNullOrWhiteSpace(xlCell.InnerText)) + { + var cellValue = new CellValue(); + cellValue.Text = Double.Parse(xlCell.InnerText, XLHelper.NumberStyle, XLHelper.ParseCulture).ToInvariantString(); + openXmlCell.CellValue = cellValue; + } + } + else + { + var cellValue = new CellValue(); + cellValue.Text = xlCell.InnerText; + openXmlCell.CellValue = cellValue; + } + } + + 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..8cd862c 100644 --- a/ClosedXML/Excel/XLWorksheet.cs +++ b/ClosedXML/Excel/XLWorksheet.cs @@ -1,1510 +1,1575 @@ -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 ClosedXML.Extensions; +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; + + Workbook = workbook; + + RangeShiftedRows = new XLReentrantEnumerableSet(); + RangeShiftedColumns = new XLReentrantEnumerableSet(); + + RangeAddress.Worksheet = this; + RangeAddress.FirstAddress.Worksheet = this; + RangeAddress.LastAddress.Worksheet = this; + + Pictures = new XLPictures(this); + NamedRanges = new XLNamedRanges(this); + SheetView = new XLSheetView(); + Tables = new XLTables(); + Hyperlinks = new XLHyperlinks(); + DataValidations = new XLDataValidations(); + PivotTables = new XLPivotTables(); + Protection = new XLSheetProtection(); + AutoFilter = new XLAutoFilter(); + ConditionalFormats = new XLConditionalFormats(); + 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 (String.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 (String.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.WrapSheetNameInQuotesIfRequired(), 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); + } + +#if _NETFRAMEWORK_ + public IXLPicture AddPicture(Bitmap bitmap) + { + return Pictures.Add(bitmap); + } + + public IXLPicture AddPicture(Bitmap bitmap, string name) + { + return Pictures.Add(bitmap, name); + } +#endif + + 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..c7b15d4 100644 --- a/ClosedXML/Excel/XLWorksheets.cs +++ b/ClosedXML/Excel/XLWorksheets.cs @@ -1,180 +1,191 @@ -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); + 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); + Add(sheetName, sheet); + sheet._position = position; + return sheet; + } + + private void Add(String sheetName, XLWorksheet sheet) + { + if (_worksheets.Any(ws => ws.Key.Equals(sheetName, StringComparison.OrdinalIgnoreCase))) + throw new ArgumentException(String.Format("A worksheet with the same name ({0}) has already been added.", sheetName), nameof(sheetName)); + + _worksheets.Add(sheetName, 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 (!String.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 (String.IsNullOrWhiteSpace(oldSheetName) || !_worksheets.ContainsKey(oldSheetName)) return; + + if (_worksheets.Any(ws1 => ws1.Key.Equals(newSheetName, StringComparison.OrdinalIgnoreCase))) + throw new ArgumentException(String.Format("A worksheet with the same name ({0}) has already been added.", newSheetName), nameof(newSheetName)); + + var ws = _worksheets[oldSheetName]; + _worksheets.Remove(oldSheetName); + Add(newSheetName, ws); + } + } +} diff --git a/ClosedXML/Extensions.cs b/ClosedXML/Extensions.cs index 03a9e97..38aafd4 100644 --- a/ClosedXML/Extensions.cs +++ b/ClosedXML/Extensions.cs @@ -1,379 +1,371 @@ -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 - { - -#if _NETSTANDARD_ - public static Double GetWidth(this IXLFontBase fontBase, String text) - { - var textWidth = text.Length * 30; - double width = (((textWidth / (double)7) * 256) - (128 / 7)) / 256; - width = (double)decimal.Round((decimal)width + 0.2M, 2); - - return width; - } - - public static Double GetHeight(this IXLFontBase fontBase) - { - var textHeight = 30; - return (double)textHeight * 0.85; - } -#endif - -#if _NETFRAMEWORK_ - public static Double GetWidth(this IXLFontBase fontBase, String text, Dictionary fontCache) - { - if (XLHelper.IsNullOrWhiteSpace(text)) - return 0; - - var font = GetCachedFont(fontBase, fontCache); - var textWidth = GraphicsUtils.MeasureString(text, font).Width; - - double width = (((textWidth / (double)7) * 256) - (128 / 7)) / 256; - width = (double)decimal.Round((decimal)width + 0.2M, 2); - - return width; - } - - - public static Double GetHeight(this IXLFontBase fontBase, Dictionary fontCache) - { - var font = GetCachedFont(fontBase, fontCache); - var textHeight = GraphicsUtils.MeasureString("X", font).Height; - return (double)textHeight * 0.85; - } -#endif - - 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; - } - -#if _NETFRAMEWORK_ - 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; - } - - 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; - } -#endif - } - - 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 + { + +#if _NETSTANDARD_ + public static Double GetWidth(this IXLFontBase fontBase, String text) + { + var textWidth = text.Length * 30; + double width = (((textWidth / (double)7) * 256) - (128 / 7)) / 256; + width = (double)decimal.Round((decimal)width + 0.2M, 2); + + return width; + } + + public static Double GetHeight(this IXLFontBase fontBase) + { + var textHeight = 30; + return (double)textHeight * 0.85; + } +#endif + +#if _NETFRAMEWORK_ + public static Double GetWidth(this IXLFontBase fontBase, String text, Dictionary fontCache) + { + if (String.IsNullOrWhiteSpace(text)) + return 0; + + var font = GetCachedFont(fontBase, fontCache); + var textWidth = GraphicsUtils.MeasureString(text, font).Width; + + double width = (((textWidth / (double)7) * 256) - (128 / 7)) / 256; + width = (double)decimal.Round((decimal)width + 0.2M, 2); + + return width; + } + + + public static Double GetHeight(this IXLFontBase fontBase, Dictionary fontCache) + { + var font = GetCachedFont(fontBase, fontCache); + var textHeight = GraphicsUtils.MeasureString("X", font).Height; + return (double)textHeight * 0.85; + } +#endif + + 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; + } + +#if _NETFRAMEWORK_ + 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; + } + + 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; + } +#endif + } + + 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/Extensions/StringExtensions.cs b/ClosedXML/Extensions/StringExtensions.cs new file mode 100644 index 0000000..facf0a5 --- /dev/null +++ b/ClosedXML/Extensions/StringExtensions.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ClosedXML.Extensions +{ + internal static class StringExtensions + { + internal static String WrapSheetNameInQuotesIfRequired(this String sheetName) + { + if (sheetName.Contains(' ')) + return "'" + sheetName + "'"; + else + return sheetName; + } + + internal static String HashPassword(this String password) + { + if (password == null) return null; + + 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/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/Utils/GraphicsUtils.cs b/ClosedXML/Utils/GraphicsUtils.cs index 66d6b10..d9a4825 100644 --- a/ClosedXML/Utils/GraphicsUtils.cs +++ b/ClosedXML/Utils/GraphicsUtils.cs @@ -1,4 +1,3 @@ -#if _NETFRAMEWORK_ using System; using System.Drawing; @@ -6,9 +5,10 @@ { internal static class GraphicsUtils { +#if _NETFRAMEWORK_ [ThreadStatic] private static Graphics threadLocalGraphics; - private static Graphics g + internal static Graphics Graphics { get { @@ -23,9 +23,23 @@ 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; } +#else + + internal static Graphics Graphics = new Graphics(); +#endif } + +#if _NETSTANDARD_ + + // Stub structure for .NET Standard + internal struct Graphics + { + public float DpiX { get { return 96; } } + public float DpiY { get { return 96; } } + } + +#endif } -#endif \ No newline at end of file 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 c85e60b..2efabeb 100644 --- a/ClosedXML/XLHelper.cs +++ b/ClosedXML/XLHelper.cs @@ -1,313 +1,302 @@ -using System; -using System.Globalization; -using System.Linq; -using System.Text.RegularExpressions; - -#if _NETFRAMEWORK_ - using System.Drawing; -#endif - -namespace ClosedXML.Excel -{ - /// - /// 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; - -#if _NETFRAMEWORK_ - internal static readonly Graphics Graphic = Graphics.FromImage(new Bitmap(200, 200)); - internal static readonly Double DpiX = Graphic.DpiX; -#endif - 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(':'); - } - -#if _NETFRAMEWORK_ - 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; - } -#endif - - 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.Globalization; +using System.Linq; +using System.Text.RegularExpressions; + +#if _NETFRAMEWORK_ + using System.Drawing; +#endif + +namespace ClosedXML.Excel +{ + /// + /// 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; + +#if _NETFRAMEWORK_ + internal static readonly Graphics Graphic = Graphics.FromImage(new Bitmap(200, 200)); + internal static readonly Double DpiX = Graphic.DpiX; +#endif + 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. + /// if set to true the column letter will be restricted to the allowed range. + /// + public static string GetColumnLetterFromNumber(int columnNumber, bool trimToAllowed = false) + { + if (trimToAllowed) columnNumber = TrimColumnNumber(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); + } + + internal static int TrimColumnNumber(int columnNumber) + { + return Math.Max(XLHelper.MinColumnNumber, Math.Min(XLHelper.MaxColumnNumber, columnNumber)); + } + + internal static int TrimRowNumber(int rowNumber) + { + return Math.Max(XLHelper.MinRowNumber, Math.Min(XLHelper.MaxRowNumber, rowNumber)); + } + + public static bool IsValidColumn(string column) + { + var length = column.Length; + if (String.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 (String.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(':'); + } + +#if _NETFRAMEWORK_ + 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; + } +#endif + + 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; + } + + 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_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 275d2a6..b125c3f 100644 --- a/ClosedXML_Examples/ClosedXML_Examples.csproj +++ b/ClosedXML_Examples/ClosedXML_Examples.csproj @@ -1,37 +1,45 @@ - - - - net452;net461 - - - - $(DefineConstants);_NETSTANDARD_;_NETSTANDARD1_6_ - - - - $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ - - - - $(DefineConstants);_NETFRAMEWORK_;_NET452_ - - - - $(DefineConstants);_NETFRAMEWORK_;_NET461_ - - - - - - - - - - - - - - - - - + + + + net452;net461 + + + + $(DefineConstants);_NETSTANDARD_;_NETSTANDARD1_6_ + + + + $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET452_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET461_ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ClosedXML_Examples/Columns/ColumnCells.cs b/ClosedXML_Examples/Columns/ColumnCells.cs index f4ccf50..3c26137 100644 --- a/ClosedXML_Examples/Columns/ColumnCells.cs +++ b/ClosedXML_Examples/Columns/ColumnCells.cs @@ -1,32 +1,32 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples -{ - public class ColumnCells : IXLExample - { - - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Column Cells"); - - var columnFromWorksheet = ws.Column(1); - columnFromWorksheet.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; - columnFromWorksheet.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; - columnFromWorksheet.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; - columnFromWorksheet.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; - - var columnFromRange = ws.Range("B1:B9").FirstColumn(); - - columnFromRange.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; - columnFromRange.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; - columnFromRange.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; - columnFromRange.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; - - workbook.SaveAs(filePath); - } - - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples +{ + public class ColumnCells : IXLExample + { + + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Column Cells"); + + var columnFromWorksheet = ws.Column(1); + columnFromWorksheet.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; + columnFromWorksheet.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; + columnFromWorksheet.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; + columnFromWorksheet.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; + + var columnFromRange = ws.Range("B1:B9").FirstColumn(); + + columnFromRange.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; + columnFromRange.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; + columnFromRange.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; + columnFromRange.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; + + workbook.SaveAs(filePath); + } + + } +} diff --git a/ClosedXML_Examples/Columns/ColumnCollections.cs b/ClosedXML_Examples/Columns/ColumnCollections.cs index a97b777..33395ad 100644 --- a/ClosedXML_Examples/Columns/ColumnCollections.cs +++ b/ClosedXML_Examples/Columns/ColumnCollections.cs @@ -1,108 +1,108 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Columns -{ - public class ColumnCollection : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Columns of a Range"); - - // All columns in a range - ws.Range("A1:B2").Columns().Style.Fill.BackgroundColor = XLColor.DimGray; - - var bigRange = ws.Range("A4:V6"); - - // Contiguous columns by number - bigRange.Columns(1, 2).Style.Fill.BackgroundColor = XLColor.Red; - - // Contiguous columns by letter - bigRange.Columns("D", "E").Style.Fill.BackgroundColor = XLColor.Blue; - - // Contiguous columns by letter - bigRange.Columns("G:H").Style.Fill.BackgroundColor = XLColor.DeepPink; - - // Spread columns by number - bigRange.Columns("10:11,13:14").Style.Fill.BackgroundColor = XLColor.Orange; - - // Spread columns by letter - bigRange.Columns("P:Q,S:T").Style.Fill.BackgroundColor = XLColor.Turquoise; - - // Use a single number/letter - bigRange.Columns("V").Style.Fill.BackgroundColor = XLColor.Cyan; - - // Adjust the width - ws.Columns("A:V").Width = 3; - - var ws2 = workbook.Worksheets.Add("Columns of a worksheet"); - - // Contiguous columns by number - ws2.Columns(1, 2).Style.Fill.BackgroundColor = XLColor.Red; - - // Contiguous columns by letter - ws2.Columns("D", "E").Style.Fill.BackgroundColor = XLColor.Blue; - - // Contiguous columns by letter - ws2.Columns("G:H").Style.Fill.BackgroundColor = XLColor.DeepPink; - - // Spread columns by number - ws2.Columns("10:11,13:14").Style.Fill.BackgroundColor = XLColor.Orange; - - // Spread columns by letter - ws2.Columns("P:Q,S:T").Style.Fill.BackgroundColor = XLColor.Turquoise; - - // Use a single number/letter - ws2.Columns("V").Style.Fill.BackgroundColor = XLColor.Cyan; - - // Adjust the width - ws2.Columns("A:V").Width = 3; - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Columns +{ + public class ColumnCollection : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Columns of a Range"); + + // All columns in a range + ws.Range("A1:B2").Columns().Style.Fill.BackgroundColor = XLColor.DimGray; + + var bigRange = ws.Range("A4:V6"); + + // Contiguous columns by number + bigRange.Columns(1, 2).Style.Fill.BackgroundColor = XLColor.Red; + + // Contiguous columns by letter + bigRange.Columns("D", "E").Style.Fill.BackgroundColor = XLColor.Blue; + + // Contiguous columns by letter + bigRange.Columns("G:H").Style.Fill.BackgroundColor = XLColor.DeepPink; + + // Spread columns by number + bigRange.Columns("10:11,13:14").Style.Fill.BackgroundColor = XLColor.Orange; + + // Spread columns by letter + bigRange.Columns("P:Q,S:T").Style.Fill.BackgroundColor = XLColor.Turquoise; + + // Use a single number/letter + bigRange.Columns("V").Style.Fill.BackgroundColor = XLColor.Cyan; + + // Adjust the width + ws.Columns("A:V").Width = 3; + + var ws2 = workbook.Worksheets.Add("Columns of a worksheet"); + + // Contiguous columns by number + ws2.Columns(1, 2).Style.Fill.BackgroundColor = XLColor.Red; + + // Contiguous columns by letter + ws2.Columns("D", "E").Style.Fill.BackgroundColor = XLColor.Blue; + + // Contiguous columns by letter + ws2.Columns("G:H").Style.Fill.BackgroundColor = XLColor.DeepPink; + + // Spread columns by number + ws2.Columns("10:11,13:14").Style.Fill.BackgroundColor = XLColor.Orange; + + // Spread columns by letter + ws2.Columns("P:Q,S:T").Style.Fill.BackgroundColor = XLColor.Turquoise; + + // Use a single number/letter + ws2.Columns("V").Style.Fill.BackgroundColor = XLColor.Cyan; + + // Adjust the width + ws2.Columns("A:V").Width = 3; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Columns/ColumnSettings.cs b/ClosedXML_Examples/Columns/ColumnSettings.cs index e051640..289d5ff 100644 --- a/ClosedXML_Examples/Columns/ColumnSettings.cs +++ b/ClosedXML_Examples/Columns/ColumnSettings.cs @@ -1,80 +1,80 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Columns -{ - public class ColumnSettings : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Constructors - - // Public - public ColumnSettings() - { - - } - - - // Private - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Column Settings"); - - var col1 = ws.Column("B"); - col1.Style.Fill.BackgroundColor = XLColor.Red; - col1.Width = 20; - - var col2 = ws.Column(4); - col2.Style.Fill.BackgroundColor = XLColor.DarkOrange; - col2.Width = 5; - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Columns +{ + public class ColumnSettings : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + public ColumnSettings() + { + + } + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Column Settings"); + + var col1 = ws.Column("B"); + col1.Style.Fill.BackgroundColor = XLColor.Red; + col1.Width = 20; + + var col2 = ws.Column(4); + col2.Style.Fill.BackgroundColor = XLColor.DarkOrange; + col2.Width = 5; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Columns/DeletingColumns.cs b/ClosedXML_Examples/Columns/DeletingColumns.cs index 405a9bf..c4f2e84 100644 --- a/ClosedXML_Examples/Columns/DeletingColumns.cs +++ b/ClosedXML_Examples/Columns/DeletingColumns.cs @@ -1,75 +1,75 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples -{ - public class DeletingColumns : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Deleting Columns"); - - var rngTitles = ws.Range("B2:D2"); - ws.Row(1).InsertRowsBelow(2); - - var rng1 = ws.Range("B2:D2"); - var rng2 = ws.Range("F2:G2"); - var rng3 = ws.Range("A1:A3"); - var col1 = ws.Column(1); - - rng1.Style.Fill.BackgroundColor = XLColor.Orange; - rng2.Style.Fill.BackgroundColor = XLColor.Blue; - rng3.Style.Fill.BackgroundColor = XLColor.Red; - col1.Style.Fill.BackgroundColor = XLColor.Black; - - ws.Columns("A,C,E:H").Delete(); - ws.Cell("A2").Value = "OK"; - ws.Cell("B2").Value = "OK"; - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples +{ + public class DeletingColumns : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Deleting Columns"); + + var rngTitles = ws.Range("B2:D2"); + ws.Row(1).InsertRowsBelow(2); + + var rng1 = ws.Range("B2:D2"); + var rng2 = ws.Range("F2:G2"); + var rng3 = ws.Range("A1:A3"); + var col1 = ws.Column(1); + + rng1.Style.Fill.BackgroundColor = XLColor.Orange; + rng2.Style.Fill.BackgroundColor = XLColor.Blue; + rng3.Style.Fill.BackgroundColor = XLColor.Red; + col1.Style.Fill.BackgroundColor = XLColor.Black; + + ws.Columns("A,C,E:H").Delete(); + ws.Cell("A2").Value = "OK"; + ws.Cell("B2").Value = "OK"; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Columns/InsertColumns.cs b/ClosedXML_Examples/Columns/InsertColumns.cs index e5f5579..58b05ee 100644 --- a/ClosedXML_Examples/Columns/InsertColumns.cs +++ b/ClosedXML_Examples/Columns/InsertColumns.cs @@ -1,84 +1,84 @@ -using System; -using System.Linq; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Columns -{ - public class InsertColumns : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Inserting Columns"); - - // Color the entire spreadsheet using columns - ws.Columns().Style.Fill.BackgroundColor = XLColor.LightCyan; - - // Put a value in a few cells - foreach (var r in Enumerable.Range(1, 5)) - foreach (var c in Enumerable.Range(1, 5)) - ws.Cell(r, c).Value = "X"; - - - var blueColumn = ws.Column(2); - var redColumn = ws.Column(5); - - blueColumn.Style.Fill.BackgroundColor = XLColor.Blue; - blueColumn.InsertColumnsAfter(2); - - - redColumn.Style.Fill.BackgroundColor = XLColor.Red; - redColumn.InsertColumnsBefore(2); - - ws.Rows(3, 4).Style.Fill.BackgroundColor = XLColor.Orange; - ws.Range("B1:D1").InsertColumnsAfter(2); - ws.Range("B2:D2").InsertColumnsBefore(2); - ws.Range("B3:D3").InsertColumnsAfter(2); - ws.Range("B4:D4").InsertColumnsBefore(2); - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Columns +{ + public class InsertColumns : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Inserting Columns"); + + // Color the entire spreadsheet using columns + ws.Columns().Style.Fill.BackgroundColor = XLColor.LightCyan; + + // Put a value in a few cells + foreach (var r in Enumerable.Range(1, 5)) + foreach (var c in Enumerable.Range(1, 5)) + ws.Cell(r, c).Value = "X"; + + + var blueColumn = ws.Column(2); + var redColumn = ws.Column(5); + + blueColumn.Style.Fill.BackgroundColor = XLColor.Blue; + blueColumn.InsertColumnsAfter(2); + + + redColumn.Style.Fill.BackgroundColor = XLColor.Red; + redColumn.InsertColumnsBefore(2); + + ws.Rows(3, 4).Style.Fill.BackgroundColor = XLColor.Orange; + ws.Range("B1:D1").InsertColumnsAfter(2); + ws.Range("B2:D2").InsertColumnsBefore(2); + ws.Range("B3:D3").InsertColumnsAfter(2); + ws.Range("B4:D4").InsertColumnsBefore(2); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Comments/AddingComments.cs b/ClosedXML_Examples/Comments/AddingComments.cs index fe5b0d3..e826414 100644 --- a/ClosedXML_Examples/Comments/AddingComments.cs +++ b/ClosedXML_Examples/Comments/AddingComments.cs @@ -1,284 +1,284 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using ClosedXML.Excel; -using System.IO; - -namespace ClosedXML_Examples -{ - public class AddingComments : IXLExample - { - - public void Create(string filePath) - { - var wb = new XLWorkbook {Author = "Manuel"}; - AddMiscComments(wb); - AddVisibilityComments(wb); - AddPosition(wb); - AddSignatures(wb); - AddStyleAlignment(wb); - AddColorsAndLines(wb); - AddMagins(wb); - AddProperties(wb); - AddProtection(wb); - AddSize(wb); - AddWeb(wb); - - wb.SaveAs(filePath); - } - - private void AddWeb(XLWorkbook wb) - { - var ws = wb.Worksheets.Add("Web"); - ws.Cell("A1").Comment.Style.Web.AlternateText = "The alternate text in case you need it."; - } - - private void AddSize(XLWorkbook wb) - { - var ws = wb.Worksheets.Add("Size"); - - // Automatic size is a copy of the property comment.Style.Alignment.AutomaticSize - // I created the duplicate because it makes more sense for it to be in Size - // but Excel has it under the Alignment tab. - ws.Cell("A2").Comment.AddText("Things are very tight around here."); - ws.Cell("A2").Comment.Style.Size.SetAutomaticSize(); - - ws.Cell("A4").Comment.AddText("Different size"); - ws.Cell("A4").Comment.Style - .Size.SetHeight(30) // The height is set in the same units as row.Height - .Size.SetWidth(30); // The width is set in the same units as row.Width - - // Set all comments to visible - ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); - } - - private void AddProtection(XLWorkbook wb) - { - var ws = wb.Worksheets.Add("Protection"); - - ws.Cell("A1").Comment.Style - .Protection.SetLocked(false) - .Protection.SetLockText(false); - } - - private void AddProperties(XLWorkbook wb) - { - var ws = wb.Worksheets.Add("Properties"); - - ws.Cell("A1").Comment.Style.Properties.Positioning = XLDrawingAnchor.Absolute; - ws.Cell("A2").Comment.Style.Properties.Positioning = XLDrawingAnchor.MoveAndSizeWithCells; - ws.Cell("A3").Comment.Style.Properties.Positioning = XLDrawingAnchor.MoveWithCells; - } - - private void AddMagins(XLWorkbook wb) - { - var ws = wb.Worksheets.Add("Margins"); - - ws.Cell("A2").Comment - .SetVisible() - .AddText("Lorem ipsum dolor sit amet, adipiscing elit. ").AddNewLine() - .AddText("Nunc elementum, sapien a ultrices, commodo nisl. ").AddNewLine() - .AddText("Consequat erat lectus a nisi. Aliquam facilisis."); - - ws.Cell("A2").Comment.Style - .Margins.SetAll(0.25) - .Size.SetAutomaticSize(); - } - - private void AddColorsAndLines(XLWorkbook wb) - { - var ws = wb.Worksheets.Add("Colors and Lines"); - - ws.Cell("A2").Comment - .AddText("Now ") - .AddText("THIS").SetBold().SetFontColor(XLColor.Red) - .AddText(" is colorful!"); - ws.Cell("A2").Comment.Style - .ColorsAndLines.SetFillColor(XLColor.RichCarmine) - .ColorsAndLines.SetFillTransparency(0.25) // 25% opaque - .ColorsAndLines.SetLineColor(XLColor.Blue) - .ColorsAndLines.SetLineTransparency(0.75) // 75% opaque - .ColorsAndLines.SetLineDash(XLDashStyle.LongDash) - .ColorsAndLines.SetLineStyle(XLLineStyle.ThickBetweenThin) - .ColorsAndLines.SetLineWeight(7.5); - - // Set all comments to visible - ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); - } - - private void AddStyleAlignment(XLWorkbook wb) - { - var ws = wb.Worksheets.Add("Alignment"); - - // Automagically adjust the size of the comment to fit the contents - ws.Cell("A1").Comment.Style.Alignment.SetAutomaticSize(); - ws.Cell("A1").Comment.AddText("Things are pretty tight around here"); - - // Default values - ws.Cell("A3").Comment - .AddText("Default Alignments:").AddNewLine() - .AddText("Vertical = Top").AddNewLine() - .AddText("Horizontal = Left").AddNewLine() - .AddText("Orientation = Left to Right"); - - // Let's change the alignments - ws.Cell("A8").Comment - .AddText("Vertical = Bottom").AddNewLine() - .AddText("Horizontal = Right"); - ws.Cell("A8").Comment.Style - .Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom) - .Alignment.SetHorizontal(XLDrawingHorizontalAlignment.Right); - - // And now the orientation... - ws.Cell("D3").Comment.AddText("Orientation = Bottom to Top"); - ws.Cell("D3").Comment.Style - .Alignment.SetOrientation(XLDrawingTextOrientation.BottomToTop) - .Alignment.SetAutomaticSize(); - - ws.Cell("E3").Comment.AddText("Orientation = Top to Bottom"); - ws.Cell("E3").Comment.Style - .Alignment.SetOrientation(XLDrawingTextOrientation.TopToBottom) - .Alignment.SetAutomaticSize(); - - ws.Cell("F3").Comment.AddText("Orientation = Vertical"); - ws.Cell("F3").Comment.Style - .Alignment.SetOrientation(XLDrawingTextOrientation.Vertical) - .Alignment.SetAutomaticSize(); - - - // Set all comments to visible - ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); - } - - private static void AddMiscComments(XLWorkbook wb) - { - var ws = wb.Worksheets.Add("Comments"); - - ws.Cell("A1").SetValue("Hidden").Comment.AddText("Hidden"); - ws.Cell("A2").SetValue("Visible").Comment.AddText("Visible"); - ws.Cell("A3").SetValue("On Top").Comment.AddText("On Top"); - ws.Cell("A4").SetValue("Underneath").Comment.AddText("Underneath"); - ws.Cell("A4").Comment.Style.Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom); - ws.Cell("A3").Comment.SetZOrder(ws.Cell("A4").Comment.ZOrder + 1); - - ws.Cell("D9").Comment.AddText("Vertical"); - ws.Cell("D9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.Vertical; - ws.Cell("D9").Comment.Style.Size.SetAutomaticSize(); - - ws.Cell("E9").Comment.AddText("Top to Bottom"); - ws.Cell("E9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.TopToBottom; - ws.Cell("E9").Comment.Style.Size.SetAutomaticSize(); - - ws.Cell("F9").Comment.AddText("Bottom to Top"); - ws.Cell("F9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.BottomToTop; - ws.Cell("F9").Comment.Style.Size.SetAutomaticSize(); - - ws.Cell("E1").Comment.Position.SetColumn(5); - ws.Cell("E1").Comment.AddText("Start on Col E, on top border"); - ws.Cell("E1").Comment.Style.Size.SetWidth(10); - var cE3 = ws.Cell("E3").Comment; - cE3.AddText("Size and position"); - cE3.Position.SetColumn(5).SetRow(4).SetColumnOffset(7).SetRowOffset(10); - cE3.Style.Size.SetHeight(25).Size.SetWidth(10); - var cE7 = ws.Cell("E7").Comment; - cE7.Position.SetColumn(6).SetRow(7).SetColumnOffset(0).SetRowOffset(0); - cE7.Style.Size.SetHeight(ws.Row(7).Height).Size.SetWidth(ws.Column(6).Width); - - ws.Cell("G1").Comment.AddText("Automatic Size"); - ws.Cell("G1").Comment.Style.Alignment.SetAutomaticSize(); - var cG3 = ws.Cell("G3").Comment; - cG3.SetAuthor("MDeLeon"); - cG3.AddSignature(); - cG3.AddText("This is a test of the emergency broadcast system."); - cG3.AddNewLine(); - cG3.AddText("Do "); - cG3.AddText("NOT").SetFontColor(XLColor.RadicalRed).SetUnderline().SetBold(); - cG3.AddText(" forget it."); - cG3.Style - .Size.SetWidth(25) - .Size.SetHeight(100) - .Alignment.SetDirection(XLDrawingTextDirection.LeftToRight) - .Alignment.SetHorizontal(XLDrawingHorizontalAlignment.Distributed) - .Alignment.SetVertical(XLDrawingVerticalAlignment.Center) - .Alignment.SetOrientation(XLDrawingTextOrientation.LeftToRight) - .ColorsAndLines.SetFillColor(XLColor.Cyan) - .ColorsAndLines.SetFillTransparency(0.25) - .ColorsAndLines.SetLineColor(XLColor.DarkBlue) - .ColorsAndLines.SetLineTransparency(0.75) - .ColorsAndLines.SetLineDash(XLDashStyle.DashDot) - .ColorsAndLines.SetLineStyle(XLLineStyle.ThinThick) - .ColorsAndLines.SetLineWeight(5) - .Margins.SetAll(0.25) - .Properties.SetPositioning(XLDrawingAnchor.MoveAndSizeWithCells) - .Protection.SetLocked(false) - .Protection.SetLockText(false) - .Web.SetAlternateText("This won't be released to the web"); - - ws.Cell("A9").Comment.SetAuthor("MDeLeon").AddSignature().AddText("Something"); - ws.Cell("A9").Comment.SetBold().SetFontColor(XLColor.DarkBlue); - - ws.CellsUsed(true, c => !c.Address.ToStringRelative().Equals("A1") && c.HasComment).ForEach(c => c.Comment.SetVisible()); - } - - private static void AddVisibilityComments(XLWorkbook wb) - { - var ws = wb.Worksheets.Add("Visibility"); - - // By default comments are hidden - ws.Cell("A1").SetValue("I have a hidden comment").Comment.AddText("Hidden"); - - // Set the comment as visible - ws.Cell("A2").Comment.SetVisible().AddText("Visible"); - - // The ZOrder on previous comments were 1 and 2 respectively - // here we're explicit about the ZOrder - ws.Cell("A3").Comment.SetZOrder(5).SetVisible().AddText("On Top"); - - // We want this comment to appear underneath the one for A3 - // so we set the ZOrder to something lower - ws.Cell("A4").Comment.SetZOrder(4).SetVisible().AddText("Underneath"); - ws.Cell("A4").Comment.Style.Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom); - - // Alternatively you could set all comments to visible with the following line: - // ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); - - ws.Columns().AdjustToContents(); - } - - private void AddPosition(XLWorkbook wb) - { - var ws = wb.Worksheets.Add("Position"); - - ws.Columns().Width = 10; - - ws.Cell("A1").Comment.AddText("This is an unusual place for a comment..."); - ws.Cell("A1").Comment.Position - .SetColumn(3) // Starting from the third column - .SetColumnOffset(5) // The comment will start in the middle of the third column - .SetRow(5) // Starting from the fifth row - .SetRowOffset(7.5); // The comment will start in the middle of the fifth row - - // Set all comments to visible - ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); - } - - private void AddSignatures(XLWorkbook wb) - { - var ws = wb.Worksheets.Add("Signatures"); - - // By default the signature will be with the logged user - // ws.Cell("A2").Comment.AddSignature().AddText("Hello World!"); - - // You can override this by specifying the comment's author: - ws.Cell("A2").Comment - .SetAuthor("MDeLeon") - .AddSignature() - .AddText("Hello World!"); - - - // Set all comments to visible - ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ClosedXML.Excel; +using System.IO; + +namespace ClosedXML_Examples +{ + public class AddingComments : IXLExample + { + + public void Create(string filePath) + { + var wb = new XLWorkbook {Author = "Manuel"}; + AddMiscComments(wb); + AddVisibilityComments(wb); + AddPosition(wb); + AddSignatures(wb); + AddStyleAlignment(wb); + AddColorsAndLines(wb); + AddMagins(wb); + AddProperties(wb); + AddProtection(wb); + AddSize(wb); + AddWeb(wb); + + wb.SaveAs(filePath); + } + + private void AddWeb(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Web"); + ws.Cell("A1").Comment.Style.Web.AlternateText = "The alternate text in case you need it."; + } + + private void AddSize(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Size"); + + // Automatic size is a copy of the property comment.Style.Alignment.AutomaticSize + // I created the duplicate because it makes more sense for it to be in Size + // but Excel has it under the Alignment tab. + ws.Cell("A2").Comment.AddText("Things are very tight around here."); + ws.Cell("A2").Comment.Style.Size.SetAutomaticSize(); + + ws.Cell("A4").Comment.AddText("Different size"); + ws.Cell("A4").Comment.Style + .Size.SetHeight(30) // The height is set in the same units as row.Height + .Size.SetWidth(30); // The width is set in the same units as row.Width + + // Set all comments to visible + ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + + private void AddProtection(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Protection"); + + ws.Cell("A1").Comment.Style + .Protection.SetLocked(false) + .Protection.SetLockText(false); + } + + private void AddProperties(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Properties"); + + ws.Cell("A1").Comment.Style.Properties.Positioning = XLDrawingAnchor.Absolute; + ws.Cell("A2").Comment.Style.Properties.Positioning = XLDrawingAnchor.MoveAndSizeWithCells; + ws.Cell("A3").Comment.Style.Properties.Positioning = XLDrawingAnchor.MoveWithCells; + } + + private void AddMagins(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Margins"); + + ws.Cell("A2").Comment + .SetVisible() + .AddText("Lorem ipsum dolor sit amet, adipiscing elit. ").AddNewLine() + .AddText("Nunc elementum, sapien a ultrices, commodo nisl. ").AddNewLine() + .AddText("Consequat erat lectus a nisi. Aliquam facilisis."); + + ws.Cell("A2").Comment.Style + .Margins.SetAll(0.25) + .Size.SetAutomaticSize(); + } + + private void AddColorsAndLines(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Colors and Lines"); + + ws.Cell("A2").Comment + .AddText("Now ") + .AddText("THIS").SetBold().SetFontColor(XLColor.Red) + .AddText(" is colorful!"); + ws.Cell("A2").Comment.Style + .ColorsAndLines.SetFillColor(XLColor.RichCarmine) + .ColorsAndLines.SetFillTransparency(0.25) // 25% opaque + .ColorsAndLines.SetLineColor(XLColor.Blue) + .ColorsAndLines.SetLineTransparency(0.75) // 75% opaque + .ColorsAndLines.SetLineDash(XLDashStyle.LongDash) + .ColorsAndLines.SetLineStyle(XLLineStyle.ThickBetweenThin) + .ColorsAndLines.SetLineWeight(7.5); + + // Set all comments to visible + ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + + private void AddStyleAlignment(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Alignment"); + + // Automagically adjust the size of the comment to fit the contents + ws.Cell("A1").Comment.Style.Alignment.SetAutomaticSize(); + ws.Cell("A1").Comment.AddText("Things are pretty tight around here"); + + // Default values + ws.Cell("A3").Comment + .AddText("Default Alignments:").AddNewLine() + .AddText("Vertical = Top").AddNewLine() + .AddText("Horizontal = Left").AddNewLine() + .AddText("Orientation = Left to Right"); + + // Let's change the alignments + ws.Cell("A8").Comment + .AddText("Vertical = Bottom").AddNewLine() + .AddText("Horizontal = Right"); + ws.Cell("A8").Comment.Style + .Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom) + .Alignment.SetHorizontal(XLDrawingHorizontalAlignment.Right); + + // And now the orientation... + ws.Cell("D3").Comment.AddText("Orientation = Bottom to Top"); + ws.Cell("D3").Comment.Style + .Alignment.SetOrientation(XLDrawingTextOrientation.BottomToTop) + .Alignment.SetAutomaticSize(); + + ws.Cell("E3").Comment.AddText("Orientation = Top to Bottom"); + ws.Cell("E3").Comment.Style + .Alignment.SetOrientation(XLDrawingTextOrientation.TopToBottom) + .Alignment.SetAutomaticSize(); + + ws.Cell("F3").Comment.AddText("Orientation = Vertical"); + ws.Cell("F3").Comment.Style + .Alignment.SetOrientation(XLDrawingTextOrientation.Vertical) + .Alignment.SetAutomaticSize(); + + + // Set all comments to visible + ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + + private static void AddMiscComments(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Comments"); + + ws.Cell("A1").SetValue("Hidden").Comment.AddText("Hidden"); + ws.Cell("A2").SetValue("Visible").Comment.AddText("Visible"); + ws.Cell("A3").SetValue("On Top").Comment.AddText("On Top"); + ws.Cell("A4").SetValue("Underneath").Comment.AddText("Underneath"); + ws.Cell("A4").Comment.Style.Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom); + ws.Cell("A3").Comment.SetZOrder(ws.Cell("A4").Comment.ZOrder + 1); + + ws.Cell("D9").Comment.AddText("Vertical"); + ws.Cell("D9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.Vertical; + ws.Cell("D9").Comment.Style.Size.SetAutomaticSize(); + + ws.Cell("E9").Comment.AddText("Top to Bottom"); + ws.Cell("E9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.TopToBottom; + ws.Cell("E9").Comment.Style.Size.SetAutomaticSize(); + + ws.Cell("F9").Comment.AddText("Bottom to Top"); + ws.Cell("F9").Comment.Style.Alignment.Orientation = XLDrawingTextOrientation.BottomToTop; + ws.Cell("F9").Comment.Style.Size.SetAutomaticSize(); + + ws.Cell("E1").Comment.Position.SetColumn(5); + ws.Cell("E1").Comment.AddText("Start on Col E, on top border"); + ws.Cell("E1").Comment.Style.Size.SetWidth(10); + var cE3 = ws.Cell("E3").Comment; + cE3.AddText("Size and position"); + cE3.Position.SetColumn(5).SetRow(4).SetColumnOffset(7).SetRowOffset(10); + cE3.Style.Size.SetHeight(25).Size.SetWidth(10); + var cE7 = ws.Cell("E7").Comment; + cE7.Position.SetColumn(6).SetRow(7).SetColumnOffset(0).SetRowOffset(0); + cE7.Style.Size.SetHeight(ws.Row(7).Height).Size.SetWidth(ws.Column(6).Width); + + ws.Cell("G1").Comment.AddText("Automatic Size"); + ws.Cell("G1").Comment.Style.Alignment.SetAutomaticSize(); + var cG3 = ws.Cell("G3").Comment; + cG3.SetAuthor("MDeLeon"); + cG3.AddSignature(); + cG3.AddText("This is a test of the emergency broadcast system."); + cG3.AddNewLine(); + cG3.AddText("Do "); + cG3.AddText("NOT").SetFontColor(XLColor.RadicalRed).SetUnderline().SetBold(); + cG3.AddText(" forget it."); + cG3.Style + .Size.SetWidth(25) + .Size.SetHeight(100) + .Alignment.SetDirection(XLDrawingTextDirection.LeftToRight) + .Alignment.SetHorizontal(XLDrawingHorizontalAlignment.Distributed) + .Alignment.SetVertical(XLDrawingVerticalAlignment.Center) + .Alignment.SetOrientation(XLDrawingTextOrientation.LeftToRight) + .ColorsAndLines.SetFillColor(XLColor.Cyan) + .ColorsAndLines.SetFillTransparency(0.25) + .ColorsAndLines.SetLineColor(XLColor.DarkBlue) + .ColorsAndLines.SetLineTransparency(0.75) + .ColorsAndLines.SetLineDash(XLDashStyle.DashDot) + .ColorsAndLines.SetLineStyle(XLLineStyle.ThinThick) + .ColorsAndLines.SetLineWeight(5) + .Margins.SetAll(0.25) + .Properties.SetPositioning(XLDrawingAnchor.MoveAndSizeWithCells) + .Protection.SetLocked(false) + .Protection.SetLockText(false) + .Web.SetAlternateText("This won't be released to the web"); + + ws.Cell("A9").Comment.SetAuthor("MDeLeon").AddSignature().AddText("Something"); + ws.Cell("A9").Comment.SetBold().SetFontColor(XLColor.DarkBlue); + + ws.CellsUsed(true, c => !c.Address.ToStringRelative().Equals("A1") && c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + + private static void AddVisibilityComments(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Visibility"); + + // By default comments are hidden + ws.Cell("A1").SetValue("I have a hidden comment").Comment.AddText("Hidden"); + + // Set the comment as visible + ws.Cell("A2").Comment.SetVisible().AddText("Visible"); + + // The ZOrder on previous comments were 1 and 2 respectively + // here we're explicit about the ZOrder + ws.Cell("A3").Comment.SetZOrder(5).SetVisible().AddText("On Top"); + + // We want this comment to appear underneath the one for A3 + // so we set the ZOrder to something lower + ws.Cell("A4").Comment.SetZOrder(4).SetVisible().AddText("Underneath"); + ws.Cell("A4").Comment.Style.Alignment.SetVertical(XLDrawingVerticalAlignment.Bottom); + + // Alternatively you could set all comments to visible with the following line: + // ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + + ws.Columns().AdjustToContents(); + } + + private void AddPosition(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Position"); + + ws.Columns().Width = 10; + + ws.Cell("A1").Comment.AddText("This is an unusual place for a comment..."); + ws.Cell("A1").Comment.Position + .SetColumn(3) // Starting from the third column + .SetColumnOffset(5) // The comment will start in the middle of the third column + .SetRow(5) // Starting from the fifth row + .SetRowOffset(7.5); // The comment will start in the middle of the fifth row + + // Set all comments to visible + ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + + private void AddSignatures(XLWorkbook wb) + { + var ws = wb.Worksheets.Add("Signatures"); + + // By default the signature will be with the logged user + // ws.Cell("A2").Comment.AddSignature().AddText("Hello World!"); + + // You can override this by specifying the comment's author: + ws.Cell("A2").Comment + .SetAuthor("MDeLeon") + .AddSignature() + .AddText("Hello World!"); + + + // Set all comments to visible + ws.CellsUsed(true, c => c.HasComment).ForEach(c => c.Comment.SetVisible()); + } + } +} diff --git a/ClosedXML_Examples/Comments/EditingComments.cs b/ClosedXML_Examples/Comments/EditingComments.cs index 163bbea..284f157 100644 --- a/ClosedXML_Examples/Comments/EditingComments.cs +++ b/ClosedXML_Examples/Comments/EditingComments.cs @@ -1,55 +1,55 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using ClosedXML.Excel; -using System.IO; - -namespace ClosedXML_Examples -{ - class EditingComments : IXLExample - { - - public void Create(string filePath) { - - // Exercise(@"path/to/test/resources/comments"); - - } - - public void Exercise(string basePath) - { - - // INCOMPLETE - - var book = new XLWorkbook(Path.Combine(basePath, "EditingComments.xlsx")); - var sheet = book.Worksheet(1); - - // no change - // A1 - - // edit existing comment - sheet.Cell("B3").Comment.AddNewLine(); - sheet.Cell("B3").Comment.AddSignature(); - sheet.Cell("B3").Comment.AddText("more comment"); - - // delete - //sheet.Cell("C1").DeleteComment(); - - // clear contents - sheet.Cell("D3").Clear(XLClearOptions.Contents); - - // new basic - sheet.Cell("E1").Comment.AddText("non authored comment"); - - // new with author - sheet.Cell("F3").Comment.AddSignature(); - sheet.Cell("F3").Comment.AddText("comment from author"); - - // TODO: merge with cells - // TODO: resize with cells - // TODO: visible - - book.SaveAs(Path.Combine(basePath, "EditingComments_modified.xlsx")); - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ClosedXML.Excel; +using System.IO; + +namespace ClosedXML_Examples +{ + class EditingComments : IXLExample + { + + public void Create(string filePath) { + + // Exercise(@"path/to/test/resources/comments"); + + } + + public void Exercise(string basePath) + { + + // INCOMPLETE + + var book = new XLWorkbook(Path.Combine(basePath, "EditingComments.xlsx")); + var sheet = book.Worksheet(1); + + // no change + // A1 + + // edit existing comment + sheet.Cell("B3").Comment.AddNewLine(); + sheet.Cell("B3").Comment.AddSignature(); + sheet.Cell("B3").Comment.AddText("more comment"); + + // delete + //sheet.Cell("C1").DeleteComment(); + + // clear contents + sheet.Cell("D3").Clear(XLClearOptions.Contents); + + // new basic + sheet.Cell("E1").Comment.AddText("non authored comment"); + + // new with author + sheet.Cell("F3").Comment.AddSignature(); + sheet.Cell("F3").Comment.AddText("comment from author"); + + // TODO: merge with cells + // TODO: resize with cells + // TODO: visible + + book.SaveAs(Path.Combine(basePath, "EditingComments_modified.xlsx")); + } + } +} diff --git a/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs b/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs index 5adc52f..a87bf0c 100644 --- a/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs +++ b/ClosedXML_Examples/ConditionalFormatting/ConditionalFormatting.cs @@ -1,637 +1,637 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples -{ - public class CFColorScaleLowMidHigh : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().ColorScale() - .LowestValue(XLColor.Red) - .Midpoint(XLCFContentType.Percent, "50", XLColor.Yellow) - .HighestValue(XLColor.Green); - - workbook.SaveAs(filePath); - } - } - - public class CFColorScaleLowHigh : IXLExample - { - - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().ColorScale() - .Minimum(XLCFContentType.Number, "2", XLColor.Red) - .Maximum(XLCFContentType.Percentile, "90", XLColor.Green); - - workbook.SaveAs(filePath); - } - } - - public class CFColorScaleMinimumMaximum : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().ColorScale() - .LowestValue(XLColor.FromHtml("#FFFF7128")) - .HighestValue(XLColor.FromHtml("#FFFFEF9C")); - - workbook.SaveAs(filePath); - } - } - - public class CFStartsWith : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue("Hello") - .CellBelow().SetValue("Hellos") - .CellBelow().SetValue("Hell") - .CellBelow().SetValue("Holl"); - - ws.RangeUsed().AddConditionalFormat().WhenStartsWith("Hell") - .Fill.SetBackgroundColor(XLColor.Red) - .Border.SetOutsideBorder(XLBorderStyleValues.Thick) - .Border.SetOutsideBorderColor(XLColor.Blue) - .Font.SetBold(); - - workbook.SaveAs(filePath); - } - } - - public class CFEndsWith : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue("Hello") - .CellBelow().SetValue("Hellos") - .CellBelow().SetValue("Hell") - .CellBelow().SetValue("Holl"); - - ws.RangeUsed().AddConditionalFormat().WhenEndsWith("ll") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFIsBlank : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue("Hello") - .CellBelow().SetValue("") - .CellBelow().SetValue("") - .CellBelow().SetValue("Holl"); - - ws.RangeUsed().AddConditionalFormat().WhenIsBlank() - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFNotBlank : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue("Hello") - .CellBelow().SetValue("") - .CellBelow().SetValue("") - .CellBelow().SetValue("Holl"); - - ws.RangeUsed().AddConditionalFormat().WhenNotBlank() - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFIsError : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue("Hello") - .CellBelow().SetFormulaA1("1/0") - .CellBelow().SetFormulaA1("1/0") - .CellBelow().SetValue("Holl"); - - ws.RangeUsed().AddConditionalFormat().WhenIsError() - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFNotError : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue("Hello") - .CellBelow().SetFormulaA1("1/0") - .CellBelow().SetFormulaA1("1/0") - .CellBelow().SetValue("Holl"); - - ws.RangeUsed().AddConditionalFormat().WhenNotError() - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFContains : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue("Hello") - .CellBelow().SetValue("Hellos") - .CellBelow().SetValue("Hell") - .CellBelow().SetValue("Holl"); - - ws.RangeUsed().AddConditionalFormat().WhenContains("Hell") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFNotContains : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue("Hello") - .CellBelow().SetValue("Hellos") - .CellBelow().SetValue("Hell") - .CellBelow().SetValue("Holl"); - - ws.RangeUsed().AddConditionalFormat().WhenNotContains("Hell") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - - public class CFEqualsString : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue("Hello") - .CellBelow().SetValue("Hellos") - .CellBelow().SetValue("Hell") - .CellBelow().SetValue("Holl"); - - ws.RangeUsed().AddConditionalFormat().WhenEquals("Hell") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFEqualsNumber : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenEquals(2) - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFNotEqualsString : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue("Hello") - .CellBelow().SetValue("Hellos") - .CellBelow().SetValue("Hell") - .CellBelow().SetValue("Holl"); - - ws.RangeUsed().AddConditionalFormat().WhenNotEquals("Hell") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFNotEqualsNumber : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenNotEquals(2) - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFGreaterThan : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenGreaterThan("2") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFEqualOrGreaterThan : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenEqualOrGreaterThan("2") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFLessThan : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenLessThan("2") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFEqualOrLessThan : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenEqualOrLessThan("2") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFBetween : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenBetween("2", "3") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFNotBetween : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenNotBetween("2", "3") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFUnique : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenIsUnique() - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFDuplicate : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenIsDuplicate() - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFIsTrue : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenIsTrue("TRUE") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFTop : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenIsTop(2) - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFBottom : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().WhenIsBottom(10, XLTopBottomType.Percent) - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFDataBar : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().DataBar(XLColor.Red, true) - .LowestValue() - .Maximum(XLCFContentType.Percent, "100"); - - workbook.SaveAs(filePath); - } - } - - public class CFIconSet : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().IconSet(XLIconSetStyle.ThreeTrafficLights2, true, true) - .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "0", XLCFContentType.Number) - .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "2", XLCFContentType.Number) - .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "3", XLCFContentType.Number); - - workbook.SaveAs(filePath); - } - } - - public class CFTwoConditions : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3); - - ws.RangeUsed().AddConditionalFormat().IconSet(XLIconSetStyle.ThreeTrafficLights2, true, true) - .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "0", XLCFContentType.Number) - .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "2", XLCFContentType.Number) - .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "3", XLCFContentType.Number); - - ws.RangeUsed().AddConditionalFormat().WhenContains("1") - .Fill.SetBackgroundColor(XLColor.Red); - - workbook.SaveAs(filePath); - } - } - - public class CFInsertRows : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.Cell(2,1).SetValue(1) - .CellRight().SetValue(1) - .CellRight().SetValue(2) - .CellRight().SetValue(3); - - var range = ws.RangeUsed(); - range.AddConditionalFormat().WhenEquals("1").Font.SetBold(); - range.InsertRowsAbove(1); - - - workbook.SaveAs(filePath); - } - } - - public class CFTest : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - ws.FirstCell().SetValue(1) - .CellBelow().SetValue(1) - .CellBelow().SetValue(2) - .CellBelow().SetValue(3) - .CellBelow().SetValue(4); - - ws.RangeUsed().AddConditionalFormat().DataBar(XLColor.Red) - .LowestValue() - .HighestValue(); - - workbook.SaveAs(filePath); - } - } - - public class CFMultipleConditions : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.AddWorksheet("Sheet1"); - - using(var range = ws.Range("A1:A10")) - { - range.AddConditionalFormat().WhenEquals("3") - .Fill.SetBackgroundColor(XLColor.Blue); - range.AddConditionalFormat().WhenEquals("2") - .Fill.SetBackgroundColor(XLColor.Green); - range.AddConditionalFormat().WhenEquals("1") - .Fill.SetBackgroundColor(XLColor.Red); - } - - workbook.SaveAs(filePath); - } - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples +{ + public class CFColorScaleLowMidHigh : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().ColorScale() + .LowestValue(XLColor.Red) + .Midpoint(XLCFContentType.Percent, "50", XLColor.Yellow) + .HighestValue(XLColor.Green); + + workbook.SaveAs(filePath); + } + } + + public class CFColorScaleLowHigh : IXLExample + { + + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().ColorScale() + .Minimum(XLCFContentType.Number, "2", XLColor.Red) + .Maximum(XLCFContentType.Percentile, "90", XLColor.Green); + + workbook.SaveAs(filePath); + } + } + + public class CFColorScaleMinimumMaximum : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().ColorScale() + .LowestValue(XLColor.FromHtml("#FFFF7128")) + .HighestValue(XLColor.FromHtml("#FFFFEF9C")); + + workbook.SaveAs(filePath); + } + } + + public class CFStartsWith : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenStartsWith("Hell") + .Fill.SetBackgroundColor(XLColor.Red) + .Border.SetOutsideBorder(XLBorderStyleValues.Thick) + .Border.SetOutsideBorderColor(XLColor.Blue) + .Font.SetBold(); + + workbook.SaveAs(filePath); + } + } + + public class CFEndsWith : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenEndsWith("ll") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFIsBlank : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("") + .CellBelow().SetValue("") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenIsBlank() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotBlank : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("") + .CellBelow().SetValue("") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenNotBlank() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFIsError : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetFormulaA1("1/0") + .CellBelow().SetFormulaA1("1/0") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenIsError() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotError : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetFormulaA1("1/0") + .CellBelow().SetFormulaA1("1/0") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenNotError() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFContains : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenContains("Hell") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotContains : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenNotContains("Hell") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + + public class CFEqualsString : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenEquals("Hell") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFEqualsNumber : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenEquals(2) + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotEqualsString : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue("Hello") + .CellBelow().SetValue("Hellos") + .CellBelow().SetValue("Hell") + .CellBelow().SetValue("Holl"); + + ws.RangeUsed().AddConditionalFormat().WhenNotEquals("Hell") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotEqualsNumber : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenNotEquals(2) + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFGreaterThan : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenGreaterThan("2") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFEqualOrGreaterThan : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenEqualOrGreaterThan("2") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFLessThan : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenLessThan("2") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFEqualOrLessThan : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenEqualOrLessThan("2") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFBetween : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenBetween("2", "3") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFNotBetween : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenNotBetween("2", "3") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFUnique : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenIsUnique() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFDuplicate : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenIsDuplicate() + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFIsTrue : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenIsTrue("TRUE") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFTop : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenIsTop(2) + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFBottom : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().WhenIsBottom(10, XLTopBottomType.Percent) + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFDataBar : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().DataBar(XLColor.Red, true) + .LowestValue() + .Maximum(XLCFContentType.Percent, "100"); + + workbook.SaveAs(filePath); + } + } + + public class CFIconSet : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().IconSet(XLIconSetStyle.ThreeTrafficLights2, true, true) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "0", XLCFContentType.Number) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "2", XLCFContentType.Number) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "3", XLCFContentType.Number); + + workbook.SaveAs(filePath); + } + } + + public class CFTwoConditions : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3); + + ws.RangeUsed().AddConditionalFormat().IconSet(XLIconSetStyle.ThreeTrafficLights2, true, true) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "0", XLCFContentType.Number) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "2", XLCFContentType.Number) + .AddValue(XLCFIconSetOperator.EqualOrGreaterThan, "3", XLCFContentType.Number); + + ws.RangeUsed().AddConditionalFormat().WhenContains("1") + .Fill.SetBackgroundColor(XLColor.Red); + + workbook.SaveAs(filePath); + } + } + + public class CFInsertRows : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.Cell(2,1).SetValue(1) + .CellRight().SetValue(1) + .CellRight().SetValue(2) + .CellRight().SetValue(3); + + var range = ws.RangeUsed(); + range.AddConditionalFormat().WhenEquals("1").Font.SetBold(); + range.InsertRowsAbove(1); + + + workbook.SaveAs(filePath); + } + } + + public class CFTest : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + ws.FirstCell().SetValue(1) + .CellBelow().SetValue(1) + .CellBelow().SetValue(2) + .CellBelow().SetValue(3) + .CellBelow().SetValue(4); + + ws.RangeUsed().AddConditionalFormat().DataBar(XLColor.Red) + .LowestValue() + .HighestValue(); + + workbook.SaveAs(filePath); + } + } + + public class CFMultipleConditions : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.AddWorksheet("Sheet1"); + + using(var range = ws.Range("A1:A10")) + { + range.AddConditionalFormat().WhenEquals("3") + .Fill.SetBackgroundColor(XLColor.Blue); + range.AddConditionalFormat().WhenEquals("2") + .Fill.SetBackgroundColor(XLColor.Green); + range.AddConditionalFormat().WhenEquals("1") + .Fill.SetBackgroundColor(XLColor.Red); + } + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Creating/CreateFiles.cs b/ClosedXML_Examples/Creating/CreateFiles.cs index 64b2ce4..1e639dd 100644 --- a/ClosedXML_Examples/Creating/CreateFiles.cs +++ b/ClosedXML_Examples/Creating/CreateFiles.cs @@ -1,96 +1,96 @@ -using ClosedXML_Examples.Columns; -using ClosedXML_Examples.Misc; -using ClosedXML_Examples.PageSetup; -using ClosedXML_Examples.Ranges; -using ClosedXML_Examples.Rows; -using ClosedXML_Examples.Styles; -using System.IO; - -namespace ClosedXML_Examples -{ - public class CreateFiles - { - public static void CreateAllFiles() - { - var path = Program.BaseCreatedDirectory; - - new HelloWorld().Create(Path.Combine(path, "HelloWorld.xlsx")); - new BasicTable().Create(Path.Combine(path, "BasicTable.xlsx")); - - new StyleExamples().Create(); - new ChangingBasicTable().Create(Path.Combine(path, "BasicTable_Modified.xlsx")); - new ShiftingRanges().Create(Path.Combine(path, "ShiftingRanges.xlsx")); - new ColumnSettings().Create(Path.Combine(path, "ColumnSettings.xlsx")); - new RowSettings().Create(Path.Combine(path, "RowSettings.xlsx")); - new MergeCells().Create(Path.Combine(path, "MergedCells.xlsx")); - new InsertRows().Create(Path.Combine(path, "InsertRows.xlsx")); - new InsertColumns().Create(Path.Combine(path, "InsertColumns.xlsx")); - new ColumnCollection().Create(Path.Combine(path, "ColumnCollection.xlsx")); - new DataTypes().Create(Path.Combine(path, "DataTypes.xlsx")); - new DataTypesUnderDifferentCulture().Create(Path.Combine(path, "DataTypesUnderDifferentCulture.xlsx")); - new MultipleSheets().Create(Path.Combine(path, "MultipleSheets.xlsx")); - new RowCollection().Create(Path.Combine(path, "RowCollection.xlsx")); - new DefiningRanges().Create(Path.Combine(path, "DefiningRanges.xlsx")); - new ClearingRanges().Create(Path.Combine(path, "ClearingRanges.xlsx")); - new DeletingRanges().Create(Path.Combine(path, "DeletingRanges.xlsx")); - new Margins().Create(Path.Combine(path, "Margins.xlsx")); - new Page().Create(Path.Combine(path, "Page.xlsx")); - new HeaderFooters().Create(Path.Combine(path, "HeaderFooters.xlsx")); - new Sheets().Create(Path.Combine(path, "Sheets.xlsx")); - new SheetTab().Create(Path.Combine(path, "SheetTab.xlsx")); - new MultipleRanges().Create(Path.Combine(path, "MultipleRanges.xlsx")); - new StyleWorksheet().Create(Path.Combine(path, "StyleWorksheet.xlsx")); - new StyleRowsColumns().Create(Path.Combine(path, "StyleRowsColumns.xlsx")); - new InsertingDeletingRows().Create(Path.Combine(path, "InsertingDeletingRows.xlsx")); - new InsertingDeletingColumns().Create(Path.Combine(path, "InsertingDeletingColumns.xlsx")); - new DeletingColumns().Create(Path.Combine(path, "DeletingColumns.xlsx")); - new CellValues().Create(Path.Combine(path, "CellValues.xlsx")); - new LambdaExpressions().Create(Path.Combine(path, "LambdaExpressions.xlsx")); - new DefaultStyles().Create(Path.Combine(path, "DefaultStyles.xlsx")); - new TransposeRanges().Create(Path.Combine(path, "TransposeRanges.xlsx")); - new TransposeRangesPlus().Create(Path.Combine(path, "TransposeRangesPlus.xlsx")); - new MergeMoves().Create(Path.Combine(path, "MergedMoves.xlsx")); - new WorkbookProperties().Create(Path.Combine(path, "WorkbookProperties.xlsx")); - new AdjustToContents().Create(Path.Combine(path, "AdjustToContents.xlsx")); - new AdjustToContentsWithAutoFilter().Create(Path.Combine(path, "AdjustToContentsWithAutoFilter.xlsx")); - new HideUnhide().Create(Path.Combine(path, "HideUnhide.xlsx")); - new Outline().Create(Path.Combine(path, "Outline.xlsx")); - new Formulas().Create(Path.Combine(path, "Formulas.xlsx")); - new Collections().Create(Path.Combine(path, "Collections.xlsx")); - new NamedRanges().Create(Path.Combine(path, "NamedRanges.xlsx")); - new CopyingRanges().Create(Path.Combine(path, "CopyingRanges.xlsx")); - new BlankCells().Create(Path.Combine(path, "BlankCells.xlsx")); - new TwoPages().Create(Path.Combine(path, "TwoPages.xlsx")); - new UsingColors().Create(Path.Combine(path, "UsingColors.xlsx")); - - new ColumnCells().Create(Path.Combine(path, "ColumnCells.xlsx")); - new RowCells().Create(Path.Combine(path, "RowCells.xlsx")); - new FreezePanes().Create(Path.Combine(path, "FreezePanes.xlsx")); - new UsingTables().Create(Path.Combine(path, "UsingTables.xlsx")); - new AddingRowToTables().Create(Path.Combine(path, "AddingRowToTables.xlsx")); - new RightToLeft().Create(Path.Combine(path, "RightToLeft.xlsx")); - new ShowCase().Create(Path.Combine(path, "ShowCase.xlsx")); - new CopyingWorksheets().Create(Path.Combine(path, "CopyingWorksheets.xlsx")); - new InsertingTables().Create(Path.Combine(path, "InsertingTables.xlsx")); - new InsertingData().Create(Path.Combine(path, "InsertingData.xlsx")); - new Hyperlinks().Create(Path.Combine(path, "Hyperlinks.xlsx")); - new DataValidation().Create(Path.Combine(path, "DataValidation.xlsx")); - new HideSheets().Create(Path.Combine(path, "HideSheets.xlsx")); - new SheetProtection().Create(Path.Combine(path, "SheetProtection.xlsx")); - new AutoFilter().Create(Path.Combine(path, "AutoFilter.xlsx")); - new Sorting().Create(Path.Combine(path, "Sorting.xlsx")); - new SortExample().Create(Path.Combine(path, "SortExample.xlsx")); - new AddingDataSet().Create(Path.Combine(path, "AddingDataSet.xlsx")); - new AddingDataTableAsWorksheet().Create(Path.Combine(path, "AddingDataTableAsWorksheet.xlsx")); - new TabColors().Create(Path.Combine(path, "TabColors.xlsx")); - new ShiftingFormulas().Create(Path.Combine(path, "ShiftingFormulas.xlsx")); - new CopyingRowsAndColumns().Create(Path.Combine(path, "CopyingRowsAndColumns.xlsx")); - new UsingRichText().Create(Path.Combine(path, "UsingRichText.xlsx")); - new UsingPhonetics().Create(Path.Combine(path, "UsingPhonetics.xlsx")); - new WalkingRanges().Create(Path.Combine(path, "CellMoves.xlsx")); - new AddingComments().Create(Path.Combine(path, "AddingComments.xlsx")); - new PivotTables().Create(Path.Combine(path, "PivotTables.xlsx")); - new SheetViews().Create(Path.Combine(path, "SheetViews.xlsx")); - } - } -} +using ClosedXML_Examples.Columns; +using ClosedXML_Examples.Misc; +using ClosedXML_Examples.PageSetup; +using ClosedXML_Examples.Ranges; +using ClosedXML_Examples.Rows; +using ClosedXML_Examples.Styles; +using System.IO; + +namespace ClosedXML_Examples +{ + public class CreateFiles + { + public static void CreateAllFiles() + { + var path = Program.BaseCreatedDirectory; + + new HelloWorld().Create(Path.Combine(path, "HelloWorld.xlsx")); + new BasicTable().Create(Path.Combine(path, "BasicTable.xlsx")); + + new StyleExamples().Create(); + new ChangingBasicTable().Create(Path.Combine(path, "BasicTable_Modified.xlsx")); + new ShiftingRanges().Create(Path.Combine(path, "ShiftingRanges.xlsx")); + new ColumnSettings().Create(Path.Combine(path, "ColumnSettings.xlsx")); + new RowSettings().Create(Path.Combine(path, "RowSettings.xlsx")); + new MergeCells().Create(Path.Combine(path, "MergedCells.xlsx")); + new InsertRows().Create(Path.Combine(path, "InsertRows.xlsx")); + new InsertColumns().Create(Path.Combine(path, "InsertColumns.xlsx")); + new ColumnCollection().Create(Path.Combine(path, "ColumnCollection.xlsx")); + new DataTypes().Create(Path.Combine(path, "DataTypes.xlsx")); + new DataTypesUnderDifferentCulture().Create(Path.Combine(path, "DataTypesUnderDifferentCulture.xlsx")); + new MultipleSheets().Create(Path.Combine(path, "MultipleSheets.xlsx")); + new RowCollection().Create(Path.Combine(path, "RowCollection.xlsx")); + new DefiningRanges().Create(Path.Combine(path, "DefiningRanges.xlsx")); + new ClearingRanges().Create(Path.Combine(path, "ClearingRanges.xlsx")); + new DeletingRanges().Create(Path.Combine(path, "DeletingRanges.xlsx")); + new Margins().Create(Path.Combine(path, "Margins.xlsx")); + new Page().Create(Path.Combine(path, "Page.xlsx")); + new HeaderFooters().Create(Path.Combine(path, "HeaderFooters.xlsx")); + new Sheets().Create(Path.Combine(path, "Sheets.xlsx")); + new SheetTab().Create(Path.Combine(path, "SheetTab.xlsx")); + new MultipleRanges().Create(Path.Combine(path, "MultipleRanges.xlsx")); + new StyleWorksheet().Create(Path.Combine(path, "StyleWorksheet.xlsx")); + new StyleRowsColumns().Create(Path.Combine(path, "StyleRowsColumns.xlsx")); + new InsertingDeletingRows().Create(Path.Combine(path, "InsertingDeletingRows.xlsx")); + new InsertingDeletingColumns().Create(Path.Combine(path, "InsertingDeletingColumns.xlsx")); + new DeletingColumns().Create(Path.Combine(path, "DeletingColumns.xlsx")); + new CellValues().Create(Path.Combine(path, "CellValues.xlsx")); + new LambdaExpressions().Create(Path.Combine(path, "LambdaExpressions.xlsx")); + new DefaultStyles().Create(Path.Combine(path, "DefaultStyles.xlsx")); + new TransposeRanges().Create(Path.Combine(path, "TransposeRanges.xlsx")); + new TransposeRangesPlus().Create(Path.Combine(path, "TransposeRangesPlus.xlsx")); + new MergeMoves().Create(Path.Combine(path, "MergedMoves.xlsx")); + new WorkbookProperties().Create(Path.Combine(path, "WorkbookProperties.xlsx")); + new AdjustToContents().Create(Path.Combine(path, "AdjustToContents.xlsx")); + new AdjustToContentsWithAutoFilter().Create(Path.Combine(path, "AdjustToContentsWithAutoFilter.xlsx")); + new HideUnhide().Create(Path.Combine(path, "HideUnhide.xlsx")); + new Outline().Create(Path.Combine(path, "Outline.xlsx")); + new Formulas().Create(Path.Combine(path, "Formulas.xlsx")); + new Collections().Create(Path.Combine(path, "Collections.xlsx")); + new NamedRanges().Create(Path.Combine(path, "NamedRanges.xlsx")); + new CopyingRanges().Create(Path.Combine(path, "CopyingRanges.xlsx")); + new BlankCells().Create(Path.Combine(path, "BlankCells.xlsx")); + new TwoPages().Create(Path.Combine(path, "TwoPages.xlsx")); + new UsingColors().Create(Path.Combine(path, "UsingColors.xlsx")); + + new ColumnCells().Create(Path.Combine(path, "ColumnCells.xlsx")); + new RowCells().Create(Path.Combine(path, "RowCells.xlsx")); + new FreezePanes().Create(Path.Combine(path, "FreezePanes.xlsx")); + new UsingTables().Create(Path.Combine(path, "UsingTables.xlsx")); + new AddingRowToTables().Create(Path.Combine(path, "AddingRowToTables.xlsx")); + new RightToLeft().Create(Path.Combine(path, "RightToLeft.xlsx")); + new ShowCase().Create(Path.Combine(path, "ShowCase.xlsx")); + new CopyingWorksheets().Create(Path.Combine(path, "CopyingWorksheets.xlsx")); + new InsertingTables().Create(Path.Combine(path, "InsertingTables.xlsx")); + new InsertingData().Create(Path.Combine(path, "InsertingData.xlsx")); + new Hyperlinks().Create(Path.Combine(path, "Hyperlinks.xlsx")); + new DataValidation().Create(Path.Combine(path, "DataValidation.xlsx")); + new HideSheets().Create(Path.Combine(path, "HideSheets.xlsx")); + new SheetProtection().Create(Path.Combine(path, "SheetProtection.xlsx")); + new AutoFilter().Create(Path.Combine(path, "AutoFilter.xlsx")); + new Sorting().Create(Path.Combine(path, "Sorting.xlsx")); + new SortExample().Create(Path.Combine(path, "SortExample.xlsx")); + new AddingDataSet().Create(Path.Combine(path, "AddingDataSet.xlsx")); + new AddingDataTableAsWorksheet().Create(Path.Combine(path, "AddingDataTableAsWorksheet.xlsx")); + new TabColors().Create(Path.Combine(path, "TabColors.xlsx")); + new ShiftingFormulas().Create(Path.Combine(path, "ShiftingFormulas.xlsx")); + new CopyingRowsAndColumns().Create(Path.Combine(path, "CopyingRowsAndColumns.xlsx")); + new UsingRichText().Create(Path.Combine(path, "UsingRichText.xlsx")); + new UsingPhonetics().Create(Path.Combine(path, "UsingPhonetics.xlsx")); + new WalkingRanges().Create(Path.Combine(path, "CellMoves.xlsx")); + new AddingComments().Create(Path.Combine(path, "AddingComments.xlsx")); + new PivotTables().Create(Path.Combine(path, "PivotTables.xlsx")); + new SheetViews().Create(Path.Combine(path, "SheetViews.xlsx")); + } + } +} diff --git a/ClosedXML_Examples/Delete/DeleteFewWorksheets.cs b/ClosedXML_Examples/Delete/DeleteFewWorksheets.cs index 8d879fc..61aa28b 100644 --- a/ClosedXML_Examples/Delete/DeleteFewWorksheets.cs +++ b/ClosedXML_Examples/Delete/DeleteFewWorksheets.cs @@ -1,41 +1,41 @@ -using System.IO; -using ClosedXML.Excel; - -namespace ClosedXML_Examples.Delete -{ - public class DeleteFewWorksheets:IXLExample - { - public void Create(string filePath) - { - string tempFile = ExampleHelper.GetTempFilePath(filePath); - try - { - //Note: Prepare - { - var workbook = new XLWorkbook(); - workbook.Worksheets.Add("1"); - workbook.Worksheets.Add("2"); - workbook.Worksheets.Add("3"); - workbook.Worksheets.Add("4"); - workbook.SaveAs(tempFile); - } - - //Note: Delate few worksheet - { - var workbook = new XLWorkbook(tempFile); - workbook.Worksheets.Delete("1"); - workbook.Worksheets.Delete("2"); - workbook.SaveAs(filePath); - } - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - - } - } +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Delete +{ + public class DeleteFewWorksheets:IXLExample + { + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + //Note: Prepare + { + var workbook = new XLWorkbook(); + workbook.Worksheets.Add("1"); + workbook.Worksheets.Add("2"); + workbook.Worksheets.Add("3"); + workbook.Worksheets.Add("4"); + workbook.SaveAs(tempFile); + } + + //Note: Delate few worksheet + { + var workbook = new XLWorkbook(tempFile); + workbook.Worksheets.Delete("1"); + workbook.Worksheets.Delete("2"); + workbook.SaveAs(filePath); + } + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Delete/DeleteRows.cs b/ClosedXML_Examples/Delete/DeleteRows.cs index 25b7152..bf58d62 100644 --- a/ClosedXML_Examples/Delete/DeleteRows.cs +++ b/ClosedXML_Examples/Delete/DeleteRows.cs @@ -1,86 +1,86 @@ -using System; -using System.Linq; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Delete -{ - public class DeleteRows : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - #region Create case - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Delete red rows"); - - // Put a value in a few cells - foreach (var r in Enumerable.Range(1, 5)) - foreach (var c in Enumerable.Range(1, 5)) - ws.Cell(r, c).Value = string.Format("R{0}C{1}", r, c); - - - var blueRow = ws.Rows(1, 2); - var redRow = ws.Row(5); - - blueRow.Style.Fill.BackgroundColor = XLColor.Blue; - - redRow.Style.Fill.BackgroundColor = XLColor.Red; - workbook.SaveAs(filePath); - } - #endregion - - #region Remove rows - { - var workbook = new XLWorkbook(filePath); - var ws = workbook.Worksheets.Worksheet("Delete red rows"); - - ws.Rows(1, 2).Delete(); - workbook.Save(); - } - #endregion - - } - - // Private - - // Override - - - #endregion - } -} +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Delete +{ + public class DeleteRows : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + #region Create case + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Delete red rows"); + + // Put a value in a few cells + foreach (var r in Enumerable.Range(1, 5)) + foreach (var c in Enumerable.Range(1, 5)) + ws.Cell(r, c).Value = string.Format("R{0}C{1}", r, c); + + + var blueRow = ws.Rows(1, 2); + var redRow = ws.Row(5); + + blueRow.Style.Fill.BackgroundColor = XLColor.Blue; + + redRow.Style.Fill.BackgroundColor = XLColor.Red; + workbook.SaveAs(filePath); + } + #endregion + + #region Remove rows + { + var workbook = new XLWorkbook(filePath); + var ws = workbook.Worksheets.Worksheet("Delete red rows"); + + ws.Rows(1, 2).Delete(); + workbook.Save(); + } + #endregion + + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/ExampleHelper.cs b/ClosedXML_Examples/ExampleHelper.cs index 188a5b1..c0d9fe6 100644 --- a/ClosedXML_Examples/ExampleHelper.cs +++ b/ClosedXML_Examples/ExampleHelper.cs @@ -1,19 +1,19 @@ -using System.IO; - -namespace ClosedXML_Examples -{ - public static class ExampleHelper - { - public static string GetTempFilePath() - { - return Path.GetTempFileName(); - } - - public static string GetTempFilePath(string filePath) - { - var extension = Path.GetExtension(filePath); - var tempFilePath = GetTempFilePath(); - return Path.ChangeExtension(tempFilePath, extension); - } - } +using System.IO; + +namespace ClosedXML_Examples +{ + public static class ExampleHelper + { + public static string GetTempFilePath() + { + return Path.GetTempFileName(); + } + + public static string GetTempFilePath(string filePath) + { + var extension = Path.GetExtension(filePath); + var tempFilePath = GetTempFilePath(); + return Path.ChangeExtension(tempFilePath, extension); + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/HelloWorld.cs b/ClosedXML_Examples/HelloWorld.cs index 5249a60..588a83f 100644 --- a/ClosedXML_Examples/HelloWorld.cs +++ b/ClosedXML_Examples/HelloWorld.cs @@ -1,16 +1,16 @@ -using System; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class HelloWorld - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var worksheet = workbook.Worksheets.Add("Sample Sheet"); - worksheet.Cell("A1").Value = "Hello World!"; - workbook.SaveAs(filePath); - } - } -} +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class HelloWorld + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var worksheet = workbook.Worksheets.Add("Sample Sheet"); + worksheet.Cell("A1").Value = "Hello World!"; + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/IXLExample.cs b/ClosedXML_Examples/IXLExample.cs index ad4384f..23e3a0e 100644 --- a/ClosedXML_Examples/IXLExample.cs +++ b/ClosedXML_Examples/IXLExample.cs @@ -1,7 +1,7 @@ -namespace ClosedXML_Examples -{ - public interface IXLExample - { - void Create(string filePath); - } +namespace ClosedXML_Examples +{ + public interface IXLExample + { + void Create(string filePath); + } } \ No newline at end of file diff --git a/ClosedXML_Examples/ImageHandling/ImageAnchors.cs b/ClosedXML_Examples/ImageHandling/ImageAnchors.cs index 303ff73..b20b42d 100644 --- a/ClosedXML_Examples/ImageHandling/ImageAnchors.cs +++ b/ClosedXML_Examples/ImageHandling/ImageAnchors.cs @@ -1,8 +1,7 @@ -using System; -using System.IO; -using System.Reflection; using ClosedXML.Excel; using ClosedXML.Excel.Drawings; +using System.IO; +using System.Reflection; namespace ClosedXML_Examples { @@ -10,75 +9,73 @@ { public void Create(string filePath) { - var wb = new XLWorkbook(); - XLPicture pic; - IXLWorksheet ws; - - using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.ImageHandling.png")) + using (var wb = new XLWorkbook()) { - ws = wb.Worksheets.Add("Images"); + IXLWorksheet ws; - #region AbsoluteAnchor - pic = new XLPicture() + using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.ImageHandling.png")) { - IsAbsolute = true, - ImageStream = fs, - Name = "Image10", - Type = "png", - OffsetX = 220, - OffsetY = 150 - }; - ws.AddPicture(pic); - #endregion + ws = wb.Worksheets.Add("Images1"); - #region OneCellAnchor - fs.Position = 0; - pic = new XLPicture() + #region AbsoluteAnchor + + ws.AddPicture(fs, XLPictureFormat.Png, "Image10") + .MoveTo(220, 150); + + #endregion AbsoluteAnchor + + #region OneCellAnchor + + fs.Position = 0; + ws.AddPicture(fs, XLPictureFormat.Png, "Image11") + .MoveTo(ws.Cell(1, 1).Address); + + #endregion OneCellAnchor + + ws = wb.Worksheets.Add("Images2"); + + #region TwoCellAnchor + + fs.Position = 0; + ws.AddPicture(fs, XLPictureFormat.Png, "Image20") + .MoveTo(ws.Cell(6, 5).Address, ws.Cell(9, 7).Address); + + #endregion TwoCellAnchor + } + + using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) { - IsAbsolute = false, - ImageStream = fs, - Name = "Image11", - Type = "png", - OffsetX = 0, - OffsetY = 0 - }; + // Moving images around and scaling them + ws = wb.Worksheets.Add("Images3"); - pic.AddMarker(new XLMarker + ws.AddPicture(fs, XLPictureFormat.Jpeg) + .MoveTo(ws.Cell(2, 2).Address, 20, 5, ws.Cell(5, 5).Address, 30, 10) + .MoveTo(ws.Cell(2, 2).Address, ws.Cell(5, 5).Address); + + ws.AddPicture(fs, XLPictureFormat.Jpeg) + .MoveTo(ws.Cell(6, 2).Address, 2, 2, ws.Cell(9, 5).Address, 2, 2) + .MoveTo(ws.Cell(6, 2).Address, 20, 5, ws.Cell(9, 5).Address, 30, 10); + + ws.AddPicture(fs, XLPictureFormat.Jpeg) + .MoveTo(ws.Cell(10, 2).Address, 20, 5) + .Scale(0.2, true) + .MoveTo(ws.Cell(10, 1).Address); + } + + using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.SampleImage.jpg")) { - ColumnId = 1, - RowId = 1 - }); + // Changing of placement + ws = wb.Worksheets.Add("Images4"); - ws.AddPicture(pic); - #endregion + ws.AddPicture(fs, XLPictureFormat.Jpeg) + .MoveTo(100, 100) + .WithPlacement(XLPicturePlacement.FreeFloating); - ws = wb.Worksheets.Add("MoreImages"); - - #region TwoCellAnchor - fs.Position = 0; - pic = new XLPicture() - { - IsAbsolute = false, - ImageStream = fs, - Name = "Image20", - Type = "png", - OffsetX = 0, - OffsetY = 0 - }; - - pic.AddMarker(new XLMarker - { - ColumnId = 5, - RowId = 6 - }); - - pic.AddMarker(new XLMarker - { - ColumnId = 7, - RowId = 9 - }); - ws.AddPicture(pic); - #endregion + // Add and delete picture immediately + ws.AddPicture(fs, XLPictureFormat.Jpeg) + .MoveTo(100, 600) + .Delete(); + } wb.SaveAs(filePath); } diff --git a/ClosedXML_Examples/ImageHandling/ImageFormats.cs b/ClosedXML_Examples/ImageHandling/ImageFormats.cs index 68d0bb0..1f21297 100644 --- a/ClosedXML_Examples/ImageHandling/ImageFormats.cs +++ b/ClosedXML_Examples/ImageHandling/ImageFormats.cs @@ -1,8 +1,7 @@ -using System; -using System.IO; -using System.Reflection; using ClosedXML.Excel; using ClosedXML.Excel.Drawings; +using System.IO; +using System.Reflection; namespace ClosedXML_Examples { @@ -11,55 +10,28 @@ public void Create(string filePath) { var wb = new XLWorkbook(); - XLPicture pic; IXLWorksheet ws; using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.ImageHandling.jpg")) { #region Jpeg + ws = wb.Worksheets.Add("Jpg"); - pic = new XLPicture() - { - IsAbsolute = false, - ImageStream = fs, - Name = "JpegImage", - Type = "jpeg", - OffsetX = 0, - OffsetY = 0 - }; + ws.AddPicture(fs, XLPictureFormat.Jpeg, "JpegImage") + .MoveTo(ws.Cell(1, 1).Address); - pic.AddMarker(new XLMarker - { - ColumnId = 1, - RowId = 1 - }); - - ws.AddPicture(pic); - #endregion + #endregion Jpeg } using (Stream fs = Assembly.GetExecutingAssembly().GetManifestResourceStream("ClosedXML_Examples.Resources.ImageHandling.png")) { #region Png + ws = wb.Worksheets.Add("Png"); - pic = new XLPicture() - { - IsAbsolute = false, - ImageStream = fs, - Name = "PngImage", - Type = "png", - OffsetX = 0, - OffsetY = 0 - }; + ws.AddPicture(fs, XLPictureFormat.Png, "PngImage") + .MoveTo(ws.Cell(1, 1).Address); - pic.AddMarker(new XLMarker - { - ColumnId = 1, - RowId = 1 - }); - - ws.AddPicture(pic); - #endregion + #endregion Png wb.SaveAs(filePath); } diff --git a/ClosedXML_Examples/Loading/ChangingBasicTable.cs b/ClosedXML_Examples/Loading/ChangingBasicTable.cs index 10d122e..a10c7a4 100644 --- a/ClosedXML_Examples/Loading/ChangingBasicTable.cs +++ b/ClosedXML_Examples/Loading/ChangingBasicTable.cs @@ -1,48 +1,48 @@ -using System.IO; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples -{ - public class ChangingBasicTable : IXLExample - { - public void Create(string filePath) - { - string tempFile = ExampleHelper.GetTempFilePath(filePath); - try - { - new BasicTable().Create(tempFile); - var workbook = new XLWorkbook(tempFile); - var ws = workbook.Worksheet(1); - - // Change the background color of the headers - var rngHeaders = ws.Range("B3:F3"); - rngHeaders.Style.Fill.BackgroundColor = XLColor.LightSalmon; - - // Change the date formats - var rngDates = ws.Range("E4:E6"); - rngDates.Style.DateFormat.Format = "MM/dd/yyyy"; - - // Change the income values to text - var rngNumbers = ws.Range("F4:F6"); - foreach (var cell in rngNumbers.Cells()) - { - string formattedString = cell.GetFormattedString(); - cell.DataType = XLCellValues.Text; - cell.Value = formattedString + " Dollars"; - } - - ws.Columns().AdjustToContents(); - - workbook.SaveAs(filePath); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - } +using System.IO; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples +{ + public class ChangingBasicTable : IXLExample + { + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + var ws = workbook.Worksheet(1); + + // Change the background color of the headers + var rngHeaders = ws.Range("B3:F3"); + rngHeaders.Style.Fill.BackgroundColor = XLColor.LightSalmon; + + // Change the date formats + var rngDates = ws.Range("E4:E6"); + rngDates.Style.DateFormat.Format = "MM/dd/yyyy"; + + // Change the income values to text + var rngNumbers = ws.Range("F4:F6"); + foreach (var cell in rngNumbers.Cells()) + { + string formattedString = cell.GetFormattedString(); + cell.DataType = XLCellValues.Text; + cell.Value = formattedString + " Dollars"; + } + + ws.Columns().AdjustToContents(); + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Loading/LoadFiles.cs b/ClosedXML_Examples/Loading/LoadFiles.cs index 7ebf5e9..772ad70 100644 --- a/ClosedXML_Examples/Loading/LoadFiles.cs +++ b/ClosedXML_Examples/Loading/LoadFiles.cs @@ -1,26 +1,26 @@ -using System; -using System.IO; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class LoadFiles - { - public static void LoadAllFiles() - { - foreach (var file in Directory.GetFiles(Program.BaseCreatedDirectory)) - { - var fileInfo = new FileInfo(file); - var fileName = fileInfo.Name; - LoadAndSaveFile(Path.Combine(Program.BaseCreatedDirectory, fileName), Path.Combine(Program.BaseModifiedDirectory, fileName)); - } - } - - private static void LoadAndSaveFile(String input, String output) - { - var wb = new XLWorkbook(input); - wb.SaveAs(output); - wb.SaveAs(output); - } - } +using System; +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class LoadFiles + { + public static void LoadAllFiles() + { + foreach (var file in Directory.GetFiles(Program.BaseCreatedDirectory)) + { + var fileInfo = new FileInfo(file); + var fileName = fileInfo.Name; + LoadAndSaveFile(Path.Combine(Program.BaseCreatedDirectory, fileName), Path.Combine(Program.BaseModifiedDirectory, fileName)); + } + } + + private static void LoadAndSaveFile(String input, String output) + { + var wb = new XLWorkbook(input); + wb.SaveAs(output); + wb.SaveAs(output); + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Misc/AddingDataSet.cs b/ClosedXML_Examples/Misc/AddingDataSet.cs index ad822aa..11c4b9c 100644 --- a/ClosedXML_Examples/Misc/AddingDataSet.cs +++ b/ClosedXML_Examples/Misc/AddingDataSet.cs @@ -1,86 +1,86 @@ -using System; -using System.Data; -using ClosedXML.Excel; - -namespace ClosedXML_Examples.Misc -{ - public class AddingDataSet : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - - var dataSet = GetDataSet(); - - // Add all DataTables in the DataSet as a worksheets - wb.Worksheets.Add(dataSet); - - wb.SaveAs(filePath); - } - - // Private - private DataSet GetDataSet() - { - var ds = new DataSet(); - ds.Tables.Add(GetTable("Patients")); - ds.Tables.Add(GetTable("Employees")); - ds.Tables.Add(GetTable("Information")); - return ds; - } - - private DataTable GetTable(String tableName) - { - DataTable table = new DataTable(); - table.TableName = tableName; - table.Columns.Add("Dosage", typeof(int)); - table.Columns.Add("Drug", typeof(string)); - table.Columns.Add("Patient", typeof(string)); - table.Columns.Add("Date", typeof(DateTime)); - - table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); - table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); - table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); - table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); - table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); - return table; - } - // Override - - - #endregion - } -} +using System; +using System.Data; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Misc +{ + public class AddingDataSet : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + var dataSet = GetDataSet(); + + // Add all DataTables in the DataSet as a worksheets + wb.Worksheets.Add(dataSet); + + wb.SaveAs(filePath); + } + + // Private + private DataSet GetDataSet() + { + var ds = new DataSet(); + ds.Tables.Add(GetTable("Patients")); + ds.Tables.Add(GetTable("Employees")); + ds.Tables.Add(GetTable("Information")); + return ds; + } + + private DataTable GetTable(String tableName) + { + DataTable table = new DataTable(); + table.TableName = tableName; + table.Columns.Add("Dosage", typeof(int)); + table.Columns.Add("Drug", typeof(string)); + table.Columns.Add("Patient", typeof(string)); + table.Columns.Add("Date", typeof(DateTime)); + + table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); + table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); + table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); + table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); + table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); + return table; + } + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/AddingDataTableAsWorksheet.cs b/ClosedXML_Examples/Misc/AddingDataTableAsWorksheet.cs index cc142a0..ae26a1b 100644 --- a/ClosedXML_Examples/Misc/AddingDataTableAsWorksheet.cs +++ b/ClosedXML_Examples/Misc/AddingDataTableAsWorksheet.cs @@ -1,77 +1,77 @@ -using System; -using System.Data; -using ClosedXML.Excel; - -namespace ClosedXML_Examples.Misc -{ - public class AddingDataTableAsWorksheet : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - - var dataTable = GetTable("Information"); - - // Add a DataTable as a worksheet - wb.Worksheets.Add(dataTable); - - wb.SaveAs(filePath); - } - - // Private - private DataTable GetTable(String tableName) - { - DataTable table = new DataTable(); - table.TableName = tableName; - table.Columns.Add("Dosage", typeof(int)); - table.Columns.Add("Drug", typeof(string)); - table.Columns.Add("Patient", typeof(string)); - table.Columns.Add("Date", typeof(DateTime)); - - table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); - table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); - table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); - table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); - table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); - return table; - } - // Override - - - #endregion - } -} +using System; +using System.Data; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Misc +{ + public class AddingDataTableAsWorksheet : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + var dataTable = GetTable("Information"); + + // Add a DataTable as a worksheet + wb.Worksheets.Add(dataTable); + + wb.SaveAs(filePath); + } + + // Private + private DataTable GetTable(String tableName) + { + DataTable table = new DataTable(); + table.TableName = tableName; + table.Columns.Add("Dosage", typeof(int)); + table.Columns.Add("Drug", typeof(string)); + table.Columns.Add("Patient", typeof(string)); + table.Columns.Add("Date", typeof(DateTime)); + + table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); + table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); + table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); + table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); + table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); + return table; + } + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/AdjustToContents.cs b/ClosedXML_Examples/Misc/AdjustToContents.cs index 24c17c6..048dbd2 100644 --- a/ClosedXML_Examples/Misc/AdjustToContents.cs +++ b/ClosedXML_Examples/Misc/AdjustToContents.cs @@ -1,113 +1,113 @@ -using ClosedXML.Excel; -using System; - -namespace ClosedXML_Examples.Misc -{ - public class AdjustToContents : IXLExample - { - // Public - public void Create(String filePath) - { - using (var wb = new XLWorkbook()) - { - var ws = wb.Worksheets.Add("Adjust To Contents"); - - // Set some values with different font sizes - ws.Cell(1, 1).Value = "Tall Row"; - ws.Cell(1, 1).Style.Font.FontSize = 30; - ws.Cell(2, 1).Value = "Very Wide Column"; - ws.Cell(2, 1).Style.Font.FontSize = 20; - - // Adjust column width - ws.Column(1).AdjustToContents(); - - // Adjust row heights - ws.Rows(1, 2).AdjustToContents(); - - // You can also adjust all rows/columns in one shot - // ws.Rows().AdjustToContents(); - // ws.Columns().AdjustToContents(); - - // We'll now select which cells should be used for calculating the - // column widths (same method applies for row heights) - - // Set the values - ws.Cell(4, 2).Value = "Width ignored because calling column.AdjustToContents(5, 7)"; - ws.Cell(5, 2).Value = "Short text"; - ws.Cell(6, 2).Value = "Width ignored because it's part of a merge"; - ws.Range(6, 2, 6, 4).Merge(); - ws.Cell(7, 2).Value = "Width should adjust to this cell"; - ws.Cell(8, 2).Value = "Width ignored because calling column.AdjustToContents(5, 7)"; - - // Adjust column widths only taking into account rows 5-7 - // (merged cells will be ignored) - ws.Column(2).AdjustToContents(5, 7); - - // You can also specify the starting row to start calculating the widths: - // e.g. ws.Column(3).AdjustToContents(9); - - var ws2 = wb.Worksheets.Add("Adjust Widths"); - ws2.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; - for (Int32 co = 0; co < 90; co += 5) - { - ws2.Cell(1, (co / 5) + 2).SetValue("Text to adjust - " + co).Style.Alignment.TextRotation = co; - } - - ws2.Columns().AdjustToContents(); - - var ws4 = wb.Worksheets.Add("Adjust Widths 2"); - ws4.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; - for (Int32 co = 0; co < 90; co += 5) - { - var c = ws4.Cell(1, (co / 5) + 2); - - c.RichText.AddText("Text to adjust - " + co).SetBold(); - c.RichText.AddText(Environment.NewLine); - c.RichText.AddText("World!").SetBold().SetFontColor(XLColor.Blue).SetFontSize(25); - c.RichText.AddText(Environment.NewLine); - c.RichText.AddText("Hello Cruel and unsusual world").SetBold().SetFontSize(20); - c.RichText.AddText(Environment.NewLine); - c.RichText.AddText("Hello").SetBold(); - c.Style.Alignment.SetTextRotation(co); - } - ws4.Columns().AdjustToContents(); - - var ws3 = wb.Worksheets.Add("Adjust Heights"); - ws3.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; - for (Int32 ro = 0; ro < 90; ro += 5) - { - ws3.Cell((ro / 5) + 2, 1).SetValue("Text to adjust - " + ro).Style.Alignment.TextRotation = ro; - } - - ws3.Rows().AdjustToContents(); - - var ws5 = wb.Worksheets.Add("Adjust Heights 2"); - ws5.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; - for (Int32 ro = 0; ro < 90; ro += 5) - { - var c = ws5.Cell((ro / 5) + 2, 1); - c.RichText.AddText("Text to adjust - " + ro).SetBold(); - c.RichText.AddText(Environment.NewLine); - c.RichText.AddText("World!").SetBold().SetFontColor(XLColor.Blue).SetFontSize(10); - c.RichText.AddText(Environment.NewLine); - c.RichText.AddText("Hello Cruel and unsusual world").SetBold().SetFontSize(15); - c.RichText.AddText(Environment.NewLine); - c.RichText.AddText("Hello").SetBold(); - c.Style.Alignment.SetTextRotation(ro); - } - - ws5.Rows().AdjustToContents(); - - var ws6 = wb.Worksheets.Add("Absurdly wide column"); - ws6.Cell("A1").Value = "Some string"; - - // This column's width should be capped at 255 - ws6.Cell("B1").Value = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."; - - ws6.Columns().AdjustToContents(); - - wb.SaveAs(filePath, true); - } - } - } -} +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class AdjustToContents : IXLExample + { + // Public + public void Create(String filePath) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Adjust To Contents"); + + // Set some values with different font sizes + ws.Cell(1, 1).Value = "Tall Row"; + ws.Cell(1, 1).Style.Font.FontSize = 30; + ws.Cell(2, 1).Value = "Very Wide Column"; + ws.Cell(2, 1).Style.Font.FontSize = 20; + + // Adjust column width + ws.Column(1).AdjustToContents(); + + // Adjust row heights + ws.Rows(1, 2).AdjustToContents(); + + // You can also adjust all rows/columns in one shot + // ws.Rows().AdjustToContents(); + // ws.Columns().AdjustToContents(); + + // We'll now select which cells should be used for calculating the + // column widths (same method applies for row heights) + + // Set the values + ws.Cell(4, 2).Value = "Width ignored because calling column.AdjustToContents(5, 7)"; + ws.Cell(5, 2).Value = "Short text"; + ws.Cell(6, 2).Value = "Width ignored because it's part of a merge"; + ws.Range(6, 2, 6, 4).Merge(); + ws.Cell(7, 2).Value = "Width should adjust to this cell"; + ws.Cell(8, 2).Value = "Width ignored because calling column.AdjustToContents(5, 7)"; + + // Adjust column widths only taking into account rows 5-7 + // (merged cells will be ignored) + ws.Column(2).AdjustToContents(5, 7); + + // You can also specify the starting row to start calculating the widths: + // e.g. ws.Column(3).AdjustToContents(9); + + var ws2 = wb.Worksheets.Add("Adjust Widths"); + ws2.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; + for (Int32 co = 0; co < 90; co += 5) + { + ws2.Cell(1, (co / 5) + 2).SetValue("Text to adjust - " + co).Style.Alignment.TextRotation = co; + } + + ws2.Columns().AdjustToContents(); + + var ws4 = wb.Worksheets.Add("Adjust Widths 2"); + ws4.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; + for (Int32 co = 0; co < 90; co += 5) + { + var c = ws4.Cell(1, (co / 5) + 2); + + c.RichText.AddText("Text to adjust - " + co).SetBold(); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("World!").SetBold().SetFontColor(XLColor.Blue).SetFontSize(25); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("Hello Cruel and unsusual world").SetBold().SetFontSize(20); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("Hello").SetBold(); + c.Style.Alignment.SetTextRotation(co); + } + ws4.Columns().AdjustToContents(); + + var ws3 = wb.Worksheets.Add("Adjust Heights"); + ws3.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; + for (Int32 ro = 0; ro < 90; ro += 5) + { + ws3.Cell((ro / 5) + 2, 1).SetValue("Text to adjust - " + ro).Style.Alignment.TextRotation = ro; + } + + ws3.Rows().AdjustToContents(); + + var ws5 = wb.Worksheets.Add("Adjust Heights 2"); + ws5.Cell(1, 1).SetValue("Text to adjust - 255").Style.Alignment.TextRotation = 255; + for (Int32 ro = 0; ro < 90; ro += 5) + { + var c = ws5.Cell((ro / 5) + 2, 1); + c.RichText.AddText("Text to adjust - " + ro).SetBold(); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("World!").SetBold().SetFontColor(XLColor.Blue).SetFontSize(10); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("Hello Cruel and unsusual world").SetBold().SetFontSize(15); + c.RichText.AddText(Environment.NewLine); + c.RichText.AddText("Hello").SetBold(); + c.Style.Alignment.SetTextRotation(ro); + } + + ws5.Rows().AdjustToContents(); + + var ws6 = wb.Worksheets.Add("Absurdly wide column"); + ws6.Cell("A1").Value = "Some string"; + + // This column's width should be capped at 255 + ws6.Cell("B1").Value = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."; + + ws6.Columns().AdjustToContents(); + + wb.SaveAs(filePath, true); + } + } + } +} diff --git a/ClosedXML_Examples/Misc/AdjustToContentsWithAutoFilter.cs b/ClosedXML_Examples/Misc/AdjustToContentsWithAutoFilter.cs index 84c39ad..ed5fe6c 100644 --- a/ClosedXML_Examples/Misc/AdjustToContentsWithAutoFilter.cs +++ b/ClosedXML_Examples/Misc/AdjustToContentsWithAutoFilter.cs @@ -1,4 +1,4 @@ -using ClosedXML.Excel; +using ClosedXML.Excel; using System; namespace ClosedXML_Examples.Misc diff --git a/ClosedXML_Examples/Misc/AutoFilter.cs b/ClosedXML_Examples/Misc/AutoFilter.cs index acf82dd..21b8402 100644 --- a/ClosedXML_Examples/Misc/AutoFilter.cs +++ b/ClosedXML_Examples/Misc/AutoFilter.cs @@ -1,69 +1,69 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class AutoFilter : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var 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.RangeUsed().SetAutoFilter(); - - // Your can turn off the autofilter in three ways: - // 1) worksheet.AutoFilterRange.SetAutoFilter(false) - // 2) worksheet.AutoFilterRange = null - // 3) Pick any range in the worksheet and call range.SetAutoFilter(false); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class AutoFilter : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var 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.RangeUsed().SetAutoFilter(); + + // Your can turn off the autofilter in three ways: + // 1) worksheet.AutoFilterRange.SetAutoFilter(false) + // 2) worksheet.AutoFilterRange = null + // 3) Pick any range in the worksheet and call range.SetAutoFilter(false); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/BlankCells.cs b/ClosedXML_Examples/Misc/BlankCells.cs index 232950e..a3220d6 100644 --- a/ClosedXML_Examples/Misc/BlankCells.cs +++ b/ClosedXML_Examples/Misc/BlankCells.cs @@ -1,59 +1,59 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class BlankCells : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Sheet1"); - ws.Cell(1, 1).Value = "X"; - ws.Cell(1, 1).Clear(); - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class BlankCells : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + ws.Cell(1, 1).Value = "X"; + ws.Cell(1, 1).Clear(); + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/CellValues.cs b/ClosedXML_Examples/Misc/CellValues.cs index 2eac33e..236da97 100644 --- a/ClosedXML_Examples/Misc/CellValues.cs +++ b/ClosedXML_Examples/Misc/CellValues.cs @@ -1,148 +1,148 @@ -using ClosedXML.Excel; -using System; - -namespace ClosedXML_Examples.Misc -{ - public class CellValues : IXLExample - { - public void Create(String filePath) - { - using (var workbook = new XLWorkbook()) - { - var ws = workbook.Worksheets.Add("Cell Values"); - - // Set the titles - ws.Cell(2, 2).Value = "Initial Value"; - ws.Cell(2, 3).Value = "Casting"; - ws.Cell(2, 4).Value = "Using Get...()"; - ws.Cell(2, 5).Value = "Using GetValue()"; - ws.Cell(2, 6).Value = "GetString()"; - ws.Cell(2, 7).Value = "GetFormattedString()"; - - ////////////////////////////////////////////////////////////////// - // DateTime - - // Fill a cell with a date - var cellDateTime = ws.Cell(3, 2); - cellDateTime.Value = new DateTime(2010, 9, 2); - cellDateTime.Style.DateFormat.Format = "yyyy-MMM-dd"; - - // Extract the date in different ways - DateTime dateTime1 = (DateTime)cellDateTime.Value; - DateTime dateTime2 = cellDateTime.GetDateTime(); - DateTime dateTime3 = cellDateTime.GetValue(); - String dateTimeString = cellDateTime.GetString(); - String dateTimeFormattedString = cellDateTime.GetFormattedString(); - - // Set the values back to cells - // The apostrophe is to force ClosedXML to treat the date as a string - ws.Cell(3, 3).Value = dateTime1; - ws.Cell(3, 4).Value = dateTime2; - ws.Cell(3, 5).Value = dateTime3; - ws.Cell(3, 6).Value = "'" + dateTimeString; - ws.Cell(3, 7).Value = "'" + dateTimeFormattedString; - - ////////////////////////////////////////////////////////////////// - // Boolean - - // Fill a cell with a boolean - var cellBoolean = ws.Cell(4, 2); - cellBoolean.Value = true; - - // Extract the boolean in different ways - Boolean boolean1 = (Boolean)cellBoolean.Value; - Boolean boolean2 = cellBoolean.GetBoolean(); - Boolean boolean3 = cellBoolean.GetValue(); - String booleanString = cellBoolean.GetString(); - String booleanFormattedString = cellBoolean.GetFormattedString(); - - // Set the values back to cells - // The apostrophe is to force ClosedXML to treat the boolean as a string - ws.Cell(4, 3).Value = boolean1; - ws.Cell(4, 4).Value = boolean2; - ws.Cell(4, 5).Value = boolean3; - ws.Cell(4, 6).Value = "'" + booleanString; - ws.Cell(4, 7).Value = "'" + booleanFormattedString; - - ////////////////////////////////////////////////////////////////// - // Double - - // Fill a cell with a double - var cellDouble = ws.Cell(5, 2); - cellDouble.Value = 1234.567; - cellDouble.Style.NumberFormat.Format = "#,##0.00"; - - // Extract the double in different ways - Double double1 = (Double)cellDouble.Value; - Double double2 = cellDouble.GetDouble(); - Double double3 = cellDouble.GetValue(); - String doubleString = cellDouble.GetString(); - String doubleFormattedString = cellDouble.GetFormattedString(); - - // Set the values back to cells - // The apostrophe is to force ClosedXML to treat the double as a string - ws.Cell(5, 3).Value = double1; - ws.Cell(5, 4).Value = double2; - ws.Cell(5, 5).Value = double3; - ws.Cell(5, 6).Value = "'" + doubleString; - ws.Cell(5, 7).Value = "'" + doubleFormattedString; - - ////////////////////////////////////////////////////////////////// - // String - - // Fill a cell with a string - var cellString = ws.Cell(6, 2); - cellString.Value = "Test Case"; - - // Extract the string in different ways - String string1 = (String)cellString.Value; - String string2 = cellString.GetString(); - String string3 = cellString.GetValue(); - String stringString = cellString.GetString(); - String stringFormattedString = cellString.GetFormattedString(); - - // Set the values back to cells - ws.Cell(6, 3).Value = string1; - ws.Cell(6, 4).Value = string2; - ws.Cell(6, 5).Value = string3; - ws.Cell(6, 6).Value = stringString; - ws.Cell(6, 7).Value = stringFormattedString; - - ////////////////////////////////////////////////////////////////// - // TimeSpan - - // Fill a cell with a timeSpan - var cellTimeSpan = ws.Cell(7, 2); - cellTimeSpan.Value = new TimeSpan(1, 2, 31, 45); - - // Extract the timeSpan in different ways - TimeSpan timeSpan1 = (TimeSpan)cellTimeSpan.Value; - TimeSpan timeSpan2 = cellTimeSpan.GetTimeSpan(); - TimeSpan timeSpan3 = cellTimeSpan.GetValue(); - String timeSpanString = "'" + cellTimeSpan.GetString(); - String timeSpanFormattedString = "'" + cellTimeSpan.GetFormattedString(); - - // Set the values back to cells - ws.Cell(7, 3).Value = timeSpan1; - ws.Cell(7, 4).Value = timeSpan2; - ws.Cell(7, 5).Value = timeSpan3; - ws.Cell(7, 6).Value = timeSpanString; - ws.Cell(7, 7).Value = timeSpanFormattedString; - - ////////////////////////////////////////////////////////////////// - // Do some formatting - ws.Columns("B:G").Width = 20; - var rngTitle = ws.Range("B2:G2"); - rngTitle.Style.Font.Bold = true; - rngTitle.Style.Fill.BackgroundColor = XLColor.Cyan; - - ws.Columns().AdjustToContents(); - - ws = workbook.AddWorksheet("Test Whitespace"); - ws.FirstCell().Value = "' "; - - workbook.SaveAs(filePath); - } - } - } -} +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class CellValues : IXLExample + { + public void Create(String filePath) + { + using (var workbook = new XLWorkbook()) + { + var ws = workbook.Worksheets.Add("Cell Values"); + + // Set the titles + ws.Cell(2, 2).Value = "Initial Value"; + ws.Cell(2, 3).Value = "Casting"; + ws.Cell(2, 4).Value = "Using Get...()"; + ws.Cell(2, 5).Value = "Using GetValue()"; + ws.Cell(2, 6).Value = "GetString()"; + ws.Cell(2, 7).Value = "GetFormattedString()"; + + ////////////////////////////////////////////////////////////////// + // DateTime + + // Fill a cell with a date + var cellDateTime = ws.Cell(3, 2); + cellDateTime.Value = new DateTime(2010, 9, 2); + cellDateTime.Style.DateFormat.Format = "yyyy-MMM-dd"; + + // Extract the date in different ways + DateTime dateTime1 = (DateTime)cellDateTime.Value; + DateTime dateTime2 = cellDateTime.GetDateTime(); + DateTime dateTime3 = cellDateTime.GetValue(); + String dateTimeString = cellDateTime.GetString(); + String dateTimeFormattedString = cellDateTime.GetFormattedString(); + + // Set the values back to cells + // The apostrophe is to force ClosedXML to treat the date as a string + ws.Cell(3, 3).Value = dateTime1; + ws.Cell(3, 4).Value = dateTime2; + ws.Cell(3, 5).Value = dateTime3; + ws.Cell(3, 6).Value = "'" + dateTimeString; + ws.Cell(3, 7).Value = "'" + dateTimeFormattedString; + + ////////////////////////////////////////////////////////////////// + // Boolean + + // Fill a cell with a boolean + var cellBoolean = ws.Cell(4, 2); + cellBoolean.Value = true; + + // Extract the boolean in different ways + Boolean boolean1 = (Boolean)cellBoolean.Value; + Boolean boolean2 = cellBoolean.GetBoolean(); + Boolean boolean3 = cellBoolean.GetValue(); + String booleanString = cellBoolean.GetString(); + String booleanFormattedString = cellBoolean.GetFormattedString(); + + // Set the values back to cells + // The apostrophe is to force ClosedXML to treat the boolean as a string + ws.Cell(4, 3).Value = boolean1; + ws.Cell(4, 4).Value = boolean2; + ws.Cell(4, 5).Value = boolean3; + ws.Cell(4, 6).Value = "'" + booleanString; + ws.Cell(4, 7).Value = "'" + booleanFormattedString; + + ////////////////////////////////////////////////////////////////// + // Double + + // Fill a cell with a double + var cellDouble = ws.Cell(5, 2); + cellDouble.Value = 1234.567; + cellDouble.Style.NumberFormat.Format = "#,##0.00"; + + // Extract the double in different ways + Double double1 = (Double)cellDouble.Value; + Double double2 = cellDouble.GetDouble(); + Double double3 = cellDouble.GetValue(); + String doubleString = cellDouble.GetString(); + String doubleFormattedString = cellDouble.GetFormattedString(); + + // Set the values back to cells + // The apostrophe is to force ClosedXML to treat the double as a string + ws.Cell(5, 3).Value = double1; + ws.Cell(5, 4).Value = double2; + ws.Cell(5, 5).Value = double3; + ws.Cell(5, 6).Value = "'" + doubleString; + ws.Cell(5, 7).Value = "'" + doubleFormattedString; + + ////////////////////////////////////////////////////////////////// + // String + + // Fill a cell with a string + var cellString = ws.Cell(6, 2); + cellString.Value = "Test Case"; + + // Extract the string in different ways + String string1 = (String)cellString.Value; + String string2 = cellString.GetString(); + String string3 = cellString.GetValue(); + String stringString = cellString.GetString(); + String stringFormattedString = cellString.GetFormattedString(); + + // Set the values back to cells + ws.Cell(6, 3).Value = string1; + ws.Cell(6, 4).Value = string2; + ws.Cell(6, 5).Value = string3; + ws.Cell(6, 6).Value = stringString; + ws.Cell(6, 7).Value = stringFormattedString; + + ////////////////////////////////////////////////////////////////// + // TimeSpan + + // Fill a cell with a timeSpan + var cellTimeSpan = ws.Cell(7, 2); + cellTimeSpan.Value = new TimeSpan(1, 2, 31, 45); + + // Extract the timeSpan in different ways + TimeSpan timeSpan1 = (TimeSpan)cellTimeSpan.Value; + TimeSpan timeSpan2 = cellTimeSpan.GetTimeSpan(); + TimeSpan timeSpan3 = cellTimeSpan.GetValue(); + String timeSpanString = "'" + cellTimeSpan.GetString(); + String timeSpanFormattedString = "'" + cellTimeSpan.GetFormattedString(); + + // Set the values back to cells + ws.Cell(7, 3).Value = timeSpan1; + ws.Cell(7, 4).Value = timeSpan2; + ws.Cell(7, 5).Value = timeSpan3; + ws.Cell(7, 6).Value = timeSpanString; + ws.Cell(7, 7).Value = timeSpanFormattedString; + + ////////////////////////////////////////////////////////////////// + // Do some formatting + ws.Columns("B:G").Width = 20; + var rngTitle = ws.Range("B2:G2"); + rngTitle.Style.Font.Bold = true; + rngTitle.Style.Fill.BackgroundColor = XLColor.Cyan; + + ws.Columns().AdjustToContents(); + + ws = workbook.AddWorksheet("Test Whitespace"); + ws.FirstCell().Value = "' "; + + workbook.SaveAs(filePath); + } + } + } +} diff --git a/ClosedXML_Examples/Misc/Collections.cs b/ClosedXML_Examples/Misc/Collections.cs index c97a995..39b416d 100644 --- a/ClosedXML_Examples/Misc/Collections.cs +++ b/ClosedXML_Examples/Misc/Collections.cs @@ -1,133 +1,133 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using ClosedXML.Excel; - -namespace ClosedXML_Examples.Misc -{ - public class Collections : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Collections"); - - // From a list of strings - var listOfStrings = new List(); - listOfStrings.Add("House"); - listOfStrings.Add("Car"); - ws.Cell(1, 1).Value = "Strings"; - ws.Cell(1, 1).AsRange().AddToNamed("Titles"); - ws.Cell(2, 1).Value = listOfStrings; - - // From a list of arrays - var listOfArr = new List(); - listOfArr.Add(new Int32[] { 1, 2, 3 }); - listOfArr.Add(new Int32[] { 1 }); - listOfArr.Add(new Int32[] { 1, 2, 3, 4, 5, 6 }); - ws.Cell(1, 3).Value = "Arrays"; - ws.Range(1, 3, 1, 8).Merge().AddToNamed("Titles"); - ws.Cell(2, 3).Value = listOfArr; - - // From a DataTable - var dataTable = GetTable(); - ws.Cell(6, 1).Value = "DataTable"; - ws.Range(6, 1, 6, 4).Merge().AddToNamed("Titles"); - ws.Cell(7, 1).Value = dataTable.AsEnumerable(); - - // From a query - var list = new List(); - list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St." }); - list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St." }); - list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St." }); - list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." }); - - var people = from p in list - where p.Age >= 21 - select new { p.Name, p.House, p.Age }; - - ws.Cell(6, 6).Value = "Query"; - ws.Range(6, 6, 6, 8).Merge().AddToNamed("Titles"); - ws.Cell(7, 6).Value = people.AsEnumerable(); // Very Important to call the AsEnumerable method - // otherwise it won't be copied. - - - // Prepare the style for the titles - var titlesStyle = wb.Style; - titlesStyle.Font.Bold = true; - titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - titlesStyle.Fill.BackgroundColor = XLColor.Cyan; - - // Format all titles in one shot - wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle; - - ws.Columns().AdjustToContents(); - - wb.SaveAs(filePath); - } - - class Person - { - public String House { get; set; } - public String Name { get; set; } - public Int32 Age { get; set; } - } - - // Private - private DataTable GetTable() - { - - DataTable table = new DataTable(); - table.Columns.Add("Dosage", typeof(int)); - table.Columns.Add("Drug", typeof(string)); - table.Columns.Add("Patient", typeof(string)); - table.Columns.Add("Date", typeof(DateTime)); - - table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); - table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); - table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); - table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); - table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); - return table; - } - // Override - - - #endregion - } -} +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Misc +{ + public class Collections : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Collections"); + + // From a list of strings + var listOfStrings = new List(); + listOfStrings.Add("House"); + listOfStrings.Add("Car"); + ws.Cell(1, 1).Value = "Strings"; + ws.Cell(1, 1).AsRange().AddToNamed("Titles"); + ws.Cell(2, 1).Value = listOfStrings; + + // From a list of arrays + var listOfArr = new List(); + listOfArr.Add(new Int32[] { 1, 2, 3 }); + listOfArr.Add(new Int32[] { 1 }); + listOfArr.Add(new Int32[] { 1, 2, 3, 4, 5, 6 }); + ws.Cell(1, 3).Value = "Arrays"; + ws.Range(1, 3, 1, 8).Merge().AddToNamed("Titles"); + ws.Cell(2, 3).Value = listOfArr; + + // From a DataTable + var dataTable = GetTable(); + ws.Cell(6, 1).Value = "DataTable"; + ws.Range(6, 1, 6, 4).Merge().AddToNamed("Titles"); + ws.Cell(7, 1).Value = dataTable.AsEnumerable(); + + // From a query + var list = new List(); + list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St." }); + list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St." }); + list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St." }); + list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." }); + + var people = from p in list + where p.Age >= 21 + select new { p.Name, p.House, p.Age }; + + ws.Cell(6, 6).Value = "Query"; + ws.Range(6, 6, 6, 8).Merge().AddToNamed("Titles"); + ws.Cell(7, 6).Value = people.AsEnumerable(); // Very Important to call the AsEnumerable method + // otherwise it won't be copied. + + + // Prepare the style for the titles + var titlesStyle = wb.Style; + titlesStyle.Font.Bold = true; + titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + titlesStyle.Fill.BackgroundColor = XLColor.Cyan; + + // Format all titles in one shot + wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle; + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + class Person + { + public String House { get; set; } + public String Name { get; set; } + public Int32 Age { get; set; } + } + + // Private + private DataTable GetTable() + { + + DataTable table = new DataTable(); + table.Columns.Add("Dosage", typeof(int)); + table.Columns.Add("Drug", typeof(string)); + table.Columns.Add("Patient", typeof(string)); + table.Columns.Add("Date", typeof(DateTime)); + + table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); + table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); + table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); + table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); + table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); + return table; + } + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/CopyingRowsAndColumns.cs b/ClosedXML_Examples/Misc/CopyingRowsAndColumns.cs index a597e35..53116c2 100644 --- a/ClosedXML_Examples/Misc/CopyingRowsAndColumns.cs +++ b/ClosedXML_Examples/Misc/CopyingRowsAndColumns.cs @@ -1,114 +1,114 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class CopyingRowsAndColumns : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - - var originalSheet = workbook.Worksheets.Add("original"); - - originalSheet.Cell("A2").SetValue("test value"); - originalSheet.Range("A2:E2").Merge(); - - originalSheet.Cell("F1").SetValue("test value").Style.Alignment.SetTopToBottom(); - originalSheet.Range("F1:F6").Merge(); - - var fromRow = workbook.Worksheets.Add("From a Row"); - fromRow.Cell(1, 1).SetValue("Row to Row:"); - originalSheet.Row(2).CopyTo(fromRow.Row(2)); - fromRow.Cell(3, 1).SetValue("Row to Range:"); - originalSheet.Row(2).CopyTo(fromRow.Row(4).AsRange()); - fromRow.Cell(5, 1).SetValue("Row to Cell:"); - originalSheet.Row(2).CopyTo(fromRow.Row(6).FirstCell()); - - var fromRange = workbook.Worksheets.Add("From a Range"); - fromRange.Cell(1, 1).SetValue("Range to Row:"); - originalSheet.Row(2).AsRange().CopyTo(fromRange.Row(2)); - fromRange.Cell(3, 1).SetValue("Range to Range:"); - originalSheet.Row(2).AsRange().CopyTo(fromRange.Row(4).AsRange()); - fromRange.Cell(5, 1).SetValue("Range to Cell:"); - originalSheet.Row(2).AsRange().CopyTo(fromRange.Row(6).FirstCell()); - - CopyRowAsRange(originalSheet, 2, fromRange, 8); - - var fromColumn = workbook.Worksheets.Add("From a Column to Column"); - fromColumn.Cell(1, 1).SetValue("Column to Column:").Style.Alignment.SetTopToBottom(); - originalSheet.Column("F").CopyTo(fromColumn.Column(2)); - fromColumn.Cell(1, 3).SetValue("Column to Range:").Style.Alignment.SetTopToBottom(); - originalSheet.Column("F").CopyTo(fromColumn.Column(4).AsRange()); - fromColumn.Cell(1, 5).SetValue("Column to Cell:").Style.Alignment.SetTopToBottom(); - originalSheet.Column("F").CopyTo(fromColumn.Column(6).FirstCell()); - - var fromRangeToColumn = workbook.Worksheets.Add("From a Range to Column"); - fromRangeToColumn.Cell(1, 1).SetValue("Range to Column:").Style.Alignment.SetTopToBottom(); - originalSheet.Column("F").AsRange().CopyTo(fromRangeToColumn.Column(2)); - fromRangeToColumn.Cell(1, 3).SetValue("Range to Range:").Style.Alignment.SetTopToBottom(); - originalSheet.Column("F").AsRange().CopyTo(fromRangeToColumn.Column(4).AsRange()); - fromRangeToColumn.Cell(1, 5).SetValue("Range to Cell:").Style.Alignment.SetTopToBottom(); - originalSheet.Column("F").AsRange().CopyTo(fromRangeToColumn.Column(6).FirstCell()); - - - workbook.SaveAs(filePath); - } - - private static void CopyRowAsRange(IXLWorksheet originalSheet, int originalRowNumber, IXLWorksheet destSheet, int destRowNumber) - { - { - var destinationRow = destSheet.Row(destRowNumber); - destinationRow.Clear(); - - var originalRow = originalSheet.Row(originalRowNumber); - int columnNumber = originalRow.LastCellUsed(true).Address.ColumnNumber; - - var originalRange = originalSheet.Range(originalRowNumber, 1, originalRowNumber, columnNumber); - var destRange = destSheet.Range(destRowNumber, 1, destRowNumber, columnNumber); - originalRange.CopyTo(destRange); - } - } - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class CopyingRowsAndColumns : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + + var originalSheet = workbook.Worksheets.Add("original"); + + originalSheet.Cell("A2").SetValue("test value"); + originalSheet.Range("A2:E2").Merge(); + + originalSheet.Cell("F1").SetValue("test value").Style.Alignment.SetTopToBottom(); + originalSheet.Range("F1:F6").Merge(); + + var fromRow = workbook.Worksheets.Add("From a Row"); + fromRow.Cell(1, 1).SetValue("Row to Row:"); + originalSheet.Row(2).CopyTo(fromRow.Row(2)); + fromRow.Cell(3, 1).SetValue("Row to Range:"); + originalSheet.Row(2).CopyTo(fromRow.Row(4).AsRange()); + fromRow.Cell(5, 1).SetValue("Row to Cell:"); + originalSheet.Row(2).CopyTo(fromRow.Row(6).FirstCell()); + + var fromRange = workbook.Worksheets.Add("From a Range"); + fromRange.Cell(1, 1).SetValue("Range to Row:"); + originalSheet.Row(2).AsRange().CopyTo(fromRange.Row(2)); + fromRange.Cell(3, 1).SetValue("Range to Range:"); + originalSheet.Row(2).AsRange().CopyTo(fromRange.Row(4).AsRange()); + fromRange.Cell(5, 1).SetValue("Range to Cell:"); + originalSheet.Row(2).AsRange().CopyTo(fromRange.Row(6).FirstCell()); + + CopyRowAsRange(originalSheet, 2, fromRange, 8); + + var fromColumn = workbook.Worksheets.Add("From a Column to Column"); + fromColumn.Cell(1, 1).SetValue("Column to Column:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").CopyTo(fromColumn.Column(2)); + fromColumn.Cell(1, 3).SetValue("Column to Range:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").CopyTo(fromColumn.Column(4).AsRange()); + fromColumn.Cell(1, 5).SetValue("Column to Cell:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").CopyTo(fromColumn.Column(6).FirstCell()); + + var fromRangeToColumn = workbook.Worksheets.Add("From a Range to Column"); + fromRangeToColumn.Cell(1, 1).SetValue("Range to Column:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").AsRange().CopyTo(fromRangeToColumn.Column(2)); + fromRangeToColumn.Cell(1, 3).SetValue("Range to Range:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").AsRange().CopyTo(fromRangeToColumn.Column(4).AsRange()); + fromRangeToColumn.Cell(1, 5).SetValue("Range to Cell:").Style.Alignment.SetTopToBottom(); + originalSheet.Column("F").AsRange().CopyTo(fromRangeToColumn.Column(6).FirstCell()); + + + workbook.SaveAs(filePath); + } + + private static void CopyRowAsRange(IXLWorksheet originalSheet, int originalRowNumber, IXLWorksheet destSheet, int destRowNumber) + { + { + var destinationRow = destSheet.Row(destRowNumber); + destinationRow.Clear(); + + var originalRow = originalSheet.Row(originalRowNumber); + int columnNumber = originalRow.LastCellUsed(true).Address.ColumnNumber; + + var originalRange = originalSheet.Range(originalRowNumber, 1, originalRowNumber, columnNumber); + var destRange = destSheet.Range(destRowNumber, 1, destRowNumber, columnNumber); + originalRange.CopyTo(destRange); + } + } + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/CopyingWorksheets.cs b/ClosedXML_Examples/Misc/CopyingWorksheets.cs index 2c86867..b0843eb 100644 --- a/ClosedXML_Examples/Misc/CopyingWorksheets.cs +++ b/ClosedXML_Examples/Misc/CopyingWorksheets.cs @@ -1,45 +1,45 @@ -using System.IO; -using ClosedXML.Excel; -using ClosedXML_Examples.Ranges; - -namespace ClosedXML_Examples.Misc -{ - public class CopyingWorksheets : IXLExample - { - public void Create(string filePath) - { - string tempFile1 = ExampleHelper.GetTempFilePath(filePath); - string tempFile2 = ExampleHelper.GetTempFilePath(filePath); - try - { - new UsingTables().Create(tempFile1); - var wb = new XLWorkbook(tempFile1); - - var wsSource = wb.Worksheet(1); - // Copy the worksheet to a new sheet in this workbook - wsSource.CopyTo("Copy"); - - // We're going to open another workbook to show that you can - // copy a sheet from one workbook to another: - new BasicTable().Create(tempFile2); - var wbSource = new XLWorkbook(tempFile2); - wbSource.Worksheet(1).CopyTo(wb, "Copy From Other"); - - // Save the workbook with the 2 copies - wb.SaveAs(filePath); - } - finally - { - if (File.Exists(tempFile1)) - { - File.Delete(tempFile1); - } - if (File.Exists(tempFile2)) - { - File.Delete(tempFile2); - } - } - } - - } -} +using System.IO; +using ClosedXML.Excel; +using ClosedXML_Examples.Ranges; + +namespace ClosedXML_Examples.Misc +{ + public class CopyingWorksheets : IXLExample + { + public void Create(string filePath) + { + string tempFile1 = ExampleHelper.GetTempFilePath(filePath); + string tempFile2 = ExampleHelper.GetTempFilePath(filePath); + try + { + new UsingTables().Create(tempFile1); + var wb = new XLWorkbook(tempFile1); + + var wsSource = wb.Worksheet(1); + // Copy the worksheet to a new sheet in this workbook + wsSource.CopyTo("Copy"); + + // We're going to open another workbook to show that you can + // copy a sheet from one workbook to another: + new BasicTable().Create(tempFile2); + var wbSource = new XLWorkbook(tempFile2); + wbSource.Worksheet(1).CopyTo(wb, "Copy From Other"); + + // Save the workbook with the 2 copies + wb.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile1)) + { + File.Delete(tempFile1); + } + if (File.Exists(tempFile2)) + { + File.Delete(tempFile2); + } + } + } + + } +} diff --git a/ClosedXML_Examples/Misc/DataTypes.cs b/ClosedXML_Examples/Misc/DataTypes.cs index 14abad9..a396328 100644 --- a/ClosedXML_Examples/Misc/DataTypes.cs +++ b/ClosedXML_Examples/Misc/DataTypes.cs @@ -1,219 +1,219 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class DataTypes : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Data Types"); - - var co = 2; - var ro = 1; - - ws.Cell(++ro, co).Value = "Plain Text:"; - ws.Cell(ro, co + 1).Value = "Hello World."; - - ws.Cell(++ro, co).Value = "Plain Date:"; - ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2); - - ws.Cell(++ro, co).Value = "Plain DateTime:"; - ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2, 13, 45, 22); - - ws.Cell(++ro, co).Value = "Plain Boolean:"; - ws.Cell(ro, co + 1).Value = true; - - ws.Cell(++ro, co).Value = "Plain Number:"; - ws.Cell(ro, co + 1).Value = 123.45; - - ws.Cell(++ro, co).Value = "TimeSpan:"; - ws.Cell(ro, co + 1).Value = new TimeSpan(33, 45, 22); - - ro++; - - ws.Cell(++ro, co).Value = "Decimal Number:"; - ws.Cell(ro, co + 1).Value = 123.45m; - - ws.Cell(++ro, co).Value = "Float Number:"; - ws.Cell(ro, co + 1).Value = 123.45f; - - ws.Cell(++ro, co).Value = "Double Number:"; - ws.Cell(ro, co + 1).Value = 123.45d; - - ro++; - - ws.Cell(++ro, co).Value = "Explicit Text:"; - ws.Cell(ro, co + 1).Value = "'Hello World."; - - ws.Cell(++ro, co).Value = "Date as Text:"; - ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2).ToString(); - - ws.Cell(++ro, co).Value = "DateTime as Text:"; - ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2, 13, 45, 22).ToString(); - - ws.Cell(++ro, co).Value = "Boolean as Text:"; - ws.Cell(ro, co + 1).Value = "'" + true.ToString(); - - ws.Cell(++ro, co).Value = "Number as Text:"; - ws.Cell(ro, co + 1).Value = "'123.45"; - - ws.Cell(++ro, co).Value = "Number with @ format:"; - ws.Cell(ro, co + 1).Style.NumberFormat.Format = "@"; - ws.Cell(ro, co + 1).Value = 123.45; - - ws.Cell(++ro, co).Value = "Format number with @:"; - ws.Cell(ro, co + 1).Value = 123.45; - ws.Cell(ro, co + 1).Style.NumberFormat.Format = "@"; - - ws.Cell(++ro, co).Value = "TimeSpan as Text:"; - ws.Cell(ro, co + 1).Value = "'" + new TimeSpan(33, 45, 22).ToString(); - - ro++; - - ws.Cell(++ro, co).Value = "Changing Data Types:"; - - ro++; - - ws.Cell(++ro, co).Value = "Date to Text:"; - ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2); - ws.Cell(ro, co + 1).DataType = XLCellValues.Text; - - ws.Cell(++ro, co).Value = "DateTime to Text:"; - ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2, 13, 45, 22); - ws.Cell(ro, co + 1).DataType = XLCellValues.Text; - - ws.Cell(++ro, co).Value = "Boolean to Text:"; - ws.Cell(ro, co + 1).Value = true; - ws.Cell(ro, co + 1).DataType = XLCellValues.Text; - - ws.Cell(++ro, co).Value = "Number to Text:"; - ws.Cell(ro, co + 1).Value = 123.45; - ws.Cell(ro, co + 1).DataType = XLCellValues.Text; - - ws.Cell(++ro, co).Value = "TimeSpan to Text:"; - ws.Cell(ro, co + 1).Value = new TimeSpan(33, 45, 22); - ws.Cell(ro, co + 1).DataType = XLCellValues.Text; - - ws.Cell(++ro, co).Value = "Text to Date:"; - ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2).ToString(); - ws.Cell(ro, co + 1).DataType = XLCellValues.DateTime; - - ws.Cell(++ro, co).Value = "Text to DateTime:"; - ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2, 13, 45, 22).ToString(); - ws.Cell(ro, co + 1).DataType = XLCellValues.DateTime; - - ws.Cell(++ro, co).Value = "Text to Boolean:"; - ws.Cell(ro, co + 1).Value = "'" + true.ToString(); - ws.Cell(ro, co + 1).DataType = XLCellValues.Boolean; - - ws.Cell(++ro, co).Value = "Text to Number:"; - ws.Cell(ro, co + 1).Value = "'123.45"; - ws.Cell(ro, co + 1).DataType = XLCellValues.Number; - - ws.Cell(++ro, co).Value = "@ format to Number:"; - ws.Cell(ro, co + 1).Style.NumberFormat.Format = "@"; - ws.Cell(ro, co + 1).Value = 123.45; - ws.Cell(ro, co + 1).DataType = XLCellValues.Number; - - ws.Cell(++ro, co).Value = "Text to TimeSpan:"; - ws.Cell(ro, co + 1).Value = "'" + new TimeSpan(33, 45, 22).ToString(); - ws.Cell(ro, co + 1).DataType = XLCellValues.TimeSpan; - - ro++; - - ws.Cell(++ro, co).Value = "Formatted Date to Text:"; - ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2); - ws.Cell(ro, co + 1).Style.DateFormat.Format = "yyyy-MM-dd"; - ws.Cell(ro, co + 1).DataType = XLCellValues.Text; - - ws.Cell(++ro, co).Value = "Formatted Number to Text:"; - ws.Cell(ro, co + 1).Value = 12345.6789; - ws.Cell(ro, co + 1).Style.NumberFormat.Format = "#,##0.00"; - ws.Cell(ro, co + 1).DataType = XLCellValues.Text; - - ro++; - - ws.Cell(++ro, co).Value = "Blank Text:"; - ws.Cell(ro, co + 1).Value = 12345.6789; - ws.Cell(ro, co + 1).Style.NumberFormat.Format = "#,##0.00"; - ws.Cell(ro, co + 1).DataType = XLCellValues.Text; - ws.Cell(ro, co + 1).Value = ""; - - ro++; - - // Using inline strings (few users will ever need to use this feature) - // - // By default all strings are stored as shared so one block of text - // can be reference by multiple cells. - // You can override this by setting the .ShareString property to false - ws.Cell(++ro, co).Value = "Inline String:"; - var cell = ws.Cell(ro, co + 1); - cell.Value = "Not Shared"; - cell.ShareString = false; - - // To view all shared strings (all texts in the workbook actually), use the following: - // workbook.GetSharedStrings() - - ws.Cell(++ro, co) - .SetDataType(XLCellValues.Text) - .SetDataType(XLCellValues.Boolean) - .SetDataType(XLCellValues.DateTime) - .SetDataType(XLCellValues.Number) - .SetDataType(XLCellValues.TimeSpan) - .SetDataType(XLCellValues.Text) - .SetDataType(XLCellValues.TimeSpan) - .SetDataType(XLCellValues.Number) - .SetDataType(XLCellValues.DateTime) - .SetDataType(XLCellValues.Boolean) - .SetDataType(XLCellValues.Text); - - ws.Columns(2, 3).AdjustToContents(); - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class DataTypes : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Data Types"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co).Value = "Plain Text:"; + ws.Cell(ro, co + 1).Value = "Hello World."; + + ws.Cell(++ro, co).Value = "Plain Date:"; + ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2); + + ws.Cell(++ro, co).Value = "Plain DateTime:"; + ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2, 13, 45, 22); + + ws.Cell(++ro, co).Value = "Plain Boolean:"; + ws.Cell(ro, co + 1).Value = true; + + ws.Cell(++ro, co).Value = "Plain Number:"; + ws.Cell(ro, co + 1).Value = 123.45; + + ws.Cell(++ro, co).Value = "TimeSpan:"; + ws.Cell(ro, co + 1).Value = new TimeSpan(33, 45, 22); + + ro++; + + ws.Cell(++ro, co).Value = "Decimal Number:"; + ws.Cell(ro, co + 1).Value = 123.45m; + + ws.Cell(++ro, co).Value = "Float Number:"; + ws.Cell(ro, co + 1).Value = 123.45f; + + ws.Cell(++ro, co).Value = "Double Number:"; + ws.Cell(ro, co + 1).Value = 123.45d; + + ro++; + + ws.Cell(++ro, co).Value = "Explicit Text:"; + ws.Cell(ro, co + 1).Value = "'Hello World."; + + ws.Cell(++ro, co).Value = "Date as Text:"; + ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2).ToString(); + + ws.Cell(++ro, co).Value = "DateTime as Text:"; + ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2, 13, 45, 22).ToString(); + + ws.Cell(++ro, co).Value = "Boolean as Text:"; + ws.Cell(ro, co + 1).Value = "'" + true.ToString(); + + ws.Cell(++ro, co).Value = "Number as Text:"; + ws.Cell(ro, co + 1).Value = "'123.45"; + + ws.Cell(++ro, co).Value = "Number with @ format:"; + ws.Cell(ro, co + 1).Style.NumberFormat.Format = "@"; + ws.Cell(ro, co + 1).Value = 123.45; + + ws.Cell(++ro, co).Value = "Format number with @:"; + ws.Cell(ro, co + 1).Value = 123.45; + ws.Cell(ro, co + 1).Style.NumberFormat.Format = "@"; + + ws.Cell(++ro, co).Value = "TimeSpan as Text:"; + ws.Cell(ro, co + 1).Value = "'" + new TimeSpan(33, 45, 22).ToString(); + + ro++; + + ws.Cell(++ro, co).Value = "Changing Data Types:"; + + ro++; + + ws.Cell(++ro, co).Value = "Date to Text:"; + ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2); + ws.Cell(ro, co + 1).DataType = XLCellValues.Text; + + ws.Cell(++ro, co).Value = "DateTime to Text:"; + ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2, 13, 45, 22); + ws.Cell(ro, co + 1).DataType = XLCellValues.Text; + + ws.Cell(++ro, co).Value = "Boolean to Text:"; + ws.Cell(ro, co + 1).Value = true; + ws.Cell(ro, co + 1).DataType = XLCellValues.Text; + + ws.Cell(++ro, co).Value = "Number to Text:"; + ws.Cell(ro, co + 1).Value = 123.45; + ws.Cell(ro, co + 1).DataType = XLCellValues.Text; + + ws.Cell(++ro, co).Value = "TimeSpan to Text:"; + ws.Cell(ro, co + 1).Value = new TimeSpan(33, 45, 22); + ws.Cell(ro, co + 1).DataType = XLCellValues.Text; + + ws.Cell(++ro, co).Value = "Text to Date:"; + ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2).ToString(); + ws.Cell(ro, co + 1).DataType = XLCellValues.DateTime; + + ws.Cell(++ro, co).Value = "Text to DateTime:"; + ws.Cell(ro, co + 1).Value = "'" + new DateTime(2010, 9, 2, 13, 45, 22).ToString(); + ws.Cell(ro, co + 1).DataType = XLCellValues.DateTime; + + ws.Cell(++ro, co).Value = "Text to Boolean:"; + ws.Cell(ro, co + 1).Value = "'" + true.ToString(); + ws.Cell(ro, co + 1).DataType = XLCellValues.Boolean; + + ws.Cell(++ro, co).Value = "Text to Number:"; + ws.Cell(ro, co + 1).Value = "'123.45"; + ws.Cell(ro, co + 1).DataType = XLCellValues.Number; + + ws.Cell(++ro, co).Value = "@ format to Number:"; + ws.Cell(ro, co + 1).Style.NumberFormat.Format = "@"; + ws.Cell(ro, co + 1).Value = 123.45; + ws.Cell(ro, co + 1).DataType = XLCellValues.Number; + + ws.Cell(++ro, co).Value = "Text to TimeSpan:"; + ws.Cell(ro, co + 1).Value = "'" + new TimeSpan(33, 45, 22).ToString(); + ws.Cell(ro, co + 1).DataType = XLCellValues.TimeSpan; + + ro++; + + ws.Cell(++ro, co).Value = "Formatted Date to Text:"; + ws.Cell(ro, co + 1).Value = new DateTime(2010, 9, 2); + ws.Cell(ro, co + 1).Style.DateFormat.Format = "yyyy-MM-dd"; + ws.Cell(ro, co + 1).DataType = XLCellValues.Text; + + ws.Cell(++ro, co).Value = "Formatted Number to Text:"; + ws.Cell(ro, co + 1).Value = 12345.6789; + ws.Cell(ro, co + 1).Style.NumberFormat.Format = "#,##0.00"; + ws.Cell(ro, co + 1).DataType = XLCellValues.Text; + + ro++; + + ws.Cell(++ro, co).Value = "Blank Text:"; + ws.Cell(ro, co + 1).Value = 12345.6789; + ws.Cell(ro, co + 1).Style.NumberFormat.Format = "#,##0.00"; + ws.Cell(ro, co + 1).DataType = XLCellValues.Text; + ws.Cell(ro, co + 1).Value = ""; + + ro++; + + // Using inline strings (few users will ever need to use this feature) + // + // By default all strings are stored as shared so one block of text + // can be reference by multiple cells. + // You can override this by setting the .ShareString property to false + ws.Cell(++ro, co).Value = "Inline String:"; + var cell = ws.Cell(ro, co + 1); + cell.Value = "Not Shared"; + cell.ShareString = false; + + // To view all shared strings (all texts in the workbook actually), use the following: + // workbook.GetSharedStrings() + + ws.Cell(++ro, co) + .SetDataType(XLCellValues.Text) + .SetDataType(XLCellValues.Boolean) + .SetDataType(XLCellValues.DateTime) + .SetDataType(XLCellValues.Number) + .SetDataType(XLCellValues.TimeSpan) + .SetDataType(XLCellValues.Text) + .SetDataType(XLCellValues.TimeSpan) + .SetDataType(XLCellValues.Number) + .SetDataType(XLCellValues.DateTime) + .SetDataType(XLCellValues.Boolean) + .SetDataType(XLCellValues.Text); + + ws.Columns(2, 3).AdjustToContents(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/DataTypesUnderDifferentCulture.cs b/ClosedXML_Examples/Misc/DataTypesUnderDifferentCulture.cs index 4b77144..cbf1110 100644 --- a/ClosedXML_Examples/Misc/DataTypesUnderDifferentCulture.cs +++ b/ClosedXML_Examples/Misc/DataTypesUnderDifferentCulture.cs @@ -1,35 +1,35 @@ -using System; -using ClosedXML.Excel; -using System.Threading; -using System.Globalization; -using System.IO; - -namespace ClosedXML_Examples.Misc -{ - public class DataTypesUnderDifferentCulture : IXLExample - { - public void Create(string filePath) - { - var backupCulture = Thread.CurrentThread.CurrentCulture; - - // Set thread culture to French, which should format numbers using decimal COMMA - Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR"); - - string tempFile = ExampleHelper.GetTempFilePath(filePath); - try - { - new DataTypes().Create(tempFile); - var workbook = new XLWorkbook(tempFile); - workbook.SaveAs(filePath); - } - finally - { - Thread.CurrentThread.CurrentCulture = backupCulture; - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - } -} +using System; +using ClosedXML.Excel; +using System.Threading; +using System.Globalization; +using System.IO; + +namespace ClosedXML_Examples.Misc +{ + public class DataTypesUnderDifferentCulture : IXLExample + { + public void Create(string filePath) + { + var backupCulture = Thread.CurrentThread.CurrentCulture; + + // Set thread culture to French, which should format numbers using decimal COMMA + Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR"); + + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new DataTypes().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + workbook.SaveAs(filePath); + } + finally + { + Thread.CurrentThread.CurrentCulture = backupCulture; + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } +} diff --git a/ClosedXML_Examples/Misc/DataValidation.cs b/ClosedXML_Examples/Misc/DataValidation.cs index fdbe3cc..10a0df4 100644 --- a/ClosedXML_Examples/Misc/DataValidation.cs +++ b/ClosedXML_Examples/Misc/DataValidation.cs @@ -1,139 +1,139 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class DataValidation : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Data Validation"); - - // Decimal between 1 and 5 - ws.Cell(1, 1).SetDataValidation().Decimal.Between(1, 5); - - // Whole number equals 2 - var dv1 = ws.Range("A2:A3").SetDataValidation(); - dv1.WholeNumber.EqualTo(2); - // Change the error message - dv1.ErrorStyle = XLErrorStyle.Warning; - dv1.ErrorTitle = "Number out of range"; - dv1.ErrorMessage = "This cell only allows the number 2."; - - // Date after the millenium - var dv2 = ws.Cell("A4").SetDataValidation(); - dv2.Date.EqualOrGreaterThan(new DateTime(2000, 1, 1)); - // Change the input message - dv2.InputTitle = "Can't party like it's 1999."; - dv2.InputMessage = "Please enter a date in this century."; - - // From a list - ws.Cell("C1").Value = "Yes"; - ws.Cell("C2").Value = "No"; - ws.Cell("A5").SetDataValidation().List(ws.Range("C1:C2")); - - ws.Range("C1:C2").AddToNamed("YesNo"); - ws.Cell("A6").SetDataValidation().List("=YesNo"); - - // Intersecting dataValidations - ws.Range("B1:B4").SetDataValidation().WholeNumber.EqualTo(1); - ws.Range("B3:B4").SetDataValidation().WholeNumber.EqualTo(2); - - - // Validate with multiple ranges - var ws2 = wb.Worksheets.Add("Validate Ranges"); - var rng1 = ws2.Ranges("A1:B2,B4:D7,F4:G5"); - rng1.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); - var rng1Validation = rng1.SetDataValidation(); - rng1Validation.Decimal.EqualTo(1); - rng1Validation.IgnoreBlanks = false; - - var rng2 = ws2.Range("A11:E14"); - rng2.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); - var rng2Validation = rng2.SetDataValidation(); - rng2Validation.Decimal.EqualTo(2); - rng2Validation.IgnoreBlanks = false; - - var rng3 = ws2.Range("B2:B12"); - //rng3.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); - var rng3Validation = rng3.SetDataValidation(); - rng3Validation.Decimal.EqualTo(3); - rng3Validation.IgnoreBlanks = true; - - var rng4 = ws2.Range("D5:D6"); - //rng4.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); - var rng4Validation = rng4.SetDataValidation(); - rng4Validation.Decimal.EqualTo(4); - rng4Validation.IgnoreBlanks = true; - - var rng5 = ws2.Range("C13:C14"); - //rng5.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); - var rng5Validation = rng5.SetDataValidation(); - rng5Validation.Decimal.EqualTo(5); - rng5Validation.IgnoreBlanks = true; - - var rng6 = ws2.Range("D11:D12"); - //rng6.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); - var rng6Validation = rng6.SetDataValidation(); - rng6Validation.Decimal.EqualTo(5); - rng6Validation.IgnoreBlanks = true; - - var rng7 = ws2.Range("G4:G5"); - //rng7.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); - var rng7Validation = rng7.SetDataValidation(); - rng7Validation.Decimal.EqualTo(5); - rng7Validation.IgnoreBlanks = true; - - ws.CopyTo(ws.Name + " - Copy"); - ws2.CopyTo(ws2.Name + " - Copy"); - - wb.AddWorksheet("Copy From Range 1").FirstCell().Value = ws.RangeUsed(true); - wb.AddWorksheet("Copy From Range 2").FirstCell().Value = ws2.RangeUsed(true); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class DataValidation : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Data Validation"); + + // Decimal between 1 and 5 + ws.Cell(1, 1).SetDataValidation().Decimal.Between(1, 5); + + // Whole number equals 2 + var dv1 = ws.Range("A2:A3").SetDataValidation(); + dv1.WholeNumber.EqualTo(2); + // Change the error message + dv1.ErrorStyle = XLErrorStyle.Warning; + dv1.ErrorTitle = "Number out of range"; + dv1.ErrorMessage = "This cell only allows the number 2."; + + // Date after the millenium + var dv2 = ws.Cell("A4").SetDataValidation(); + dv2.Date.EqualOrGreaterThan(new DateTime(2000, 1, 1)); + // Change the input message + dv2.InputTitle = "Can't party like it's 1999."; + dv2.InputMessage = "Please enter a date in this century."; + + // From a list + ws.Cell("C1").Value = "Yes"; + ws.Cell("C2").Value = "No"; + ws.Cell("A5").SetDataValidation().List(ws.Range("C1:C2")); + + ws.Range("C1:C2").AddToNamed("YesNo"); + ws.Cell("A6").SetDataValidation().List("=YesNo"); + + // Intersecting dataValidations + ws.Range("B1:B4").SetDataValidation().WholeNumber.EqualTo(1); + ws.Range("B3:B4").SetDataValidation().WholeNumber.EqualTo(2); + + + // Validate with multiple ranges + var ws2 = wb.Worksheets.Add("Validate Ranges"); + var rng1 = ws2.Ranges("A1:B2,B4:D7,F4:G5"); + rng1.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng1Validation = rng1.SetDataValidation(); + rng1Validation.Decimal.EqualTo(1); + rng1Validation.IgnoreBlanks = false; + + var rng2 = ws2.Range("A11:E14"); + rng2.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng2Validation = rng2.SetDataValidation(); + rng2Validation.Decimal.EqualTo(2); + rng2Validation.IgnoreBlanks = false; + + var rng3 = ws2.Range("B2:B12"); + //rng3.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng3Validation = rng3.SetDataValidation(); + rng3Validation.Decimal.EqualTo(3); + rng3Validation.IgnoreBlanks = true; + + var rng4 = ws2.Range("D5:D6"); + //rng4.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng4Validation = rng4.SetDataValidation(); + rng4Validation.Decimal.EqualTo(4); + rng4Validation.IgnoreBlanks = true; + + var rng5 = ws2.Range("C13:C14"); + //rng5.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng5Validation = rng5.SetDataValidation(); + rng5Validation.Decimal.EqualTo(5); + rng5Validation.IgnoreBlanks = true; + + var rng6 = ws2.Range("D11:D12"); + //rng6.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng6Validation = rng6.SetDataValidation(); + rng6Validation.Decimal.EqualTo(5); + rng6Validation.IgnoreBlanks = true; + + var rng7 = ws2.Range("G4:G5"); + //rng7.Style.Fill.SetBackgroundColor(XLColor.YellowGreen); + var rng7Validation = rng7.SetDataValidation(); + rng7Validation.Decimal.EqualTo(5); + rng7Validation.IgnoreBlanks = true; + + ws.CopyTo(ws.Name + " - Copy"); + ws2.CopyTo(ws2.Name + " - Copy"); + + wb.AddWorksheet("Copy From Range 1").FirstCell().Value = ws.RangeUsed(true); + wb.AddWorksheet("Copy From Range 2").FirstCell().Value = ws2.RangeUsed(true); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/Formulas.cs b/ClosedXML_Examples/Misc/Formulas.cs index 8707e4c..729cb9e 100644 --- a/ClosedXML_Examples/Misc/Formulas.cs +++ b/ClosedXML_Examples/Misc/Formulas.cs @@ -1,120 +1,78 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class Formulas : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Formulas"); - - ws.Cell(1, 1).Value = "Num1"; - ws.Cell(1, 2).Value = "Num2"; - ws.Cell(1, 3).Value = "Total"; - ws.Cell(1, 4).Value = "cell.FormulaA1"; - ws.Cell(1, 5).Value = "cell.FormulaR1C1"; - ws.Cell(1, 6).Value = "cell.Value"; - ws.Cell(1, 7).Value = "Are Equal?"; - - ws.Cell(2, 1).Value = 1; - ws.Cell(2, 2).Value = 2; - var cellWithFormulaA1 = ws.Cell(2, 3); - // Use A1 notation - cellWithFormulaA1.FormulaA1 = "=A2+$B$2"; // The equal sign (=) in a formula is optional - ws.Cell(2, 4).Value = cellWithFormulaA1.FormulaA1; - ws.Cell(2, 5).Value = cellWithFormulaA1.FormulaR1C1; - ws.Cell(2, 6).Value = cellWithFormulaA1.Value; - - ws.Cell(3, 1).Value = 1; - ws.Cell(3, 2).Value = 2; - var cellWithFormulaR1C1 = ws.Cell(3, 3); - // Use R1C1 notation - cellWithFormulaR1C1.FormulaR1C1 = "RC[-2]+R3C2"; // The equal sign (=) in a formula is optional - ws.Cell(3, 4).Value = cellWithFormulaR1C1.FormulaA1; - ws.Cell(3, 5).Value = cellWithFormulaR1C1.FormulaR1C1; - ws.Cell(3, 6).Value = cellWithFormulaR1C1.Value; - - ws.Cell(4, 1).Value = "A"; - ws.Cell(4, 2).Value = "B"; - var cellWithStringFormula = ws.Cell(4, 3); - - // Use R1C1 notation - cellWithStringFormula.FormulaR1C1 = "=\"Test\" & RC[-2] & \"R3C2\""; - ws.Cell(4, 4).Value = cellWithStringFormula.FormulaA1; - ws.Cell(4, 5).Value = cellWithStringFormula.FormulaR1C1; - ws.Cell(4, 6).Value = cellWithStringFormula.Value; - - // Setting the formula of a range - var rngData = ws.Range(2, 1, 4, 7); - rngData.LastColumn().FormulaR1C1 = "=IF(RC[-3]=RC[-1],\"Yes\", \"No\")"; - - // Using an array formula: - // Just put the formula between curly braces - ws.Cell("A6").Value = "Array Formula: "; - ws.Cell("B6").FormulaA1 = "{A2+A3}"; - - ws.Range(1, 1, 1, 7).Style.Fill.BackgroundColor = XLColor.Cyan; - ws.Range(1, 1, 1, 7).Style.Font.Bold = true; - ws.Columns().AdjustToContents(); - - // You can also change the reference notation: - wb.ReferenceStyle = XLReferenceStyle.R1C1; - - // And the workbook calculation mode: - wb.CalculateMode = XLCalculateMode.Auto; - - ws.Range("A10").AddToNamed("A10_R1C1_A10_R1C1"); - ws.Cell("A10").Value = 0; - ws.Cell("A11").FormulaA1 = "A2 + A10_R1C1_A10_R1C1"; - ws.Cell("A12").FormulaR1C1 = "R2C1 + A10_R1C1_A10_R1C1"; - ws.Cell("A13").FormulaR1C1 = "=SUM(R[-5]:R[-4])"; - ws.Cell("A14").FormulaA1 = "=SUM(8:9)"; - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class Formulas : IXLExample + { + public virtual void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Formulas"); + + ws.Cell(1, 1).Value = "Num1"; + ws.Cell(1, 2).Value = "Num2"; + ws.Cell(1, 3).Value = "Total"; + ws.Cell(1, 4).Value = "cell.FormulaA1"; + ws.Cell(1, 5).Value = "cell.FormulaR1C1"; + ws.Cell(1, 6).Value = "cell.Value"; + ws.Cell(1, 7).Value = "Are Equal?"; + + ws.Cell(2, 1).Value = 1; + ws.Cell(2, 2).Value = 2; + var cellWithFormulaA1 = ws.Cell(2, 3); + // Use A1 notation + cellWithFormulaA1.FormulaA1 = "=A2+$B$2"; // The equal sign (=) in a formula is optional + ws.Cell(2, 4).Value = cellWithFormulaA1.FormulaA1; + ws.Cell(2, 5).Value = cellWithFormulaA1.FormulaR1C1; + ws.Cell(2, 6).Value = cellWithFormulaA1.Value; + + ws.Cell(3, 1).Value = 1; + ws.Cell(3, 2).Value = 2; + var cellWithFormulaR1C1 = ws.Cell(3, 3); + // Use R1C1 notation + cellWithFormulaR1C1.FormulaR1C1 = "RC[-2]+R3C2"; // The equal sign (=) in a formula is optional + ws.Cell(3, 4).Value = cellWithFormulaR1C1.FormulaA1; + ws.Cell(3, 5).Value = cellWithFormulaR1C1.FormulaR1C1; + ws.Cell(3, 6).Value = cellWithFormulaR1C1.Value; + + ws.Cell(4, 1).Value = "A"; + ws.Cell(4, 2).Value = "B"; + var cellWithStringFormula = ws.Cell(4, 3); + + // Use R1C1 notation + cellWithStringFormula.FormulaR1C1 = "=\"Test\" & RC[-2] & \"R3C2\""; + ws.Cell(4, 4).Value = cellWithStringFormula.FormulaA1; + ws.Cell(4, 5).Value = cellWithStringFormula.FormulaR1C1; + ws.Cell(4, 6).Value = cellWithStringFormula.Value; + + // Setting the formula of a range + var rngData = ws.Range(2, 1, 4, 7); + rngData.LastColumn().FormulaR1C1 = "=IF(RC[-4]=RC[-1],\"Yes\", \"No\")"; + + // Using an array formula: + // Just put the formula between curly braces + ws.Cell("A6").Value = "Array Formula: "; + ws.Cell("B6").FormulaA1 = "{A2+A3}"; + + ws.Range(1, 1, 1, 7).Style.Fill.BackgroundColor = XLColor.Cyan; + ws.Range(1, 1, 1, 7).Style.Font.Bold = true; + ws.Columns().AdjustToContents(); + + // You can also change the reference notation: + wb.ReferenceStyle = XLReferenceStyle.R1C1; + + // And the workbook calculation mode: + wb.CalculateMode = XLCalculateMode.Auto; + + ws.Range("A10").AddToNamed("A10_R1C1_A10_R1C1"); + ws.Cell("A10").Value = 0; + ws.Cell("A11").FormulaA1 = "A2 + A10_R1C1_A10_R1C1"; + ws.Cell("A12").FormulaR1C1 = "R2C1 + A10_R1C1_A10_R1C1"; + ws.Cell("A13").FormulaR1C1 = "=SUM(R[-5]:R[-4])"; + ws.Cell("A14").FormulaA1 = "=SUM(8:9)"; + + wb.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Misc/FormulasWithEvaluation.cs b/ClosedXML_Examples/Misc/FormulasWithEvaluation.cs new file mode 100644 index 0000000..dca890e --- /dev/null +++ b/ClosedXML_Examples/Misc/FormulasWithEvaluation.cs @@ -0,0 +1,16 @@ +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Misc +{ + public class FormulasWithEvaluation : Formulas + { + public override void Create(string filePath) + { + base.Create(filePath); + using (var wb = new XLWorkbook(filePath)) + { + wb.Save(true, true); + } + } + } +} diff --git a/ClosedXML_Examples/Misc/FreezePanes.cs b/ClosedXML_Examples/Misc/FreezePanes.cs index 913738f..2fd9465 100644 --- a/ClosedXML_Examples/Misc/FreezePanes.cs +++ b/ClosedXML_Examples/Misc/FreezePanes.cs @@ -1,72 +1,72 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class FreezePanes : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var wsFreeze = wb.Worksheets.Add("Freeze View"); - - // Freeze rows and columns in one shot - wsFreeze.SheetView.Freeze(3, 3); - - // You can also be more specific on what you want to freeze - // For example: - // wsFreeze.SheetView.FreezeRows(3); - // wsFreeze.SheetView.FreezeColumns(3); - - - ////////////////////////////// - //var wsSplit = wb.Worksheets.Add("Split View"); - //wsSplit.SheetView.SplitRow = 3; - //wsSplit.SheetView.SplitColumn = 3; - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class FreezePanes : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var wsFreeze = wb.Worksheets.Add("Freeze View"); + + // Freeze rows and columns in one shot + wsFreeze.SheetView.Freeze(3, 3); + + // You can also be more specific on what you want to freeze + // For example: + // wsFreeze.SheetView.FreezeRows(3); + // wsFreeze.SheetView.FreezeColumns(3); + + + ////////////////////////////// + //var wsSplit = wb.Worksheets.Add("Split View"); + //wsSplit.SheetView.SplitRow = 3; + //wsSplit.SheetView.SplitColumn = 3; + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/HideSheets.cs b/ClosedXML_Examples/Misc/HideSheets.cs index 8d0b6fd..e4f769f 100644 --- a/ClosedXML_Examples/Misc/HideSheets.cs +++ b/ClosedXML_Examples/Misc/HideSheets.cs @@ -1,63 +1,63 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class HideSheets : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - - wb.Worksheets.Add("First Hidden").Hide(); - wb.Worksheets.Add("Visible"); - wb.Worksheets.Add("Unhidden").Hide().Unhide(); - wb.Worksheets.Add("VeryHidden").Visibility = XLWorksheetVisibility.VeryHidden; - wb.Worksheets.Add("Last Hidden").Hide(); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class HideSheets : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + wb.Worksheets.Add("First Hidden").Hide(); + wb.Worksheets.Add("Visible"); + wb.Worksheets.Add("Unhidden").Hide().Unhide(); + wb.Worksheets.Add("VeryHidden").Visibility = XLWorksheetVisibility.VeryHidden; + wb.Worksheets.Add("Last Hidden").Hide(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/HideUnhide.cs b/ClosedXML_Examples/Misc/HideUnhide.cs index 82fe795..98c3df3 100644 --- a/ClosedXML_Examples/Misc/HideUnhide.cs +++ b/ClosedXML_Examples/Misc/HideUnhide.cs @@ -1,64 +1,64 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class HideUnhide : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Hide Rows Columns"); - - ws.Columns(1, 3).Hide(); - ws.Rows(1, 3).Hide(); - - ws.Column(2).Unhide(); - ws.Row(2).Unhide(); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class HideUnhide : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Hide Rows Columns"); + + ws.Columns(1, 3).Hide(); + ws.Rows(1, 3).Hide(); + + ws.Column(2).Unhide(); + ws.Row(2).Unhide(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/Hyperlinks.cs b/ClosedXML_Examples/Misc/Hyperlinks.cs index 1dca03e..4ce869f 100644 --- a/ClosedXML_Examples/Misc/Hyperlinks.cs +++ b/ClosedXML_Examples/Misc/Hyperlinks.cs @@ -1,128 +1,128 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class Hyperlinks : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Hyperlinks"); - wb.Worksheets.Add("Second Sheet"); - - Int32 ro = 0; - - // You can create a link with pretty much anything you can put on a - // browser: http, ftp, mailto, gopher, news, nntp, etc. - - ws.Cell(++ro, 1).Value = "Link to a web page, no tooltip - Yahoo!"; - ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"http://www.yahoo.com"); - - ws.Cell(++ro, 1).Value = "Link to a web page, with a tooltip - Yahoo!"; - ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"http://www.yahoo.com", "Click to go to Yahoo!"); - - ws.Cell(++ro, 1).Value = "Link to a file - same folder"; - ws.Cell(ro, 1).Hyperlink = new XLHyperlink("Test.xlsx"); - - ws.Cell(++ro, 1).Value = "Link to a file - Absolute"; - ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"D:\Test.xlsx"); - - ws.Cell(++ro, 1).Value = "Link to a file - relative address"; - ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"../Test.xlsx"); - - ws.Cell(++ro, 1).Value = "Link to an address in this worksheet"; - ws.Cell(ro, 1).Hyperlink = new XLHyperlink("B1"); - - ws.Cell(++ro, 1).Value = "Link to an address in another worksheet"; - ws.Cell(ro, 1).Hyperlink = new XLHyperlink("'Second Sheet'!A1"); - - // You can also set the properties of a hyperlink directly: - - ws.Cell(++ro, 1).Value = "Link to a range in this worksheet"; - ws.Cell(ro, 1).Hyperlink.InternalAddress = "B1:C2"; - ws.Cell(ro, 1).Hyperlink.Tooltip = "SquareBox"; - - ws.Cell(++ro, 1).Value = "Link to an email message"; - ws.Cell(ro, 1).Hyperlink.ExternalAddress = new Uri(@"mailto:SantaClaus@NorthPole.com?subject=Presents"); - - // Deleting a hyperlink - ws.Cell(++ro, 1).Value = "This is no longer a link"; - ws.Cell(ro, 1).Hyperlink.InternalAddress = "A1"; - ws.Cell(ro, 1).Hyperlink.Delete(); - - // Setting a hyperlink preserves previous formatting: - ws.Cell(++ro, 1).Value = "Odd looking link"; - ws.Cell(ro, 1).Style.Font.FontColor = XLColor.Red; - ws.Cell(ro, 1).Style.Font.Underline = XLFontUnderlineValues.Double; - ws.Cell(ro, 1).Hyperlink = new XLHyperlink(ws.Range("B1:C2")); - - // Hyperlink via formula - ws.Cell( ++ro, 1 ).SetValue( "Send Email" ) - .SetFormulaA1( "=HYPERLINK(\"mailto:test@test.com\", \"Send Email\")" ) - .Hyperlink = new XLHyperlink( "mailto:test@test.com", "'Send Email'" ); - - // List all hyperlinks in a worksheet: - var hyperlinksInWorksheet = ws.Hyperlinks; - - // List all hyperlinks in a range: - var hyperlinksInRange = ws.Range("A1:A3").Hyperlinks; - - // Clearing a cell with a hyperlink - ws.Cell(++ro, 1).Value = "ERROR!"; - ws.Cell(ro, 1).Hyperlink.InternalAddress = "A1"; - ws.Cell(ro, 1).Clear(); - - // Deleting a cell with a hyperlink - ws.Cell(++ro, 1).Value = "ERROR!"; - ws.Cell(ro, 1).Hyperlink.InternalAddress = "A1"; - ws.Cell(ro, 1).Clear(); - - ws.Columns().AdjustToContents(); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class Hyperlinks : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Hyperlinks"); + wb.Worksheets.Add("Second Sheet"); + + Int32 ro = 0; + + // You can create a link with pretty much anything you can put on a + // browser: http, ftp, mailto, gopher, news, nntp, etc. + + ws.Cell(++ro, 1).Value = "Link to a web page, no tooltip - Yahoo!"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"http://www.yahoo.com"); + + ws.Cell(++ro, 1).Value = "Link to a web page, with a tooltip - Yahoo!"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"http://www.yahoo.com", "Click to go to Yahoo!"); + + ws.Cell(++ro, 1).Value = "Link to a file - same folder"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink("Test.xlsx"); + + ws.Cell(++ro, 1).Value = "Link to a file - Absolute"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"D:\Test.xlsx"); + + ws.Cell(++ro, 1).Value = "Link to a file - relative address"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink(@"../Test.xlsx"); + + ws.Cell(++ro, 1).Value = "Link to an address in this worksheet"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink("B1"); + + ws.Cell(++ro, 1).Value = "Link to an address in another worksheet"; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink("'Second Sheet'!A1"); + + // You can also set the properties of a hyperlink directly: + + ws.Cell(++ro, 1).Value = "Link to a range in this worksheet"; + ws.Cell(ro, 1).Hyperlink.InternalAddress = "B1:C2"; + ws.Cell(ro, 1).Hyperlink.Tooltip = "SquareBox"; + + ws.Cell(++ro, 1).Value = "Link to an email message"; + ws.Cell(ro, 1).Hyperlink.ExternalAddress = new Uri(@"mailto:SantaClaus@NorthPole.com?subject=Presents"); + + // Deleting a hyperlink + ws.Cell(++ro, 1).Value = "This is no longer a link"; + ws.Cell(ro, 1).Hyperlink.InternalAddress = "A1"; + ws.Cell(ro, 1).Hyperlink.Delete(); + + // Setting a hyperlink preserves previous formatting: + ws.Cell(++ro, 1).Value = "Odd looking link"; + ws.Cell(ro, 1).Style.Font.FontColor = XLColor.Red; + ws.Cell(ro, 1).Style.Font.Underline = XLFontUnderlineValues.Double; + ws.Cell(ro, 1).Hyperlink = new XLHyperlink(ws.Range("B1:C2")); + + // Hyperlink via formula + ws.Cell( ++ro, 1 ).SetValue( "Send Email" ) + .SetFormulaA1( "=HYPERLINK(\"mailto:test@test.com\", \"Send Email\")" ) + .Hyperlink = new XLHyperlink( "mailto:test@test.com", "'Send Email'" ); + + // List all hyperlinks in a worksheet: + var hyperlinksInWorksheet = ws.Hyperlinks; + + // List all hyperlinks in a range: + var hyperlinksInRange = ws.Range("A1:A3").Hyperlinks; + + // Clearing a cell with a hyperlink + ws.Cell(++ro, 1).Value = "ERROR!"; + ws.Cell(ro, 1).Hyperlink.InternalAddress = "A1"; + ws.Cell(ro, 1).Clear(); + + // Deleting a cell with a hyperlink + ws.Cell(++ro, 1).Value = "ERROR!"; + ws.Cell(ro, 1).Hyperlink.InternalAddress = "A1"; + ws.Cell(ro, 1).Clear(); + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/InsertingData.cs b/ClosedXML_Examples/Misc/InsertingData.cs index 3877daa..d0ade19 100644 --- a/ClosedXML_Examples/Misc/InsertingData.cs +++ b/ClosedXML_Examples/Misc/InsertingData.cs @@ -1,100 +1,100 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using ClosedXML.Excel; - -namespace ClosedXML_Examples.Misc -{ - public class InsertingData : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Inserting Data"); - - // From a list of strings - var listOfStrings = new List(); - listOfStrings.Add("House"); - listOfStrings.Add("001"); - ws.Cell(1, 1).Value = "From Strings"; - ws.Cell(1, 1).AsRange().AddToNamed("Titles"); - ws.Cell(2, 1).InsertData(listOfStrings); - - // From a list of arrays - var listOfArr = new List(); - listOfArr.Add(new Int32[] { 1, 2, 3 }); - listOfArr.Add(new Int32[] { 1 }); - listOfArr.Add(new Int32[] { 1, 2, 3, 4, 5, 6 }); - ws.Cell(1, 3).Value = "From Arrays"; - ws.Range(1, 3, 1, 8).Merge().AddToNamed("Titles"); - ws.Cell(2, 3).InsertData(listOfArr); - - // From a DataTable - var dataTable = GetTable(); - ws.Cell(6, 1).Value = "From DataTable"; - ws.Range(6, 1, 6, 4).Merge().AddToNamed("Titles"); - ws.Cell(7, 1).InsertData(dataTable.AsEnumerable()); - - // From a query - var list = new List(); - list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St." }); - list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St." }); - list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St." }); - list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." }); - - var people = from p in list - where p.Age >= 21 - select new { p.Name, p.House, p.Age }; - - ws.Cell(6, 6).Value = "From Query"; - ws.Range(6, 6, 6, 8).Merge().AddToNamed("Titles"); - ws.Cell(7, 6).InsertData(people.AsEnumerable()); - - // Prepare the style for the titles - var titlesStyle = wb.Style; - titlesStyle.Font.Bold = true; - titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - titlesStyle.Fill.BackgroundColor = XLColor.Cyan; - - // Format all titles in one shot - wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle; - - ws.Columns().AdjustToContents(); - - wb.SaveAs(filePath); - } - - class Person - { - public String House { get; set; } - public String Name { get; set; } - public Int32 Age { get; set; } - } - - // Private - private DataTable GetTable() - { - - DataTable table = new DataTable(); - table.Columns.Add("Dosage", typeof(int)); - table.Columns.Add("Drug", typeof(string)); - table.Columns.Add("Patient", typeof(string)); - table.Columns.Add("Date", typeof(DateTime)); - - table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); - table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); - table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); - table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); - table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); - return table; - } - // Override - - - #endregion - } -} +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Misc +{ + public class InsertingData : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Inserting Data"); + + // From a list of strings + var listOfStrings = new List(); + listOfStrings.Add("House"); + listOfStrings.Add("001"); + ws.Cell(1, 1).Value = "From Strings"; + ws.Cell(1, 1).AsRange().AddToNamed("Titles"); + ws.Cell(2, 1).InsertData(listOfStrings); + + // From a list of arrays + var listOfArr = new List(); + listOfArr.Add(new Int32[] { 1, 2, 3 }); + listOfArr.Add(new Int32[] { 1 }); + listOfArr.Add(new Int32[] { 1, 2, 3, 4, 5, 6 }); + ws.Cell(1, 3).Value = "From Arrays"; + ws.Range(1, 3, 1, 8).Merge().AddToNamed("Titles"); + ws.Cell(2, 3).InsertData(listOfArr); + + // From a DataTable + var dataTable = GetTable(); + ws.Cell(6, 1).Value = "From DataTable"; + ws.Range(6, 1, 6, 4).Merge().AddToNamed("Titles"); + ws.Cell(7, 1).InsertData(dataTable.AsEnumerable()); + + // From a query + var list = new List(); + list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St." }); + list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St." }); + list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St." }); + list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." }); + + var people = from p in list + where p.Age >= 21 + select new { p.Name, p.House, p.Age }; + + ws.Cell(6, 6).Value = "From Query"; + ws.Range(6, 6, 6, 8).Merge().AddToNamed("Titles"); + ws.Cell(7, 6).InsertData(people.AsEnumerable()); + + // Prepare the style for the titles + var titlesStyle = wb.Style; + titlesStyle.Font.Bold = true; + titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + titlesStyle.Fill.BackgroundColor = XLColor.Cyan; + + // Format all titles in one shot + wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle; + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + class Person + { + public String House { get; set; } + public String Name { get; set; } + public Int32 Age { get; set; } + } + + // Private + private DataTable GetTable() + { + + DataTable table = new DataTable(); + table.Columns.Add("Dosage", typeof(int)); + table.Columns.Add("Drug", typeof(string)); + table.Columns.Add("Patient", typeof(string)); + table.Columns.Add("Date", typeof(DateTime)); + + table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); + table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); + table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); + table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); + table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); + return table; + } + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/InsertingTables.cs b/ClosedXML_Examples/Misc/InsertingTables.cs index 6da50c6..50be801 100644 --- a/ClosedXML_Examples/Misc/InsertingTables.cs +++ b/ClosedXML_Examples/Misc/InsertingTables.cs @@ -1,102 +1,102 @@ -using ClosedXML.Attributes; -using ClosedXML.Excel; -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; - -namespace ClosedXML_Examples.Misc -{ - public class InsertingTables : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Inserting Tables"); - - // From a list of strings - var listOfStrings = new List(); - listOfStrings.Add("House"); - listOfStrings.Add("Car"); - ws.Cell(1, 1).Value = "From Strings"; - ws.Cell(1, 1).AsRange().AddToNamed("Titles"); - ws.Cell(2, 1).InsertTable(listOfStrings); - - // From a list of arrays - var listOfArr = new List(); - listOfArr.Add(new Int32[] { 1, 2, 3 }); - listOfArr.Add(new Int32[] { 1 }); - listOfArr.Add(new Int32[] { 1, 2, 3, 4, 5, 6 }); - ws.Cell(1, 3).Value = "From Arrays"; - ws.Range(1, 3, 1, 8).Merge().AddToNamed("Titles"); - ws.Cell(2, 3).InsertTable(listOfArr); - - // From a DataTable - var dataTable = GetTable(); - ws.Cell(7, 1).Value = "From DataTable"; - ws.Range(7, 1, 7, 4).Merge().AddToNamed("Titles"); - ws.Cell(8, 1).InsertTable(dataTable.AsEnumerable()); - - // From a query - var list = new List(); - list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St." }); - list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St." }); - list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St." }); - list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." }); - - var people = from p in list - where p.Age >= 21 - select p; - - ws.Cell(7, 6).Value = "From Query"; - ws.Range(7, 6, 7, 8).Merge().AddToNamed("Titles"); - ws.Cell(8, 6).InsertTable(people.AsEnumerable()); - - // Prepare the style for the titles - var titlesStyle = wb.Style; - titlesStyle.Font.Bold = true; - titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - titlesStyle.Fill.BackgroundColor = XLColor.Cyan; - - // Format all titles in one shot - wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle; - - ws.Columns().AdjustToContents(); - - wb.SaveAs(filePath); - } - - private class Person - { - [XLColumn(Header = "House Street")] - public String House { get; set; } - - public String Name { get; set; } - public Int32 Age { get; set; } - } - - // Private - private DataTable GetTable() - { - DataTable table = new DataTable(); - table.Columns.Add("Dosage", typeof(int)); - table.Columns.Add("Drug", typeof(string)); - table.Columns.Add("Patient", typeof(string)); - table.Columns.Add("Date", typeof(DateTime)); - - table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); - table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); - table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); - table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); - table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); - return table; - } - - // Override - - #endregion Methods - } -} +using ClosedXML.Attributes; +using ClosedXML.Excel; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; + +namespace ClosedXML_Examples.Misc +{ + public class InsertingTables : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Inserting Tables"); + + // From a list of strings + var listOfStrings = new List(); + listOfStrings.Add("House"); + listOfStrings.Add("Car"); + ws.Cell(1, 1).Value = "From Strings"; + ws.Cell(1, 1).AsRange().AddToNamed("Titles"); + ws.Cell(2, 1).InsertTable(listOfStrings); + + // From a list of arrays + var listOfArr = new List(); + listOfArr.Add(new Int32[] { 1, 2, 3 }); + listOfArr.Add(new Int32[] { 1 }); + listOfArr.Add(new Int32[] { 1, 2, 3, 4, 5, 6 }); + ws.Cell(1, 3).Value = "From Arrays"; + ws.Range(1, 3, 1, 8).Merge().AddToNamed("Titles"); + ws.Cell(2, 3).InsertTable(listOfArr); + + // From a DataTable + var dataTable = GetTable(); + ws.Cell(7, 1).Value = "From DataTable"; + ws.Range(7, 1, 7, 4).Merge().AddToNamed("Titles"); + ws.Cell(8, 1).InsertTable(dataTable.AsEnumerable()); + + // From a query + var list = new List(); + list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St." }); + list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St." }); + list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St." }); + list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." }); + + var people = from p in list + where p.Age >= 21 + select p; + + ws.Cell(7, 6).Value = "From Query"; + ws.Range(7, 6, 7, 8).Merge().AddToNamed("Titles"); + ws.Cell(8, 6).InsertTable(people.AsEnumerable()); + + // Prepare the style for the titles + var titlesStyle = wb.Style; + titlesStyle.Font.Bold = true; + titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + titlesStyle.Fill.BackgroundColor = XLColor.Cyan; + + // Format all titles in one shot + wb.NamedRanges.NamedRange("Titles").Ranges.Style = titlesStyle; + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + private class Person + { + [XLColumn(Header = "House Street")] + public String House { get; set; } + + public String Name { get; set; } + public Int32 Age { get; set; } + } + + // Private + private DataTable GetTable() + { + DataTable table = new DataTable(); + table.Columns.Add("Dosage", typeof(int)); + table.Columns.Add("Drug", typeof(string)); + table.Columns.Add("Patient", typeof(string)); + table.Columns.Add("Date", typeof(DateTime)); + + table.Rows.Add(25, "Indocin", "David", new DateTime(2000, 1, 1)); + table.Rows.Add(50, "Enebrel", "Sam", new DateTime(2000, 1, 2)); + table.Rows.Add(10, "Hydralazine", "Christoff", new DateTime(2000, 1, 3)); + table.Rows.Add(21, "Combivent", "Janet", new DateTime(2000, 1, 4)); + table.Rows.Add(100, "Dilantin", "Melanie", new DateTime(2000, 1, 5)); + return table; + } + + // Override + + #endregion Methods + } +} diff --git a/ClosedXML_Examples/Misc/LambdaExpressions.cs b/ClosedXML_Examples/Misc/LambdaExpressions.cs index 325cf58..7b5e4f3 100644 --- a/ClosedXML_Examples/Misc/LambdaExpressions.cs +++ b/ClosedXML_Examples/Misc/LambdaExpressions.cs @@ -1,56 +1,56 @@ -using System.IO; -using System.Linq; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class LambdaExpressions : IXLExample - { - public void Create(string filePath) - { - - string tempFile = ExampleHelper.GetTempFilePath(filePath); - try - { - new BasicTable().Create(tempFile); - var workbook = new XLWorkbook(tempFile); - var ws = workbook.Worksheet(1); - - // Define a range with the data - var firstDataCell = ws.Cell("B4"); - var lastDataCell = ws.LastCellUsed(); - var rngData = ws.Range(firstDataCell.Address, lastDataCell.Address); - - // Delete all rows where Outcast = false (the 3rd column) - rngData.Rows() // From all rows - .Where(r => !r.Cell(3).GetBoolean()) // where the 3rd cell of each row is false - .ForEach(r => r.Delete()); // delete the row and shift the cells up (the default for rows in a range) - - //// Put a light gray background to all text cells - //rngData.Cells() // From all cells - // .Where(c => c.DataType == XLCellValues.Text) // where the data type is Text - // .ForEach(c => c.Style.Fill.BackgroundColor = XLColor.LightGray); // Fill with a light gray - - var cells = rngData.Cells(); - var filtered = cells.Where(c => c.DataType == XLCellValues.Text); - var list = filtered.ToList(); - foreach (var c in list) - { - c.Style.Fill.BackgroundColor = XLColor.LightGray; - } - - // Put a thick border to the bottom of the table (we may have deleted the bottom cells with the border) - rngData.LastRow().Style.Border.BottomBorder = XLBorderStyleValues.Thick; - - workbook.SaveAs(filePath); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - } +using System.IO; +using System.Linq; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class LambdaExpressions : IXLExample + { + public void Create(string filePath) + { + + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + var ws = workbook.Worksheet(1); + + // Define a range with the data + var firstDataCell = ws.Cell("B4"); + var lastDataCell = ws.LastCellUsed(); + var rngData = ws.Range(firstDataCell.Address, lastDataCell.Address); + + // Delete all rows where Outcast = false (the 3rd column) + rngData.Rows() // From all rows + .Where(r => !r.Cell(3).GetBoolean()) // where the 3rd cell of each row is false + .ForEach(r => r.Delete()); // delete the row and shift the cells up (the default for rows in a range) + + //// Put a light gray background to all text cells + //rngData.Cells() // From all cells + // .Where(c => c.DataType == XLCellValues.Text) // where the data type is Text + // .ForEach(c => c.Style.Fill.BackgroundColor = XLColor.LightGray); // Fill with a light gray + + var cells = rngData.Cells(); + var filtered = cells.Where(c => c.DataType == XLCellValues.Text); + var list = filtered.ToList(); + foreach (var c in list) + { + c.Style.Fill.BackgroundColor = XLColor.LightGray; + } + + // Put a thick border to the bottom of the table (we may have deleted the bottom cells with the border) + rngData.LastRow().Style.Border.BottomBorder = XLBorderStyleValues.Thick; + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Misc/MergeCells.cs b/ClosedXML_Examples/Misc/MergeCells.cs index ed9456f..dfe542b 100644 --- a/ClosedXML_Examples/Misc/MergeCells.cs +++ b/ClosedXML_Examples/Misc/MergeCells.cs @@ -1,88 +1,88 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class MergeCells : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Constructors - - // Public - - - // Private - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Merge Cells"); - - // Merge a row - ws.Cell("B2").Value = "Merged Row(1) of Range (B2:D3)"; - ws.Range("B2:D3").Row(1).Merge(); - - // Merge a column - ws.Cell("F2").Value = "Merged Column(1) of Range (F2:G8)"; - ws.Cell("F2").Style.Alignment.WrapText = true; - ws.Range("F2:G8").Column(1).Merge(); - - // Merge a range - ws.Cell("B4").Value = "Merged Range (B4:D6)"; - ws.Cell("B4").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - ws.Cell("B4").Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - ws.Range("B4:D6").Merge(); - - // Unmerging a range... - ws.Cell("B8").Value = "Unmerged"; - ws.Range("B8:D8").Merge(); - ws.Range("B8:D8").Unmerge(); - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class MergeCells : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Merge Cells"); + + // Merge a row + ws.Cell("B2").Value = "Merged Row(1) of Range (B2:D3)"; + ws.Range("B2:D3").Row(1).Merge(); + + // Merge a column + ws.Cell("F2").Value = "Merged Column(1) of Range (F2:G8)"; + ws.Cell("F2").Style.Alignment.WrapText = true; + ws.Range("F2:G8").Column(1).Merge(); + + // Merge a range + ws.Cell("B4").Value = "Merged Range (B4:D6)"; + ws.Cell("B4").Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + ws.Cell("B4").Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + ws.Range("B4:D6").Merge(); + + // Unmerging a range... + ws.Cell("B8").Value = "Unmerged"; + ws.Range("B8:D8").Merge(); + ws.Range("B8:D8").Unmerge(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/MergeMoves.cs b/ClosedXML_Examples/Misc/MergeMoves.cs index d2d5f46..a5be4ce 100644 --- a/ClosedXML_Examples/Misc/MergeMoves.cs +++ b/ClosedXML_Examples/Misc/MergeMoves.cs @@ -1,53 +1,53 @@ -using System.IO; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class MergeMoves : IXLExample - { - - public void Create(string filePath) - { - string tempFile = ExampleHelper.GetTempFilePath(filePath); - try - { - new MergeCells().Create(tempFile); - var workbook = new XLWorkbook(tempFile); - - var ws = workbook.Worksheet(1); - - ws.Range("B1:F1").InsertRowsBelow(1); - ws.Range("A3:A9").InsertColumnsAfter(1); - ws.Row(1).Delete(); - ws.Column(1).Delete(); - - ws.Range("E8:E9").InsertColumnsAfter(1); - ws.Range("F2:F8").Merge(); - ws.Range("E3:E4").InsertColumnsAfter(1); - ws.Range("F2:F8").Merge(); - ws.Range("E1:E2").InsertColumnsAfter(1); - ws.Range("G2:G8").Merge(); - ws.Range("E1:E2").Delete(XLShiftDeletedCells.ShiftCellsLeft); - - ws.Range("D3:E3").InsertRowsBelow(1); - ws.Range("A1:B1").InsertRowsBelow(1); - ws.Range("B3:D3").Merge(); - ws.Range("A1:B1").Delete(XLShiftDeletedCells.ShiftCellsUp); - - ws.Range("B8:D8").Merge(); - ws.Range("D8:D9").Clear(); - - workbook.SaveAs(filePath); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - - } -} +using System.IO; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class MergeMoves : IXLExample + { + + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new MergeCells().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + + var ws = workbook.Worksheet(1); + + ws.Range("B1:F1").InsertRowsBelow(1); + ws.Range("A3:A9").InsertColumnsAfter(1); + ws.Row(1).Delete(); + ws.Column(1).Delete(); + + ws.Range("E8:E9").InsertColumnsAfter(1); + ws.Range("F2:F8").Merge(); + ws.Range("E3:E4").InsertColumnsAfter(1); + ws.Range("F2:F8").Merge(); + ws.Range("E1:E2").InsertColumnsAfter(1); + ws.Range("G2:G8").Merge(); + ws.Range("E1:E2").Delete(XLShiftDeletedCells.ShiftCellsLeft); + + ws.Range("D3:E3").InsertRowsBelow(1); + ws.Range("A1:B1").InsertRowsBelow(1); + ws.Range("B3:D3").Merge(); + ws.Range("A1:B1").Delete(XLShiftDeletedCells.ShiftCellsUp); + + ws.Range("B8:D8").Merge(); + ws.Range("D8:D9").Clear(); + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + + } +} diff --git a/ClosedXML_Examples/Misc/MultipleSheets.cs b/ClosedXML_Examples/Misc/MultipleSheets.cs index 630c139..b0217c3 100644 --- a/ClosedXML_Examples/Misc/MultipleSheets.cs +++ b/ClosedXML_Examples/Misc/MultipleSheets.cs @@ -1,30 +1,30 @@ -using System.Linq; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class MultipleSheets : IXLExample - { - - public void Create(string filePath) - { - var wb = new XLWorkbook(); - foreach (var wsNum in Enumerable.Range(1, 5)) - { - wb.Worksheets.Add("Original Pos. is " + wsNum.ToString()); - } - - // Move first worksheet to the last position - wb.Worksheet(1).Position = wb.Worksheets.Count() + 1; - - // Delete worksheet on position 4 (in this case it's where original position = 5) - wb.Worksheet(4).Delete(); - - // Swap sheets in positions 1 and 2 - wb.Worksheet(2).Position = 1; - - wb.SaveAs(filePath); - } - } -} +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class MultipleSheets : IXLExample + { + + public void Create(string filePath) + { + var wb = new XLWorkbook(); + foreach (var wsNum in Enumerable.Range(1, 5)) + { + wb.Worksheets.Add("Original Pos. is " + wsNum.ToString()); + } + + // Move first worksheet to the last position + wb.Worksheet(1).Position = wb.Worksheets.Count() + 1; + + // Delete worksheet on position 4 (in this case it's where original position = 5) + wb.Worksheet(4).Delete(); + + // Swap sheets in positions 1 and 2 + wb.Worksheet(2).Position = 1; + + wb.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Misc/Outline.cs b/ClosedXML_Examples/Misc/Outline.cs index 0d7dd21..f920a5e 100644 --- a/ClosedXML_Examples/Misc/Outline.cs +++ b/ClosedXML_Examples/Misc/Outline.cs @@ -1,86 +1,86 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class Outline : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Outline"); - - ws.Outline.SummaryHLocation = XLOutlineSummaryHLocation.Right; - ws.Columns(2, 6).Group(); // Create an outline (level 1) for columns 2-6 - ws.Columns(2, 4).Group(); // Create an outline (level 2) for columns 2-4 - ws.Column(2).Ungroup(true); // Remove column 2 from all outlines - - ws.Outline.SummaryVLocation = XLOutlineSummaryVLocation.Bottom; - ws.Rows(1, 5).Group(); // Create an outline (level 1) for rows 1-5 - ws.Rows(1, 4).Group(); // Create an outline (level 2) for rows 1-4 - ws.Rows(1, 4).Collapse(); // Collapse rows 1-4 - ws.Rows(1, 2).Group(); // Create an outline (level 3) for rows 1-2 - ws.Rows(1, 2).Ungroup(); // Ungroup rows 1-2 from their last outline - - // You can also Collapse/Expand specific outline levels - // - // ws.CollapseRows(Int32 outlineLevel) - // ws.CollapseColumns(Int32 outlineLevel) - // - // ws.ExpandRows(Int32 outlineLevel) - // ws.ExpandColumns(Int32 outlineLevel) - - // And you can also Collapse/Expand ALL outline levels in one shot - // - // ws.CollapseRows() - // ws.CollapseColumns() - // - // ws.ExpandRows() - // ws.ExpandColumns() - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class Outline : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Outline"); + + ws.Outline.SummaryHLocation = XLOutlineSummaryHLocation.Right; + ws.Columns(2, 6).Group(); // Create an outline (level 1) for columns 2-6 + ws.Columns(2, 4).Group(); // Create an outline (level 2) for columns 2-4 + ws.Column(2).Ungroup(true); // Remove column 2 from all outlines + + ws.Outline.SummaryVLocation = XLOutlineSummaryVLocation.Bottom; + ws.Rows(1, 5).Group(); // Create an outline (level 1) for rows 1-5 + ws.Rows(1, 4).Group(); // Create an outline (level 2) for rows 1-4 + ws.Rows(1, 4).Collapse(); // Collapse rows 1-4 + ws.Rows(1, 2).Group(); // Create an outline (level 3) for rows 1-2 + ws.Rows(1, 2).Ungroup(); // Ungroup rows 1-2 from their last outline + + // You can also Collapse/Expand specific outline levels + // + // ws.CollapseRows(Int32 outlineLevel) + // ws.CollapseColumns(Int32 outlineLevel) + // + // ws.ExpandRows(Int32 outlineLevel) + // ws.ExpandColumns(Int32 outlineLevel) + + // And you can also Collapse/Expand ALL outline levels in one shot + // + // ws.CollapseRows() + // ws.CollapseColumns() + // + // ws.ExpandRows() + // ws.ExpandColumns() + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/RightToLeft.cs b/ClosedXML_Examples/Misc/RightToLeft.cs index c9a5fa8..5137fec 100644 --- a/ClosedXML_Examples/Misc/RightToLeft.cs +++ b/ClosedXML_Examples/Misc/RightToLeft.cs @@ -1,4 +1,4 @@ -using ClosedXML.Excel; +using ClosedXML.Excel; using System; namespace ClosedXML_Examples.Misc diff --git a/ClosedXML_Examples/Misc/SheetProtection.cs b/ClosedXML_Examples/Misc/SheetProtection.cs index 9ff9e3e..fdb64ad 100644 --- a/ClosedXML_Examples/Misc/SheetProtection.cs +++ b/ClosedXML_Examples/Misc/SheetProtection.cs @@ -1,92 +1,92 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class SheetProtection : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Protected No-Password"); - - ws.Protect() // On this sheet we will only allow: - .SetFormatCells() // Cell Formatting - .SetInsertColumns() // Inserting Columns - .SetDeleteColumns() // Deleting Columns - .SetDeleteRows(); // Deleting Rows - - ws.Cell("A1").SetValue("Locked, No Hidden (Default):").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); - ws.Cell("B1").Style - .Border.SetOutsideBorder(XLBorderStyleValues.Medium); - - ws.Cell("A2").SetValue("Locked, Hidden:").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); - ws.Cell("B2").Style - .Protection.SetHidden() - .Border.SetOutsideBorder(XLBorderStyleValues.Medium); - - ws.Cell("A3").SetValue("Not Locked, Hidden:").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); - ws.Cell("B3").Style - .Protection.SetLocked(false) - .Protection.SetHidden() - .Border.SetOutsideBorder(XLBorderStyleValues.Medium); - - ws.Cell("A4").SetValue("Not Locked, Not Hidden:").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); - ws.Cell("B4").Style - .Protection.SetLocked(false) - .Border.SetOutsideBorder(XLBorderStyleValues.Medium); - - ws.Columns().AdjustToContents(); - - // Protect a sheet with a password - var protectedSheet = wb.Worksheets.Add("Protected Password = 123"); - var protection = protectedSheet.Protect("123"); - protection.InsertRows = true; - protection.InsertColumns = true; - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class SheetProtection : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Protected No-Password"); + + ws.Protect() // On this sheet we will only allow: + .SetFormatCells() // Cell Formatting + .SetInsertColumns() // Inserting Columns + .SetDeleteColumns() // Deleting Columns + .SetDeleteRows(); // Deleting Rows + + ws.Cell("A1").SetValue("Locked, No Hidden (Default):").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); + ws.Cell("B1").Style + .Border.SetOutsideBorder(XLBorderStyleValues.Medium); + + ws.Cell("A2").SetValue("Locked, Hidden:").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); + ws.Cell("B2").Style + .Protection.SetHidden() + .Border.SetOutsideBorder(XLBorderStyleValues.Medium); + + ws.Cell("A3").SetValue("Not Locked, Hidden:").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); + ws.Cell("B3").Style + .Protection.SetLocked(false) + .Protection.SetHidden() + .Border.SetOutsideBorder(XLBorderStyleValues.Medium); + + ws.Cell("A4").SetValue("Not Locked, Not Hidden:").Style.Font.SetBold().Fill.SetBackgroundColor(XLColor.Cyan); + ws.Cell("B4").Style + .Protection.SetLocked(false) + .Border.SetOutsideBorder(XLBorderStyleValues.Medium); + + ws.Columns().AdjustToContents(); + + // Protect a sheet with a password + var protectedSheet = wb.Worksheets.Add("Protected Password = 123"); + var protection = protectedSheet.Protect("123"); + protection.InsertRows = true; + protection.InsertColumns = true; + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/SheetViews.cs b/ClosedXML_Examples/Misc/SheetViews.cs index 70f9b5c..0a18706 100644 --- a/ClosedXML_Examples/Misc/SheetViews.cs +++ b/ClosedXML_Examples/Misc/SheetViews.cs @@ -1,4 +1,4 @@ -using ClosedXML.Excel; +using ClosedXML.Excel; using System; using System.Collections.Generic; using System.Linq; diff --git a/ClosedXML_Examples/Misc/ShiftingFormulas.cs b/ClosedXML_Examples/Misc/ShiftingFormulas.cs index f54aeb3..63c636f 100644 --- a/ClosedXML_Examples/Misc/ShiftingFormulas.cs +++ b/ClosedXML_Examples/Misc/ShiftingFormulas.cs @@ -1,93 +1,93 @@ -using System; -using System.Linq; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class ShiftingFormulas : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Shifting Formulas"); - ws.Cell("B2").Value = 5; - ws.Cell("B3").Value = 6; - ws.Cell("C2").Value = 1; - ws.Cell("C3").Value = 2; - ws.Cell("A4").Value = "Sum:"; - ws.Range("B4:C4").FormulaR1C1 = "Sum(R[-2]C:R[-1]C)"; - ws.Range("B4:C4").AddToNamed("WorkbookB4C4"); - ws.Range("B4:C4").AddToNamed("WorksheetB4C4", XLScope.Worksheet); - ws.Cell("E2").Value = "Avg:"; - - ws.Cell("F2").FormulaA1 = "Average(B2:C3)"; - ws.Ranges("A4,E2").Style - .Font.SetBold() - .Fill.SetBackgroundColor(XLColor.CyanProcess); - - var ws2 = wb.Worksheets.Add("WS2"); - ws2.Cell(1, 1).FormulaA1 = "='Shifting Formulas'!B2"; - ws2.Cell(1, 2).Value = ws2.Cell(1, 1).Value; - ws2.Cell(2, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:$C$3)"; - ws2.Cell(3, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:$C3)"; - ws2.Cell(4, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:C3)"; - ws2.Cell(5, 1).FormulaA1 = "Average('Shifting Formulas'!$B2:C3)"; - ws2.Cell(6, 1).FormulaA1 = "Average('Shifting Formulas'!B2:C3)"; - ws2.Cell(7, 1).FormulaA1 = "Average('Shifting Formulas'!B2:C$3)"; - ws2.Cell(8, 1).FormulaA1 = "Average('Shifting Formulas'!B2:$C$3)"; - ws2.Cell(9, 1).FormulaA1 = "Average('Shifting Formulas'!B$2:$C$3)"; - - var dataGrid = ws.Range("B2:D3"); - ws.Row(1).InsertRowsAbove(1); - var newRow = dataGrid.LastRow().InsertRowsAbove(1).First(); - newRow.Value = 1; - dataGrid.LastColumn().FormulaR1C1 = String.Format("SUM(RC[-{0}]:RC[-1])", dataGrid.ColumnCount() - 1); - ws.Cell(1, 1).InsertCellsBelow(1); - ws.Column(1).InsertColumnsBefore(1); - ws.Row(4).Delete(); - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class ShiftingFormulas : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Shifting Formulas"); + ws.Cell("B2").Value = 5; + ws.Cell("B3").Value = 6; + ws.Cell("C2").Value = 1; + ws.Cell("C3").Value = 2; + ws.Cell("A4").Value = "Sum:"; + ws.Range("B4:C4").FormulaR1C1 = "Sum(R[-2]C:R[-1]C)"; + ws.Range("B4:C4").AddToNamed("WorkbookB4C4"); + ws.Range("B4:C4").AddToNamed("WorksheetB4C4", XLScope.Worksheet); + ws.Cell("E2").Value = "Avg:"; + + ws.Cell("F2").FormulaA1 = "Average(B2:C3)"; + ws.Ranges("A4,E2").Style + .Font.SetBold() + .Fill.SetBackgroundColor(XLColor.CyanProcess); + + var ws2 = wb.Worksheets.Add("WS2"); + ws2.Cell(1, 1).FormulaA1 = "='Shifting Formulas'!B2"; + ws2.Cell(1, 2).Value = ws2.Cell(1, 1).Value; + ws2.Cell(2, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:$C$3)"; + ws2.Cell(3, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:$C3)"; + ws2.Cell(4, 1).FormulaA1 = "Average('Shifting Formulas'!$B$2:C3)"; + ws2.Cell(5, 1).FormulaA1 = "Average('Shifting Formulas'!$B2:C3)"; + ws2.Cell(6, 1).FormulaA1 = "Average('Shifting Formulas'!B2:C3)"; + ws2.Cell(7, 1).FormulaA1 = "Average('Shifting Formulas'!B2:C$3)"; + ws2.Cell(8, 1).FormulaA1 = "Average('Shifting Formulas'!B2:$C$3)"; + ws2.Cell(9, 1).FormulaA1 = "Average('Shifting Formulas'!B$2:$C$3)"; + + var dataGrid = ws.Range("B2:D3"); + ws.Row(1).InsertRowsAbove(1); + var newRow = dataGrid.LastRow().InsertRowsAbove(1).First(); + newRow.Value = 1; + dataGrid.LastColumn().FormulaR1C1 = String.Format("SUM(RC[-{0}]:RC[-1])", dataGrid.ColumnCount() - 1); + ws.Cell(1, 1).InsertCellsBelow(1); + ws.Column(1).InsertColumnsBefore(1); + ws.Row(4).Delete(); + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/ShowCase.cs b/ClosedXML_Examples/Misc/ShowCase.cs index c8edc32..63d92b3 100644 --- a/ClosedXML_Examples/Misc/ShowCase.cs +++ b/ClosedXML_Examples/Misc/ShowCase.cs @@ -1,105 +1,105 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples -{ - public class ShowCase : 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").SetValue("Dagny"); // Another way to set the value - //Last Names - ws.Cell("C3").Value = "LName"; - ws.Cell("C4").Value = "Galt"; - ws.Cell("C5").Value = "Rearden"; - ws.Cell("C6").SetValue("Taggart"); // Another way to set the value - - //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").SetValue(false); // Another way to set the value - //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").SetValue(new DateTime(1921, 12, 15)); // Another way to set the value - //Income - ws.Cell("F3").Value = "Income"; - ws.Cell("F4").Value = 2000; - ws.Cell("F5").Value = 40000; - ws.Cell("F6").SetValue(10000); // Another way to set the value - - //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"; - - //Format title cell in one shot - rngTable.Cell(1, 1).Style - .Font.SetBold() - .Fill.SetBackgroundColor(XLColor.CornflowerBlue) - .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center); - - //Merge title cells - rngTable.FirstRow().Merge(); // We could've also used: rngTable.Range("A1:E1").Merge() or rngTable.Row(1).Merge() - - //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.Font.FontColor = XLColor.DarkBlue; - rngHeaders.Style.Fill.BackgroundColor = XLColor.Aqua; - - // Create an Excel table with the data portion - var rngData = ws.Range("B3:F6"); - var excelTable = rngData.CreateTable(); - - // Add the totals row - excelTable.ShowTotalsRow = true; - // Put the average on the field "Income" - // Notice how we're calling the cell by the column name - excelTable.Field("Income").TotalsRowFunction = XLTotalsRowFunction.Average; - // Put a label on the totals cell of the field "DOB" - excelTable.Field("DOB").TotalsRowLabel = "Average:"; - - //Add thick borders to the contents of our spreadsheet - ws.RangeUsed().Style.Border.OutsideBorder = XLBorderStyleValues.Thick; - - // You can also specify the border for each side with: - // contents.FirstColumn().Style.Border.LeftBorder = XLBorderStyleValues.Thick; - // contents.LastColumn().Style.Border.RightBorder = XLBorderStyleValues.Thick; - // contents.FirstRow().Style.Border.TopBorder = XLBorderStyleValues.Thick; - // contents.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 ShowCase : 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").SetValue("Dagny"); // Another way to set the value + //Last Names + ws.Cell("C3").Value = "LName"; + ws.Cell("C4").Value = "Galt"; + ws.Cell("C5").Value = "Rearden"; + ws.Cell("C6").SetValue("Taggart"); // Another way to set the value + + //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").SetValue(false); // Another way to set the value + //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").SetValue(new DateTime(1921, 12, 15)); // Another way to set the value + //Income + ws.Cell("F3").Value = "Income"; + ws.Cell("F4").Value = 2000; + ws.Cell("F5").Value = 40000; + ws.Cell("F6").SetValue(10000); // Another way to set the value + + //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"; + + //Format title cell in one shot + rngTable.Cell(1, 1).Style + .Font.SetBold() + .Fill.SetBackgroundColor(XLColor.CornflowerBlue) + .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center); + + //Merge title cells + rngTable.FirstRow().Merge(); // We could've also used: rngTable.Range("A1:E1").Merge() or rngTable.Row(1).Merge() + + //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.Font.FontColor = XLColor.DarkBlue; + rngHeaders.Style.Fill.BackgroundColor = XLColor.Aqua; + + // Create an Excel table with the data portion + var rngData = ws.Range("B3:F6"); + var excelTable = rngData.CreateTable(); + + // Add the totals row + excelTable.ShowTotalsRow = true; + // Put the average on the field "Income" + // Notice how we're calling the cell by the column name + excelTable.Field("Income").TotalsRowFunction = XLTotalsRowFunction.Average; + // Put a label on the totals cell of the field "DOB" + excelTable.Field("DOB").TotalsRowLabel = "Average:"; + + //Add thick borders to the contents of our spreadsheet + ws.RangeUsed().Style.Border.OutsideBorder = XLBorderStyleValues.Thick; + + // You can also specify the border for each side with: + // contents.FirstColumn().Style.Border.LeftBorder = XLBorderStyleValues.Thick; + // contents.LastColumn().Style.Border.RightBorder = XLBorderStyleValues.Thick; + // contents.FirstRow().Style.Border.TopBorder = XLBorderStyleValues.Thick; + // contents.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/Misc/TabColors.cs b/ClosedXML_Examples/Misc/TabColors.cs index 19f1664..15222b9 100644 --- a/ClosedXML_Examples/Misc/TabColors.cs +++ b/ClosedXML_Examples/Misc/TabColors.cs @@ -1,67 +1,67 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class TabColors : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - - var wsRed = wb.Worksheets.Add("Red").SetTabColor(XLColor.Red); - - var wsAccent3 = wb.Worksheets.Add("Accent3").SetTabColor(XLColor.FromTheme(XLThemeColor.Accent3)); - - var wsIndexed = wb.Worksheets.Add("Indexed"); - wsIndexed.TabColor = XLColor.FromIndex(24); - - var wsArgb = wb.Worksheets.Add("Argb"); - wsArgb.TabColor = XLColor.FromArgb(23, 23, 23); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class TabColors : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + var wsRed = wb.Worksheets.Add("Red").SetTabColor(XLColor.Red); + + var wsAccent3 = wb.Worksheets.Add("Accent3").SetTabColor(XLColor.FromTheme(XLThemeColor.Accent3)); + + var wsIndexed = wb.Worksheets.Add("Indexed"); + wsIndexed.TabColor = XLColor.FromIndex(24); + + var wsArgb = wb.Worksheets.Add("Argb"); + wsArgb.TabColor = XLColor.FromArgb(23, 23, 23); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/WorkbookProperties.cs b/ClosedXML_Examples/Misc/WorkbookProperties.cs index 3a32bcf..03a7426 100644 --- a/ClosedXML_Examples/Misc/WorkbookProperties.cs +++ b/ClosedXML_Examples/Misc/WorkbookProperties.cs @@ -1,75 +1,75 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class WorkbookProperties : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Workbook Properties"); - - wb.Properties.Author = "theAuthor"; - wb.Properties.Title = "theTitle"; - wb.Properties.Subject = "theSubject"; - wb.Properties.Category = "theCategory"; - wb.Properties.Keywords = "theKeywords"; - wb.Properties.Comments = "theComments"; - wb.Properties.Status = "theStatus"; - wb.Properties.LastModifiedBy = "theLastModifiedBy"; - wb.Properties.Company = "theCompany"; - wb.Properties.Manager = "theManager"; - - // Creating/Using custom properties - wb.CustomProperties.Add("theText", "XXX"); - wb.CustomProperties.Add("theDate", new DateTime(2011, 1, 1, 17, 0, 0, DateTimeKind.Utc)); // Use UTC to make sure test can be run in any time zone - wb.CustomProperties.Add("theNumber", 123.456); - wb.CustomProperties.Add("theBoolean", true); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class WorkbookProperties : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Workbook Properties"); + + wb.Properties.Author = "theAuthor"; + wb.Properties.Title = "theTitle"; + wb.Properties.Subject = "theSubject"; + wb.Properties.Category = "theCategory"; + wb.Properties.Keywords = "theKeywords"; + wb.Properties.Comments = "theComments"; + wb.Properties.Status = "theStatus"; + wb.Properties.LastModifiedBy = "theLastModifiedBy"; + wb.Properties.Company = "theCompany"; + wb.Properties.Manager = "theManager"; + + // Creating/Using custom properties + wb.CustomProperties.Add("theText", "XXX"); + wb.CustomProperties.Add("theDate", new DateTime(2011, 1, 1, 17, 0, 0, DateTimeKind.Utc)); // Use UTC to make sure test can be run in any time zone + wb.CustomProperties.Add("theNumber", 123.456); + wb.CustomProperties.Add("theBoolean", true); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Misc/WorkbookProtection.cs b/ClosedXML_Examples/Misc/WorkbookProtection.cs new file mode 100644 index 0000000..0bd0122 --- /dev/null +++ b/ClosedXML_Examples/Misc/WorkbookProtection.cs @@ -0,0 +1,23 @@ +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Misc +{ + public class WorkbookProtection : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Workbook Protection"); + wb.Protect(true, false, "Abc@123"); + wb.SaveAs(filePath); + } + } + + #endregion + } +} diff --git a/ClosedXML_Examples/ModifyFiles.cs b/ClosedXML_Examples/ModifyFiles.cs index 048525e..69790b0 100644 --- a/ClosedXML_Examples/ModifyFiles.cs +++ b/ClosedXML_Examples/ModifyFiles.cs @@ -1,14 +1,14 @@ -using ClosedXML_Examples.Delete; -using System.IO; - -namespace ClosedXML_Examples -{ - public class ModifyFiles - { - public static void Run() - { - var path = Program.BaseModifiedDirectory; - new DeleteRows().Create(Path.Combine(path, "DeleteRows.xlsx")); - } - } +using ClosedXML_Examples.Delete; +using System.IO; + +namespace ClosedXML_Examples +{ + public class ModifyFiles + { + public static void Run() + { + var path = Program.BaseModifiedDirectory; + new DeleteRows().Create(Path.Combine(path, "DeleteRows.xlsx")); + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/PageSetup/HeaderFooters.cs b/ClosedXML_Examples/PageSetup/HeaderFooters.cs index ed8646e..ed8fee0 100644 --- a/ClosedXML_Examples/PageSetup/HeaderFooters.cs +++ b/ClosedXML_Examples/PageSetup/HeaderFooters.cs @@ -1,65 +1,65 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.PageSetup -{ - public class HeaderFooters : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Headers and Footers"); - - // Simple left header to be placed on all pages - ws.PageSetup.Header.Left.AddText("Created with ClosedXML"); - - // Using various font decorations for the right header on the first page only - // Here we show different methods for setting font decorations. - - // Set single font decorations immediately - ws.PageSetup.Header.Right.AddText("The ", XLHFOccurrence.FirstPage).SetBold(); - ws.PageSetup.Header.Right.AddText("First ", XLHFOccurrence.FirstPage).SetFontColor(XLColor.Red); - - // Use the IXLRichText returned by the AddText(...) method to later on modify the font - var richText = ws.PageSetup.Header.Right.AddText("Colorful ", XLHFOccurrence.FirstPage); - richText.FontColor = XLColor.Blue; - richText.Underline = XLFontUnderlineValues.Double; - - // Set multiple font decorations chained - ws.PageSetup.Header.Right.AddText("Page", XLHFOccurrence.FirstPage) - .SetBold() - .SetItalic() - .SetFontName("Broadway"); - - - // Using predefined header/footer text: - - // Let's put the full path to the file on the right footer of every odd page: - ws.PageSetup.Footer.Right.AddText(XLHFPredefinedText.FullPath, XLHFOccurrence.OddPages); - - // Let's put the current page number and total pages on the center of every footer: - ws.PageSetup.Footer.Center.AddText(XLHFPredefinedText.PageNumber, XLHFOccurrence.AllPages); - ws.PageSetup.Footer.Center.AddText(" / ", XLHFOccurrence.AllPages); - ws.PageSetup.Footer.Center.AddText(XLHFPredefinedText.NumberOfPages, XLHFOccurrence.AllPages); - - // Don't align headers and footers with the margins - ws.PageSetup.AlignHFWithMargins = false; - - // Don't scale headers and footers with the document - ws.PageSetup.ScaleHFWithDocument = false; - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class HeaderFooters : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Headers and Footers"); + + // Simple left header to be placed on all pages + ws.PageSetup.Header.Left.AddText("Created with ClosedXML"); + + // Using various font decorations for the right header on the first page only + // Here we show different methods for setting font decorations. + + // Set single font decorations immediately + ws.PageSetup.Header.Right.AddText("The ", XLHFOccurrence.FirstPage).SetBold(); + ws.PageSetup.Header.Right.AddText("First ", XLHFOccurrence.FirstPage).SetFontColor(XLColor.Red); + + // Use the IXLRichText returned by the AddText(...) method to later on modify the font + var richText = ws.PageSetup.Header.Right.AddText("Colorful ", XLHFOccurrence.FirstPage); + richText.FontColor = XLColor.Blue; + richText.Underline = XLFontUnderlineValues.Double; + + // Set multiple font decorations chained + ws.PageSetup.Header.Right.AddText("Page", XLHFOccurrence.FirstPage) + .SetBold() + .SetItalic() + .SetFontName("Broadway"); + + + // Using predefined header/footer text: + + // Let's put the full path to the file on the right footer of every odd page: + ws.PageSetup.Footer.Right.AddText(XLHFPredefinedText.FullPath, XLHFOccurrence.OddPages); + + // Let's put the current page number and total pages on the center of every footer: + ws.PageSetup.Footer.Center.AddText(XLHFPredefinedText.PageNumber, XLHFOccurrence.AllPages); + ws.PageSetup.Footer.Center.AddText(" / ", XLHFOccurrence.AllPages); + ws.PageSetup.Footer.Center.AddText(XLHFPredefinedText.NumberOfPages, XLHFOccurrence.AllPages); + + // Don't align headers and footers with the margins + ws.PageSetup.AlignHFWithMargins = false; + + // Don't scale headers and footers with the document + ws.PageSetup.ScaleHFWithDocument = false; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PageSetup/Margins.cs b/ClosedXML_Examples/PageSetup/Margins.cs index e343126..ec2ad79 100644 --- a/ClosedXML_Examples/PageSetup/Margins.cs +++ b/ClosedXML_Examples/PageSetup/Margins.cs @@ -1,36 +1,36 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.PageSetup -{ - public class Margins : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Margins"); - ws.PageSetup.Margins.Top = 1; - ws.PageSetup.Margins.Bottom = 1.25; - ws.PageSetup.Margins.Left = 0.5; - ws.PageSetup.Margins.Right = 0.75; - ws.PageSetup.Margins.Footer = 0.15; - ws.PageSetup.Margins.Header = 0.30; - - ws.PageSetup.CenterHorizontally = true; - ws.PageSetup.CenterVertically = true; - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class Margins : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Margins"); + ws.PageSetup.Margins.Top = 1; + ws.PageSetup.Margins.Bottom = 1.25; + ws.PageSetup.Margins.Left = 0.5; + ws.PageSetup.Margins.Right = 0.75; + ws.PageSetup.Margins.Footer = 0.15; + ws.PageSetup.Margins.Header = 0.30; + + ws.PageSetup.CenterHorizontally = true; + ws.PageSetup.CenterVertically = true; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PageSetup/Page.cs b/ClosedXML_Examples/PageSetup/Page.cs index e4d745e..7c8078b 100644 --- a/ClosedXML_Examples/PageSetup/Page.cs +++ b/ClosedXML_Examples/PageSetup/Page.cs @@ -1,43 +1,43 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.PageSetup -{ - public class Page : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws1 = workbook.Worksheets.Add("Page Setup - Page1"); - ws1.PageSetup.PageOrientation = XLPageOrientation.Landscape; - ws1.PageSetup.AdjustTo(80); - ws1.PageSetup.PaperSize = XLPaperSize.LegalPaper; - ws1.PageSetup.VerticalDpi = 600; - ws1.PageSetup.HorizontalDpi = 600; - - var ws2 = workbook.Worksheets.Add("Page Setup - Page2"); - ws2.PageSetup.PageOrientation = XLPageOrientation.Portrait; - ws2.PageSetup.FitToPages(2, 2); // Alternatively you can use - // ws2.PageSetup.PagesTall = # - // and/or ws2.PageSetup.PagesWide = # - - ws2.PageSetup.PaperSize = XLPaperSize.LetterPaper; - ws2.PageSetup.VerticalDpi = 600; - ws2.PageSetup.HorizontalDpi = 600; - ws2.PageSetup.FirstPageNumber = 5; - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class Page : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws1 = workbook.Worksheets.Add("Page Setup - Page1"); + ws1.PageSetup.PageOrientation = XLPageOrientation.Landscape; + ws1.PageSetup.AdjustTo(80); + ws1.PageSetup.PaperSize = XLPaperSize.LegalPaper; + ws1.PageSetup.VerticalDpi = 600; + ws1.PageSetup.HorizontalDpi = 600; + + var ws2 = workbook.Worksheets.Add("Page Setup - Page2"); + ws2.PageSetup.PageOrientation = XLPageOrientation.Portrait; + ws2.PageSetup.FitToPages(2, 2); // Alternatively you can use + // ws2.PageSetup.PagesTall = # + // and/or ws2.PageSetup.PagesWide = # + + ws2.PageSetup.PaperSize = XLPaperSize.LetterPaper; + ws2.PageSetup.VerticalDpi = 600; + ws2.PageSetup.HorizontalDpi = 600; + ws2.PageSetup.FirstPageNumber = 5; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PageSetup/SheetTab.cs b/ClosedXML_Examples/PageSetup/SheetTab.cs index 1048dec..8bb70d3 100644 --- a/ClosedXML_Examples/PageSetup/SheetTab.cs +++ b/ClosedXML_Examples/PageSetup/SheetTab.cs @@ -1,58 +1,58 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.PageSetup -{ - public class SheetTab : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Sheet Tab"); - - // Adding print areas - ws.PageSetup.PrintAreas.Add("A1:B2"); - ws.PageSetup.PrintAreas.Add("D3:D5"); - - // Adding rows to repeat at top - ws.PageSetup.SetRowsToRepeatAtTop(1,2); - - // Adding columns to repeat at left - ws.PageSetup.SetColumnsToRepeatAtLeft(1, 2); - - // Show gridlines - ws.PageSetup.ShowGridlines = true; - - // Print in black and white - ws.PageSetup.BlackAndWhite = true; - - // Print in draft quality - ws.PageSetup.DraftQuality = true; - - // Show row and column headings - ws.PageSetup.ShowRowAndColumnHeadings = true; - - // Set the page print order to over, then down - ws.PageSetup.PageOrder = XLPageOrderValues.OverThenDown; - - // Place comments at the end of the sheet - ws.PageSetup.ShowComments = XLShowCommentsValues.AtEnd; - - // Print errors as #N/A - ws.PageSetup.PrintErrorValue = XLPrintErrorValues.NA; - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class SheetTab : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Sheet Tab"); + + // Adding print areas + ws.PageSetup.PrintAreas.Add("A1:B2"); + ws.PageSetup.PrintAreas.Add("D3:D5"); + + // Adding rows to repeat at top + ws.PageSetup.SetRowsToRepeatAtTop(1,2); + + // Adding columns to repeat at left + ws.PageSetup.SetColumnsToRepeatAtLeft(1, 2); + + // Show gridlines + ws.PageSetup.ShowGridlines = true; + + // Print in black and white + ws.PageSetup.BlackAndWhite = true; + + // Print in draft quality + ws.PageSetup.DraftQuality = true; + + // Show row and column headings + ws.PageSetup.ShowRowAndColumnHeadings = true; + + // Set the page print order to over, then down + ws.PageSetup.PageOrder = XLPageOrderValues.OverThenDown; + + // Place comments at the end of the sheet + ws.PageSetup.ShowComments = XLShowCommentsValues.AtEnd; + + // Print errors as #N/A + ws.PageSetup.PrintErrorValue = XLPrintErrorValues.NA; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PageSetup/Sheets.cs b/ClosedXML_Examples/PageSetup/Sheets.cs index a7b2584..0ee94cc 100644 --- a/ClosedXML_Examples/PageSetup/Sheets.cs +++ b/ClosedXML_Examples/PageSetup/Sheets.cs @@ -1,34 +1,34 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.PageSetup -{ - public class Sheets : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws1 = workbook.Worksheets.Add("Separate PrintAreas"); - ws1.PageSetup.PrintAreas.Add("A1:B2"); - ws1.PageSetup.PrintAreas.Add("D3:D5"); - - var ws2 = workbook.Worksheets.Add("Page Breaks"); - ws2.PageSetup.PrintAreas.Add("A1:D5"); - ws2.PageSetup.AddHorizontalPageBreak(2); - ws2.PageSetup.AddVerticalPageBreak(2); - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class Sheets : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws1 = workbook.Worksheets.Add("Separate PrintAreas"); + ws1.PageSetup.PrintAreas.Add("A1:B2"); + ws1.PageSetup.PrintAreas.Add("D3:D5"); + + var ws2 = workbook.Worksheets.Add("Page Breaks"); + ws2.PageSetup.PrintAreas.Add("A1:D5"); + ws2.PageSetup.AddHorizontalPageBreak(2); + ws2.PageSetup.AddVerticalPageBreak(2); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PageSetup/TwoPages.cs b/ClosedXML_Examples/PageSetup/TwoPages.cs index 33cf47d..fe06049 100644 --- a/ClosedXML_Examples/PageSetup/TwoPages.cs +++ b/ClosedXML_Examples/PageSetup/TwoPages.cs @@ -1,36 +1,36 @@ -using System; -using System.Linq; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.PageSetup -{ - public class TwoPages : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Sheet1"); - foreach (var ro in Enumerable.Range(1, 100)) - { - foreach (var co in Enumerable.Range(1, 10)) - { - ws.Cell(ro, co).Value = ws.Cell(ro, co).Address.ToString(); - } - } - ws.PageSetup.PagesWide = 1; - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.PageSetup +{ + public class TwoPages : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Sheet1"); + foreach (var ro in Enumerable.Range(1, 100)) + { + foreach (var co in Enumerable.Range(1, 10)) + { + ws.Cell(ro, co).Value = ws.Cell(ro, co).Address.ToString(); + } + } + ws.PageSetup.PagesWide = 1; + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/PivotTables/PivotTables.cs b/ClosedXML_Examples/PivotTables/PivotTables.cs index 61692b9..9eb24ea 100644 --- a/ClosedXML_Examples/PivotTables/PivotTables.cs +++ b/ClosedXML_Examples/PivotTables/PivotTables.cs @@ -1,133 +1,133 @@ -using ClosedXML.Excel; -using System; -using System.Collections.Generic; - -namespace ClosedXML_Examples -{ - public class PivotTables : IXLExample - { - private class Pastry - { - public Pastry(string name, int numberOfOrders, double quality, string month) - { - Name = name; - NumberOfOrders = numberOfOrders; - Quality = quality; - Month = month; - } - - public string Name { get; set; } - public int NumberOfOrders { get; set; } - public double Quality { get; set; } - public string Month { get; set; } - } - - public void Create(String filePath) - { - var pastries = new List - { - new Pastry("Croissant", 150, 60.2, "Apr"), - new Pastry("Croissant", 250, 50.42, "May"), - new Pastry("Croissant", 134, 22.12, "June"), - new Pastry("Doughnut", 250, 89.99, "Apr"), - new Pastry("Doughnut", 225, 70, "May"), - new Pastry("Doughnut", 210, 75.33, "June"), - new Pastry("Bearclaw", 134, 10.24, "Apr"), - new Pastry("Bearclaw", 184, 33.33, "May"), - new Pastry("Bearclaw", 124, 25, "June"), - new Pastry("Danish", 394, -20.24, "Apr"), - new Pastry("Danish", 190, 60, "May"), - new Pastry("Danish", 221, 24.76, "June"), - - // Deliberately add different casings of same string to ensure pivot table doesn't duplicate it. - new Pastry("Scone", 135, 0, "Apr"), - new Pastry("SconE", 122, 5.19, "May"), - new Pastry("SCONE", 243, 44.2, "June") - }; - - using (var wb = new XLWorkbook()) - { - var sheet = wb.Worksheets.Add("PastrySalesData"); - // Insert our list of pastry data into the "PastrySalesData" sheet at cell 1,1 - var source = sheet.Cell(1, 1).InsertTable(pastries, "PastrySalesData", true); - sheet.Columns().AdjustToContents(); - - // Create a range that includes our table, including the header row - var range = source.DataRange; - var header = sheet.Range(1, 1, 1, 3); - var dataRange = sheet.Range(header.FirstCell(), range.LastCell()); - - IXLWorksheet ptSheet; - IXLPivotTable pt; - - for (int i = 1; i <= 3; i++) - { - // Add a new sheet for our pivot table - ptSheet = wb.Worksheets.Add("pvt" + i); - - // Create the pivot table, using the data from the "PastrySalesData" table - pt = ptSheet.PivotTables.AddNew("pvt", ptSheet.Cell(1, 1), dataRange); - - // The rows in our pivot table will be the names of the pastries - pt.RowLabels.Add("Name"); - if (i == 2) pt.RowLabels.Add(XLConstants.PivotTableValuesSentinalLabel); - - // The columns will be the months - pt.ColumnLabels.Add("Month"); - if (i == 3) pt.ColumnLabels.Add(XLConstants.PivotTableValuesSentinalLabel); - - // The values in our table will come from the "NumberOfOrders" field - // The default calculation setting is a total of each row/column - pt.Values.Add("NumberOfOrders", "NumberOfOrdersPercentageOfBearclaw") - .ShowAsPercentageFrom("Name").And("Bearclaw") - .NumberFormat.Format = "0%"; - - if (i > 1) - { - pt.Values.Add("Quality", "Sum of Quality") - .NumberFormat.SetFormat("#,##0.00"); - } - if (i > 2) - { - pt.Values.Add("NumberOfOrders", "Sum of NumberOfOrders"); - } - - ptSheet.Columns().AdjustToContents(); - } - - // Different kind of pivot - ptSheet = wb.Worksheets.Add("pvtNoColumnLabels"); - pt = ptSheet.PivotTables.AddNew("pvtNoColumnLabels", ptSheet.Cell(1, 1), dataRange); - - pt.RowLabels.Add("Name"); - pt.RowLabels.Add("Month"); - - pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); - pt.Values.Add("Quality").SetSummaryFormula(XLPivotSummary.Sum); - - - // Pivot table with collapsed fields - ptSheet = wb.Worksheets.Add("pvtCollapsedFields"); - pt = ptSheet.PivotTables.AddNew("pvtCollapsedFields", ptSheet.Cell(1, 1), dataRange); - - pt.RowLabels.Add("Name").SetCollapsed(); - pt.RowLabels.Add("Month").SetCollapsed(); - - pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); - pt.Values.Add("Quality").SetSummaryFormula(XLPivotSummary.Sum); - - - // Pivot table with a field both as a value and as a row/column/filter label - ptSheet = wb.Worksheets.Add("pvtFieldAsValueAndLabel"); - pt = ptSheet.PivotTables.AddNew("pvtFieldAsValueAndLabel", ptSheet.Cell(1, 1), dataRange); - - pt.RowLabels.Add("Name"); - pt.RowLabels.Add("Month"); - - pt.Values.Add("Name").SetSummaryFormula(XLPivotSummary.Count);//.NumberFormat.Format = "#0.00"; - - wb.SaveAs(filePath); - } - } - } -} +using ClosedXML.Excel; +using System; +using System.Collections.Generic; + +namespace ClosedXML_Examples +{ + public class PivotTables : IXLExample + { + private class Pastry + { + public Pastry(string name, int numberOfOrders, double quality, string month) + { + Name = name; + NumberOfOrders = numberOfOrders; + Quality = quality; + Month = month; + } + + public string Name { get; set; } + public int NumberOfOrders { get; set; } + public double Quality { get; set; } + public string Month { get; set; } + } + + public void Create(String filePath) + { + var pastries = new List + { + new Pastry("Croissant", 150, 60.2, "Apr"), + new Pastry("Croissant", 250, 50.42, "May"), + new Pastry("Croissant", 134, 22.12, "June"), + new Pastry("Doughnut", 250, 89.99, "Apr"), + new Pastry("Doughnut", 225, 70, "May"), + new Pastry("Doughnut", 210, 75.33, "June"), + new Pastry("Bearclaw", 134, 10.24, "Apr"), + new Pastry("Bearclaw", 184, 33.33, "May"), + new Pastry("Bearclaw", 124, 25, "June"), + new Pastry("Danish", 394, -20.24, "Apr"), + new Pastry("Danish", 190, 60, "May"), + new Pastry("Danish", 221, 24.76, "June"), + + // Deliberately add different casings of same string to ensure pivot table doesn't duplicate it. + new Pastry("Scone", 135, 0, "Apr"), + new Pastry("SconE", 122, 5.19, "May"), + new Pastry("SCONE", 243, 44.2, "June") + }; + + using (var wb = new XLWorkbook()) + { + var sheet = wb.Worksheets.Add("PastrySalesData"); + // Insert our list of pastry data into the "PastrySalesData" sheet at cell 1,1 + var source = sheet.Cell(1, 1).InsertTable(pastries, "PastrySalesData", true); + sheet.Columns().AdjustToContents(); + + // Create a range that includes our table, including the header row + var range = source.DataRange; + var header = sheet.Range(1, 1, 1, 3); + var dataRange = sheet.Range(header.FirstCell(), range.LastCell()); + + IXLWorksheet ptSheet; + IXLPivotTable pt; + + for (int i = 1; i <= 3; i++) + { + // Add a new sheet for our pivot table + ptSheet = wb.Worksheets.Add("pvt" + i); + + // Create the pivot table, using the data from the "PastrySalesData" table + pt = ptSheet.PivotTables.AddNew("pvt", ptSheet.Cell(1, 1), dataRange); + + // The rows in our pivot table will be the names of the pastries + pt.RowLabels.Add("Name"); + if (i == 2) pt.RowLabels.Add(XLConstants.PivotTableValuesSentinalLabel); + + // The columns will be the months + pt.ColumnLabels.Add("Month"); + if (i == 3) pt.ColumnLabels.Add(XLConstants.PivotTableValuesSentinalLabel); + + // The values in our table will come from the "NumberOfOrders" field + // The default calculation setting is a total of each row/column + pt.Values.Add("NumberOfOrders", "NumberOfOrdersPercentageOfBearclaw") + .ShowAsPercentageFrom("Name").And("Bearclaw") + .NumberFormat.Format = "0%"; + + if (i > 1) + { + pt.Values.Add("Quality", "Sum of Quality") + .NumberFormat.SetFormat("#,##0.00"); + } + if (i > 2) + { + pt.Values.Add("NumberOfOrders", "Sum of NumberOfOrders"); + } + + ptSheet.Columns().AdjustToContents(); + } + + // Different kind of pivot + ptSheet = wb.Worksheets.Add("pvtNoColumnLabels"); + pt = ptSheet.PivotTables.AddNew("pvtNoColumnLabels", ptSheet.Cell(1, 1), dataRange); + + pt.RowLabels.Add("Name"); + pt.RowLabels.Add("Month"); + + pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + pt.Values.Add("Quality").SetSummaryFormula(XLPivotSummary.Sum); + + + // Pivot table with collapsed fields + ptSheet = wb.Worksheets.Add("pvtCollapsedFields"); + pt = ptSheet.PivotTables.AddNew("pvtCollapsedFields", ptSheet.Cell(1, 1), dataRange); + + pt.RowLabels.Add("Name").SetCollapsed(); + pt.RowLabels.Add("Month").SetCollapsed(); + + pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum); + pt.Values.Add("Quality").SetSummaryFormula(XLPivotSummary.Sum); + + + // Pivot table with a field both as a value and as a row/column/filter label + ptSheet = wb.Worksheets.Add("pvtFieldAsValueAndLabel"); + pt = ptSheet.PivotTables.AddNew("pvtFieldAsValueAndLabel", ptSheet.Cell(1, 1), dataRange); + + pt.RowLabels.Add("Name"); + pt.RowLabels.Add("Month"); + + pt.Values.Add("Name").SetSummaryFormula(XLPivotSummary.Count);//.NumberFormat.Format = "#0.00"; + + wb.SaveAs(filePath); + } + } + } +} diff --git a/ClosedXML_Examples/Program.cs b/ClosedXML_Examples/Program.cs index 113aed9..afefad3 100644 --- a/ClosedXML_Examples/Program.cs +++ b/ClosedXML_Examples/Program.cs @@ -1,34 +1,34 @@ -using System; -using System.IO; - -namespace ClosedXML_Examples -{ - public class Program - { - public static string BaseCreatedDirectory - { - get - { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Created"); - if (!Directory.Exists(path)) Directory.CreateDirectory(path); - return path; - } - } - - public static string BaseModifiedDirectory - { - get - { - var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Modified"); - if (!Directory.Exists(path)) Directory.CreateDirectory(path); - return path; - } - } - - private static void Main(string[] args) - { - CreateFiles.CreateAllFiles(); - LoadFiles.LoadAllFiles(); - } - } +using System; +using System.IO; + +namespace ClosedXML_Examples +{ + public class Program + { + public static string BaseCreatedDirectory + { + get + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Created"); + if (!Directory.Exists(path)) Directory.CreateDirectory(path); + return path; + } + } + + public static string BaseModifiedDirectory + { + get + { + var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Modified"); + if (!Directory.Exists(path)) Directory.CreateDirectory(path); + return path; + } + } + + private static void Main(string[] args) + { + CreateFiles.CreateAllFiles(); + LoadFiles.LoadAllFiles(); + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Ranges/AddingRowToTables.cs b/ClosedXML_Examples/Ranges/AddingRowToTables.cs index 8320397..4cfba08 100644 --- a/ClosedXML_Examples/Ranges/AddingRowToTables.cs +++ b/ClosedXML_Examples/Ranges/AddingRowToTables.cs @@ -1,58 +1,58 @@ -using System; -using System.IO; -using ClosedXML.Excel; -using System.Linq; - - -namespace ClosedXML_Examples.Ranges -{ - public class AddingRowToTables : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - string tempFile = ExampleHelper.GetTempFilePath(filePath); - try - { - new BasicTable().Create(tempFile); - var wb = new XLWorkbook(tempFile); - var ws = wb.Worksheets.First(); - - var firstCell = ws.FirstCellUsed(); - var lastCell = ws.LastCellUsed(); - var range = ws.Range(firstCell.Address, lastCell.Address); - range.FirstRow().Delete(); // Deleting the "Contacts" header (we don't need it for our purposes) - - // We want to use a theme for table, not the hard coded format of the BasicTable - range.Clear(XLClearOptions.Formats); - // Put back the date and number formats - range.Column(4).Style.NumberFormat.NumberFormatId = 15; - range.Column(5).Style.NumberFormat.Format = "$ #,##0"; - - var table = range.CreateTable(); // You can also use range.AsTable() if you want to - - ws.Cell("Q6000").Value = "dummy value"; - - var row = table.DataRange.InsertRowsBelow(1).First(); - - wb.SaveAs(filePath); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - - // Private - - // Override - - - #endregion - } -} +using System; +using System.IO; +using ClosedXML.Excel; +using System.Linq; + + +namespace ClosedXML_Examples.Ranges +{ + public class AddingRowToTables : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var wb = new XLWorkbook(tempFile); + var ws = wb.Worksheets.First(); + + var firstCell = ws.FirstCellUsed(); + var lastCell = ws.LastCellUsed(); + var range = ws.Range(firstCell.Address, lastCell.Address); + range.FirstRow().Delete(); // Deleting the "Contacts" header (we don't need it for our purposes) + + // We want to use a theme for table, not the hard coded format of the BasicTable + range.Clear(XLClearOptions.Formats); + // Put back the date and number formats + range.Column(4).Style.NumberFormat.NumberFormatId = 15; + range.Column(5).Style.NumberFormat.Format = "$ #,##0"; + + var table = range.CreateTable(); // You can also use range.AsTable() if you want to + + ws.Cell("Q6000").Value = "dummy value"; + + var row = table.DataRange.InsertRowsBelow(1).First(); + + wb.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/ClearingRanges.cs b/ClosedXML_Examples/Ranges/ClearingRanges.cs index 4f9c9c1..f33df7c 100644 --- a/ClosedXML_Examples/Ranges/ClearingRanges.cs +++ b/ClosedXML_Examples/Ranges/ClearingRanges.cs @@ -1,54 +1,54 @@ -using System; -using System.Linq; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Ranges -{ - public class ClearingRanges : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Clearing Ranges"); - foreach (var ro in Enumerable.Range(1, 10)) - { - foreach (var co in Enumerable.Range(1, 10)) - { - var cell = ws.Cell(ro, co); - cell.Value = cell.Address.ToString(); - cell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; - cell.Style.Fill.BackgroundColor = XLColor.Turquoise; - cell.Style.Font.Bold = true; - } - } - - // Clearing a range - ws.Range("B1:C2").Clear(); - - // Clearing a row in a range - ws.Range("B4:C5").Row(1).Clear(); - - // Clearing a column in a range - ws.Range("E1:F4").Column(2).Clear(); - - // Clear an entire row - ws.Row(7).Clear(); - - // Clear an entire column - ws.Column("H").Clear(); - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class ClearingRanges : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Clearing Ranges"); + foreach (var ro in Enumerable.Range(1, 10)) + { + foreach (var co in Enumerable.Range(1, 10)) + { + var cell = ws.Cell(ro, co); + cell.Value = cell.Address.ToString(); + cell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center; + cell.Style.Fill.BackgroundColor = XLColor.Turquoise; + cell.Style.Font.Bold = true; + } + } + + // Clearing a range + ws.Range("B1:C2").Clear(); + + // Clearing a row in a range + ws.Range("B4:C5").Row(1).Clear(); + + // Clearing a column in a range + ws.Range("E1:F4").Column(2).Clear(); + + // Clear an entire row + ws.Row(7).Clear(); + + // Clear an entire column + ws.Column("H").Clear(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/CopyingRanges.cs b/ClosedXML_Examples/Ranges/CopyingRanges.cs index 1550592..7718f7a 100644 --- a/ClosedXML_Examples/Ranges/CopyingRanges.cs +++ b/ClosedXML_Examples/Ranges/CopyingRanges.cs @@ -1,37 +1,37 @@ -using System.IO; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class CopyingRanges : IXLExample - { - public void Create(string filePath) - { - var tempFile = ExampleHelper.GetTempFilePath(filePath); - try - { - new BasicTable().Create(tempFile); - var workbook = new XLWorkbook(tempFile); - var ws = workbook.Worksheet(1); - - // Define a range with the data - var firstTableCell = ws.FirstCellUsed(); - var lastTableCell = ws.LastCellUsed(); - var rngData = ws.Range(firstTableCell.Address, lastTableCell.Address); - - // Copy the table to another worksheet - var wsCopy = workbook.Worksheets.Add("Contacts Copy"); - wsCopy.Cell(1, 1).Value = rngData; - - workbook.SaveAs(filePath); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - } +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class CopyingRanges : IXLExample + { + public void Create(string filePath) + { + var tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + var ws = workbook.Worksheet(1); + + // Define a range with the data + var firstTableCell = ws.FirstCellUsed(); + var lastTableCell = ws.LastCellUsed(); + var rngData = ws.Range(firstTableCell.Address, lastTableCell.Address); + + // Copy the table to another worksheet + var wsCopy = workbook.Worksheets.Add("Contacts Copy"); + wsCopy.Cell(1, 1).Value = rngData; + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Ranges/CurrentRowColumn.cs b/ClosedXML_Examples/Ranges/CurrentRowColumn.cs index 8c1934c..98d662c 100644 --- a/ClosedXML_Examples/Ranges/CurrentRowColumn.cs +++ b/ClosedXML_Examples/Ranges/CurrentRowColumn.cs @@ -1,51 +1,51 @@ -using System; -using System.Linq; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Ranges -{ - public class CurrentRowColumn : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Current Row Column"); - - var cell = ws.Cell(5, 2); - cell.Style.Fill.SetBackgroundColor(XLColor.Red); - ws.Cell(1, 1) - .SetValue("Red's Row:") - .CellRight().SetValue(cell.WorksheetRow().RowNumber()) - .CellBelow().SetValue(cell.WorksheetColumn().ColumnLetter()) - .CellLeft().SetValue("Red's Column:"); - - var row = ws.Range("A6:C6").FirstRow(); - row.Style.Fill.SetBackgroundColor(XLColor.Blue); - - var column = ws.Range("B7:B9").FirstColumn(); - column.Style.Fill.SetBackgroundColor(XLColor.Green); - - ws.Cell(1, 4) - .SetValue("Blue's Row:") - .CellRight().SetValue(row.WorksheetRow().RowNumber()) - .CellBelow().SetValue(column.WorksheetColumn().ColumnLetter()) - .CellLeft().SetValue("Green's Column:"); - - ws.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right; - ws.Columns().AdjustToContents(); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class CurrentRowColumn : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Current Row Column"); + + var cell = ws.Cell(5, 2); + cell.Style.Fill.SetBackgroundColor(XLColor.Red); + ws.Cell(1, 1) + .SetValue("Red's Row:") + .CellRight().SetValue(cell.WorksheetRow().RowNumber()) + .CellBelow().SetValue(cell.WorksheetColumn().ColumnLetter()) + .CellLeft().SetValue("Red's Column:"); + + var row = ws.Range("A6:C6").FirstRow(); + row.Style.Fill.SetBackgroundColor(XLColor.Blue); + + var column = ws.Range("B7:B9").FirstColumn(); + column.Style.Fill.SetBackgroundColor(XLColor.Green); + + ws.Cell(1, 4) + .SetValue("Blue's Row:") + .CellRight().SetValue(row.WorksheetRow().RowNumber()) + .CellBelow().SetValue(column.WorksheetColumn().ColumnLetter()) + .CellLeft().SetValue("Green's Column:"); + + ws.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right; + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/DefiningRanges.cs b/ClosedXML_Examples/Ranges/DefiningRanges.cs index ba51969..125ba44 100644 --- a/ClosedXML_Examples/Ranges/DefiningRanges.cs +++ b/ClosedXML_Examples/Ranges/DefiningRanges.cs @@ -1,49 +1,49 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Ranges -{ - public class DefiningRanges : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Defining a Range"); - - // With a string - var range1 = ws.Range("A1:B1"); - range1.Cell(1, 1).Value = "ws.Range(\"A1:B1\").Merge()"; - range1.Merge(); - - // With two XLAddresses - var range2 = ws.Range(ws.Cell(2, 1).Address, ws.Cell(2, 2).Address); - range2.Cell(1, 1).Value = "ws.Range(ws.Cell(2, 1).Address, ws.Cell(2, 2).Address).Merge()"; - range2.Merge(); - - // With two strings - var range4 = ws.Range("A3", "B3"); - range4.Cell(1, 1).Value = "ws.Range(\"A3\", \"B3\").Merge()"; - range4.Merge(); - - // With 4 points - var range5 = ws.Range(4, 1, 4, 2); - range5.Cell(1, 1).Value = "ws.Range(4, 1, 4, 2).Merge()"; - range5.Merge(); - - ws.Column("A").AdjustToContents(); - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class DefiningRanges : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Defining a Range"); + + // With a string + var range1 = ws.Range("A1:B1"); + range1.Cell(1, 1).Value = "ws.Range(\"A1:B1\").Merge()"; + range1.Merge(); + + // With two XLAddresses + var range2 = ws.Range(ws.Cell(2, 1).Address, ws.Cell(2, 2).Address); + range2.Cell(1, 1).Value = "ws.Range(ws.Cell(2, 1).Address, ws.Cell(2, 2).Address).Merge()"; + range2.Merge(); + + // With two strings + var range4 = ws.Range("A3", "B3"); + range4.Cell(1, 1).Value = "ws.Range(\"A3\", \"B3\").Merge()"; + range4.Merge(); + + // With 4 points + var range5 = ws.Range(4, 1, 4, 2); + range5.Cell(1, 1).Value = "ws.Range(4, 1, 4, 2).Merge()"; + range5.Merge(); + + ws.Column("A").AdjustToContents(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/DeletingRanges.cs b/ClosedXML_Examples/Ranges/DeletingRanges.cs index fa10274..cd916c8 100644 --- a/ClosedXML_Examples/Ranges/DeletingRanges.cs +++ b/ClosedXML_Examples/Ranges/DeletingRanges.cs @@ -1,69 +1,69 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Ranges -{ - public class DeletingRanges : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Deleting Ranges"); - - // Deleting Columns - // Setup test values - ws.Columns("1-3, 5, 7").Style.Fill.BackgroundColor = XLColor.Gray; - ws.Columns("4, 6").Style.Fill.BackgroundColor = XLColor.GreenPigment; - ws.Row(1).Cells("1-3, 5, 7").Value = "FAIL"; - - ws.Column(7).Delete(); - ws.Column(1).Delete(); - ws.Columns(1,2).Delete(); - ws.Column(2).Delete(); - - // Deleting Rows - ws.Rows("1,5,7").Style.Fill.BackgroundColor = XLColor.GreenPigment; - ws.Rows("2-4,6, 8").Style.Fill.BackgroundColor = XLColor.Gray; - ws.Column(1).Cells("2-4,6, 8").Value = "FAIL"; - - ws.Row(8).Delete(); - ws.Row(2).Delete(); - ws.Rows(2, 3).Delete(); - ws.Rows(3, 4).Delete(); - - // Deleting Ranges (Shifting Left) - var rng1 = ws.Range(2, 2, 8, 8); - rng1.Columns("1-3, 5, 7").Style.Fill.BackgroundColor = XLColor.Gray; - rng1.Columns("4, 6").Style.Fill.BackgroundColor = XLColor.Orange; - rng1.Row(1).Cells("1-3, 5, 7").Value = "FAIL"; - - rng1.Column(7).Delete(); - rng1.Column(1).Delete(); - rng1.Range(1, 1, rng1.RowCount(), 2).Delete(XLShiftDeletedCells.ShiftCellsLeft); - rng1.Column(2).Delete(); - - // Deleting Ranges (Shifting Up) - rng1.Rows("4, 6").Style.Fill.BackgroundColor = XLColor.Orange; - rng1.Rows("1-3, 5, 7").Style.Fill.BackgroundColor = XLColor.Gray; - rng1.Column(1).Cells("1-3, 5, 7").Value = "FAIL"; - - rng1.Row(7).Delete(); - rng1.Row(1).Delete(); - rng1.Range(1, 1, 2, rng1.ColumnCount()).Delete(XLShiftDeletedCells.ShiftCellsUp); - rng1.Row(2).Delete(); - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class DeletingRanges : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Deleting Ranges"); + + // Deleting Columns + // Setup test values + ws.Columns("1-3, 5, 7").Style.Fill.BackgroundColor = XLColor.Gray; + ws.Columns("4, 6").Style.Fill.BackgroundColor = XLColor.GreenPigment; + ws.Row(1).Cells("1-3, 5, 7").Value = "FAIL"; + + ws.Column(7).Delete(); + ws.Column(1).Delete(); + ws.Columns(1,2).Delete(); + ws.Column(2).Delete(); + + // Deleting Rows + ws.Rows("1,5,7").Style.Fill.BackgroundColor = XLColor.GreenPigment; + ws.Rows("2-4,6, 8").Style.Fill.BackgroundColor = XLColor.Gray; + ws.Column(1).Cells("2-4,6, 8").Value = "FAIL"; + + ws.Row(8).Delete(); + ws.Row(2).Delete(); + ws.Rows(2, 3).Delete(); + ws.Rows(3, 4).Delete(); + + // Deleting Ranges (Shifting Left) + var rng1 = ws.Range(2, 2, 8, 8); + rng1.Columns("1-3, 5, 7").Style.Fill.BackgroundColor = XLColor.Gray; + rng1.Columns("4, 6").Style.Fill.BackgroundColor = XLColor.Orange; + rng1.Row(1).Cells("1-3, 5, 7").Value = "FAIL"; + + rng1.Column(7).Delete(); + rng1.Column(1).Delete(); + rng1.Range(1, 1, rng1.RowCount(), 2).Delete(XLShiftDeletedCells.ShiftCellsLeft); + rng1.Column(2).Delete(); + + // Deleting Ranges (Shifting Up) + rng1.Rows("4, 6").Style.Fill.BackgroundColor = XLColor.Orange; + rng1.Rows("1-3, 5, 7").Style.Fill.BackgroundColor = XLColor.Gray; + rng1.Column(1).Cells("1-3, 5, 7").Value = "FAIL"; + + rng1.Row(7).Delete(); + rng1.Row(1).Delete(); + rng1.Range(1, 1, 2, rng1.ColumnCount()).Delete(XLShiftDeletedCells.ShiftCellsUp); + rng1.Row(2).Delete(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/InsertingDeletingColumns.cs b/ClosedXML_Examples/Ranges/InsertingDeletingColumns.cs index 1e23002..f2aecb5 100644 --- a/ClosedXML_Examples/Ranges/InsertingDeletingColumns.cs +++ b/ClosedXML_Examples/Ranges/InsertingDeletingColumns.cs @@ -1,55 +1,55 @@ -using System; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class InsertingDeletingColumns : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Inserting and Deleting Columns"); - - // Range starts with 2 columns - var rng = ws.Range("B2:C3"); // Range starts on B2 - - // Insert a column before the range - ws.Column(1).InsertColumnsAfter(1); // Range starts on C2 - - // Insert a column in between the range - ws.Column(3).InsertColumnsAfter(1); // Range now has 3 columns - - // Insert a column (from a range) before the range - ws.Range("A2:A3").InsertColumnsAfter(1); // Range starts on D2 - - // Insert a column (from a range) in between the range - ws.Range("D2:D3").InsertColumnsAfter(1); // Range now has 4 columns - - // Inserting columns from a range not covering all columns - // does not affect our defined range - ws.Range("A1:A2").InsertColumnsAfter(1); - ws.Range("E3:E4").InsertColumnsAfter(1); - - // Delete a column before the range - ws.Column(1).Delete(); // Range starts on C2 - - // Delete a column (from a range) before the range - ws.Range("A2:A3").Delete(XLShiftDeletedCells.ShiftCellsLeft); // Range starts on B2 - - // Delete a column in between the range - ws.Column(3).Delete(); // Range now has 3 columns - - // Delete a column (from a range) in between the range - ws.Range("C2:C3").Delete(XLShiftDeletedCells.ShiftCellsLeft); // Range now has 2 columns - - // Deleting columns from a range not covering all columns - // does not affect our defined range - ws.Range("A1:A2").Delete(XLShiftDeletedCells.ShiftCellsLeft); - ws.Range("D3:D4").Delete(XLShiftDeletedCells.ShiftCellsLeft); - - rng.Style.Fill.BackgroundColor = XLColor.Orange; - - workbook.SaveAs(filePath); - } - } -} +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class InsertingDeletingColumns : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Inserting and Deleting Columns"); + + // Range starts with 2 columns + var rng = ws.Range("B2:C3"); // Range starts on B2 + + // Insert a column before the range + ws.Column(1).InsertColumnsAfter(1); // Range starts on C2 + + // Insert a column in between the range + ws.Column(3).InsertColumnsAfter(1); // Range now has 3 columns + + // Insert a column (from a range) before the range + ws.Range("A2:A3").InsertColumnsAfter(1); // Range starts on D2 + + // Insert a column (from a range) in between the range + ws.Range("D2:D3").InsertColumnsAfter(1); // Range now has 4 columns + + // Inserting columns from a range not covering all columns + // does not affect our defined range + ws.Range("A1:A2").InsertColumnsAfter(1); + ws.Range("E3:E4").InsertColumnsAfter(1); + + // Delete a column before the range + ws.Column(1).Delete(); // Range starts on C2 + + // Delete a column (from a range) before the range + ws.Range("A2:A3").Delete(XLShiftDeletedCells.ShiftCellsLeft); // Range starts on B2 + + // Delete a column in between the range + ws.Column(3).Delete(); // Range now has 3 columns + + // Delete a column (from a range) in between the range + ws.Range("C2:C3").Delete(XLShiftDeletedCells.ShiftCellsLeft); // Range now has 2 columns + + // Deleting columns from a range not covering all columns + // does not affect our defined range + ws.Range("A1:A2").Delete(XLShiftDeletedCells.ShiftCellsLeft); + ws.Range("D3:D4").Delete(XLShiftDeletedCells.ShiftCellsLeft); + + rng.Style.Fill.BackgroundColor = XLColor.Orange; + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Ranges/InsertingDeletingRows.cs b/ClosedXML_Examples/Ranges/InsertingDeletingRows.cs index 4c5a4db..9d4617c 100644 --- a/ClosedXML_Examples/Ranges/InsertingDeletingRows.cs +++ b/ClosedXML_Examples/Ranges/InsertingDeletingRows.cs @@ -1,55 +1,55 @@ -using System; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class InsertingDeletingRows : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Inserting and Deleting Rows"); - - // Range starts with 2 rows - var rng = ws.Range("B2:C3"); - - // Insert a row above the range - ws.Row(1).InsertRowsBelow(1); // Range starts on B3 - - // Insert a row in between the range - ws.Row(3).InsertRowsBelow(1); // Range now has 3 rows - - // Insert a row (from a range) above the range - ws.Range("B1:C1").InsertRowsBelow(1); // Range starts on B4 - - // Insert a row (from a range) in between the range - ws.Range("B4:C4").InsertRowsBelow(1); // Range now has 4 rows - - // Inserting rows from a range not covering all columns - // does not affect our defined range - ws.Range("A1:B1").InsertRowsBelow(1); - ws.Range("C4:D4").InsertRowsBelow(1); - - // Delete a row above the range - ws.Row(1).Delete(); // Range starts on B3 - - // Delete a row (from a range) above the range - ws.Range("B1:C1").Delete(XLShiftDeletedCells.ShiftCellsUp); // Range starts on B2 - - // Delete a row in between the range - ws.Row(3).Delete(); // Range now has 3 rows - - // Delete a row (from a range) in between the range - ws.Range("B3:C3").Delete(XLShiftDeletedCells.ShiftCellsUp); // Range now has 2 rows - - // Deleting rows from a range not covering all columns - // does not affect our defined range - ws.Range("A1:B1").Delete(XLShiftDeletedCells.ShiftCellsUp); - ws.Range("C4:D4").Delete(XLShiftDeletedCells.ShiftCellsUp); - - rng.Style.Fill.BackgroundColor = XLColor.Orange; - - workbook.SaveAs(filePath); - } - } -} +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class InsertingDeletingRows : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Inserting and Deleting Rows"); + + // Range starts with 2 rows + var rng = ws.Range("B2:C3"); + + // Insert a row above the range + ws.Row(1).InsertRowsBelow(1); // Range starts on B3 + + // Insert a row in between the range + ws.Row(3).InsertRowsBelow(1); // Range now has 3 rows + + // Insert a row (from a range) above the range + ws.Range("B1:C1").InsertRowsBelow(1); // Range starts on B4 + + // Insert a row (from a range) in between the range + ws.Range("B4:C4").InsertRowsBelow(1); // Range now has 4 rows + + // Inserting rows from a range not covering all columns + // does not affect our defined range + ws.Range("A1:B1").InsertRowsBelow(1); + ws.Range("C4:D4").InsertRowsBelow(1); + + // Delete a row above the range + ws.Row(1).Delete(); // Range starts on B3 + + // Delete a row (from a range) above the range + ws.Range("B1:C1").Delete(XLShiftDeletedCells.ShiftCellsUp); // Range starts on B2 + + // Delete a row in between the range + ws.Row(3).Delete(); // Range now has 3 rows + + // Delete a row (from a range) in between the range + ws.Range("B3:C3").Delete(XLShiftDeletedCells.ShiftCellsUp); // Range now has 2 rows + + // Deleting rows from a range not covering all columns + // does not affect our defined range + ws.Range("A1:B1").Delete(XLShiftDeletedCells.ShiftCellsUp); + ws.Range("C4:D4").Delete(XLShiftDeletedCells.ShiftCellsUp); + + rng.Style.Fill.BackgroundColor = XLColor.Orange; + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Ranges/MultipleRanges.cs b/ClosedXML_Examples/Ranges/MultipleRanges.cs index d49becf..0652f98 100644 --- a/ClosedXML_Examples/Ranges/MultipleRanges.cs +++ b/ClosedXML_Examples/Ranges/MultipleRanges.cs @@ -1,22 +1,22 @@ -using System; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class MultipleRanges : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Multiple Ranges"); - - // using multiple string range definitions - ws.Ranges("A1:B2,C3:D4,E5:F6").Style.Fill.BackgroundColor = XLColor.Red; - - // using a single string separated by commas - ws.Ranges("A5:B6,E1:F2").Style.Fill.BackgroundColor = XLColor.Orange; - - workbook.SaveAs(filePath); - } - } -} +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class MultipleRanges : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Multiple Ranges"); + + // using multiple string range definitions + ws.Ranges("A1:B2,C3:D4,E5:F6").Style.Fill.BackgroundColor = XLColor.Red; + + // using a single string separated by commas + ws.Ranges("A5:B6,E1:F2").Style.Fill.BackgroundColor = XLColor.Orange; + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Ranges/NamedRanges.cs b/ClosedXML_Examples/Ranges/NamedRanges.cs index 325a98f..948a56c 100644 --- a/ClosedXML_Examples/Ranges/NamedRanges.cs +++ b/ClosedXML_Examples/Ranges/NamedRanges.cs @@ -1,85 +1,85 @@ -using ClosedXML.Excel; -using System; - -namespace ClosedXML_Examples.Misc -{ - public class NamedRanges : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var wsPresentation = wb.Worksheets.Add("Presentation"); - var wsData = wb.Worksheets.Add("Data"); - - // Fill up some data - wsData.Cell(1, 1).Value = "Name"; - wsData.Cell(1, 2).Value = "Age"; - wsData.Cell(2, 1).Value = "Tom"; - wsData.Cell(2, 2).Value = 30; - wsData.Cell(3, 1).Value = "Dick"; - wsData.Cell(3, 2).Value = 25; - wsData.Cell(4, 1).Value = "Harry"; - wsData.Cell(4, 2).Value = 29; - - // Create a named range with the data: - wsData.Range("A2:B4").AddToNamed("PeopleData"); // Default named range scope is Workbook - - // Create a hidden named range - wb.NamedRanges.Add("Headers", wsData.Range("A1:B1")).Visible = false; - - // Create a hidden named range n worksheet scope - wsData.NamedRanges.Add("HeadersAndData", wsData.Range("A1:B4")).Visible = false; - - // Let's use the named range in a formula: - wsPresentation.Cell(1, 1).Value = "People Count:"; - wsPresentation.Cell(1, 2).FormulaA1 = "COUNT(PeopleData)"; - - // Create a named range with worksheet scope: - wsPresentation.Range("B1").AddToNamed("PeopleCount", XLScope.Worksheet); - - // Let's use the named range: - wsPresentation.Cell(2, 1).Value = "Total:"; - wsPresentation.Cell(2, 2).FormulaA1 = "PeopleCount"; - - // Copy the data in a named range: - wsPresentation.Cell(4, 1).Value = "People Data:"; - wsPresentation.Cell(5, 1).Value = wb.Range("PeopleData"); - - ///////////////////////////////////////////////////////////////////////// - // For the Excel geeks out there who actually know about - // named ranges with relative addresses, you can - // create such a thing with the following methods: - - // The following creates a relative named range pointing to the same row - // and one column to the right. For example if the current cell is B4 - // relativeRange1 will point to C4. - wsPresentation.NamedRanges.Add("relativeRange1", "Presentation!B1"); - - // The following creates a ralative named range pointing to the same row - // and one column to the left. For example if the current cell is D2 - // relativeRange2 will point to C2. - wb.NamedRanges.Add("relativeRange2", "Presentation!XFD1"); - - // Explanation: The address of a relative range always starts at A1 - // and moves from then on. To get the desired relative range just - // add or subtract the required rows and/or columns from A1. - // Column -1 = XFD, Column -2 = XFC, etc. - // Row -1 = 1048576, Row -2 = 1048575, etc. - ///////////////////////////////////////////////////////////////////////// - - wsData.Columns().AdjustToContents(); - wsPresentation.Columns().AdjustToContents(); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - #endregion Methods - } -} +using ClosedXML.Excel; +using System; + +namespace ClosedXML_Examples.Misc +{ + public class NamedRanges : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var wsPresentation = wb.Worksheets.Add("Presentation"); + var wsData = wb.Worksheets.Add("Data"); + + // Fill up some data + wsData.Cell(1, 1).Value = "Name"; + wsData.Cell(1, 2).Value = "Age"; + wsData.Cell(2, 1).Value = "Tom"; + wsData.Cell(2, 2).Value = 30; + wsData.Cell(3, 1).Value = "Dick"; + wsData.Cell(3, 2).Value = 25; + wsData.Cell(4, 1).Value = "Harry"; + wsData.Cell(4, 2).Value = 29; + + // Create a named range with the data: + wsData.Range("A2:B4").AddToNamed("PeopleData"); // Default named range scope is Workbook + + // Create a hidden named range + wb.NamedRanges.Add("Headers", wsData.Range("A1:B1")).Visible = false; + + // Create a hidden named range n worksheet scope + wsData.NamedRanges.Add("HeadersAndData", wsData.Range("A1:B4")).Visible = false; + + // Let's use the named range in a formula: + wsPresentation.Cell(1, 1).Value = "People Count:"; + wsPresentation.Cell(1, 2).FormulaA1 = "COUNT(PeopleData)"; + + // Create a named range with worksheet scope: + wsPresentation.Range("B1").AddToNamed("PeopleCount", XLScope.Worksheet); + + // Let's use the named range: + wsPresentation.Cell(2, 1).Value = "Total:"; + wsPresentation.Cell(2, 2).FormulaA1 = "PeopleCount"; + + // Copy the data in a named range: + wsPresentation.Cell(4, 1).Value = "People Data:"; + wsPresentation.Cell(5, 1).Value = wb.Range("PeopleData"); + + ///////////////////////////////////////////////////////////////////////// + // For the Excel geeks out there who actually know about + // named ranges with relative addresses, you can + // create such a thing with the following methods: + + // The following creates a relative named range pointing to the same row + // and one column to the right. For example if the current cell is B4 + // relativeRange1 will point to C4. + wsPresentation.NamedRanges.Add("relativeRange1", "Presentation!B1"); + + // The following creates a ralative named range pointing to the same row + // and one column to the left. For example if the current cell is D2 + // relativeRange2 will point to C2. + wb.NamedRanges.Add("relativeRange2", "Presentation!XFD1"); + + // Explanation: The address of a relative range always starts at A1 + // and moves from then on. To get the desired relative range just + // add or subtract the required rows and/or columns from A1. + // Column -1 = XFD, Column -2 = XFC, etc. + // Row -1 = 1048576, Row -2 = 1048575, etc. + ///////////////////////////////////////////////////////////////////////// + + wsData.Columns().AdjustToContents(); + wsPresentation.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + #endregion Methods + } +} diff --git a/ClosedXML_Examples/Ranges/SelectingRanges.cs b/ClosedXML_Examples/Ranges/SelectingRanges.cs index 963a3cd..f5897df 100644 --- a/ClosedXML_Examples/Ranges/SelectingRanges.cs +++ b/ClosedXML_Examples/Ranges/SelectingRanges.cs @@ -1,29 +1,29 @@ -using System; -using System.Linq; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Ranges -{ - public class SelectingRanges : IXLExample - { - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var wsActiveCell = wb.AddWorksheet("Set Active Cell"); - wsActiveCell.Cell("B2").SetActive(); - - var wsSelectRowsColumns = wb.AddWorksheet("Select Rows and Columns"); - wsSelectRowsColumns.Rows("2, 4-5").Select(); - wsSelectRowsColumns.Columns("2, 4-5").Select(); - - var wsSelectMisc = wb.AddWorksheet("Select Misc"); - wsSelectMisc.Cell("B2").Select(); - wsSelectMisc.Range("D2:E2").Select(); - wsSelectMisc.Ranges("C3, D4:E5").Select(); - - wb.SaveAs(filePath); - } - - } -} +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class SelectingRanges : IXLExample + { + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var wsActiveCell = wb.AddWorksheet("Set Active Cell"); + wsActiveCell.Cell("B2").SetActive(); + + var wsSelectRowsColumns = wb.AddWorksheet("Select Rows and Columns"); + wsSelectRowsColumns.Rows("2, 4-5").Select(); + wsSelectRowsColumns.Columns("2, 4-5").Select(); + + var wsSelectMisc = wb.AddWorksheet("Select Misc"); + wsSelectMisc.Cell("B2").Select(); + wsSelectMisc.Range("D2:E2").Select(); + wsSelectMisc.Ranges("C3, D4:E5").Select(); + + wb.SaveAs(filePath); + } + + } +} diff --git a/ClosedXML_Examples/Ranges/ShiftingRanges.cs b/ClosedXML_Examples/Ranges/ShiftingRanges.cs index b01bdb9..6bba32d 100644 --- a/ClosedXML_Examples/Ranges/ShiftingRanges.cs +++ b/ClosedXML_Examples/Ranges/ShiftingRanges.cs @@ -1,40 +1,40 @@ -using System.IO; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class ShiftingRanges : IXLExample - { - public void Create(string filePath) - { - string tempFile = ExampleHelper.GetTempFilePath(filePath); - try - { - new BasicTable().Create(tempFile); - var workbook = new XLWorkbook(tempFile); - var ws = workbook.Worksheet(1); - - // Get a range object - var rngHeaders = ws.Range("B3:F3"); - - // Insert some rows/columns before the range - ws.Row(1).InsertRowsAbove(2); - ws.Column(1).InsertColumnsBefore(2); - - // Change the background color of the headers - rngHeaders.Style.Fill.BackgroundColor = XLColor.LightSalmon; - - ws.Columns().AdjustToContents(); - - workbook.SaveAs(filePath); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - } -} +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class ShiftingRanges : IXLExample + { + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + var ws = workbook.Worksheet(1); + + // Get a range object + var rngHeaders = ws.Range("B3:F3"); + + // Insert some rows/columns before the range + ws.Row(1).InsertRowsAbove(2); + ws.Column(1).InsertColumnsBefore(2); + + // Change the background color of the headers + rngHeaders.Style.Fill.BackgroundColor = XLColor.LightSalmon; + + ws.Columns().AdjustToContents(); + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } +} diff --git a/ClosedXML_Examples/Ranges/SortExample.cs b/ClosedXML_Examples/Ranges/SortExample.cs index 926a114..084808f 100644 --- a/ClosedXML_Examples/Ranges/SortExample.cs +++ b/ClosedXML_Examples/Ranges/SortExample.cs @@ -1,233 +1,233 @@ -using System; -using System.Linq; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class SortExample : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - - #region Sort a table - var wsTable = wb.Worksheets.Add("Table"); - AddTestTable(wsTable); - var header = wsTable.Row(1).InsertRowsAbove(1).First(); - for(Int32 co = 1; co <= wsTable.LastColumnUsed().ColumnNumber(); co++) - { - header.Cell(co).Value = "Column" + co.ToString(); - } - var rangeTable = wsTable.RangeUsed(); - var table = rangeTable.CopyTo(wsTable.Column(wsTable.LastColumnUsed().ColumnNumber() + 3)).CreateTable(); - - table.Sort("Column2, Column3 Desc, Column1 ASC"); - - wsTable.Row(1).InsertRowsAbove(2); - wsTable.Cell(1, 1) - .SetValue(".Sort(\"Column2, Column3 Desc, Column1 ASC\") = Sort table Top to Bottom, Col 2 Asc, Col 3 Desc, Col 1 Asc, Ignore Blanks, Ignore Case") - .Style.Font.SetBold(); - #endregion - - #region Sort a simple range left to right - var wsLeftToRight = wb.Worksheets.Add("Sort Left to Right"); - AddTestTable(wsLeftToRight); - wsLeftToRight.RangeUsed().Transpose(XLTransposeOptions.MoveCells); - var rangeLeftToRight = wsLeftToRight.RangeUsed(); - var copyLeftToRight = rangeLeftToRight.CopyTo(wsLeftToRight.Row(wsLeftToRight.LastRowUsed().RowNumber() + 3)); - - copyLeftToRight.SortLeftToRight(); - - wsLeftToRight.Row(1).InsertRowsAbove(2); - wsLeftToRight.Cell(1, 1) - .SetValue(".SortLeftToRight() = Sort Range Left to Right, Ascendingly, Ignore Blanks, Ignore Case") - .Style.Font.SetBold(); - #endregion - - #region Sort a range - var wsComplex2 = wb.Worksheets.Add("Complex 2"); - AddTestTable(wsComplex2); - var rangeComplex2 = wsComplex2.RangeUsed(); - var copyComplex2 = rangeComplex2.CopyTo(wsComplex2.Column(wsComplex2.LastColumnUsed().ColumnNumber() + 3)); - - copyComplex2.SortColumns.Add(1, XLSortOrder.Ascending, false, true); - copyComplex2.SortColumns.Add(3, XLSortOrder.Descending); - copyComplex2.Sort(); - - wsComplex2.Row(1).InsertRowsAbove(4); - wsComplex2.Cell(1, 1) - .SetValue(".SortColumns.Add(1, XLSortOrder.Ascending, false, true) = Sort Col 1 Asc, Match Blanks, Match Case").Style.Font.SetBold(); - wsComplex2.Cell(2, 1) - .SetValue(".SortColumns.Add(3, XLSortOrder.Descending) = Sort Col 3 Desc, Ignore Blanks, Ignore Case").Style.Font.SetBold(); - wsComplex2.Cell(3, 1) - .SetValue(".Sort() = Sort range using the parameters defined in SortColumns").Style.Font.SetBold(); - #endregion - - #region Sort a range - var wsComplex1 = wb.Worksheets.Add("Complex 1"); - AddTestTable(wsComplex1); - var rangeComplex1 = wsComplex1.RangeUsed(); - var copyComplex1 = rangeComplex1.CopyTo(wsComplex1.Column(wsComplex1.LastColumnUsed().ColumnNumber() + 3)); - - copyComplex1.Sort("2, 1 DESC", XLSortOrder.Ascending, true); - - wsComplex1.Row(1).InsertRowsAbove(2); - wsComplex1.Cell(1, 1) - .SetValue(".Sort(\"2, 1 DESC\", XLSortOrder.Ascending, true) = Sort Range Top to Bottom, Col 2 Asc, Col 1 Desc, Ignore Blanks, Match Case").Style.Font.SetBold(); - #endregion - - #region Sort a simple column - var wsSimpleColumn = wb.Worksheets.Add("Simple Column"); - AddTestColumn(wsSimpleColumn); - var rangeSimpleColumn = wsSimpleColumn.RangeUsed(); - var copySimpleColumn = rangeSimpleColumn.CopyTo(wsSimpleColumn.Column(wsSimpleColumn.LastColumnUsed().ColumnNumber() + 3)); - - copySimpleColumn.FirstColumn().Sort(XLSortOrder.Descending, true); - - wsSimpleColumn.Row(1).InsertRowsAbove(2); - wsSimpleColumn.Cell(1, 1) - .SetValue(".Sort(XLSortOrder.Descending, true) = Sort Range Top to Bottom, Descendingly, Ignore Blanks, Match Case").Style.Font.SetBold(); - #endregion - - #region Sort a simple range - var wsSimple = wb.Worksheets.Add("Simple"); - AddTestTable(wsSimple); - var rangeSimple = wsSimple.RangeUsed(); - var copySimple = rangeSimple.CopyTo(wsSimple.Column(wsSimple.LastColumnUsed().ColumnNumber() + 3)); - - copySimple.Sort(); - - wsSimple.Row(1).InsertRowsAbove(2); - wsSimple.Cell(1, 1).SetValue(".Sort() = Sort Range Top to Bottom, Ascendingly, Ignore Blanks, Ignore Case").Style.Font.SetBold(); - #endregion - - wb.SaveAs(filePath); - } - - private void AddTestColumnMixed(IXLWorksheet ws) - { - ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue(new TimeSpan(9, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - private void AddTestColumnNumbers(IXLWorksheet ws) - { - ws.Cell("A1").SetValue(1.30).Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue(1230).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue(4.30).Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue(4.15).Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - private void AddTestColumnTimeSpans(IXLWorksheet ws) - { - ws.Cell("A1").SetValue(new TimeSpan(0, 12, 35, 21)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue(new TimeSpan(45, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue(new TimeSpan(0, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue(new TimeSpan(1, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue(new TimeSpan(1, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - private void AddTestColumnDates(IXLWorksheet ws) - { - ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue(new DateTime(2011, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue(new DateTime(2011, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue(new DateTime(2011, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue(new DateTime(2011, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - private void AddTestColumn(IXLWorksheet ws) - { - ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue("c").Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - private void AddTestTable(IXLWorksheet ws) - { - ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.DeepPink); - - ws.Cell("B1").SetValue("").Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("B2").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("B3").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("B4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("B5").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("B6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("B7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("B8").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DeepPink); - - ws.Cell("C1").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("C2").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("C3").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("C4").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("C5").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("C6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("C7").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("C8").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - // Private - - // Override - - - #endregion - } -} +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class SortExample : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + #region Sort a table + var wsTable = wb.Worksheets.Add("Table"); + AddTestTable(wsTable); + var header = wsTable.Row(1).InsertRowsAbove(1).First(); + for(Int32 co = 1; co <= wsTable.LastColumnUsed().ColumnNumber(); co++) + { + header.Cell(co).Value = "Column" + co.ToString(); + } + var rangeTable = wsTable.RangeUsed(); + var table = rangeTable.CopyTo(wsTable.Column(wsTable.LastColumnUsed().ColumnNumber() + 3)).CreateTable(); + + table.Sort("Column2, Column3 Desc, Column1 ASC"); + + wsTable.Row(1).InsertRowsAbove(2); + wsTable.Cell(1, 1) + .SetValue(".Sort(\"Column2, Column3 Desc, Column1 ASC\") = Sort table Top to Bottom, Col 2 Asc, Col 3 Desc, Col 1 Asc, Ignore Blanks, Ignore Case") + .Style.Font.SetBold(); + #endregion + + #region Sort a simple range left to right + var wsLeftToRight = wb.Worksheets.Add("Sort Left to Right"); + AddTestTable(wsLeftToRight); + wsLeftToRight.RangeUsed().Transpose(XLTransposeOptions.MoveCells); + var rangeLeftToRight = wsLeftToRight.RangeUsed(); + var copyLeftToRight = rangeLeftToRight.CopyTo(wsLeftToRight.Row(wsLeftToRight.LastRowUsed().RowNumber() + 3)); + + copyLeftToRight.SortLeftToRight(); + + wsLeftToRight.Row(1).InsertRowsAbove(2); + wsLeftToRight.Cell(1, 1) + .SetValue(".SortLeftToRight() = Sort Range Left to Right, Ascendingly, Ignore Blanks, Ignore Case") + .Style.Font.SetBold(); + #endregion + + #region Sort a range + var wsComplex2 = wb.Worksheets.Add("Complex 2"); + AddTestTable(wsComplex2); + var rangeComplex2 = wsComplex2.RangeUsed(); + var copyComplex2 = rangeComplex2.CopyTo(wsComplex2.Column(wsComplex2.LastColumnUsed().ColumnNumber() + 3)); + + copyComplex2.SortColumns.Add(1, XLSortOrder.Ascending, false, true); + copyComplex2.SortColumns.Add(3, XLSortOrder.Descending); + copyComplex2.Sort(); + + wsComplex2.Row(1).InsertRowsAbove(4); + wsComplex2.Cell(1, 1) + .SetValue(".SortColumns.Add(1, XLSortOrder.Ascending, false, true) = Sort Col 1 Asc, Match Blanks, Match Case").Style.Font.SetBold(); + wsComplex2.Cell(2, 1) + .SetValue(".SortColumns.Add(3, XLSortOrder.Descending) = Sort Col 3 Desc, Ignore Blanks, Ignore Case").Style.Font.SetBold(); + wsComplex2.Cell(3, 1) + .SetValue(".Sort() = Sort range using the parameters defined in SortColumns").Style.Font.SetBold(); + #endregion + + #region Sort a range + var wsComplex1 = wb.Worksheets.Add("Complex 1"); + AddTestTable(wsComplex1); + var rangeComplex1 = wsComplex1.RangeUsed(); + var copyComplex1 = rangeComplex1.CopyTo(wsComplex1.Column(wsComplex1.LastColumnUsed().ColumnNumber() + 3)); + + copyComplex1.Sort("2, 1 DESC", XLSortOrder.Ascending, true); + + wsComplex1.Row(1).InsertRowsAbove(2); + wsComplex1.Cell(1, 1) + .SetValue(".Sort(\"2, 1 DESC\", XLSortOrder.Ascending, true) = Sort Range Top to Bottom, Col 2 Asc, Col 1 Desc, Ignore Blanks, Match Case").Style.Font.SetBold(); + #endregion + + #region Sort a simple column + var wsSimpleColumn = wb.Worksheets.Add("Simple Column"); + AddTestColumn(wsSimpleColumn); + var rangeSimpleColumn = wsSimpleColumn.RangeUsed(); + var copySimpleColumn = rangeSimpleColumn.CopyTo(wsSimpleColumn.Column(wsSimpleColumn.LastColumnUsed().ColumnNumber() + 3)); + + copySimpleColumn.FirstColumn().Sort(XLSortOrder.Descending, true); + + wsSimpleColumn.Row(1).InsertRowsAbove(2); + wsSimpleColumn.Cell(1, 1) + .SetValue(".Sort(XLSortOrder.Descending, true) = Sort Range Top to Bottom, Descendingly, Ignore Blanks, Match Case").Style.Font.SetBold(); + #endregion + + #region Sort a simple range + var wsSimple = wb.Worksheets.Add("Simple"); + AddTestTable(wsSimple); + var rangeSimple = wsSimple.RangeUsed(); + var copySimple = rangeSimple.CopyTo(wsSimple.Column(wsSimple.LastColumnUsed().ColumnNumber() + 3)); + + copySimple.Sort(); + + wsSimple.Row(1).InsertRowsAbove(2); + wsSimple.Cell(1, 1).SetValue(".Sort() = Sort Range Top to Bottom, Ascendingly, Ignore Blanks, Ignore Case").Style.Font.SetBold(); + #endregion + + wb.SaveAs(filePath); + } + + private void AddTestColumnMixed(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new TimeSpan(9, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumnNumbers(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(1.30).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(1230).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(4.30).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(4.15).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumnTimeSpans(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new TimeSpan(0, 12, 35, 21)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(new TimeSpan(45, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(new TimeSpan(0, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new TimeSpan(1, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new TimeSpan(1, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumnDates(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(new DateTime(2011, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new DateTime(2011, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(new DateTime(2011, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new DateTime(2011, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumn(IXLWorksheet ws) + { + ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue("c").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestTable(IXLWorksheet ws) + { + ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + + ws.Cell("B1").SetValue("").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("B2").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("B3").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("B4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("B5").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("B6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("B7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("B8").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + + ws.Cell("C1").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("C2").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("C3").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("C4").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("C5").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("C6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("C7").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("C8").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/Sorting.cs b/ClosedXML_Examples/Ranges/Sorting.cs index 4d24204..67ab08f 100644 --- a/ClosedXML_Examples/Ranges/Sorting.cs +++ b/ClosedXML_Examples/Ranges/Sorting.cs @@ -1,257 +1,257 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Misc -{ - public class Sorting : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - - #region Sort Table - var wsTable = wb.Worksheets.Add("Table"); - AddTestTable(wsTable); - var header = wsTable.Row(1).InsertRowsAbove(1); - Int32 lastCo = wsTable.LastColumnUsed().ColumnNumber(); - for (Int32 co = 1; co <= lastCo; co++) - wsTable.Cell(1, co).Value = "Column" + co.ToString(); - - var table = wsTable.RangeUsed().AsTable(); - table.Sort("Column2 Desc, 1, 3 Asc"); - #endregion - - #region Sort Rows - var wsRows = wb.Worksheets.Add("Rows"); - AddTestTable(wsRows); - wsRows.Row(1).Sort(); - wsRows.RangeUsed().Row(2).Sort(); - wsRows.Rows(3, wsRows.LastRowUsed().RowNumber()).Delete(); - #endregion - - #region Sort Columns - var wsColumns = wb.Worksheets.Add("Columns"); - AddTestTable(wsColumns); - wsColumns.LastColumnUsed().Delete(); - wsColumns.Column(1).Sort(); - wsColumns.RangeUsed().Column(2).Sort(); - #endregion - - #region Sort Mixed - var wsMixed = wb.Worksheets.Add("Mixed"); - AddTestColumnMixed(wsMixed); - wsMixed.Sort(); - #endregion - - #region Sort Numbers - var wsNumbers = wb.Worksheets.Add("Numbers"); - AddTestColumnNumbers(wsNumbers); - wsNumbers.Sort(); - #endregion - - #region Sort TimeSpans - var wsTimeSpans = wb.Worksheets.Add("TimeSpans"); - AddTestColumnTimeSpans(wsTimeSpans); - wsTimeSpans.Sort(); - #endregion - - #region Sort Dates - var wsDates = wb.Worksheets.Add("Dates"); - AddTestColumnDates(wsDates); - wsDates.Sort(); - #endregion - - #region Do Not Ignore Blanks - var wsIncludeBlanks = wb.Worksheets.Add("Include Blanks"); - AddTestTable(wsIncludeBlanks); - var rangeIncludeBlanks = wsIncludeBlanks; - rangeIncludeBlanks.SortColumns.Add(1, XLSortOrder.Ascending, false, true); - rangeIncludeBlanks.SortColumns.Add(2, XLSortOrder.Descending, false, true); - rangeIncludeBlanks.Sort(); - - var wsIncludeBlanksColumn = wb.Worksheets.Add("Include Blanks Column"); - AddTestColumn(wsIncludeBlanksColumn); - var rangeIncludeBlanksColumn = wsIncludeBlanksColumn; - rangeIncludeBlanksColumn.SortColumns.Add(1, XLSortOrder.Ascending, false, true); - rangeIncludeBlanksColumn.Sort(); - - var wsIncludeBlanksColumnDesc = wb.Worksheets.Add("Include Blanks Column Desc"); - AddTestColumn(wsIncludeBlanksColumnDesc); - var rangeIncludeBlanksColumnDesc = wsIncludeBlanksColumnDesc; - rangeIncludeBlanksColumnDesc.SortColumns.Add(1, XLSortOrder.Descending, false, true); - rangeIncludeBlanksColumnDesc.Sort(); - #endregion - - #region Case Sensitive - var wsCaseSensitive = wb.Worksheets.Add("Case Sensitive"); - AddTestTable(wsCaseSensitive); - var rangeCaseSensitive = wsCaseSensitive; - rangeCaseSensitive.SortColumns.Add(1, XLSortOrder.Ascending, true, true); - rangeCaseSensitive.SortColumns.Add(2, XLSortOrder.Descending, true, true); - rangeCaseSensitive.Sort(); - - var wsCaseSensitiveColumn = wb.Worksheets.Add("Case Sensitive Column"); - AddTestColumn(wsCaseSensitiveColumn); - var rangeCaseSensitiveColumn = wsCaseSensitiveColumn; - rangeCaseSensitiveColumn.SortColumns.Add(1, XLSortOrder.Ascending, true, true); - rangeCaseSensitiveColumn.Sort(); - - var wsCaseSensitiveColumnDesc = wb.Worksheets.Add("Case Sensitive Column Desc"); - AddTestColumn(wsCaseSensitiveColumnDesc); - var rangeCaseSensitiveColumnDesc = wsCaseSensitiveColumnDesc; - rangeCaseSensitiveColumnDesc.SortColumns.Add(1, XLSortOrder.Descending, true, true); - rangeCaseSensitiveColumnDesc.Sort(); - #endregion - - #region Simple Sorts - var wsSimple = wb.Worksheets.Add("Simple"); - AddTestTable(wsSimple); - wsSimple.Sort(); - - var wsSimpleDesc = wb.Worksheets.Add("Simple Desc"); - AddTestTable(wsSimpleDesc); - wsSimpleDesc.Sort("", XLSortOrder.Descending); - - var wsSimpleColumns = wb.Worksheets.Add("Simple Columns"); - AddTestTable(wsSimpleColumns); - wsSimpleColumns.Sort("2, A DESC, 3"); - - var wsSimpleColumn = wb.Worksheets.Add("Simple Column"); - AddTestColumn(wsSimpleColumn); - wsSimpleColumn.Sort(); - - var wsSimpleColumnDesc = wb.Worksheets.Add("Simple Column Desc"); - AddTestColumn(wsSimpleColumnDesc); - wsSimpleColumnDesc.Sort(1, XLSortOrder.Descending); - #endregion - - wb.SaveAs(filePath); - } - - private void AddTestColumnMixed(IXLWorksheet ws) - { - ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue(new TimeSpan(9, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - private void AddTestColumnNumbers(IXLWorksheet ws) - { - ws.Cell("A1").SetValue(1.30).Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue(1230).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue(4.30).Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue(4.15).Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - private void AddTestColumnTimeSpans(IXLWorksheet ws) - { - ws.Cell("A1").SetValue(new TimeSpan(0, 12, 35, 21)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue(new TimeSpan(45, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue(new TimeSpan(0, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue(new TimeSpan(1, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue(new TimeSpan(1, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - private void AddTestColumnDates(IXLWorksheet ws) - { - ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue(new DateTime(2011, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue(new DateTime(2011, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue(new DateTime(2011, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue(new DateTime(2011, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - private void AddTestColumn(IXLWorksheet ws) - { - ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue("c").Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - private void AddTestTable(IXLWorksheet ws) - { - ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("A4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("A6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("A7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("A8").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.DeepPink); - - ws.Cell("B1").SetValue("").Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("B2").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("B3").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("B4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("B5").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("B6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("B7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("B8").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DeepPink); - - ws.Cell("C1").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.LightGreen); - ws.Cell("C2").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); - ws.Cell("C3").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); - ws.Cell("C4").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkGray); - ws.Cell("C5").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); - ws.Cell("C6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); - ws.Cell("C7").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.IndianRed); - ws.Cell("C8").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DeepPink); - } - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Misc +{ + public class Sorting : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + + #region Sort Table + var wsTable = wb.Worksheets.Add("Table"); + AddTestTable(wsTable); + var header = wsTable.Row(1).InsertRowsAbove(1); + Int32 lastCo = wsTable.LastColumnUsed().ColumnNumber(); + for (Int32 co = 1; co <= lastCo; co++) + wsTable.Cell(1, co).Value = "Column" + co.ToString(); + + var table = wsTable.RangeUsed().AsTable(); + table.Sort("Column2 Desc, 1, 3 Asc"); + #endregion + + #region Sort Rows + var wsRows = wb.Worksheets.Add("Rows"); + AddTestTable(wsRows); + wsRows.Row(1).Sort(); + wsRows.RangeUsed().Row(2).Sort(); + wsRows.Rows(3, wsRows.LastRowUsed().RowNumber()).Delete(); + #endregion + + #region Sort Columns + var wsColumns = wb.Worksheets.Add("Columns"); + AddTestTable(wsColumns); + wsColumns.LastColumnUsed().Delete(); + wsColumns.Column(1).Sort(); + wsColumns.RangeUsed().Column(2).Sort(); + #endregion + + #region Sort Mixed + var wsMixed = wb.Worksheets.Add("Mixed"); + AddTestColumnMixed(wsMixed); + wsMixed.Sort(); + #endregion + + #region Sort Numbers + var wsNumbers = wb.Worksheets.Add("Numbers"); + AddTestColumnNumbers(wsNumbers); + wsNumbers.Sort(); + #endregion + + #region Sort TimeSpans + var wsTimeSpans = wb.Worksheets.Add("TimeSpans"); + AddTestColumnTimeSpans(wsTimeSpans); + wsTimeSpans.Sort(); + #endregion + + #region Sort Dates + var wsDates = wb.Worksheets.Add("Dates"); + AddTestColumnDates(wsDates); + wsDates.Sort(); + #endregion + + #region Do Not Ignore Blanks + var wsIncludeBlanks = wb.Worksheets.Add("Include Blanks"); + AddTestTable(wsIncludeBlanks); + var rangeIncludeBlanks = wsIncludeBlanks; + rangeIncludeBlanks.SortColumns.Add(1, XLSortOrder.Ascending, false, true); + rangeIncludeBlanks.SortColumns.Add(2, XLSortOrder.Descending, false, true); + rangeIncludeBlanks.Sort(); + + var wsIncludeBlanksColumn = wb.Worksheets.Add("Include Blanks Column"); + AddTestColumn(wsIncludeBlanksColumn); + var rangeIncludeBlanksColumn = wsIncludeBlanksColumn; + rangeIncludeBlanksColumn.SortColumns.Add(1, XLSortOrder.Ascending, false, true); + rangeIncludeBlanksColumn.Sort(); + + var wsIncludeBlanksColumnDesc = wb.Worksheets.Add("Include Blanks Column Desc"); + AddTestColumn(wsIncludeBlanksColumnDesc); + var rangeIncludeBlanksColumnDesc = wsIncludeBlanksColumnDesc; + rangeIncludeBlanksColumnDesc.SortColumns.Add(1, XLSortOrder.Descending, false, true); + rangeIncludeBlanksColumnDesc.Sort(); + #endregion + + #region Case Sensitive + var wsCaseSensitive = wb.Worksheets.Add("Case Sensitive"); + AddTestTable(wsCaseSensitive); + var rangeCaseSensitive = wsCaseSensitive; + rangeCaseSensitive.SortColumns.Add(1, XLSortOrder.Ascending, true, true); + rangeCaseSensitive.SortColumns.Add(2, XLSortOrder.Descending, true, true); + rangeCaseSensitive.Sort(); + + var wsCaseSensitiveColumn = wb.Worksheets.Add("Case Sensitive Column"); + AddTestColumn(wsCaseSensitiveColumn); + var rangeCaseSensitiveColumn = wsCaseSensitiveColumn; + rangeCaseSensitiveColumn.SortColumns.Add(1, XLSortOrder.Ascending, true, true); + rangeCaseSensitiveColumn.Sort(); + + var wsCaseSensitiveColumnDesc = wb.Worksheets.Add("Case Sensitive Column Desc"); + AddTestColumn(wsCaseSensitiveColumnDesc); + var rangeCaseSensitiveColumnDesc = wsCaseSensitiveColumnDesc; + rangeCaseSensitiveColumnDesc.SortColumns.Add(1, XLSortOrder.Descending, true, true); + rangeCaseSensitiveColumnDesc.Sort(); + #endregion + + #region Simple Sorts + var wsSimple = wb.Worksheets.Add("Simple"); + AddTestTable(wsSimple); + wsSimple.Sort(); + + var wsSimpleDesc = wb.Worksheets.Add("Simple Desc"); + AddTestTable(wsSimpleDesc); + wsSimpleDesc.Sort("", XLSortOrder.Descending); + + var wsSimpleColumns = wb.Worksheets.Add("Simple Columns"); + AddTestTable(wsSimpleColumns); + wsSimpleColumns.Sort("2, A DESC, 3"); + + var wsSimpleColumn = wb.Worksheets.Add("Simple Column"); + AddTestColumn(wsSimpleColumn); + wsSimpleColumn.Sort(); + + var wsSimpleColumnDesc = wb.Worksheets.Add("Simple Column Desc"); + AddTestColumn(wsSimpleColumnDesc); + wsSimpleColumnDesc.Sort(1, XLSortOrder.Descending); + #endregion + + wb.SaveAs(filePath); + } + + private void AddTestColumnMixed(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new TimeSpan(9, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumnNumbers(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(1.30).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(1.15).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(1230).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(9).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(4.30).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(4.15).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumnTimeSpans(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new TimeSpan(0, 12, 35, 21)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(new TimeSpan(45, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new TimeSpan(1, 1, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(new TimeSpan(0, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new TimeSpan(1, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new TimeSpan(1, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumnDates(IXLWorksheet ws) + { + ws.Cell("A1").SetValue(new DateTime(2011, 1, 30)).Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue(new DateTime(2011, 1, 15)).Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue(new DateTime(2011, 12, 30)).Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue(new DateTime(2011, 12, 15)).Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue(new DateTime(2011, 4, 30)).Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue(new DateTime(2011, 4, 15)).Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestColumn(IXLWorksheet ws) + { + ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue("c").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + private void AddTestTable(IXLWorksheet ws) + { + ws.Cell("A1").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("A2").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("A3").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("A4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("A5").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("A6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("A7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("A8").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + + ws.Cell("B1").SetValue("").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("B2").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("B3").SetValue("B").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("B4").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("B5").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("B6").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("B7").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("B8").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + + ws.Cell("C1").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.LightGreen); + ws.Cell("C2").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DarkTurquoise); + ws.Cell("C3").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.BurlyWood); + ws.Cell("C4").SetValue("a").Style.Fill.SetBackgroundColor(XLColor.DarkGray); + ws.Cell("C5").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.DarkSalmon); + ws.Cell("C6").SetValue("b").Style.Fill.SetBackgroundColor(XLColor.DodgerBlue); + ws.Cell("C7").SetValue("A").Style.Fill.SetBackgroundColor(XLColor.IndianRed); + ws.Cell("C8").SetValue("").Style.Fill.SetBackgroundColor(XLColor.DeepPink); + } + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/TransposeRanges.cs b/ClosedXML_Examples/Ranges/TransposeRanges.cs index 3d1af2d..bc74b0c 100644 --- a/ClosedXML_Examples/Ranges/TransposeRanges.cs +++ b/ClosedXML_Examples/Ranges/TransposeRanges.cs @@ -1,37 +1,37 @@ -using System.IO; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples -{ - public class TransposeRanges:IXLExample - { - public void Create(string filePath) - { - string tempFile = ExampleHelper.GetTempFilePath(filePath); - try - { - new BasicTable().Create(tempFile); - var workbook = new XLWorkbook(tempFile); - - var ws = workbook.Worksheet(1); - - var rngTable = ws.Range("B2:F6"); - - rngTable.Transpose(XLTransposeOptions.MoveCells); - - ws.Columns().AdjustToContents(); - - workbook.SaveAs(filePath); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - - } - } +using System.IO; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples +{ + public class TransposeRanges:IXLExample + { + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + + var ws = workbook.Worksheet(1); + + var rngTable = ws.Range("B2:F6"); + + rngTable.Transpose(XLTransposeOptions.MoveCells); + + ws.Columns().AdjustToContents(); + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Ranges/TransposeRangesPlus.cs b/ClosedXML_Examples/Ranges/TransposeRangesPlus.cs index 9ced0c0..f96ba38 100644 --- a/ClosedXML_Examples/Ranges/TransposeRangesPlus.cs +++ b/ClosedXML_Examples/Ranges/TransposeRangesPlus.cs @@ -1,46 +1,46 @@ -using System.IO; -using ClosedXML.Excel; - -namespace ClosedXML_Examples -{ - public class TransposeRangesPlus : IXLExample - { - public void Create(string filePath) - { - string tempFile = ExampleHelper.GetTempFilePath(filePath); - try - { - new BasicTable().Create(tempFile); - var workbook = new XLWorkbook(tempFile); - - var ws = workbook.Worksheet(1); - - var rngTable = ws.Range("B2:F6"); - - rngTable.Row(rngTable.RowCount() - 1).Delete(XLShiftDeletedCells.ShiftCellsUp); - - // Place some markers - var cellNextRow = ws.Cell(rngTable.RangeAddress.LastAddress.RowNumber + 1, rngTable.RangeAddress.LastAddress.ColumnNumber); - cellNextRow.Value = "ColumnRight Row"; - var cellNextColumn = ws.Cell(rngTable.RangeAddress.LastAddress.RowNumber, rngTable.RangeAddress.LastAddress.ColumnNumber + 1); - cellNextColumn.Value = "ColumnRight Column"; - - rngTable.Transpose(XLTransposeOptions.MoveCells); - rngTable.Transpose(XLTransposeOptions.MoveCells); - rngTable.Transpose(XLTransposeOptions.ReplaceCells); - rngTable.Transpose(XLTransposeOptions.ReplaceCells); - - ws.Columns().AdjustToContents(); - - workbook.SaveAs(filePath); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - } +using System.IO; +using ClosedXML.Excel; + +namespace ClosedXML_Examples +{ + public class TransposeRangesPlus : IXLExample + { + public void Create(string filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + + var ws = workbook.Worksheet(1); + + var rngTable = ws.Range("B2:F6"); + + rngTable.Row(rngTable.RowCount() - 1).Delete(XLShiftDeletedCells.ShiftCellsUp); + + // Place some markers + var cellNextRow = ws.Cell(rngTable.RangeAddress.LastAddress.RowNumber + 1, rngTable.RangeAddress.LastAddress.ColumnNumber); + cellNextRow.Value = "ColumnRight Row"; + var cellNextColumn = ws.Cell(rngTable.RangeAddress.LastAddress.RowNumber, rngTable.RangeAddress.LastAddress.ColumnNumber + 1); + cellNextColumn.Value = "ColumnRight Column"; + + rngTable.Transpose(XLTransposeOptions.MoveCells); + rngTable.Transpose(XLTransposeOptions.MoveCells); + rngTable.Transpose(XLTransposeOptions.ReplaceCells); + rngTable.Transpose(XLTransposeOptions.ReplaceCells); + + ws.Columns().AdjustToContents(); + + workbook.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Ranges/UsingTables.cs b/ClosedXML_Examples/Ranges/UsingTables.cs index 045dca9..e5c24b2 100644 --- a/ClosedXML_Examples/Ranges/UsingTables.cs +++ b/ClosedXML_Examples/Ranges/UsingTables.cs @@ -1,106 +1,106 @@ -using System; -using System.IO; -using ClosedXML.Excel; -using System.Linq; - - -namespace ClosedXML_Examples.Ranges -{ - public class UsingTables : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - string tempFile = ExampleHelper.GetTempFilePath(filePath); - try - { - new BasicTable().Create(tempFile); - var wb = new XLWorkbook(tempFile); - var ws = wb.Worksheet(1); - ws.Name = "Contacts Table"; - var firstCell = ws.FirstCellUsed(); - var lastCell = ws.LastCellUsed(); - var range = ws.Range(firstCell.Address, lastCell.Address); - range.FirstRow().Delete(); // Deleting the "Contacts" header (we don't need it for our purposes) - - // We want to use a theme for table, not the hard coded format of the BasicTable - range.Clear(XLClearOptions.Formats); - // Put back the date and number formats - range.Column(4).Style.NumberFormat.NumberFormatId = 15; - range.Column(5).Style.NumberFormat.Format = "$ #,##0"; - - var table = range.CreateTable(); // You can also use range.AsTable() if you want to - // manipulate the range as a table but don't want - // to create the table in the worksheet. - - // Let's activate the Totals row and add the sum of Income - table.ShowTotalsRow = true; - table.Field("Income").TotalsRowFunction = XLTotalsRowFunction.Sum; - // Just for fun let's add the text "Sum Of Income" to the totals row - table.Field(0).TotalsRowLabel = "Sum Of Income"; - - // Copy all the headers - Int32 columnWithHeaders = lastCell.Address.ColumnNumber + 2; - Int32 currentRow = table.RangeAddress.FirstAddress.RowNumber; - ws.Cell(currentRow, columnWithHeaders).Value = "Table Headers"; - foreach (var cell in table.HeadersRow().Cells()) - { - currentRow++; - ws.Cell(currentRow, columnWithHeaders).Value = cell.Value; - } - - // Format the headers as a table with a different style and no autofilters - var htFirstCell = ws.Cell(table.RangeAddress.FirstAddress.RowNumber, columnWithHeaders); - var htLastCell = ws.Cell(currentRow, columnWithHeaders); - var headersTable = ws.Range(htFirstCell, htLastCell).CreateTable("Headers"); - headersTable.Theme = XLTableTheme.TableStyleLight10; - headersTable.ShowAutoFilter = false; - - // Add a custom formula to the headersTable - headersTable.ShowTotalsRow = true; - headersTable.Field(0).TotalsRowFormulaA1 = "CONCATENATE(\"Count: \", CountA(Headers[Table Headers]))"; - - // Copy the names - Int32 columnWithNames = columnWithHeaders + 2; - currentRow = table.RangeAddress.FirstAddress.RowNumber; // reset the currentRow - ws.Cell(currentRow, columnWithNames).Value = "Names"; - foreach (var row in table.DataRange.Rows()) - { - currentRow++; - var fName = row.Field("FName").GetString(); // Notice how we're calling the cell by field name - var lName = row.Field("LName").GetString(); // Notice how we're calling the cell by field name - var name = String.Format("{0} {1}", fName, lName); - ws.Cell(currentRow, columnWithNames).Value = name; - } - - // Format the names as a table with a different style and no autofilters - var ntFirstCell = ws.Cell(table.RangeAddress.FirstAddress.RowNumber, columnWithNames); - var ntLastCell = ws.Cell(currentRow, columnWithNames); - var namesTable = ws.Range(ntFirstCell, ntLastCell).CreateTable(); - namesTable.Theme = XLTableTheme.TableStyleLight12; - namesTable.ShowAutoFilter = false; - - ws.Columns().AdjustToContents(); - ws.Columns("A,G,I").Width = 3; - - wb.SaveAs(filePath); - } - finally - { - if (File.Exists(tempFile)) - { - File.Delete(tempFile); - } - } - } - - // Private - - // Override - - - #endregion - } -} +using System; +using System.IO; +using ClosedXML.Excel; +using System.Linq; + + +namespace ClosedXML_Examples.Ranges +{ + public class UsingTables : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new BasicTable().Create(tempFile); + var wb = new XLWorkbook(tempFile); + var ws = wb.Worksheet(1); + ws.Name = "Contacts Table"; + var firstCell = ws.FirstCellUsed(); + var lastCell = ws.LastCellUsed(); + var range = ws.Range(firstCell.Address, lastCell.Address); + range.FirstRow().Delete(); // Deleting the "Contacts" header (we don't need it for our purposes) + + // We want to use a theme for table, not the hard coded format of the BasicTable + range.Clear(XLClearOptions.Formats); + // Put back the date and number formats + range.Column(4).Style.NumberFormat.NumberFormatId = 15; + range.Column(5).Style.NumberFormat.Format = "$ #,##0"; + + var table = range.CreateTable(); // You can also use range.AsTable() if you want to + // manipulate the range as a table but don't want + // to create the table in the worksheet. + + // Let's activate the Totals row and add the sum of Income + table.ShowTotalsRow = true; + table.Field("Income").TotalsRowFunction = XLTotalsRowFunction.Sum; + // Just for fun let's add the text "Sum Of Income" to the totals row + table.Field(0).TotalsRowLabel = "Sum Of Income"; + + // Copy all the headers + Int32 columnWithHeaders = lastCell.Address.ColumnNumber + 2; + Int32 currentRow = table.RangeAddress.FirstAddress.RowNumber; + ws.Cell(currentRow, columnWithHeaders).Value = "Table Headers"; + foreach (var cell in table.HeadersRow().Cells()) + { + currentRow++; + ws.Cell(currentRow, columnWithHeaders).Value = cell.Value; + } + + // Format the headers as a table with a different style and no autofilters + var htFirstCell = ws.Cell(table.RangeAddress.FirstAddress.RowNumber, columnWithHeaders); + var htLastCell = ws.Cell(currentRow, columnWithHeaders); + var headersTable = ws.Range(htFirstCell, htLastCell).CreateTable("Headers"); + headersTable.Theme = XLTableTheme.TableStyleLight10; + headersTable.ShowAutoFilter = false; + + // Add a custom formula to the headersTable + headersTable.ShowTotalsRow = true; + headersTable.Field(0).TotalsRowFormulaA1 = "CONCATENATE(\"Count: \", CountA(Headers[Table Headers]))"; + + // Copy the names + Int32 columnWithNames = columnWithHeaders + 2; + currentRow = table.RangeAddress.FirstAddress.RowNumber; // reset the currentRow + ws.Cell(currentRow, columnWithNames).Value = "Names"; + foreach (var row in table.DataRange.Rows()) + { + currentRow++; + var fName = row.Field("FName").GetString(); // Notice how we're calling the cell by field name + var lName = row.Field("LName").GetString(); // Notice how we're calling the cell by field name + var name = String.Format("{0} {1}", fName, lName); + ws.Cell(currentRow, columnWithNames).Value = name; + } + + // Format the names as a table with a different style and no autofilters + var ntFirstCell = ws.Cell(table.RangeAddress.FirstAddress.RowNumber, columnWithNames); + var ntLastCell = ws.Cell(currentRow, columnWithNames); + var namesTable = ws.Range(ntFirstCell, ntLastCell).CreateTable(); + namesTable.Theme = XLTableTheme.TableStyleLight12; + namesTable.ShowAutoFilter = false; + + ws.Columns().AdjustToContents(); + ws.Columns("A,G,I").Width = 3; + + wb.SaveAs(filePath); + } + finally + { + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Ranges/WalkingRanges.cs b/ClosedXML_Examples/Ranges/WalkingRanges.cs index e891fbc..a6b5f75 100644 --- a/ClosedXML_Examples/Ranges/WalkingRanges.cs +++ b/ClosedXML_Examples/Ranges/WalkingRanges.cs @@ -1,68 +1,68 @@ -using System; -using System.Linq; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Ranges -{ - public class WalkingRanges : IXLExample - { - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Walking Cells"); - - var cell = ws.Cell(5, 5).SetValue("(5,5)"); - - cell.CellAbove().SetValue("(4,5)").Style.Fill.SetBackgroundColor(XLColor.LightSalmon); - cell.CellAbove(2).SetValue("(3,5)").Style.Fill.SetBackgroundColor(XLColor.LightSalmon); - cell.CellBelow().SetValue("(6,5)").Style.Fill.SetBackgroundColor(XLColor.Salmon); - cell.CellBelow(2).SetValue("(7,5)").Style.Fill.SetBackgroundColor(XLColor.Salmon); - - cell.CellLeft().SetValue("(5,4)").Style.Fill.SetBackgroundColor(XLColor.LightBlue); - cell.CellLeft(2).SetValue("(5,3)").Style.Fill.SetBackgroundColor(XLColor.LightBlue); - cell.CellRight().SetValue("(5,6)").Style.Fill.SetBackgroundColor(XLColor.BlueBell); - cell.CellRight(2).SetValue("(5,7)").Style.Fill.SetBackgroundColor(XLColor.BlueBell); - - var wsWalkRows = wb.Worksheets.Add("Walking rows"); - - var row = wsWalkRows.Row(3); - row.RowAbove().Style.Fill.SetBackgroundColor(XLColor.Salmon); - row.RowAbove(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); - row.RowBelow().Style.Fill.SetBackgroundColor(XLColor.Blue); - row.RowBelow(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); - - var rangeRow = wsWalkRows.Range("B8:D12").Row(3); - rangeRow.RowAbove().Style.Fill.SetBackgroundColor(XLColor.Salmon); - rangeRow.RowAbove(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); - rangeRow.RowBelow().Style.Fill.SetBackgroundColor(XLColor.Blue); - rangeRow.RowBelow(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); - - var wsWalkColumns = wb.Worksheets.Add("Walking columns"); - - var column = wsWalkColumns.Column(3); - column.ColumnLeft().Style.Fill.SetBackgroundColor(XLColor.Salmon); - column.ColumnLeft(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); - column.ColumnRight().Style.Fill.SetBackgroundColor(XLColor.Blue); - column.ColumnRight(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); - - var rangeColumn = wsWalkColumns.Range("H2:L4").Column(3); - rangeColumn.ColumnLeft().Style.Fill.SetBackgroundColor(XLColor.Salmon); - rangeColumn.ColumnLeft(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); - rangeColumn.ColumnRight().Style.Fill.SetBackgroundColor(XLColor.Blue); - rangeColumn.ColumnRight(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Ranges +{ + public class WalkingRanges : IXLExample + { + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Walking Cells"); + + var cell = ws.Cell(5, 5).SetValue("(5,5)"); + + cell.CellAbove().SetValue("(4,5)").Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + cell.CellAbove(2).SetValue("(3,5)").Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + cell.CellBelow().SetValue("(6,5)").Style.Fill.SetBackgroundColor(XLColor.Salmon); + cell.CellBelow(2).SetValue("(7,5)").Style.Fill.SetBackgroundColor(XLColor.Salmon); + + cell.CellLeft().SetValue("(5,4)").Style.Fill.SetBackgroundColor(XLColor.LightBlue); + cell.CellLeft(2).SetValue("(5,3)").Style.Fill.SetBackgroundColor(XLColor.LightBlue); + cell.CellRight().SetValue("(5,6)").Style.Fill.SetBackgroundColor(XLColor.BlueBell); + cell.CellRight(2).SetValue("(5,7)").Style.Fill.SetBackgroundColor(XLColor.BlueBell); + + var wsWalkRows = wb.Worksheets.Add("Walking rows"); + + var row = wsWalkRows.Row(3); + row.RowAbove().Style.Fill.SetBackgroundColor(XLColor.Salmon); + row.RowAbove(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + row.RowBelow().Style.Fill.SetBackgroundColor(XLColor.Blue); + row.RowBelow(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); + + var rangeRow = wsWalkRows.Range("B8:D12").Row(3); + rangeRow.RowAbove().Style.Fill.SetBackgroundColor(XLColor.Salmon); + rangeRow.RowAbove(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + rangeRow.RowBelow().Style.Fill.SetBackgroundColor(XLColor.Blue); + rangeRow.RowBelow(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); + + var wsWalkColumns = wb.Worksheets.Add("Walking columns"); + + var column = wsWalkColumns.Column(3); + column.ColumnLeft().Style.Fill.SetBackgroundColor(XLColor.Salmon); + column.ColumnLeft(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + column.ColumnRight().Style.Fill.SetBackgroundColor(XLColor.Blue); + column.ColumnRight(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); + + var rangeColumn = wsWalkColumns.Range("H2:L4").Column(3); + rangeColumn.ColumnLeft().Style.Fill.SetBackgroundColor(XLColor.Salmon); + rangeColumn.ColumnLeft(2).Style.Fill.SetBackgroundColor(XLColor.LightSalmon); + rangeColumn.ColumnRight().Style.Fill.SetBackgroundColor(XLColor.Blue); + rangeColumn.ColumnRight(2).Style.Fill.SetBackgroundColor(XLColor.BlueBell); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Resources/SampleImage.jpg b/ClosedXML_Examples/Resources/SampleImage.jpg new file mode 100644 index 0000000..e7a7f75 --- /dev/null +++ b/ClosedXML_Examples/Resources/SampleImage.jpg Binary files differ diff --git a/ClosedXML_Examples/Rows/InsertRows.cs b/ClosedXML_Examples/Rows/InsertRows.cs index 8b46171..bb519b3 100644 --- a/ClosedXML_Examples/Rows/InsertRows.cs +++ b/ClosedXML_Examples/Rows/InsertRows.cs @@ -1,83 +1,83 @@ -using System; -using System.Linq; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Rows -{ - public class InsertRows : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Inserting Rows"); - - // Color the entire spreadsheet using rows - ws.Rows().Style.Fill.BackgroundColor = XLColor.LightCyan; - - // Put a value in a few cells - foreach (var r in Enumerable.Range(1, 5)) - foreach (var c in Enumerable.Range(1, 5)) - ws.Cell(r, c).Value = "X"; - - var blueRow = ws.Row(2); - var redRow = ws.Row(5); - - blueRow.Style.Fill.BackgroundColor = XLColor.Blue; - blueRow.InsertRowsBelow(2); - - - redRow.Style.Fill.BackgroundColor = XLColor.Red; - redRow.InsertRowsAbove(2); - - ws.Columns(3, 4).Style.Fill.BackgroundColor = XLColor.Orange; - ws.Range("A2:A4").InsertRowsBelow(2); - ws.Range("B2:B4").InsertRowsAbove(2); - ws.Range("C2:C4").InsertRowsBelow(2); - ws.Range("D2:D4").InsertRowsAbove(2); - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using System.Linq; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Rows +{ + public class InsertRows : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Inserting Rows"); + + // Color the entire spreadsheet using rows + ws.Rows().Style.Fill.BackgroundColor = XLColor.LightCyan; + + // Put a value in a few cells + foreach (var r in Enumerable.Range(1, 5)) + foreach (var c in Enumerable.Range(1, 5)) + ws.Cell(r, c).Value = "X"; + + var blueRow = ws.Row(2); + var redRow = ws.Row(5); + + blueRow.Style.Fill.BackgroundColor = XLColor.Blue; + blueRow.InsertRowsBelow(2); + + + redRow.Style.Fill.BackgroundColor = XLColor.Red; + redRow.InsertRowsAbove(2); + + ws.Columns(3, 4).Style.Fill.BackgroundColor = XLColor.Orange; + ws.Range("A2:A4").InsertRowsBelow(2); + ws.Range("B2:B4").InsertRowsAbove(2); + ws.Range("C2:C4").InsertRowsBelow(2); + ws.Range("D2:D4").InsertRowsAbove(2); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Rows/RowCells.cs b/ClosedXML_Examples/Rows/RowCells.cs index 369ae43..2add1eb 100644 --- a/ClosedXML_Examples/Rows/RowCells.cs +++ b/ClosedXML_Examples/Rows/RowCells.cs @@ -1,73 +1,73 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples -{ - public class RowCells : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Row Cells"); - - var rowFromWorksheet = ws.Row(1); - rowFromWorksheet.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; - rowFromWorksheet.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; - rowFromWorksheet.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; - rowFromWorksheet.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; - - var rowFromRange = ws.Range("A2:I2").FirstRow(); - - rowFromRange.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; - rowFromRange.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; - rowFromRange.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; - rowFromRange.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; - - ws.Columns().Width = 7; - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples +{ + public class RowCells : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Row Cells"); + + var rowFromWorksheet = ws.Row(1); + rowFromWorksheet.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; + rowFromWorksheet.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; + rowFromWorksheet.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; + rowFromWorksheet.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; + + var rowFromRange = ws.Range("A2:I2").FirstRow(); + + rowFromRange.Cell(1).Style.Fill.BackgroundColor = XLColor.Red; + rowFromRange.Cells("2").Style.Fill.BackgroundColor = XLColor.Blue; + rowFromRange.Cells("3,5:6").Style.Fill.BackgroundColor = XLColor.Red; + rowFromRange.Cells(8, 9).Style.Fill.BackgroundColor = XLColor.Blue; + + ws.Columns().Width = 7; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Rows/RowCollection.cs b/ClosedXML_Examples/Rows/RowCollection.cs index b4b8817..31e63c1 100644 --- a/ClosedXML_Examples/Rows/RowCollection.cs +++ b/ClosedXML_Examples/Rows/RowCollection.cs @@ -1,96 +1,96 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Rows -{ - public class RowCollection : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Rows of a Range"); - - // All rows in a range - ws.Range("A1:B2").Rows().Style.Fill.BackgroundColor = XLColor.DimGray; - - var bigRange = ws.Range("B4:C17"); - - // Contiguous rows by number - bigRange.Rows(1, 2).Style.Fill.BackgroundColor = XLColor.Red; - - // Contiguous rows by number - bigRange.Rows("4:5").Style.Fill.BackgroundColor = XLColor.Blue; - - // Spread rows by number - bigRange.Rows("7:8,10:11").Style.Fill.BackgroundColor = XLColor.Orange; - - // Using a single number - bigRange.Rows("13").Style.Fill.BackgroundColor = XLColor.Cyan; - - // Adjust the height - ws.Rows().Height = 15; - - var ws2 = workbook.Worksheets.Add("Rows of a Worksheet"); - - // Contiguous rows by number - ws2.Rows(1, 2).Style.Fill.BackgroundColor = XLColor.Red; - - // Contiguous rows by number - ws2.Rows("4:5").Style.Fill.BackgroundColor = XLColor.Blue; - - // Spread rows by number - ws2.Rows("7:8,10:11").Style.Fill.BackgroundColor = XLColor.Orange; - - // Using a single number - ws2.Rows("13").Style.Fill.BackgroundColor = XLColor.Cyan; - - // Adjust the height - ws2.Rows("1:13").Height = 15; - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Rows +{ + public class RowCollection : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Rows of a Range"); + + // All rows in a range + ws.Range("A1:B2").Rows().Style.Fill.BackgroundColor = XLColor.DimGray; + + var bigRange = ws.Range("B4:C17"); + + // Contiguous rows by number + bigRange.Rows(1, 2).Style.Fill.BackgroundColor = XLColor.Red; + + // Contiguous rows by number + bigRange.Rows("4:5").Style.Fill.BackgroundColor = XLColor.Blue; + + // Spread rows by number + bigRange.Rows("7:8,10:11").Style.Fill.BackgroundColor = XLColor.Orange; + + // Using a single number + bigRange.Rows("13").Style.Fill.BackgroundColor = XLColor.Cyan; + + // Adjust the height + ws.Rows().Height = 15; + + var ws2 = workbook.Worksheets.Add("Rows of a Worksheet"); + + // Contiguous rows by number + ws2.Rows(1, 2).Style.Fill.BackgroundColor = XLColor.Red; + + // Contiguous rows by number + ws2.Rows("4:5").Style.Fill.BackgroundColor = XLColor.Blue; + + // Spread rows by number + ws2.Rows("7:8,10:11").Style.Fill.BackgroundColor = XLColor.Orange; + + // Using a single number + ws2.Rows("13").Style.Fill.BackgroundColor = XLColor.Cyan; + + // Adjust the height + ws2.Rows("1:13").Height = 15; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Rows/RowSettings.cs b/ClosedXML_Examples/Rows/RowSettings.cs index 54798a2..ea402ff 100644 --- a/ClosedXML_Examples/Rows/RowSettings.cs +++ b/ClosedXML_Examples/Rows/RowSettings.cs @@ -1,80 +1,80 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Rows -{ - public class RowSettings : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Constructors - - // Public - public RowSettings() - { - - } - - - // Private - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Row Settings"); - - var row1 = ws.Row(2); - row1.Style.Fill.BackgroundColor = XLColor.Red; - row1.Height = 30; - - var row2 = ws.Row(4); - row2.Style.Fill.BackgroundColor = XLColor.DarkOrange; - row2.Height = 3; - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Rows +{ + public class RowSettings : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + public RowSettings() + { + + } + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Row Settings"); + + var row1 = ws.Row(2); + row1.Style.Fill.BackgroundColor = XLColor.Red; + row1.Height = 30; + + var row2 = ws.Row(4); + row2.Style.Fill.BackgroundColor = XLColor.DarkOrange; + row2.Height = 3; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/StyleExamples.cs b/ClosedXML_Examples/StyleExamples.cs index adeb703..7617e76 100644 --- a/ClosedXML_Examples/StyleExamples.cs +++ b/ClosedXML_Examples/StyleExamples.cs @@ -1,73 +1,73 @@ -using ClosedXML_Examples.Styles; -using System.IO; - -namespace ClosedXML_Examples -{ - public class StyleExamples - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Constructors - - // Public - public StyleExamples() - { - - } - - - // Private - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create() - { - var path = Program.BaseCreatedDirectory; - new StyleFont().Create(Path.Combine(path, "styleFont.xlsx")); - new StyleFill().Create(Path.Combine(path, "styleFill.xlsx")); - new StyleBorder().Create(Path.Combine(path, "styleBorder.xlsx")); - new StyleAlignment().Create(Path.Combine(path, "styleAlignment.xlsx")); - new StyleNumberFormat().Create(Path.Combine(path, "styleNumberFormat.xlsx")); - } - - // Private - - // Override - - - #endregion - } -} +using ClosedXML_Examples.Styles; +using System.IO; + +namespace ClosedXML_Examples +{ + public class StyleExamples + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + public StyleExamples() + { + + } + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create() + { + var path = Program.BaseCreatedDirectory; + new StyleFont().Create(Path.Combine(path, "styleFont.xlsx")); + new StyleFill().Create(Path.Combine(path, "styleFill.xlsx")); + new StyleBorder().Create(Path.Combine(path, "styleBorder.xlsx")); + new StyleAlignment().Create(Path.Combine(path, "styleAlignment.xlsx")); + new StyleNumberFormat().Create(Path.Combine(path, "styleNumberFormat.xlsx")); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Styles/DefaultStyles.cs b/ClosedXML_Examples/Styles/DefaultStyles.cs index 8c49955..f940844 100644 --- a/ClosedXML_Examples/Styles/DefaultStyles.cs +++ b/ClosedXML_Examples/Styles/DefaultStyles.cs @@ -1,29 +1,29 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Styles -{ - public class DefaultStyles : IXLExample - { - public void Create(String filePath) - { - // Create our workbook - var workbook = new XLWorkbook(); - - // This worksheet will have the default style, row height, column width, and page setup - var ws1 = workbook.Worksheets.Add("Default Style"); - - // Change the default row height for all new worksheets in this workbook - workbook.RowHeight = 30; - - var ws2 = workbook.Worksheets.Add("Tall Rows"); - - // Create a worksheet and change the default row height - var ws3 = workbook.Worksheets.Add("Short Rows"); - ws3.RowHeight = 7.5; - - workbook.SaveAs(filePath); - } - } +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class DefaultStyles : IXLExample + { + public void Create(String filePath) + { + // Create our workbook + var workbook = new XLWorkbook(); + + // This worksheet will have the default style, row height, column width, and page setup + var ws1 = workbook.Worksheets.Add("Default Style"); + + // Change the default row height for all new worksheets in this workbook + workbook.RowHeight = 30; + + var ws2 = workbook.Worksheets.Add("Tall Rows"); + + // Create a worksheet and change the default row height + var ws3 = workbook.Worksheets.Add("Short Rows"); + ws3.RowHeight = 7.5; + + workbook.SaveAs(filePath); + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/PurpleWorksheet.cs b/ClosedXML_Examples/Styles/PurpleWorksheet.cs index fa4e674..a42856d 100644 --- a/ClosedXML_Examples/Styles/PurpleWorksheet.cs +++ b/ClosedXML_Examples/Styles/PurpleWorksheet.cs @@ -1,19 +1,19 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Styles -{ - public class PurpleWorksheet : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Purple Worksheet"); - - ws.Style.Fill.BackgroundColor = XLColor.Purple; - - workbook.SaveAs(filePath); - } - } +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class PurpleWorksheet : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Purple Worksheet"); + + ws.Style.Fill.BackgroundColor = XLColor.Purple; + + workbook.SaveAs(filePath); + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/StyleAlignment.cs b/ClosedXML_Examples/Styles/StyleAlignment.cs index 8ff3bcf..ca6fcb9 100644 --- a/ClosedXML_Examples/Styles/StyleAlignment.cs +++ b/ClosedXML_Examples/Styles/StyleAlignment.cs @@ -1,105 +1,105 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Styles -{ - public class StyleAlignment : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Constructors - - // Public - public StyleAlignment() - { - - } - - - // Private - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Style Alignment"); - - var co = 2; - var ro = 1; - - ws.Cell(++ro, co).Value = "Horizontal = Right"; - ws.Cell(ro, co).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right; - - ws.Cell(++ro, co).Value = "Indent = 2"; - ws.Cell(ro, co).Style.Alignment.Indent = 2; - - ws.Cell(++ro, co).Value = "JustifyLastLine = true"; - ws.Cell(ro, co).Style.Alignment.JustifyLastLine = true; - - ws.Cell(++ro, co).Value = "ReadingOrder = ContextDependent"; - ws.Cell(ro, co).Style.Alignment.ReadingOrder = XLAlignmentReadingOrderValues.ContextDependent; - - ws.Cell(++ro, co).Value = "RelativeIndent = 2"; - ws.Cell(ro, co).Style.Alignment.RelativeIndent = 2; - - ws.Cell(++ro, co).Value = "ShrinkToFit = true"; - ws.Cell(ro, co).Style.Alignment.ShrinkToFit = true; - - ws.Cell(++ro, co).Value = "TextRotation = 45"; - ws.Cell(ro, co).Style.Alignment.TextRotation = 45; - - ws.Cell(++ro, co).Value = "TopToBottom = true"; - ws.Cell(ro, co).Style.Alignment.TopToBottom = true; - - ws.Cell(++ro, co).Value = "Vertical = Center"; - ws.Cell(ro, co).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; - - ws.Cell(++ro, co).Value = "WrapText = true"; - ws.Cell(ro, co).Style.Alignment.WrapText = true; - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class StyleAlignment : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + public StyleAlignment() + { + + } + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Alignment"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co).Value = "Horizontal = Right"; + ws.Cell(ro, co).Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Right; + + ws.Cell(++ro, co).Value = "Indent = 2"; + ws.Cell(ro, co).Style.Alignment.Indent = 2; + + ws.Cell(++ro, co).Value = "JustifyLastLine = true"; + ws.Cell(ro, co).Style.Alignment.JustifyLastLine = true; + + ws.Cell(++ro, co).Value = "ReadingOrder = ContextDependent"; + ws.Cell(ro, co).Style.Alignment.ReadingOrder = XLAlignmentReadingOrderValues.ContextDependent; + + ws.Cell(++ro, co).Value = "RelativeIndent = 2"; + ws.Cell(ro, co).Style.Alignment.RelativeIndent = 2; + + ws.Cell(++ro, co).Value = "ShrinkToFit = true"; + ws.Cell(ro, co).Style.Alignment.ShrinkToFit = true; + + ws.Cell(++ro, co).Value = "TextRotation = 45"; + ws.Cell(ro, co).Style.Alignment.TextRotation = 45; + + ws.Cell(++ro, co).Value = "TopToBottom = true"; + ws.Cell(ro, co).Style.Alignment.TopToBottom = true; + + ws.Cell(++ro, co).Value = "Vertical = Center"; + ws.Cell(ro, co).Style.Alignment.Vertical = XLAlignmentVerticalValues.Center; + + ws.Cell(++ro, co).Value = "WrapText = true"; + ws.Cell(ro, co).Style.Alignment.WrapText = true; + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Styles/StyleBorder.cs b/ClosedXML_Examples/Styles/StyleBorder.cs index d151b27..bffc64d 100644 --- a/ClosedXML_Examples/Styles/StyleBorder.cs +++ b/ClosedXML_Examples/Styles/StyleBorder.cs @@ -1,52 +1,52 @@ -using System; - -using ClosedXML.Excel; - -namespace ClosedXML_Examples.Styles -{ - public class StyleBorder : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Style Border"); - - var co = 2; - var ro = 1; - - ws.Cell(++ro, co).Value = "BottomBorder = Thick; BottomBorderColor = Red"; - ws.Cell(ro, co).Style.Border.BottomBorder = XLBorderStyleValues.Thick; - ws.Cell(ro, co).Style.Border.BottomBorderColor = XLColor.Red; - - ws.Cell(++ro, co).Value = "LeftBorder = Thick; LeftBorderColor = Blue"; - ws.Cell(ro, co).Style.Border.LeftBorder = XLBorderStyleValues.Thick; - ws.Cell(ro, co).Style.Border.LeftBorderColor = XLColor.Blue; - - ws.Cell(++ro, co).Value = "TopBorder = Thick; TopBorderColor = Yellow"; - ws.Cell(ro, co).Style.Border.TopBorder = XLBorderStyleValues.Thick; - ws.Cell(ro, co).Style.Border.TopBorderColor = XLColor.Yellow; - - ws.Cell(++ro, co).Value = "RightBorder = Thick; RightBorderColor = Black"; - ws.Cell(ro, co).Style.Border.RightBorder = XLBorderStyleValues.Thick; - ws.Cell(ro, co).Style.Border.RightBorderColor = XLColor.Black; - - ws.Cell(++ro, co).Value = "DiagonalBorder = Thin; DiagonalBorderColor = Red; DiagonalUp = true"; - ws.Cell(ro, co).Style.Border.DiagonalBorder = XLBorderStyleValues.Thin; - ws.Cell(ro, co).Style.Border.DiagonalBorderColor = XLColor.Red; - ws.Cell(ro, co).Style.Border.DiagonalUp = true; - - ws.Cell(++ro, co).Value = "DiagonalBorder = Thin; DiagonalBorderColor = Red; DiagonalDown = true"; - ws.Cell(ro, co).Style.Border.DiagonalBorder = XLBorderStyleValues.Thin; - ws.Cell(ro, co).Style.Border.DiagonalBorderColor = XLColor.Red; - ws.Cell(ro, co).Style.Border.DiagonalDown = true; - - ws.Cell(++ro, co).Value = "DiagonalBorder = Thin; DiagonalBorderColor = Red; DiagonalUp = true; DiagonalDown = true"; - ws.Cell(ro, co).Style.Border.DiagonalBorder = XLBorderStyleValues.Thin; - ws.Cell(ro, co).Style.Border.DiagonalBorderColor = XLColor.Red; - ws.Cell(ro, co).Style.Border.DiagonalUp = true; - ws.Cell(ro, co).Style.Border.DiagonalDown = true; - - workbook.SaveAs(filePath); - } - } +using System; + +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Styles +{ + public class StyleBorder : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Border"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co).Value = "BottomBorder = Thick; BottomBorderColor = Red"; + ws.Cell(ro, co).Style.Border.BottomBorder = XLBorderStyleValues.Thick; + ws.Cell(ro, co).Style.Border.BottomBorderColor = XLColor.Red; + + ws.Cell(++ro, co).Value = "LeftBorder = Thick; LeftBorderColor = Blue"; + ws.Cell(ro, co).Style.Border.LeftBorder = XLBorderStyleValues.Thick; + ws.Cell(ro, co).Style.Border.LeftBorderColor = XLColor.Blue; + + ws.Cell(++ro, co).Value = "TopBorder = Thick; TopBorderColor = Yellow"; + ws.Cell(ro, co).Style.Border.TopBorder = XLBorderStyleValues.Thick; + ws.Cell(ro, co).Style.Border.TopBorderColor = XLColor.Yellow; + + ws.Cell(++ro, co).Value = "RightBorder = Thick; RightBorderColor = Black"; + ws.Cell(ro, co).Style.Border.RightBorder = XLBorderStyleValues.Thick; + ws.Cell(ro, co).Style.Border.RightBorderColor = XLColor.Black; + + ws.Cell(++ro, co).Value = "DiagonalBorder = Thin; DiagonalBorderColor = Red; DiagonalUp = true"; + ws.Cell(ro, co).Style.Border.DiagonalBorder = XLBorderStyleValues.Thin; + ws.Cell(ro, co).Style.Border.DiagonalBorderColor = XLColor.Red; + ws.Cell(ro, co).Style.Border.DiagonalUp = true; + + ws.Cell(++ro, co).Value = "DiagonalBorder = Thin; DiagonalBorderColor = Red; DiagonalDown = true"; + ws.Cell(ro, co).Style.Border.DiagonalBorder = XLBorderStyleValues.Thin; + ws.Cell(ro, co).Style.Border.DiagonalBorderColor = XLColor.Red; + ws.Cell(ro, co).Style.Border.DiagonalDown = true; + + ws.Cell(++ro, co).Value = "DiagonalBorder = Thin; DiagonalBorderColor = Red; DiagonalUp = true; DiagonalDown = true"; + ws.Cell(ro, co).Style.Border.DiagonalBorder = XLBorderStyleValues.Thin; + ws.Cell(ro, co).Style.Border.DiagonalBorderColor = XLColor.Red; + ws.Cell(ro, co).Style.Border.DiagonalUp = true; + ws.Cell(ro, co).Style.Border.DiagonalDown = true; + + workbook.SaveAs(filePath); + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/StyleFill.cs b/ClosedXML_Examples/Styles/StyleFill.cs index f9edee2..a5d0800 100644 --- a/ClosedXML_Examples/Styles/StyleFill.cs +++ b/ClosedXML_Examples/Styles/StyleFill.cs @@ -1,30 +1,30 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Styles -{ - - - public class StyleFill : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Style Fill"); - - var co = 2; - var ro = 1; - - ws.Cell(++ro, co + 1).Value = "BackgroundColor = Red"; - ws.Cell(ro, co).Style.Fill.BackgroundColor = XLColor.Red; - - ws.Cell(++ro, co + 1).Value = "PatternType = DarkTrellis; PatternColor = Orange; PatternBackgroundColor = Blue"; - ws.Cell(ro, co).Style.Fill.PatternType = XLFillPatternValues.DarkTrellis; - ws.Cell(ro, co).Style.Fill.PatternColor = XLColor.Orange; - ws.Cell(ro, co).Style.Fill.PatternBackgroundColor = XLColor.Blue; - - workbook.SaveAs(filePath); - } - } +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + + + public class StyleFill : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Fill"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co + 1).Value = "BackgroundColor = Red"; + ws.Cell(ro, co).Style.Fill.BackgroundColor = XLColor.Red; + + ws.Cell(++ro, co + 1).Value = "PatternType = DarkTrellis; PatternColor = Orange; PatternBackgroundColor = Blue"; + ws.Cell(ro, co).Style.Fill.PatternType = XLFillPatternValues.DarkTrellis; + ws.Cell(ro, co).Style.Fill.PatternColor = XLColor.Orange; + ws.Cell(ro, co).Style.Fill.PatternBackgroundColor = XLColor.Blue; + + workbook.SaveAs(filePath); + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/StyleFont.cs b/ClosedXML_Examples/Styles/StyleFont.cs index d1f3a9e..7da4adf 100644 --- a/ClosedXML_Examples/Styles/StyleFont.cs +++ b/ClosedXML_Examples/Styles/StyleFont.cs @@ -1,49 +1,49 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Styles -{ - public class StyleFont : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Style Font"); - - var co = 2; - var ro = 1; - - ws.Cell(++ro, co).Value = "Bold"; - ws.Cell(ro, co).Style.Font.Bold = true; - - ws.Cell(++ro, co).Value = "FontColor - Red"; - ws.Cell(ro, co).Style.Font.FontColor = XLColor.Red; - - ws.Cell(++ro, co).Value = "FontFamilyNumbering - Script"; - ws.Cell(ro, co).Style.Font.FontFamilyNumbering = XLFontFamilyNumberingValues.Script; - - ws.Cell(++ro, co).Value = "FontName - Stencil"; - ws.Cell(ro, co).Style.Font.FontName = "Stencil"; - - ws.Cell(++ro, co).Value = "FontSize - 15"; - ws.Cell(ro, co).Style.Font.FontSize = 15; - - ws.Cell(++ro, co).Value = "Italic - true"; - ws.Cell(ro, co).Style.Font.Italic = true; - - ws.Cell(++ro, co).Value = "Strikethrough - true"; - ws.Cell(ro, co).Style.Font.Strikethrough = true; - - ws.Cell(++ro, co).Value = "Underline - Double"; - ws.Cell(ro, co).Style.Font.Underline = XLFontUnderlineValues.Double; - - ws.Cell(++ro, co).Value = "VerticalAlignment - Superscript"; - ws.Cell(ro, co).Style.Font.VerticalAlignment = XLFontVerticalTextAlignmentValues.Superscript; - - ws.Column(co).AdjustToContents(); - - workbook.SaveAs(filePath); - } - } -} +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class StyleFont : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Font"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co).Value = "Bold"; + ws.Cell(ro, co).Style.Font.Bold = true; + + ws.Cell(++ro, co).Value = "FontColor - Red"; + ws.Cell(ro, co).Style.Font.FontColor = XLColor.Red; + + ws.Cell(++ro, co).Value = "FontFamilyNumbering - Script"; + ws.Cell(ro, co).Style.Font.FontFamilyNumbering = XLFontFamilyNumberingValues.Script; + + ws.Cell(++ro, co).Value = "FontName - Stencil"; + ws.Cell(ro, co).Style.Font.FontName = "Stencil"; + + ws.Cell(++ro, co).Value = "FontSize - 15"; + ws.Cell(ro, co).Style.Font.FontSize = 15; + + ws.Cell(++ro, co).Value = "Italic - true"; + ws.Cell(ro, co).Style.Font.Italic = true; + + ws.Cell(++ro, co).Value = "Strikethrough - true"; + ws.Cell(ro, co).Style.Font.Strikethrough = true; + + ws.Cell(++ro, co).Value = "Underline - Double"; + ws.Cell(ro, co).Style.Font.Underline = XLFontUnderlineValues.Double; + + ws.Cell(++ro, co).Value = "VerticalAlignment - Superscript"; + ws.Cell(ro, co).Style.Font.VerticalAlignment = XLFontVerticalTextAlignmentValues.Superscript; + + ws.Column(co).AdjustToContents(); + + workbook.SaveAs(filePath); + } + } +} diff --git a/ClosedXML_Examples/Styles/StyleNumberFormat.cs b/ClosedXML_Examples/Styles/StyleNumberFormat.cs index 0972de5..0f6e7e6 100644 --- a/ClosedXML_Examples/Styles/StyleNumberFormat.cs +++ b/ClosedXML_Examples/Styles/StyleNumberFormat.cs @@ -1,85 +1,85 @@ -using System; -using ClosedXML.Excel; - -namespace ClosedXML_Examples.Styles -{ - public class StyleNumberFormat : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Constructors - - // Public - public StyleNumberFormat() - { - - } - - - // Private - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Style NumberFormat"); - - var co = 2; - var ro = 1; - - ws.Cell(++ro, co).Value = "123456.789"; - ws.Cell(ro, co).Style.NumberFormat.Format = "$ #,##0.00"; - - ws.Cell(++ro, co).Value = "12.345"; - ws.Cell(ro, co).Style.NumberFormat.Format = "0000"; - - ws.Cell(++ro, co).Value = "12.345"; - ws.Cell(ro, co).Style.NumberFormat.NumberFormatId = 3; - - ws.Column(co).AdjustToContents(); - - workbook.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Styles +{ + public class StyleNumberFormat : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + public StyleNumberFormat() + { + + } + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style NumberFormat"); + + var co = 2; + var ro = 1; + + ws.Cell(++ro, co).Value = "123456.789"; + ws.Cell(ro, co).Style.NumberFormat.Format = "$ #,##0.00"; + + ws.Cell(++ro, co).Value = "12.345"; + ws.Cell(ro, co).Style.NumberFormat.Format = "0000"; + + ws.Cell(++ro, co).Value = "12.345"; + ws.Cell(ro, co).Style.NumberFormat.NumberFormatId = 3; + + ws.Column(co).AdjustToContents(); + + workbook.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Styles/StyleRowsColumns.cs b/ClosedXML_Examples/Styles/StyleRowsColumns.cs index 4681ac9..a12a0b3 100644 --- a/ClosedXML_Examples/Styles/StyleRowsColumns.cs +++ b/ClosedXML_Examples/Styles/StyleRowsColumns.cs @@ -1,34 +1,34 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Styles -{ - public class StyleRowsColumns : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Style Rows and Columns"); - - //Set the entire worksheet's cells to be bold and with a light cyan background - ws.Style.Font.Bold = true; - ws.Style.Fill.BackgroundColor = XLColor.LightCyan; - - // Set the width of all columns in the worksheet - ws.Columns().Width = 5; - - // Set the height of all rows in the worksheet - ws.Rows().Height = 20; - - // Let's play with the rows and columns - ws.Rows(2, 3).Style.Fill.BackgroundColor = XLColor.Blue; - ws.Columns(3, 4).Style.Fill.BackgroundColor = XLColor.Orange; - ws.Rows(5, 5).Style.Fill.BackgroundColor = XLColor.Pink; - ws.Row(6).Style.Fill.BackgroundColor = XLColor.Brown; - ws.Column("E").Style.Fill.BackgroundColor = XLColor.Gray; - - workbook.SaveAs(filePath); - } - } +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class StyleRowsColumns : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Rows and Columns"); + + //Set the entire worksheet's cells to be bold and with a light cyan background + ws.Style.Font.Bold = true; + ws.Style.Fill.BackgroundColor = XLColor.LightCyan; + + // Set the width of all columns in the worksheet + ws.Columns().Width = 5; + + // Set the height of all rows in the worksheet + ws.Rows().Height = 20; + + // Let's play with the rows and columns + ws.Rows(2, 3).Style.Fill.BackgroundColor = XLColor.Blue; + ws.Columns(3, 4).Style.Fill.BackgroundColor = XLColor.Orange; + ws.Rows(5, 5).Style.Fill.BackgroundColor = XLColor.Pink; + ws.Row(6).Style.Fill.BackgroundColor = XLColor.Brown; + ws.Column("E").Style.Fill.BackgroundColor = XLColor.Gray; + + workbook.SaveAs(filePath); + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/StyleWorksheet.cs b/ClosedXML_Examples/Styles/StyleWorksheet.cs index 5669aaf..d17e4e3 100644 --- a/ClosedXML_Examples/Styles/StyleWorksheet.cs +++ b/ClosedXML_Examples/Styles/StyleWorksheet.cs @@ -1,42 +1,42 @@ -using System; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Styles -{ - public class StyleWorksheet : IXLExample - { - public void Create(String filePath) - { - var workbook = new XLWorkbook(); - var ws = workbook.Worksheets.Add("Style Worksheet"); - - ws.Style.Font.Bold = true; - ws.Style.Font.FontColor = XLColor.Red; - ws.Style.Fill.BackgroundColor = XLColor.Cyan; - - // The following cells will be bold and red - // because we've specified those attributes to the entire worksheet - ws.Cell(1, 1).Value = "Test"; - ws.Cell(1, 2).Value = "Case"; - - // Here we'll change the style of a single cell - ws.Cell(2, 1).Value = "Default"; - ws.Cell(2, 1).Style = XLWorkbook.DefaultStyle; - - // Let's play with some rows - ws.Row(4).Style = XLWorkbook.DefaultStyle; - ws.Row(4).Height = 20; - ws.Rows(5, 6).Style = XLWorkbook.DefaultStyle; - ws.Rows(5, 6).Height = 20; - - // Let's play with some columns - ws.Column(4).Style = XLWorkbook.DefaultStyle; - ws.Column(4).Width = 5; - ws.Columns(5, 6).Style = XLWorkbook.DefaultStyle; - ws.Columns(5, 6).Width = 5; - - workbook.SaveAs(filePath); - } - } +using System; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class StyleWorksheet : IXLExample + { + public void Create(String filePath) + { + var workbook = new XLWorkbook(); + var ws = workbook.Worksheets.Add("Style Worksheet"); + + ws.Style.Font.Bold = true; + ws.Style.Font.FontColor = XLColor.Red; + ws.Style.Fill.BackgroundColor = XLColor.Cyan; + + // The following cells will be bold and red + // because we've specified those attributes to the entire worksheet + ws.Cell(1, 1).Value = "Test"; + ws.Cell(1, 2).Value = "Case"; + + // Here we'll change the style of a single cell + ws.Cell(2, 1).Value = "Default"; + ws.Cell(2, 1).Style = XLWorkbook.DefaultStyle; + + // Let's play with some rows + ws.Row(4).Style = XLWorkbook.DefaultStyle; + ws.Row(4).Height = 20; + ws.Rows(5, 6).Style = XLWorkbook.DefaultStyle; + ws.Rows(5, 6).Height = 20; + + // Let's play with some columns + ws.Column(4).Style = XLWorkbook.DefaultStyle; + ws.Column(4).Width = 5; + ws.Columns(5, 6).Style = XLWorkbook.DefaultStyle; + ws.Columns(5, 6).Width = 5; + + workbook.SaveAs(filePath); + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/UsingColors.cs b/ClosedXML_Examples/Styles/UsingColors.cs index b736cff..9364c15 100644 --- a/ClosedXML_Examples/Styles/UsingColors.cs +++ b/ClosedXML_Examples/Styles/UsingColors.cs @@ -1,90 +1,90 @@ -using System; -using System.Drawing; -using ClosedXML.Excel; - - -namespace ClosedXML_Examples.Styles -{ - public class UsingColors : IXLExample - { - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Using Colors"); - - Int32 ro = 0; - - // From Known color - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.Red; - ws.Cell(ro, 2).Value = "XLColor.Red"; - - // From Color not so known - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.Byzantine; - ws.Cell(ro, 2).Value = "XLColor.Byzantine"; - - ro++; - - // FromArgb(Int32 argb) using Hex notation - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(0xFF00FF); - ws.Cell(ro, 2).Value = "XLColor.FromArgb(0xFF00FF)"; - - // FromArgb(Int32 argb) using an integer (you need to convert the hex value to an int) - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(16711935); - ws.Cell(ro, 2).Value = "XLColor.FromArgb(16711935)"; - - // FromArgb(Int32 r, Int32 g, Int32 b) - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(255, 0, 255); - ws.Cell(ro, 2).Value = "XLColor.FromArgb(255, 0, 255)"; - - // FromArgb(Int32 a, Int32 r, Int32 g, Int32 b) - // Note: Excel ignores the alpha value - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(0, 255, 0, 255); - ws.Cell(ro, 2).Value = "XLColor.FromArgb(0, 255, 0, 255)"; - - ro++; - - // FromColor(Color color) - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromColor(Color.Red); - ws.Cell(ro, 2).Value = "XLColor.FromColor(Color.Red)"; - - ro++; - - // FromHtml(String htmlColor) - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromHtml("#FF996515"); - ws.Cell(ro, 2).Value = "XLColor.FromHtml(\"#FF996515\")"; - - ro++; - - // FromIndex(Int32 indexedColor) - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromIndex(25); - ws.Cell(ro, 2).Value = "XLColor.FromIndex(25)"; - - ro++; - - // FromKnownColor(KnownColor knownColor) - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromKnownColor(KnownColor.Plum); - ws.Cell(ro, 2).Value = "XLColor.FromKnownColor(KnownColor.Plum)"; - - ro++; - - // FromName(String colorName) - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromName("PowderBlue"); - ws.Cell(ro, 2).Value = "XLColor.FromName(\"PowderBlue\")"; - - ro++; - - // From Theme color - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromTheme(XLThemeColor.Accent1); - ws.Cell(ro, 2).Value = "XLColor.FromTheme(XLThemeColor.Accent1)"; - - // From Theme color with tint - ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromTheme(XLThemeColor.Accent1, 0.5); - ws.Cell(ro, 2).Value = "XLColor.FromTheme(XLThemeColor.Accent1, 0.5)"; - - - ws.Columns().AdjustToContents(); - - wb.SaveAs(filePath); - } - } +using System; +using System.Drawing; +using ClosedXML.Excel; + + +namespace ClosedXML_Examples.Styles +{ + public class UsingColors : IXLExample + { + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Using Colors"); + + Int32 ro = 0; + + // From Known color + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.Red; + ws.Cell(ro, 2).Value = "XLColor.Red"; + + // From Color not so known + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.Byzantine; + ws.Cell(ro, 2).Value = "XLColor.Byzantine"; + + ro++; + + // FromArgb(Int32 argb) using Hex notation + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(0xFF00FF); + ws.Cell(ro, 2).Value = "XLColor.FromArgb(0xFF00FF)"; + + // FromArgb(Int32 argb) using an integer (you need to convert the hex value to an int) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(16711935); + ws.Cell(ro, 2).Value = "XLColor.FromArgb(16711935)"; + + // FromArgb(Int32 r, Int32 g, Int32 b) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(255, 0, 255); + ws.Cell(ro, 2).Value = "XLColor.FromArgb(255, 0, 255)"; + + // FromArgb(Int32 a, Int32 r, Int32 g, Int32 b) + // Note: Excel ignores the alpha value + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromArgb(0, 255, 0, 255); + ws.Cell(ro, 2).Value = "XLColor.FromArgb(0, 255, 0, 255)"; + + ro++; + + // FromColor(Color color) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromColor(Color.Red); + ws.Cell(ro, 2).Value = "XLColor.FromColor(Color.Red)"; + + ro++; + + // FromHtml(String htmlColor) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromHtml("#FF996515"); + ws.Cell(ro, 2).Value = "XLColor.FromHtml(\"#FF996515\")"; + + ro++; + + // FromIndex(Int32 indexedColor) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromIndex(25); + ws.Cell(ro, 2).Value = "XLColor.FromIndex(25)"; + + ro++; + + // FromKnownColor(KnownColor knownColor) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromKnownColor(KnownColor.Plum); + ws.Cell(ro, 2).Value = "XLColor.FromKnownColor(KnownColor.Plum)"; + + ro++; + + // FromName(String colorName) + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromName("PowderBlue"); + ws.Cell(ro, 2).Value = "XLColor.FromName(\"PowderBlue\")"; + + ro++; + + // From Theme color + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromTheme(XLThemeColor.Accent1); + ws.Cell(ro, 2).Value = "XLColor.FromTheme(XLThemeColor.Accent1)"; + + // From Theme color with tint + ws.Cell(++ro, 1).Style.Fill.BackgroundColor = XLColor.FromTheme(XLThemeColor.Accent1, 0.5); + ws.Cell(ro, 2).Value = "XLColor.FromTheme(XLThemeColor.Accent1, 0.5)"; + + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + } } \ No newline at end of file diff --git a/ClosedXML_Examples/Styles/UsingPhonetics.cs b/ClosedXML_Examples/Styles/UsingPhonetics.cs index aa727f2..eaf2e32 100644 --- a/ClosedXML_Examples/Styles/UsingPhonetics.cs +++ b/ClosedXML_Examples/Styles/UsingPhonetics.cs @@ -1,39 +1,39 @@ -using System; -using ClosedXML.Excel; - -namespace ClosedXML_Examples.Styles -{ - public class UsingPhonetics : IXLExample - { - - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Using Phonetics"); - - var cell = ws.Cell(1, 1); - - // Phonetics are implemented as part of the Rich Text functionality. For more information see [Using Rich Text] - // First we add the text. - cell.RichText.AddText("みんなさんはお元気ですか。").SetFontSize(16); - - // And then we add the phonetics - cell.RichText.Phonetics.SetFontSize(8); - cell.RichText.Phonetics.Add("げん", 7, 1); - cell.RichText.Phonetics.Add("き", 8, 1); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Styles +{ + public class UsingPhonetics : IXLExample + { + + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Using Phonetics"); + + var cell = ws.Cell(1, 1); + + // Phonetics are implemented as part of the Rich Text functionality. For more information see [Using Rich Text] + // First we add the text. + cell.RichText.AddText("みんなさんはお元気ですか。").SetFontSize(16); + + // And then we add the phonetics + cell.RichText.Phonetics.SetFontSize(8); + cell.RichText.Phonetics.Add("げん", 7, 1); + cell.RichText.Phonetics.Add("き", 8, 1); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Examples/Styles/UsingRichText.cs b/ClosedXML_Examples/Styles/UsingRichText.cs index 3ceed77..7709a98 100644 --- a/ClosedXML_Examples/Styles/UsingRichText.cs +++ b/ClosedXML_Examples/Styles/UsingRichText.cs @@ -1,121 +1,121 @@ -using System; -using ClosedXML.Excel; - -namespace ClosedXML_Examples.Styles -{ - public class UsingRichText : IXLExample - { - #region Variables - - // Public - - // Private - - - #endregion - - #region Properties - - // Public - - // Private - - // Override - - - #endregion - - #region Constructors - - // Public - - - - // Private - - - #endregion - - #region Events - - // Public - - // Private - - // Override - - - #endregion - - #region Methods - - // Public - public void Create(String filePath) - { - var wb = new XLWorkbook(); - var ws = wb.Worksheets.Add("Rich Text"); - - // Let's start with a plain text and then decorate it... - var cell1 = ws.Cell(1, 1).SetValue("The show must go on..."); - - // We want everything in blue except the word show - // (which we want in red and with Courier Font) - cell1.Style.Font.FontColor = XLColor.Blue; // Set the color for the entire cell - cell1.RichText.Substring(4, 4) - .SetFontColor(XLColor.Red) - .SetFontName("Courier"); // Set the color and font for the word "show" - - // On the next example we'll start with an empty cell and add the rich text - var cell = ws.Cell(3, 1); - - // Add the text parts - cell.RichText.AddText("Hello").SetFontColor(XLColor.Red); - cell.RichText.AddText(" BIG ").SetFontColor(XLColor.Blue).SetBold(); - cell.RichText.AddText("World").SetFontColor(XLColor.Red); - - // Here we're showing that even though we added three pieces of text - // you can treat then like a single one. - cell.RichText.Substring(4, 7).SetUnderline(); - - // Right now cell.RichText has the following 5 strings: - // - // "Hell" -> Red - // "o" -> Red, Underlined - // " BIG " -> Blue, Underlined, Bold - // "W" -> Red, Underlined - // "orld" -> Red - - // Of course you can loop through each piece of text and check its properties - foreach (var richText in cell.RichText) - { - if(richText.Bold) - ws.Cell(3, 2).Value = String.Format("\"{0}\" is Bold.", richText.Text); - } - - - // Now we'll build a cell with rich text, and some other styles - cell = ws.Cell(5, 1); - - // Add the text parts - cell.RichText.AddText("Some").SetFontColor(XLColor.Green); - cell.RichText.AddText(" rich text ").SetFontColor(XLColor.Blue).SetBold(); - cell.RichText.AddText("with a gray background").SetItalic(); - - cell.Style.Fill.SetBackgroundColor(XLColor.Gray); - - ws.Cell(5, 2).Value = cell.RichText; // Should copy only rich text, but not background - - - ws.Columns().AdjustToContents(); - - wb.SaveAs(filePath); - } - - // Private - - // Override - - - #endregion - } -} +using System; +using ClosedXML.Excel; + +namespace ClosedXML_Examples.Styles +{ + public class UsingRichText : IXLExample + { + #region Variables + + // Public + + // Private + + + #endregion + + #region Properties + + // Public + + // Private + + // Override + + + #endregion + + #region Constructors + + // Public + + + + // Private + + + #endregion + + #region Events + + // Public + + // Private + + // Override + + + #endregion + + #region Methods + + // Public + public void Create(String filePath) + { + var wb = new XLWorkbook(); + var ws = wb.Worksheets.Add("Rich Text"); + + // Let's start with a plain text and then decorate it... + var cell1 = ws.Cell(1, 1).SetValue("The show must go on..."); + + // We want everything in blue except the word show + // (which we want in red and with Courier Font) + cell1.Style.Font.FontColor = XLColor.Blue; // Set the color for the entire cell + cell1.RichText.Substring(4, 4) + .SetFontColor(XLColor.Red) + .SetFontName("Courier"); // Set the color and font for the word "show" + + // On the next example we'll start with an empty cell and add the rich text + var cell = ws.Cell(3, 1); + + // Add the text parts + cell.RichText.AddText("Hello").SetFontColor(XLColor.Red); + cell.RichText.AddText(" BIG ").SetFontColor(XLColor.Blue).SetBold(); + cell.RichText.AddText("World").SetFontColor(XLColor.Red); + + // Here we're showing that even though we added three pieces of text + // you can treat then like a single one. + cell.RichText.Substring(4, 7).SetUnderline(); + + // Right now cell.RichText has the following 5 strings: + // + // "Hell" -> Red + // "o" -> Red, Underlined + // " BIG " -> Blue, Underlined, Bold + // "W" -> Red, Underlined + // "orld" -> Red + + // Of course you can loop through each piece of text and check its properties + foreach (var richText in cell.RichText) + { + if(richText.Bold) + ws.Cell(3, 2).Value = String.Format("\"{0}\" is Bold.", richText.Text); + } + + + // Now we'll build a cell with rich text, and some other styles + cell = ws.Cell(5, 1); + + // Add the text parts + cell.RichText.AddText("Some").SetFontColor(XLColor.Green); + cell.RichText.AddText(" rich text ").SetFontColor(XLColor.Blue).SetBold(); + cell.RichText.AddText("with a gray background").SetItalic(); + + cell.Style.Fill.SetBackgroundColor(XLColor.Gray); + + ws.Cell(5, 2).Value = cell.RichText; // Should copy only rich text, but not background + + + ws.Columns().AdjustToContents(); + + wb.SaveAs(filePath); + } + + // Private + + // Override + + + #endregion + } +} diff --git a/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj b/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj index 92e1621..c94f965 100644 --- a/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj +++ b/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj @@ -1,13 +1,13 @@ - - - - Exe - net452;net461 - - - - - - - - + + + + Exe + net452;net461 + + + + + + + + diff --git a/ClosedXML_Sandbox/OneRow.cs b/ClosedXML_Sandbox/OneRow.cs index 0dde282..2627417 100644 --- a/ClosedXML_Sandbox/OneRow.cs +++ b/ClosedXML_Sandbox/OneRow.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Web; diff --git a/ClosedXML_Sandbox/PerformanceRunner.cs b/ClosedXML_Sandbox/PerformanceRunner.cs index 2d4f570..ec834ce 100644 --- a/ClosedXML_Sandbox/PerformanceRunner.cs +++ b/ClosedXML_Sandbox/PerformanceRunner.cs @@ -1,4 +1,4 @@ -using ClosedXML.Excel; +using ClosedXML.Excel; using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/ClosedXML_Sandbox/Program.cs b/ClosedXML_Sandbox/Program.cs index 1556644..3773e7e 100644 --- a/ClosedXML_Sandbox/Program.cs +++ b/ClosedXML_Sandbox/Program.cs @@ -1,21 +1,21 @@ -using System; - -namespace ClosedXML_Sandbox -{ - internal class Program - { - private static void Main(string[] args) - { - Console.WriteLine("Running {0}", nameof(PerformanceRunner.OpenTestFile)); - PerformanceRunner.TimeAction(PerformanceRunner.OpenTestFile); - Console.WriteLine(); - - Console.WriteLine("Running {0}", nameof(PerformanceRunner.RunInsertTable)); - PerformanceRunner.TimeAction(PerformanceRunner.RunInsertTable); - Console.WriteLine(); - - Console.WriteLine("Press any key to continue"); - Console.ReadKey(); - } - } -} +using System; + +namespace ClosedXML_Sandbox +{ + internal class Program + { + private static void Main(string[] args) + { + Console.WriteLine("Running {0}", nameof(PerformanceRunner.OpenTestFile)); + PerformanceRunner.TimeAction(PerformanceRunner.OpenTestFile); + Console.WriteLine(); + + Console.WriteLine("Running {0}", nameof(PerformanceRunner.RunInsertTable)); + PerformanceRunner.TimeAction(PerformanceRunner.RunInsertTable); + Console.WriteLine(); + + Console.WriteLine("Press any key to continue"); + Console.ReadKey(); + } + } +} diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj index da3624c..e5137ce 100644 --- a/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -1,52 +1,53 @@ - - - - net452;net461 - false - - - - $(DefineConstants);_NETSTANDARD_;_NETSTANDARD1_6_ - - - - $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ - - - - $(DefineConstants);_NETFRAMEWORK_;_NET452_ - - - - $(DefineConstants);_NETFRAMEWORK_;_NET461_ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + net452;net461 + false + + + + $(DefineConstants);_NETSTANDARD_;_NETSTANDARD1_6_ + + + + $(DefineConstants);_NETSTANDARD_;_NETSTANDARD2_0_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET452_ + + + + $(DefineConstants);_NETFRAMEWORK_;_NET461_ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..4f14453 100644 --- a/ClosedXML_Tests/Examples/MiscTests.cs +++ b/ClosedXML_Tests/Examples/MiscTests.cs @@ -1,202 +1,214 @@ -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 FormulasWithEvaluation() + { + TestHelper.RunTestExample(@"Misc\FormulasWithEvaluation.xlsx", true); + } + + [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"); + } + + [Test] + public void WorkbookProtection() + { + TestHelper.RunTestExample(@"Misc\WorkbookProtection.xlsx"); + } + } +} \ No newline at end of file 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/PivotTableTests.cs b/ClosedXML_Tests/Examples/PivotTableTests.cs new file mode 100644 index 0000000..5a1d061 --- /dev/null +++ b/ClosedXML_Tests/Examples/PivotTableTests.cs @@ -0,0 +1,15 @@ +using ClosedXML_Examples; +using NUnit.Framework; + +namespace ClosedXML_Tests.Examples +{ + [TestFixture] + public class PivotTableTests + { + [Test] + public void PivotTables() + { + TestHelper.RunTestExample(@"PivotTables\PivotTables.xlsx"); + } + } +} 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..1d4c5d4 100644 --- a/ClosedXML_Tests/Excel/CalcEngine/DateAndTimeTests.cs +++ b/ClosedXML_Tests/Excel/CalcEngine/DateAndTimeTests.cs @@ -1,509 +1,526 @@ -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; + + actual = XLWorkbook.EvaluateExpr("Date(2008, 1, 1)"); + Assert.AreEqual(39448, actual); + + actual = XLWorkbook.EvaluateExpr("Date(2008, 15, 1)"); + Assert.AreEqual(39873, actual); + + actual = XLWorkbook.EvaluateExpr("Date(2008, -50, 1)"); + Assert.AreEqual(37895, actual); + + actual = XLWorkbook.EvaluateExpr("Date(2008, 5, 63)"); + Assert.AreEqual(39631, actual); + + actual = XLWorkbook.EvaluateExpr("Date(2008, 13, 63)"); + Assert.AreEqual(39876, actual); + + actual = XLWorkbook.EvaluateExpr("Date(2008, 15, -120)"); + Assert.AreEqual(39752, 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..31e66f9 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..5410863 100644 --- a/ClosedXML_Tests/Excel/Columns/ColumnTests.cs +++ b/ClosedXML_Tests/Excel/Columns/ColumnTests.cs @@ -1,240 +1,241 @@ -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/Comments/CommentsTests.cs b/ClosedXML_Tests/Excel/Comments/CommentsTests.cs new file mode 100644 index 0000000..1ba4e76 --- /dev/null +++ b/ClosedXML_Tests/Excel/Comments/CommentsTests.cs @@ -0,0 +1,33 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ClosedXML_Tests.Excel.Comments +{ + public class CommentsTests + { + [Test] + public void CanGetColorFromIndex81() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Misc\CommentsWithIndexedColor81.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheets.First(); + var c = ws.FirstCellUsed(); + + var xlColor = c.Comment.Style.ColorsAndLines.LineColor; + Assert.AreEqual(XLColorType.Indexed, xlColor.ColorType); + Assert.AreEqual(81, xlColor.Indexed); + + + var color = xlColor.Color.ToHex(); + Assert.AreEqual("FF000000", color); + } + + } + } +} diff --git a/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs b/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs index 526ae67..4d0329f 100644 --- a/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs +++ b/ClosedXML_Tests/Excel/Coordinates/XLAddressTests.cs @@ -1,32 +1,55 @@ -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 +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)); + } + + [Test] + public void ToStringTestWithSpace() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1"); + 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("'Sheet 1'!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("'Sheet 1'!$A$1", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("'Sheet 1'!R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + Assert.AreEqual("'Sheet 1'!$A$1", address.ToStringFixed(XLReferenceStyle.Default, true)); + } + } +} 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 5cff8ca..218ae90 100644 --- a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs +++ b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs @@ -1,122 +1,182 @@ -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" - }; - - 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\ExcelProducedWorkbookWithImages.xlsx", + @"Misc\InvalidPrintTitles.xlsx", + @"Misc\ExcelProducedWorkbookWithImages.xlsx", + @"Misc\EmptyCellValue.xlsx", + @"Misc\AllShapes.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..654ca49 100644 --- a/ClosedXML_Tests/Excel/Misc/CopyContentsTests.cs +++ b/ClosedXML_Tests/Excel/Misc/CopyContentsTests.cs @@ -1,119 +1,134 @@ -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 +using ClosedXML.Excel; +using NUnit.Framework; +using System.Linq; + +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"); + } + + [Test] + public void UpdateCellsWorksheetTest() + { + using (var wb = new XLWorkbook()) + { + var ws1 = wb.Worksheets.Add("Sheet1"); + ws1.Cell(1, 1).Value = "hello, world."; + + var ws2 = ws1.CopyTo("Sheet2"); + + Assert.AreEqual("Sheet1", ws1.FirstCell().Address.Worksheet.Name); + Assert.AreEqual("Sheet2", ws2.FirstCell().Address.Worksheet.Name); + } + } + } +} 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..645ed8a 100644 --- a/ClosedXML_Tests/Excel/Misc/StylesTests.cs +++ b/ClosedXML_Tests/Excel/Misc/StylesTests.cs @@ -1,81 +1,106 @@ -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); + } + } + + [Test] + public void SetStyleViaRowReference() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Style + .Font.SetFontSize(8) + .Font.SetFontColor(XLColor.Green) + .Font.SetBold(true); + + var row = ws.Row(1); + ws.Cell(1, 1).Value = "Test"; + row.Cell(2).Value = "Test"; + row.Cells(3, 3).Value = "Test"; + + foreach (var cell in ws.CellsUsed()) + { + Assert.AreEqual(8, ws.Cell("A1").Style.Font.FontSize); + Assert.AreEqual(XLColor.Green, ws.Cell("B1").Style.Font.FontColor); + Assert.AreEqual(true, ws.Cell("C1").Style.Font.Bold); + } + } + } + } +} diff --git a/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs b/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs index 601bc06..5a1e4a7 100644 --- a/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs +++ b/ClosedXML_Tests/Excel/Misc/XLWorkbookTests.cs @@ -1,259 +1,335 @@ -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 +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()); + } + + [Test] + public void WbProtect1() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + wb.Protect(); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsFalse(wb.IsPasswordProtected); + } + } + + [Test] + public void WbProtect2() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + wb.Protect(true, false); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsFalse(wb.IsPasswordProtected); + } + } + + [Test] + public void WbProtect3() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + wb.Protect("Abc@123"); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsTrue(wb.IsPasswordProtected); + Assert.Throws(typeof(InvalidOperationException), delegate { wb.Protect(); }); + Assert.Throws(typeof(InvalidOperationException), delegate { wb.Unprotect(); }); + Assert.Throws(typeof(ArgumentException), delegate { wb.Unprotect("Cde@345"); }); + } + } + + [Test] + public void WbProtect4() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + wb.Protect(); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsFalse(wb.IsPasswordProtected); + wb.Protect("Abc@123"); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsTrue(wb.IsPasswordProtected); + } + } + + [Test] + public void WbProtect5() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.Worksheets.Add("Sheet1"); + wb.Protect(true, false, "Abc@123"); + Assert.IsTrue(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsTrue(wb.IsPasswordProtected); + wb.Unprotect("Abc@123"); + Assert.IsFalse(wb.LockStructure); + Assert.IsFalse(wb.LockWindows); + Assert.IsFalse(wb.IsPasswordProtected); + } + } + } +} 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..907bc96 100644 --- a/ClosedXML_Tests/Excel/NamedRanges/NamedRangesTests.cs +++ b/ClosedXML_Tests/Excel/NamedRanges/NamedRangesTests.cs @@ -1,112 +1,144 @@ -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 +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Linq; + +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); + } + + [Test] + public void DeleteColumnUsedInNamedRange() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Column1"); + ws.FirstCell().CellRight().SetValue("Column2").Style.Font.SetBold(); + ws.FirstCell().CellRight(2).SetValue("Column3"); + ws.NamedRanges.Add("MyRange", "A1:C1"); + + ws.Column(1).Delete(); + + Assert.IsTrue(ws.Cell("A1").Style.Font.Bold); + Assert.AreEqual("Column3", ws.Cell("B1").GetValue()); + Assert.IsEmpty(ws.Cell("C1").GetValue()); + } + } + + [Test] + public void TestInvalidNamedRangeOnWorkbookScope() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.FirstCell().SetValue("Column1"); + ws.FirstCell().CellRight().SetValue("Column2").Style.Font.SetBold(); + ws.FirstCell().CellRight(2).SetValue("Column3"); + + Assert.Throws(() => wb.NamedRanges.Add("MyRange", "A1:C1")); + } + } + } +} 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..f61b84b 100644 --- a/ClosedXML_Tests/Excel/PivotTables/XLPivotTableTests.cs +++ b/ClosedXML_Tests/Excel/PivotTables/XLPivotTableTests.cs @@ -1,15 +1,33 @@ -using ClosedXML_Examples; -using NUnit.Framework; - -namespace ClosedXML_Tests -{ - [TestFixture] - public class XLPivotTableTests - { - [Test] - public void PivotTables() - { - TestHelper.RunTestExample(@"PivotTables\PivotTables.xlsx"); - } - } -} +using ClosedXML.Excel; +using NUnit.Framework; +using System.IO; + +namespace ClosedXML_Tests +{ + [TestFixture] + public class XLPivotTableTests + { + [Test] + public void PivotTables() + { + using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\PivotTables\PivotTables.xlsx"))) + using (var wb = new XLWorkbook(stream)) + { + var ws = wb.Worksheet("PastrySalesData"); + var table = ws.Table("PastrySalesData"); + + var range = table.DataRange; + var header = ws.Range(1, 1, 1, 3); + var dataRange = ws.Range(header.FirstCell(), range.LastCell()); + + var ptSheet = wb.Worksheets.Add("BlankPivotTable"); + var pt = ptSheet.PivotTables.AddNew("pvt", ptSheet.Cell(1, 1), dataRange); + + using (var ms = new MemoryStream()) + { + wb.SaveAs(ms, true); + } + } + } + } +} 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..669e811 100644 --- a/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs +++ b/ClosedXML_Tests/Excel/Ranges/XLRangeAddressTests.cs @@ -1,29 +1,49 @@ -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 +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)); + } + + [Test] + public void ToStringTestWithSpace() + { + IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet 1"); + IXLRangeAddress address = ws.Cell(1, 1).AsRange().RangeAddress; + + Assert.AreEqual("A1:A1", address.ToString()); + + Assert.AreEqual("A1:A1", address.ToStringRelative()); + Assert.AreEqual("'Sheet 1'!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("'Sheet 1'!$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.A1, true)); + Assert.AreEqual("'Sheet 1'!R1C1:R1C1", address.ToStringFixed(XLReferenceStyle.R1C1, true)); + Assert.AreEqual("'Sheet 1'!$A$1:$A$1", address.ToStringFixed(XLReferenceStyle.Default, true)); + } + } +} 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..f679187 100644 --- a/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs +++ b/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs @@ -1,129 +1,144 @@ -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 AddingDuplicateSheetNameThrowsException() + { + using (var wb = new XLWorkbook()) + { + IXLWorksheet ws; + ws = wb.AddWorksheet("Sheet1"); + + Assert.Throws(() => wb.AddWorksheet("Sheet1")); + + //Sheet names are case insensitive + Assert.Throws(() => wb.AddWorksheet("sheet1")); + } + } + + [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); + } + } + } +} \ No newline at end of file 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/OleDb/OleDbTests.cs b/ClosedXML_Tests/OleDb/OleDbTests.cs new file mode 100644 index 0000000..e502614 --- /dev/null +++ b/ClosedXML_Tests/OleDb/OleDbTests.cs @@ -0,0 +1,146 @@ +using ClosedXML.Excel; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.OleDb; +using System.IO; +using System.Linq; + +namespace ClosedXML_Tests.OleDb +{ + [TestFixture] + public class OleDbTests + { +#if !APPVEYOR + [Test] + public void TestOleDbValues() + { + using (var tf = new TestFile(CreateTestFile())) + { + Console.Write("Using temporary file\t{0}", tf.Path); + var connectionString = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';", tf.Path); + using (var connection = new OleDbConnection(connectionString)) + { + // Install driver from https://www.microsoft.com/en-za/download/details.aspx?id=13255 if required + // Also check that test runner is running under correct architecture: + connection.Open(); + using (var command = new OleDbCommand("select * from [Sheet1$]", connection)) + using (var dataAdapter = new OleDbDataAdapter()) + { + dataAdapter.SelectCommand = command; + var dt = new DataTable(); + dataAdapter.Fill(dt); + + Assert.AreEqual("Base", dt.Columns[0].ColumnName); + Assert.AreEqual("Ref", dt.Columns[1].ColumnName); + + Assert.AreEqual(2, dt.Rows.Count); + + Assert.AreEqual(42, dt.Rows.Cast().First()[0]); + Assert.AreEqual("42", dt.Rows.Cast().First()[1]); + + Assert.AreEqual(41, dt.Rows.Cast().Last()[0]); + Assert.AreEqual("41", dt.Rows.Cast().Last()[1]); + } + + using (var command = new OleDbCommand("select * from [Sheet2$]", connection)) + using (var dataAdapter = new OleDbDataAdapter()) + { + dataAdapter.SelectCommand = command; + var dt = new DataTable(); + dataAdapter.Fill(dt); + + Assert.AreEqual("Ref1", dt.Columns[0].ColumnName); + Assert.AreEqual("Ref2", dt.Columns[1].ColumnName); + Assert.AreEqual("Sum", dt.Columns[2].ColumnName); + Assert.AreEqual("SumRef", dt.Columns[3].ColumnName); + + var expected = new Dictionary() + { + {"Ref1", "42" }, + {"Ref2", "41" }, + {"Sum", "83" }, + {"SumRef", "83" }, + }; + + foreach (var col in dt.Columns.Cast()) + foreach (var row in dt.Rows.Cast()) + { + Assert.AreEqual(expected[col.ColumnName], row[col]); + } + + Assert.AreEqual(2, dt.Rows.Count); + } + + connection.Close(); + } + } + } +#endif + + private string CreateTestFile() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Sheet1"); + ws.Cell("A1").Value = "Base"; + ws.Cell("B1").Value = "Ref"; + + ws.Cell("A2").Value = 42; + ws.Cell("A3").Value = 41; + + ws.Cell("B2").FormulaA1 = "=A2"; + ws.Cell("B3").FormulaA1 = "=A3"; + + ws = wb.AddWorksheet("Sheet2"); + ws.Cell("A1").Value = "Ref1"; + ws.Cell("B1").Value = "Ref2"; + ws.Cell("C1").Value = "Sum"; + ws.Cell("D1").Value = "SumRef"; + + ws.Cell("A2").FormulaA1 = "=Sheet1!A2"; + ws.Cell("B2").FormulaA1 = "=Sheet1!A3"; + ws.Cell("C2").FormulaA1 = "=SUM(A2:B2)"; + ws.Cell("D2").FormulaA1 = "=SUM(Sheet1!A2:Sheet1!A3)"; + + ws.Cell("A3").FormulaA1 = "=Sheet1!B2"; + ws.Cell("B3").FormulaA1 = "=Sheet1!B3"; + ws.Cell("C3").FormulaA1 = "=SUM(A3:B3)"; + ws.Cell("D3").FormulaA1 = "=SUM(Sheet1!B2:Sheet1!B3)"; + + var path = Path.ChangeExtension(Path.GetTempFileName(), "xlsx"); + wb.SaveAs(path, true, true); + + return path; + } + } + + internal class TestFile : IDisposable + { + internal TestFile(string path) + : this(path, false) + { } + + internal TestFile(string path, bool preserve) + { + this.Path = path; + this.Preserve = preserve; + } + + public string Path { get; private set; } + public bool Preserve { get; private set; } + + public void Dispose() + { + if (!Preserve) + File.Delete(Path); + } + + public override string ToString() + { + return this.Path; + } + } + } +} 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..d791985 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..dea7693 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/FormulasWithEvaluation.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/FormulasWithEvaluation.xlsx new file mode 100644 index 0000000..7a93ddb --- /dev/null +++ b/ClosedXML_Tests/Resource/Examples/Misc/FormulasWithEvaluation.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..222ba7b 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/Misc/WorkbookProtection.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/WorkbookProtection.xlsx new file mode 100644 index 0000000..2e7c839 --- /dev/null +++ b/ClosedXML_Tests/Resource/Examples/Misc/WorkbookProtection.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..6e3156d 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..8d4e6a2 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/AllShapes.xlsx b/ClosedXML_Tests/Resource/Misc/AllShapes.xlsx new file mode 100644 index 0000000..2c5b324 --- /dev/null +++ b/ClosedXML_Tests/Resource/Misc/AllShapes.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Misc/CommentsWithIndexedColor81.xlsx b/ClosedXML_Tests/Resource/Misc/CommentsWithIndexedColor81.xlsx new file mode 100644 index 0000000..715c073 --- /dev/null +++ b/ClosedXML_Tests/Resource/Misc/CommentsWithIndexedColor81.xlsx Binary files differ diff --git a/ClosedXML_Tests/Resource/Misc/EmptyCellValue.xlsx b/ClosedXML_Tests/Resource/Misc/EmptyCellValue.xlsx new file mode 100644 index 0000000..f90b0fc --- /dev/null +++ b/ClosedXML_Tests/Resource/Misc/EmptyCellValue.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/Resource/Misc/InvalidPrintTitles.xlsx b/ClosedXML_Tests/Resource/Misc/InvalidPrintTitles.xlsx new file mode 100644 index 0000000..86bef09 --- /dev/null +++ b/ClosedXML_Tests/Resource/Misc/InvalidPrintTitles.xlsx Binary files differ diff --git a/ClosedXML_Tests/TestHelper.cs b/ClosedXML_Tests/TestHelper.cs index 477facf..bf85115 100644 --- a/ClosedXML_Tests/TestHelper.cs +++ b/ClosedXML_Tests/TestHelper.cs @@ -1,130 +1,130 @@ -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 ClosedXML.Excel; +using ClosedXML_Examples; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +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, bool evaluateFormulae = false) + 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, true, evaluateFormulae); + + 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/README.md b/README.md index 961bba2..89339db 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,15 @@ 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. +* We use 4 spaces for code indentation. This is the default in Visual Studio. Don't leave any trailing white space at the end of lines or files. To make this easier, ClosedXML has an [editorconfig](http://www.editorconfig.org) configuration file. It is recommended you install editorconfig from the Visual Studio Extension Manager.