diff --git a/ClosedXML/ClosedXML.csproj b/ClosedXML/ClosedXML.csproj
index b17bde2..2d8b034 100644
--- a/ClosedXML/ClosedXML.csproj
+++ b/ClosedXML/ClosedXML.csproj
@@ -26,6 +26,7 @@
4
1591
false
+ 6
pdbonly
diff --git a/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs b/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs
index dcf4b76..a01a138 100644
--- a/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs
+++ b/ClosedXML/Excel/AutoFilters/XLAutoFilter.cs
@@ -128,7 +128,7 @@
{
Boolean match = isText
? filter.Condition(row.Cell(kp.Key).GetString())
- : row.Cell(kp.Key).DataType == XLCellValues.Number &&
+ : row.Cell(kp.Key).DataType == XLDataType.Number &&
filter.Condition(row.Cell(kp.Key).GetDouble());
if (firstFilter)
{
diff --git a/ClosedXML/Excel/AutoFilters/XLFilterColumn.cs b/ClosedXML/Excel/AutoFilters/XLFilterColumn.cs
index a045910..a624708 100644
--- a/ClosedXML/Excel/AutoFilters/XLFilterColumn.cs
+++ b/ClosedXML/Excel/AutoFilters/XLFilterColumn.cs
@@ -206,7 +206,7 @@
}
var cell = row.Cell(_column);
- if (cell.DataType != XLCellValues.Number || !condition(cell.GetDouble())) continue;
+ if (cell.DataType != XLDataType.Number || !condition(cell.GetDouble())) continue;
row.WorksheetRow().Unhide();
foundOne = true;
}
@@ -224,7 +224,7 @@
{
using (var subColumn = column.Column(2, column.CellCount()))
{
- var cellsUsed = subColumn.CellsUsed(c => c.DataType == XLCellValues.Number);
+ var cellsUsed = subColumn.CellsUsed(c => c.DataType == XLDataType.Number);
if (takeTop)
{
if (type == XLTopBottomType.Items)
@@ -284,7 +284,7 @@
}
var cell = row.Cell(_column);
- if (cell.DataType != XLCellValues.Number || !condition(cell.GetDouble())) continue;
+ if (cell.DataType != XLDataType.Number || !condition(cell.GetDouble())) continue;
row.WorksheetRow().Unhide();
foundOne = true;
}
@@ -304,17 +304,17 @@
{
using (var subColumn = column.Column(2, column.CellCount()))
{
- Double average = subColumn.CellsUsed(c => c.DataType == XLCellValues.Number).Select(c => c.GetDouble()).Average();
+ Double average = subColumn.CellsUsed(c => c.DataType == XLDataType.Number).Select(c => c.GetDouble()).Average();
if (aboveAverage)
{
return
- subColumn.CellsUsed(c => c.DataType == XLCellValues.Number).
+ subColumn.CellsUsed(c => c.DataType == XLDataType.Number).
Select(c => c.GetDouble()).Where(c => c > average).Distinct();
}
return
- subColumn.CellsUsed(c => c.DataType == XLCellValues.Number).
+ subColumn.CellsUsed(c => c.DataType == XLDataType.Number).
Select(c => c.GetDouble()).Where(c => c < average).Distinct();
}
@@ -371,7 +371,7 @@
{
Boolean match = isText
? condition(row.Cell(_column).GetString())
- : row.Cell(_column).DataType == XLCellValues.Number &&
+ : row.Cell(_column).DataType == XLDataType.Number &&
condition(row.Cell(_column).GetDouble());
if (match)
row.WorksheetRow().Unhide();
@@ -390,4 +390,4 @@
public IXLFilterColumn SetDynamicValue(Double value) { DynamicValue = value; return this; }
}
-}
\ No newline at end of file
+}
diff --git a/ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs b/ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs
index f9d2bd3..1f11d83 100644
--- a/ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs
+++ b/ClosedXML/Excel/AutoFilters/XLFilteredColumn.cs
@@ -46,7 +46,7 @@
if ((isText && condition(row.Cell(_column).GetString())) || (
!isText &&
row.Cell(_column).DataType ==
- XLCellValues.Number &&
+ XLDataType.Number &&
condition(
row.Cell(_column).GetValue()))
)
diff --git a/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs b/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs
index 46e96e1..83d872a 100644
--- a/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs
+++ b/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs
@@ -1,11 +1,28 @@
using System;
+using System.Collections.Generic;
using System.Diagnostics;
+using System.Linq;
using System.Text.RegularExpressions;
namespace ClosedXML.Excel.CalcEngine
{
internal class CalcEngineHelpers
{
+ private static Lazy>> patternReplacements =
+ new Lazy>>(() =>
+ {
+ var patternReplacements = new Dictionary>();
+ // key: the literal string to match
+ // value: a tuple: first item: the search pattern, second item: the replacement
+ patternReplacements.Add(@"~~", new Tuple(@"~~", "~"));
+ patternReplacements.Add(@"~*", new Tuple(@"~\*", @"\*"));
+ patternReplacements.Add(@"~?", new Tuple(@"~\?", @"\?"));
+ patternReplacements.Add(@"?", new Tuple(@"\?", ".?"));
+ patternReplacements.Add(@"*", new Tuple(@"\*", ".*"));
+
+ return patternReplacements;
+ });
+
internal static bool ValueSatisfiesCriteria(object value, object criteria, CalcEngine ce)
{
// safety...
@@ -25,8 +42,11 @@
// convert criteria to string
var cs = criteria as string;
- if (!string.IsNullOrEmpty(cs))
+ if (cs != null)
{
+ if (cs == "")
+ return cs.Equals(value);
+
// if criteria is an expression (e.g. ">20"), use calc engine
if (cs[0] == '=' || cs[0] == '<' || cs[0] == '>')
{
@@ -54,11 +74,17 @@
}
// if criteria is a regular expression, use regex
- if (cs.IndexOf('*') > -1)
+ if (cs.IndexOfAny(new[] { '*', '?' }) > -1)
{
- var pattern = cs.Replace(@"\", @"\\");
- pattern = pattern.Replace(".", @"\");
- pattern = pattern.Replace("*", ".*");
+ var pattern = Regex.Replace(
+ cs,
+ "(" + String.Join(
+ "|",
+ patternReplacements.Value.Values.Select(t => t.Item1))
+ + ")",
+ m => patternReplacements.Value[m.Value].Item2);
+ pattern = $"^{pattern}$";
+
return Regex.IsMatch(value.ToString(), pattern, RegexOptions.IgnoreCase);
}
diff --git a/ClosedXML/Excel/CalcEngine/Functions/Lookup.cs b/ClosedXML/Excel/CalcEngine/Functions/Lookup.cs
index 801a195..dfd6c1b 100644
--- a/ClosedXML/Excel/CalcEngine/Functions/Lookup.cs
+++ b/ClosedXML/Excel/CalcEngine/Functions/Lookup.cs
@@ -17,7 +17,7 @@
//ce.RegisterFunction("FORMULATEXT", , Formulatext); // Returns the formula at the given reference as text
//ce.RegisterFunction("GETPIVOTDATA", , Getpivotdata); // Returns data stored in a PivotTable report
ce.RegisterFunction("HLOOKUP", 3, 4, Hlookup); // Looks in the top row of an array and returns the value of the indicated cell
- //ce.RegisterFunction("HYPERLINK", , Hyperlink); // Creates a shortcut or jump that opens a document stored on a network server, an intranet, or the Internet
+ ce.RegisterFunction("HYPERLINK", 1, 2, Hyperlink); // Creates a shortcut or jump that opens a document stored on a network server, an intranet, or the Internet
//ce.RegisterFunction("INDEX", , Index); // Uses an index to choose a value from a reference or array
//ce.RegisterFunction("INDIRECT", , Indirect); // Returns a reference indicated by a text value
//ce.RegisterFunction("LOOKUP", , Lookup); // Looks up values in a vector or array
@@ -80,6 +80,13 @@
.Value;
}
+ 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 Vlookup(List p)
{
var lookup_value = p[0];
diff --git a/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs
index 2d1368d..66fbd8c 100644
--- a/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs
+++ b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs
@@ -4,6 +4,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
+using System.Text;
namespace ClosedXML.Excel.CalcEngine
{
@@ -16,15 +17,25 @@
ce.RegisterFunction("ABS", 1, Abs);
ce.RegisterFunction("ACOS", 1, Acos);
ce.RegisterFunction("ACOSH", 1, Acosh);
+ ce.RegisterFunction("ACOT", 1, Acot);
+ ce.RegisterFunction("ACOTH", 1, Acoth);
+ ce.RegisterFunction("ARABIC", 1, Arabic);
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("BASE", 2, 3, Base);
ce.RegisterFunction("CEILING", 1, Ceiling);
ce.RegisterFunction("COMBIN", 2, Combin);
+ ce.RegisterFunction("COMBINA", 2, CombinA);
ce.RegisterFunction("COS", 1, Cos);
ce.RegisterFunction("COSH", 1, Cosh);
+ ce.RegisterFunction("COT", 1, Cot);
+ ce.RegisterFunction("COTH", 1, Coth);
+ ce.RegisterFunction("CSC", 1, Csc);
+ ce.RegisterFunction("CSCH", 1, Csch);
+ ce.RegisterFunction("DECIMAL", 2, MathTrig.Decimal);
ce.RegisterFunction("DEGREES", 1, Degrees);
ce.RegisterFunction("EVEN", 1, Even);
ce.RegisterFunction("EXP", 1, Exp);
@@ -56,6 +67,8 @@
ce.RegisterFunction("ROUND", 2, Round);
ce.RegisterFunction("ROUNDDOWN", 2, RoundDown);
ce.RegisterFunction("ROUNDUP", 1, 2, RoundUp);
+ ce.RegisterFunction("SEC", 1, Sec);
+ ce.RegisterFunction("SECH", 1, Sech);
ce.RegisterFunction("SERIESSUM", 4, SeriesSum);
ce.RegisterFunction("SIGN", 1, Sign);
ce.RegisterFunction("SIN", 1, Sin);
@@ -65,6 +78,7 @@
ce.RegisterFunction("SUBTOTAL", 2, 255, Subtotal);
ce.RegisterFunction("SUM", 1, int.MaxValue, Sum);
ce.RegisterFunction("SUMIF", 2, 3, SumIf);
+ ce.RegisterFunction("SUMIFS", 3, 255, SumIfs);
ce.RegisterFunction("SUMPRODUCT", 1, 30, SumProduct);
ce.RegisterFunction("SUMSQ", 1, 255, SumSq);
//ce.RegisterFunction("SUMX2MY2", SumX2MY2, 1);
@@ -82,12 +96,20 @@
private static object Acos(List p)
{
+ double input = p[0];
+ if (Math.Abs(input) > 1)
+ throw new NumberException();
+
return Math.Acos(p[0]);
}
private static object Asin(List p)
{
- return Math.Asin(p[0]);
+ double input = p[0];
+ if (Math.Abs(input) > 1)
+ throw new NumberException();
+
+ return Math.Asin(input);
}
private static object Atan(List p)
@@ -97,7 +119,12 @@
private static object Atan2(List p)
{
- return Math.Atan2(p[0], p[1]);
+ double x = p[0];
+ double y = p[1];
+ if (x == 0 && y == 0)
+ throw new DivisionByZeroException();
+
+ return Math.Atan2(y, x);
}
private static object Ceiling(List p)
@@ -115,6 +142,76 @@
return Math.Cosh(p[0]);
}
+ private static object Cot(List p)
+ {
+ var tan = (double)Math.Tan(p[0]);
+
+ if (tan == 0)
+ throw new DivisionByZeroException();
+
+ return 1 / tan;
+ }
+
+ private static object Coth(List p)
+ {
+ double input = p[0];
+ if (input == 0)
+ throw new DivisionByZeroException();
+
+ return 1 / Math.Tanh(input);
+ }
+
+ private static object Csc(List p)
+ {
+ double input = p[0];
+ if (input == 0)
+ throw new DivisionByZeroException();
+
+ return 1 / Math.Sin(input);
+ }
+
+ private static object Csch(List p)
+ {
+ if (Math.Abs((double)p[0].Evaluate()) < Double.Epsilon)
+ throw new DivisionByZeroException();
+
+ return 1 / Math.Sinh(p[0]);
+ }
+
+ private static object Decimal(List p)
+ {
+ string source = p[0];
+ double radix = p[1];
+
+ if (radix < 2 || radix > 36)
+ throw new NumberException();
+
+ var asciiValues = Encoding.ASCII.GetBytes(source.ToUpperInvariant());
+
+ double result = 0;
+ int i = 0;
+
+ foreach (byte digit in asciiValues)
+ {
+ if (digit > 90)
+ {
+ throw new NumberException();
+ }
+
+ int digitNumber = digit >= 48 && digit < 58
+ ? digit - 48
+ : digit - 55;
+
+ if (digitNumber > radix - 1)
+ throw new NumberException();
+
+ result = result * radix + digitNumber;
+ i++;
+ }
+
+ return result;
+ }
+
private static object Exp(List p)
{
return Math.Exp(p[0]);
@@ -159,7 +256,7 @@
private static object Int(List p)
{
- return (int)((double)p[0]);
+ return Math.Floor(p[0]);
}
private static object Ln(List p)
@@ -231,9 +328,9 @@
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();
+ var range = p[0] as IEnumerable; // range of values to match the criteria against
+ var sumRange = p.Count < 3 ? range : p[2] as IEnumerable; // range of values to sum up
+ var criteria = p[1].Evaluate(); // the criteria to evaluate
// build list of values in range and sumRange
var rangeValues = new List
bin\Release\
diff --git a/ClosedXML_Examples/Columns/InsertColumns.cs b/ClosedXML_Examples/Columns/InsertColumns.cs
index 58b05ee..e908c01 100644
--- a/ClosedXML_Examples/Columns/InsertColumns.cs
+++ b/ClosedXML_Examples/Columns/InsertColumns.cs
@@ -1,46 +1,11 @@
+using ClosedXML.Excel;
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();
@@ -54,14 +19,12 @@
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);
@@ -73,12 +36,5 @@
workbook.SaveAs(filePath);
}
-
- // Private
-
- // Override
-
-
- #endregion
}
}
diff --git a/ClosedXML_Examples/Loading/ChangingBasicTable.cs b/ClosedXML_Examples/Loading/ChangingBasicTable.cs
index a10c7a4..c64d0d3 100644
--- a/ClosedXML_Examples/Loading/ChangingBasicTable.cs
+++ b/ClosedXML_Examples/Loading/ChangingBasicTable.cs
@@ -28,7 +28,7 @@
foreach (var cell in rngNumbers.Cells())
{
string formattedString = cell.GetFormattedString();
- cell.DataType = XLCellValues.Text;
+ cell.DataType = XLDataType.Text;
cell.Value = formattedString + " Dollars";
}
diff --git a/ClosedXML_Examples/Misc/DataTypes.cs b/ClosedXML_Examples/Misc/DataTypes.cs
index a396328..e50b3ba 100644
--- a/ClosedXML_Examples/Misc/DataTypes.cs
+++ b/ClosedXML_Examples/Misc/DataTypes.cs
@@ -113,67 +113,67 @@
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 + 1).DataType = XLDataType.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 + 1).DataType = XLDataType.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 + 1).DataType = XLDataType.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 + 1).DataType = XLDataType.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 + 1).DataType = XLDataType.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 + 1).DataType = XLDataType.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 + 1).DataType = XLDataType.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 + 1).DataType = XLDataType.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 + 1).DataType = XLDataType.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 + 1).DataType = XLDataType.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;
+ ws.Cell(ro, co + 1).DataType = XLDataType.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 + 1).DataType = XLDataType.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;
+ ws.Cell(ro, co + 1).DataType = XLDataType.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).DataType = XLDataType.Text;
ws.Cell(ro, co + 1).Value = "";
ro++;
@@ -192,17 +192,17 @@
// 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);
+ .SetDataType(XLDataType.Text)
+ .SetDataType(XLDataType.Boolean)
+ .SetDataType(XLDataType.DateTime)
+ .SetDataType(XLDataType.Number)
+ .SetDataType(XLDataType.TimeSpan)
+ .SetDataType(XLDataType.Text)
+ .SetDataType(XLDataType.TimeSpan)
+ .SetDataType(XLDataType.Number)
+ .SetDataType(XLDataType.DateTime)
+ .SetDataType(XLDataType.Boolean)
+ .SetDataType(XLDataType.Text);
ws.Columns(2, 3).AdjustToContents();
diff --git a/ClosedXML_Examples/Misc/LambdaExpressions.cs b/ClosedXML_Examples/Misc/LambdaExpressions.cs
index 7b5e4f3..5e2721b 100644
--- a/ClosedXML_Examples/Misc/LambdaExpressions.cs
+++ b/ClosedXML_Examples/Misc/LambdaExpressions.cs
@@ -32,7 +32,7 @@
// .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 filtered = cells.Where(c => c.DataType == XLDataType.Text);
var list = filtered.ToList();
foreach (var c in list)
{
diff --git a/ClosedXML_Examples/PivotTables/PivotTables.cs b/ClosedXML_Examples/PivotTables/PivotTables.cs
index a94bb10..b8f6023 100644
--- a/ClosedXML_Examples/PivotTables/PivotTables.cs
+++ b/ClosedXML_Examples/PivotTables/PivotTables.cs
@@ -8,41 +8,43 @@
{
private class Pastry
{
- public Pastry(string name, int numberOfOrders, double quality, string month)
+ public Pastry(string name, int numberOfOrders, double quality, string month, DateTime bakeDate)
{
Name = name;
NumberOfOrders = numberOfOrders;
Quality = quality;
Month = month;
+ BakeDate = bakeDate;
}
public string Name { get; set; }
public int NumberOfOrders { get; set; }
public double Quality { get; set; }
public string Month { get; set; }
+ public DateTime BakeDate { 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"),
+ new Pastry("Croissant", 150, 60.2, "Apr", new DateTime(2016, 04, 21)),
+ new Pastry("Croissant", 250, 50.42, "May", new DateTime(2016, 05, 03)),
+ new Pastry("Croissant", 134, 22.12, "Jun", new DateTime(2016, 06, 24)),
+ new Pastry("Doughnut", 250, 89.99, "Apr", new DateTime(2017, 04, 23)),
+ new Pastry("Doughnut", 225, 70, "May", new DateTime(2016, 05, 24)),
+ new Pastry("Doughnut", 210, 75.33, "Jun", new DateTime(2016, 06, 02)),
+ new Pastry("Bearclaw", 134, 10.24, "Apr", new DateTime(2016, 04, 27)),
+ new Pastry("Bearclaw", 184, 33.33, "May", new DateTime(2016, 05, 20)),
+ new Pastry("Bearclaw", 124, 25, "Jun", new DateTime(2017, 06, 05)),
+ new Pastry("Danish", 394, -20.24, "Apr", new DateTime(2017, 04, 24)),
+ new Pastry("Danish", 190, 60, "May", new DateTime(2017, 05, 08)),
+ new Pastry("Danish", 221, 24.76, "Jun", new DateTime(2016, 06, 21)),
// 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")
+ new Pastry("Scone", 135, 0, "Apr", new DateTime(2017, 04, 22)),
+ new Pastry("SconE", 122, 5.19, "May", new DateTime(2017, 05, 03)),
+ new Pastry("SCONE", 243, 44.2, "Jun", new DateTime(2017, 06, 14)),
};
using (var wb = new XLWorkbook())
@@ -170,6 +172,28 @@
#endregion Pivot table with subtotals disabled
+ #region Pivot Table with filter
+
+ ptSheet = wb.Worksheets.Add("pvtFilter");
+
+ pt = ptSheet.PivotTables.AddNew("pvtFilter", ptSheet.Cell(1, 1), dataRange);
+
+ pt.RowLabels.Add("Month");
+
+ pt.Values.Add("NumberOfOrders").SetSummaryFormula(XLPivotSummary.Sum);
+
+ pt.ReportFilters.Add("Name")
+ .AddSelectedValue("Scone")
+ .AddSelectedValue("Doughnut");
+
+ pt.ReportFilters.Add("Quality")
+ .AddSelectedValue(5.19);
+
+ pt.ReportFilters.Add("BakeDate")
+ .AddSelectedValue(new DateTime(2017, 05, 03));
+
+ #endregion Pivot Table with filter
+
wb.SaveAs(filePath);
}
}
diff --git a/ClosedXML_Examples/Styles/StyleFill.cs b/ClosedXML_Examples/Styles/StyleFill.cs
index a5d0800..8a85791 100644
--- a/ClosedXML_Examples/Styles/StyleFill.cs
+++ b/ClosedXML_Examples/Styles/StyleFill.cs
@@ -1,11 +1,8 @@
-using System;
using ClosedXML.Excel;
-
+using System;
namespace ClosedXML_Examples.Styles
{
-
-
public class StyleFill : IXLExample
{
public void Create(String filePath)
@@ -19,12 +16,12 @@
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 + 1).Value = "PatternType = DarkTrellis; PatternColor = Orange; BackgroundColor = 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;
+ ws.Cell(ro, co).Style.Fill.BackgroundColor = XLColor.Blue;
workbook.SaveAs(filePath);
}
}
-}
\ No newline at end of file
+}
diff --git a/ClosedXML_Examples/Tables/UsingTables.cs b/ClosedXML_Examples/Tables/UsingTables.cs
index 639a0a0..24f4903 100644
--- a/ClosedXML_Examples/Tables/UsingTables.cs
+++ b/ClosedXML_Examples/Tables/UsingTables.cs
@@ -21,7 +21,7 @@
ws.Name = "Contacts Table";
var firstCell = ws.FirstCellUsed();
var lastCell = ws.LastCellUsed();
- var range = ws.Range(firstCell.Address, lastCell.Address);
+ var range = ws.Range(firstCell.Address, lastCell.CellRight().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
@@ -30,6 +30,15 @@
range.Column(4).Style.NumberFormat.NumberFormatId = 15;
range.Column(5).Style.NumberFormat.Format = "$ #,##0";
+ // Add a field
+ range.Column(6).FirstCell().SetValue("Age");
+ var c = range.Column(6).FirstCell().CellBelow();
+ c.Style.NumberFormat.SetFormat("0.00");
+ c.FormulaA1 = "=(DATE(2017, 10, 3) - E3) / 365";
+
+ c.CopyTo(c.CellBelow())
+ .CopyTo(c.CellBelow().CellBelow());
+
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.
@@ -40,8 +49,10 @@
// Just for fun let's add the text "Sum Of Income" to the totals row
table.Field(0).TotalsRowLabel = "Sum Of Income";
+ table.Field("Age").TotalsRowFunction = XLTotalsRowFunction.Average;
+
// Copy all the headers
- Int32 columnWithHeaders = lastCell.Address.ColumnNumber + 2;
+ Int32 columnWithHeaders = lastCell.Address.ColumnNumber + 3;
Int32 currentRow = table.RangeAddress.FirstAddress.RowNumber;
ws.Cell(currentRow, columnWithHeaders).Value = "Table Headers";
foreach (var cell in table.HeadersRow().Cells())
@@ -82,7 +93,7 @@
namesTable.ShowAutoFilter = false;
ws.Columns().AdjustToContents();
- ws.Columns("A,G,I").Width = 3;
+ ws.Columns("A,H,J").Width = 3;
wb.SaveAs(filePath);
}
diff --git a/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj b/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj
index d72ca28..fa38f46 100644
--- a/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj
+++ b/ClosedXML_Sandbox/ClosedXML_Sandbox.csproj
@@ -23,6 +23,7 @@
AnyCPU
prompt
false
+ 6
bin\Release\
diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj
index d6e713a..a1fbe64 100644
--- a/ClosedXML_Tests/ClosedXML_Tests.csproj
+++ b/ClosedXML_Tests/ClosedXML_Tests.csproj
@@ -26,6 +26,7 @@
prompt
4
false
+ 6
pdbonly
@@ -299,6 +300,7 @@
+
diff --git a/ClosedXML_Tests/Examples/ColumnsTests.cs b/ClosedXML_Tests/Examples/ColumnsTests.cs
index 1ecd215..b5007bf 100644
--- a/ClosedXML_Tests/Examples/ColumnsTests.cs
+++ b/ClosedXML_Tests/Examples/ColumnsTests.cs
@@ -30,5 +30,11 @@
{
TestHelper.RunTestExample(@"Columns\DeletingColumns.xlsx");
}
+
+ //[Test] // Not working yet
+ public void InsertColumns()
+ {
+ TestHelper.RunTestExample(@"Columns\InsertColumns.xlsx");
+ }
}
-}
\ No newline at end of file
+}
diff --git a/ClosedXML_Tests/Examples/RowsTests.cs b/ClosedXML_Tests/Examples/RowsTests.cs
index 3042957..446b812 100644
--- a/ClosedXML_Tests/Examples/RowsTests.cs
+++ b/ClosedXML_Tests/Examples/RowsTests.cs
@@ -24,5 +24,11 @@
{
TestHelper.RunTestExample(@"Rows\RowSettings.xlsx");
}
+
+ //[Test] // Not working yet
+ public void InsertRows()
+ {
+ TestHelper.RunTestExample(@"Rows\InsertRows.xlsx");
+ }
}
-}
\ No newline at end of file
+}
diff --git a/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs b/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs
index da8bde2..9a4356a 100644
--- a/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs
+++ b/ClosedXML_Tests/Excel/AutoFilters/AutoFilterTests.cs
@@ -1,8 +1,9 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
using ClosedXML.Excel;
using NUnit.Framework;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
namespace ClosedXML_Tests
{
@@ -94,5 +95,35 @@
Assert.That(!ws.AutoFilter.Enabled);
}
}
+
+ [Test]
+ public void CanCopyAutoFilterToNewSheetOnNewWorkbook()
+ {
+ using (var ms1 = new MemoryStream())
+ using (var ms2 = new MemoryStream())
+ {
+ using (var wb1 = new XLWorkbook())
+ using (var wb2 = new XLWorkbook())
+ {
+ var ws = wb1.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();
+
+ wb1.SaveAs(ms1);
+
+ ws.CopyTo(wb2, ws.Name);
+ wb2.SaveAs(ms2);
+ }
+
+ using (var wb2 = new XLWorkbook(ms2))
+ {
+ Assert.IsTrue(wb2.Worksheets.First().AutoFilter.Enabled);
+ }
+ }
+ }
}
}
diff --git a/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs b/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs
index a18e509..b7b7151 100644
--- a/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs
+++ b/ClosedXML_Tests/Excel/CalcEngine/LookupTests.cs
@@ -129,5 +129,20 @@
Assert.Throws(() => workbook.Evaluate(@"=VLOOKUP(20,Data!$B$2:$I$71,9,FALSE)"));
}
+
+ [Test]
+ public void Hyperlink()
+ {
+ XLHyperlink hl;
+ hl = XLWorkbook.EvaluateExpr("HYPERLINK(\"http://github.com/ClosedXML/ClosedXML\")") as XLHyperlink;
+ Assert.IsNotNull(hl);
+ Assert.AreEqual("http://github.com/ClosedXML/ClosedXML", hl.ExternalAddress.ToString());
+ Assert.AreEqual(string.Empty, hl.Tooltip);
+
+ hl = XLWorkbook.EvaluateExpr("HYPERLINK(\"mailto:jsmith@github.com\", \"jsmith@github.com\")") as XLHyperlink;
+ Assert.IsNotNull(hl);
+ Assert.AreEqual("mailto:jsmith@github.com", hl.ExternalAddress.ToString());
+ Assert.AreEqual("jsmith@github.com", hl.Tooltip);
+ }
}
}
diff --git a/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs b/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs
index b9003d2..60f4585 100644
--- a/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs
+++ b/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs
@@ -2,6 +2,7 @@
using ClosedXML.Excel.CalcEngine.Exceptions;
using NUnit.Framework;
using System;
+using System.Globalization;
using System.Linq;
namespace ClosedXML_Tests.Excel.CalcEngine
@@ -11,6 +12,857 @@
{
private readonly double tolerance = 1e-10;
+ [Theory]
+ public void Abs_ReturnsItselfOnPositiveNumbers([Range(0, 10, 0.1)] double input)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ABS({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(input, actual, tolerance * 10);
+ }
+
+ [Theory]
+ public void Abs_ReturnsTheCorrectValueOnNegativeInput([Range(-10, -0.1, 0.1)] double input)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ABS({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(-input, actual, tolerance * 10);
+ }
+
+ [TestCase(-10, 3.041924001)]
+ [TestCase(-9, 3.030935432)]
+ [TestCase(-8, 3.017237659)]
+ [TestCase(-7, 2.999695599)]
+ [TestCase(-6, 2.976443976)]
+ [TestCase(-5, 2.944197094)]
+ [TestCase(-4, 2.89661399)]
+ [TestCase(-3, 2.819842099)]
+ [TestCase(-2, 2.677945045)]
+ [TestCase(-1, 2.35619449)]
+ [TestCase(0, 1.570796327)]
+ [TestCase(1, 0.785398163)]
+ [TestCase(2, 0.463647609)]
+ [TestCase(3, 0.321750554)]
+ [TestCase(4, 0.244978663)]
+ [TestCase(5, 0.19739556)]
+ [TestCase(6, 0.165148677)]
+ [TestCase(7, 0.141897055)]
+ [TestCase(8, 0.124354995)]
+ [TestCase(9, 0.110657221)]
+ [TestCase(10, 0.099668652)]
+ public void Acot_ReturnsCorrectValue(double input, double expectedResult)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ACOT({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actual, tolerance * 10);
+ }
+
+ [Theory]
+ public void Acos_ThrowsNumberExceptionOutsideRange([Range(1.1, 3, 0.1)] double input)
+ {
+ // checking input and it's additive inverse as both are outside range.
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ACOS({0})", input.ToString(CultureInfo.InvariantCulture))));
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ACOS({0})", (-input).ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [TestCase(-1, 3.141592654)]
+ [TestCase(-0.9, 2.690565842)]
+ [TestCase(-0.8, 2.498091545)]
+ [TestCase(-0.7, 2.346193823)]
+ [TestCase(-0.6, 2.214297436)]
+ [TestCase(-0.5, 2.094395102)]
+ [TestCase(-0.4, 1.982313173)]
+ [TestCase(-0.3, 1.875488981)]
+ [TestCase(-0.2, 1.772154248)]
+ [TestCase(-0.1, 1.670963748)]
+ [TestCase(0, 1.570796327)]
+ [TestCase(0.1, 1.470628906)]
+ [TestCase(0.2, 1.369438406)]
+ [TestCase(0.3, 1.266103673)]
+ [TestCase(0.4, 1.159279481)]
+ [TestCase(0.5, 1.047197551)]
+ [TestCase(0.6, 0.927295218)]
+ [TestCase(0.7, 0.79539883)]
+ [TestCase(0.8, 0.643501109)]
+ [TestCase(0.9, 0.451026812)]
+ [TestCase(1, 0)]
+ public void Acos_ReturnsCorrectValue(double input, double expectedResult)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ACOS({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actual, tolerance * 10);
+ }
+
+ [Theory]
+ public void Acosh_NumbersBelow1ThrowNumberException([Range(-1, 0.9, 0.1)] double input)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ACOSH({0})", input.ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [TestCase(1.2, 0.622362504)]
+ [TestCase(1.5, 0.96242365)]
+ [TestCase(1.8, 1.192910731)]
+ [TestCase(2.1, 1.372859144)]
+ [TestCase(2.4, 1.522079367)]
+ [TestCase(2.7, 1.650193455)]
+ [TestCase(3, 1.762747174)]
+ [TestCase(3.3, 1.863279351)]
+ [TestCase(3.6, 1.954207529)]
+ [TestCase(3.9, 2.037266466)]
+ [TestCase(4.2, 2.113748231)]
+ [TestCase(4.5, 2.184643792)]
+ [TestCase(4.8, 2.250731414)]
+ [TestCase(5.1, 2.312634419)]
+ [TestCase(5.4, 2.370860342)]
+ [TestCase(5.7, 2.425828318)]
+ [TestCase(6, 2.47788873)]
+ [TestCase(1, 0)]
+ public void Acosh_ReturnsCorrectValue(double input, double expectedResult)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ACOSH({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actual, tolerance * 10);
+ }
+
+ [TestCase(-10, -0.100335348)]
+ [TestCase(-9, -0.111571776)]
+ [TestCase(-8, -0.125657214)]
+ [TestCase(-7, -0.143841036)]
+ [TestCase(-6, -0.168236118)]
+ [TestCase(-5, -0.202732554)]
+ [TestCase(-4, -0.255412812)]
+ [TestCase(-3, -0.34657359)]
+ [TestCase(-2, -0.549306144)]
+ [TestCase(2, 0.549306144)]
+ [TestCase(3, 0.34657359)]
+ [TestCase(4, 0.255412812)]
+ [TestCase(5, 0.202732554)]
+ [TestCase(6, 0.168236118)]
+ [TestCase(7, 0.143841036)]
+ [TestCase(8, 0.125657214)]
+ [TestCase(9, 0.111571776)]
+ [TestCase(10, 0.100335348)]
+ public void Acoth_ReturnsCorrectValue(double input, double expectedResult)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ACOTH({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actual, tolerance * 10);
+ }
+
+ [Theory]
+ public void Acoth_ForPlusMinusXSmallerThan1_ThrowsNumberException([Range(-0.9, 0.9, 0.1)] double input)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ACOTH({0})", input.ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [TestCase("LVII", 57)]
+ [TestCase("mcmxii", 1912)]
+ [TestCase("", 0)]
+ [TestCase("-IV", -4)]
+ [TestCase(" XIV", 14)]
+ [TestCase("MCMLXXXIII ", 1983)]
+ public void Arabic_ReturnsCorrectNumber(string roman, int arabic)
+ {
+ var actual = (int)XLWorkbook.EvaluateExpr(string.Format($"ARABIC(\"{roman}\")"));
+ Assert.AreEqual(arabic, actual);
+ }
+
+ [Test]
+ public void Arabic_ThrowsNumberExceptionOnMinus()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("ARABIC(\"-\")"));
+ }
+
+ [TestCase("- I")]
+ [TestCase("roman")]
+ public void Arabic_ThrowsValueExceptionOnInvalidNumber(string invalidRoman)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr($"ARABIC(\"{invalidRoman}\")"));
+ }
+
+ [Theory]
+ public void Asin_ThrowsNumberExceptionWhenAbsOfInputGreaterThan1([Range(-3, -1.1, 0.1)] double input)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ASIN({0})", input.ToString(CultureInfo.InvariantCulture))));
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ASIN({0})", (-input).ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [TestCase(-1, -1.570796327)]
+ [TestCase(-0.9, -1.119769515)]
+ [TestCase(-0.8, -0.927295218)]
+ [TestCase(-0.7, -0.775397497)]
+ [TestCase(-0.6, -0.643501109)]
+ [TestCase(-0.5, -0.523598776)]
+ [TestCase(-0.4, -0.411516846)]
+ [TestCase(-0.3, -0.304692654)]
+ [TestCase(-0.2, -0.201357921)]
+ [TestCase(-0.1, -0.100167421)]
+ [TestCase(0, 0)]
+ [TestCase(0.1, 0.100167421)]
+ [TestCase(0.2, 0.201357921)]
+ [TestCase(0.3, 0.304692654)]
+ [TestCase(0.4, 0.411516846)]
+ [TestCase(0.5, 0.523598776)]
+ [TestCase(0.6, 0.643501109)]
+ [TestCase(0.7, 0.775397497)]
+ [TestCase(0.8, 0.927295218)]
+ [TestCase(0.9, 1.119769515)]
+ [TestCase(1, 1.570796327)]
+ public void Asin_ReturnsCorrectResult(double input, double expectedResult)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ASIN({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actual, tolerance * 10);
+ }
+
+ [TestCase(0, 0)]
+ [TestCase(0.1, 0.0998340788992076)]
+ [TestCase(0.2, 0.198690110349241)]
+ [TestCase(0.3, 0.295673047563422)]
+ [TestCase(0.4, 0.390035319770715)]
+ [TestCase(0.5, 0.481211825059603)]
+ [TestCase(0.6, 0.568824898732248)]
+ [TestCase(0.7, 0.652666566082356)]
+ [TestCase(0.8, 0.732668256045411)]
+ [TestCase(0.9, 0.808866935652783)]
+ [TestCase(1, 0.881373587019543)]
+ [TestCase(2, 1.44363547517881)]
+ [TestCase(3, 1.81844645923207)]
+ [TestCase(4, 2.0947125472611)]
+ [TestCase(5, 2.31243834127275)]
+ public void Asinh_ReturnsCorrectResult(double input, double expectedResult)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ASINH({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actual, tolerance);
+ var minusActual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ASINH({0})", (-input).ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(-expectedResult, minusActual, tolerance);
+ }
+
+ [TestCase(0, 0)]
+ [TestCase(0.1, 0.099668652491162)]
+ [TestCase(0.2, 0.197395559849881)]
+ [TestCase(0.3, 0.291456794477867)]
+ [TestCase(0.4, 0.380506377112365)]
+ [TestCase(0.5, 0.463647609000806)]
+ [TestCase(0.6, 0.540419500270584)]
+ [TestCase(0.7, 0.610725964389209)]
+ [TestCase(0.8, 0.674740942223553)]
+ [TestCase(0.9, 0.732815101786507)]
+ [TestCase(1, 0.785398163397448)]
+ [TestCase(2, 1.10714871779409)]
+ [TestCase(3, 1.24904577239825)]
+ [TestCase(4, 1.32581766366803)]
+ [TestCase(5, 1.37340076694502)]
+ public void Atan_ReturnsCorrectResult(double input, double expectedResult)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actual, tolerance);
+ var minusActual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN({0})", (-input).ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(-expectedResult, minusActual, tolerance);
+ }
+
+ [Test]
+ public void Atan2_ThrowsDiv0ExceptionOn0And0()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(@"ATAN2(0, 0)"));
+ }
+
+ [Test]
+ public void Atan2_ReturnsPiOn0AsSecondInputWhenFirstSmaller0([Range(-5, -0.1, 0.4)] double input)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2({0}, 0)", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(Math.PI, actual, tolerance);
+ }
+
+ [Test]
+ public void Atan2_ReturnsHalfPiOn0AsFirstInputWhenSecondGreater0([Range(0.1, 5, 0.4)] double input)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2(0, {0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(0.5 * Math.PI, actual, tolerance);
+ }
+
+ [Test]
+ public void Atan2_ReturnsMinusHalfPiOn0AsFirstInputWhenSecondSmaller0([Range(-5, -0.1, 0.4)] double input)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2(0, {0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(-0.5 * Math.PI, actual, tolerance);
+ }
+
+ [Test]
+ public void Atan2_Returns0OnSecond0AndFirstGreater0([Range(0.1, 5, 0.4)] double input)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2({0}, 0)", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(0, actual, tolerance);
+ }
+
+ public void Atan2_ReturnsQuarterOfPiWhenInputsAreEqualAndGreater0([Range(-5, 5, 0.3)] double input)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2(0, {0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(0.25 * Math.PI, actual, tolerance);
+ }
+
+ public void Atan2_Returns3QuartersOfPiWhenFirstSmaller0AndSecondItsNegative([Range(-5, 5, 0.3)] double input)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"ATAN2(0, {0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(0.25 * Math.PI, actual, tolerance);
+ }
+
+ [TestCase(1, 2, 1.10714871779409)]
+ [TestCase(1, 3, 1.24904577239825)]
+ [TestCase(2, 3, 0.98279372324733)]
+ [TestCase(1, 4, 1.32581766366803)]
+ [TestCase(3, 4, 0.92729521800161)]
+ [TestCase(1, 5, 1.37340076694502)]
+ [TestCase(2, 5, 1.19028994968253)]
+ [TestCase(3, 5, 1.03037682652431)]
+ [TestCase(4, 5, 0.89605538457134)]
+ [TestCase(1, 6, 1.40564764938027)]
+ [TestCase(5, 6, 0.87605805059819)]
+ [TestCase(1, 7, 1.42889927219073)]
+ [TestCase(2, 7, 1.29249666778979)]
+ [TestCase(3, 7, 1.16590454050981)]
+ [TestCase(4, 7, 1.05165021254837)]
+ [TestCase(5, 7, 0.95054684081208)]
+ [TestCase(6, 7, 0.86217005466723)]
+ public void Atan2_ReturnsCorrectResults_EqualOnAllMultiplesOfFraction(double x, double y, double expectedResult)
+ {
+ for (int i = 1; i < 5; i++)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"ATAN2({0}, {1})",
+ (x * i).ToString(CultureInfo.InvariantCulture),
+ (y * i).ToString(CultureInfo.InvariantCulture)));
+
+ Assert.AreEqual(expectedResult, actual, tolerance);
+ }
+ }
+
+ [Theory]
+ public void Atanh_ThrowsNumberExceptionWhenAbsOfInput1OrGreater([Range(1, 5, 0.2)] double input)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ATANH({0})", input.ToString(CultureInfo.InvariantCulture))));
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"ATANH({0})", (-input).ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [TestCase(-0.99, -2.64665241236225)]
+ [TestCase(-0.9, -1.47221948958322)]
+ [TestCase(-0.8, -1.09861228866811)]
+ [TestCase(-0.6, -0.693147180559945)]
+ [TestCase(-0.4, -0.423648930193602)]
+ [TestCase(-0.2, -0.202732554054082)]
+ [TestCase(0, 0)]
+ [TestCase(0.2, 0.202732554054082)]
+ [TestCase(0.4, 0.423648930193602)]
+ [TestCase(0.6, 0.693147180559945)]
+ [TestCase(0.8, 1.09861228866811)]
+ [TestCase(-0.9, -1.47221948958322)]
+ [TestCase(-0.990, -2.64665241236225)]
+ [TestCase(-0.999, -3.8002011672502)]
+ public void Atanh_ReturnsCorrectResults(double input, double expectedResult)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"ATANH({0})",
+ input.ToString(CultureInfo.InvariantCulture)));
+
+ Assert.AreEqual(expectedResult, actual, tolerance * 10);
+ }
+
+ [Theory]
+ public void Base_ThrowsNumberExceptionOnBaseSmallerThan2([Range(-2, 1)] int theBase)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"BASE(0, {0})", theBase.ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [Theory]
+ public void Base_ThrowsNumberExceptionOnInputSmallerThan0([Range(-5, -1)] int input)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"BASE({0}, 2)", input.ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [Theory]
+ public void Base_ThrowsNumberExceptionOnRadixGreaterThan36([Range(37, 40)] int radix)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"BASE(1, {0})", radix.ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [TestCase("x", "2", "2")]
+ [TestCase("0", "x", "2")]
+ [TestCase("0", "2", "x")]
+ public void Base_ThrowsValueExceptionOnAnyInputNotANumber(string input, string theBase, string minLength)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"BASE({0}, {1}, {2})",
+ input,
+ theBase,
+ minLength)));
+ }
+
+ [TestCase(0, 36, "0")]
+ [TestCase(1, 36, "1")]
+ [TestCase(2, 36, "2")]
+ [TestCase(3, 36, "3")]
+ [TestCase(4, 36, "4")]
+ [TestCase(5, 36, "5")]
+ [TestCase(6, 36, "6")]
+ [TestCase(7, 36, "7")]
+ [TestCase(8, 36, "8")]
+ [TestCase(9, 36, "9")]
+ [TestCase(10, 36, "A")]
+ [TestCase(11, 36, "B")]
+ [TestCase(12, 36, "C")]
+ [TestCase(13, 36, "D")]
+ [TestCase(14, 36, "E")]
+ [TestCase(15, 36, "F")]
+ [TestCase(16, 36, "G")]
+ [TestCase(17, 36, "H")]
+ [TestCase(18, 36, "I")]
+ [TestCase(19, 36, "J")]
+ [TestCase(20, 36, "K")]
+ [TestCase(21, 36, "L")]
+ [TestCase(22, 36, "M")]
+ [TestCase(23, 36, "N")]
+ [TestCase(24, 36, "O")]
+ [TestCase(25, 36, "P")]
+ [TestCase(26, 36, "Q")]
+ [TestCase(27, 36, "R")]
+ [TestCase(28, 36, "S")]
+ [TestCase(29, 36, "T")]
+ [TestCase(30, 36, "U")]
+ [TestCase(31, 36, "V")]
+ [TestCase(32, 36, "W")]
+ [TestCase(33, 36, "X")]
+ [TestCase(34, 36, "Y")]
+ [TestCase(35, 36, "Z")]
+ [TestCase(36, 36, "10")]
+ [TestCase(255, 29, "8N")]
+ [TestCase(255, 2, "11111111")]
+ public void Base_ReturnsCorrectResultOnInput(int input, int theBase, string expectedResult)
+ {
+ var actual = (string)XLWorkbook.EvaluateExpr(string.Format(@"BASE({0}, {1})", input, theBase));
+ Assert.AreEqual(expectedResult, actual);
+ }
+
+ [TestCase(255, 2, 3, "11111111")]
+ [TestCase(255, 2, 8, "11111111")]
+ [TestCase(255, 2, 10, "0011111111")]
+ [TestCase(10, 3, 4, "0101")]
+ public void Base_ReturnsCorrectResultOnInputWithMinimalLength(int input, int theBase, int minLength, string expectedResult)
+ {
+ var actual = (string)XLWorkbook.EvaluateExpr(string.Format(@"BASE({0}, {1}, {2})", input, theBase, minLength));
+ Assert.AreEqual(expectedResult, actual);
+ }
+
+ [Theory]
+ public void Combin_ThrowsNumberExceptionForAnyArgumentSmaller0([Range(-4, -1)] int smaller0)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"COMBIN({0}, {1})",
+ smaller0.ToString(CultureInfo.InvariantCulture),
+ (-smaller0).ToString(CultureInfo.InvariantCulture))));
+
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"COMBIN({0}, {1})",
+ (-smaller0).ToString(CultureInfo.InvariantCulture),
+ smaller0.ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [TestCase("\"no number\"")]
+ [TestCase("\"\"")]
+ public void Combin_ThrowsNumericExceptionForAnyArgumentNotNumeric(string input)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"COMBIN({0}, 1)",
+ input?.ToString(CultureInfo.InvariantCulture))));
+
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"COMBIN(1, {0})",
+ input?.ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [Theory]
+ public void Combin_Returns1ForKis0OrKEqualsN([Range(0, 10)] int n)
+ {
+ var actual = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, 0)", n));
+ Assert.AreEqual(1, actual);
+
+ var actual2 = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, {0})", n));
+ Assert.AreEqual(1, actual2);
+ }
+
+ [Theory]
+ public void Combin_ReturnsNforKis1OrKisNminus1([Range(1, 10)] int n)
+ {
+ var actual = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, 1)", n));
+ Assert.AreEqual(n, actual);
+
+ var actual2 = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, {1})", n, n - 1));
+ Assert.AreEqual(n, actual2);
+ }
+
+ [TestCase(4, 2, 6)]
+ [TestCase(5, 2, 10)]
+ [TestCase(6, 2, 15)]
+ [TestCase(6, 3, 20)]
+ [TestCase(7, 2, 21)]
+ [TestCase(7, 3, 35)]
+ public void Combin_ReturnsCorrectResults(int n, int k, int expectedResult)
+ {
+ var actual = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, {1})", n, k));
+ Assert.AreEqual(expectedResult, actual);
+
+ var actual2 = XLWorkbook.EvaluateExpr(string.Format(@"COMBIN({0}, {1})", n, n - k));
+ Assert.AreEqual(expectedResult, actual2);
+ }
+
+ [TestCase(4, 3, 20)]
+ [TestCase(10, 3, 220)]
+ [TestCase(0, 0, 1)]
+ public void Combina_CalculatesCorrectValues(int number, int chosen, int expectedResult)
+ {
+ var actualResult = XLWorkbook.EvaluateExpr($"COMBINA({number}, {chosen})");
+ Assert.AreEqual(expectedResult, (long)actualResult);
+ }
+
+ [Theory]
+ public void Combina_Returns1WhenChosenIs0([Range(0, 10)]int number)
+ {
+ Combina_CalculatesCorrectValues(number, 0, 1);
+ }
+
+ [TestCase(4.23, 3, 20)]
+ [TestCase(10.4, 3.14, 220)]
+ [TestCase(0, 0.4, 1)]
+ public void Combina_TruncatesNumbersCorrectly(double number, double chosen, int expectedResult)
+ {
+ var actualResult = XLWorkbook.EvaluateExpr(string.Format(
+ @"COMBINA({0}, {1})",
+ number.ToString(CultureInfo.InvariantCulture),
+ chosen.ToString(CultureInfo.InvariantCulture)));
+
+ Assert.AreEqual(expectedResult, (long)actualResult);
+ }
+
+ [TestCase(-1, 2)]
+ [TestCase(-3, -2)]
+ [TestCase(2, -2)]
+ public void Combina_ThrowsNumExceptionOnInvalidValues(int number, int chosen)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"COMBINA({0}, {1})",
+ number.ToString(CultureInfo.InvariantCulture),
+ chosen.ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [TestCase(0, 1)]
+ [TestCase(0.4, 0.921060994002885)]
+ [TestCase(0.8, 0.696706709347165)]
+ [TestCase(1.2, 0.362357754476674)]
+ [TestCase(1.6, -0.0291995223012888)]
+ [TestCase(2, -0.416146836547142)]
+ [TestCase(2.4, -0.737393715541245)]
+ [TestCase(2.8, -0.942222340668658)]
+ [TestCase(3.2, -0.998294775794753)]
+ [TestCase(3.6, -0.896758416334147)]
+ [TestCase(4, -0.653643620863612)]
+ [TestCase(4.4, -0.307332869978419)]
+ [TestCase(4.8, 0.0874989834394464)]
+ [TestCase(5.2, 0.468516671300377)]
+ [TestCase(5.6, 0.77556587851025)]
+ [TestCase(6, 0.960170286650366)]
+ [TestCase(6.4, 0.993184918758193)]
+ [TestCase(6.8, 0.869397490349825)]
+ [TestCase(7.2, 0.608351314532255)]
+ [TestCase(7.6, 0.251259842582256)]
+ [TestCase(8, -0.145500033808614)]
+ [TestCase(8.4, -0.519288654116686)]
+ public void Cos_ReturnsCorrectResult(double input, double expectedResult)
+ {
+ var actualResult = (double)XLWorkbook.EvaluateExpr(string.Format("COS({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actualResult, tolerance);
+ }
+
+ [TestCase(0, 1)]
+ [TestCase(0.4, 1.08107237183845)]
+ [TestCase(0.8, 1.33743494630484)]
+ [TestCase(1.2, 1.81065556732437)]
+ [TestCase(1.6, 2.57746447119489)]
+ [TestCase(2, 3.76219569108363)]
+ [TestCase(2.4, 5.55694716696551)]
+ [TestCase(2.8, 8.25272841686113)]
+ [TestCase(3.2, 12.2866462005439)]
+ [TestCase(3.6, 18.3127790830626)]
+ [TestCase(4, 27.3082328360165)]
+ [TestCase(4.4, 40.7315730024356)]
+ [TestCase(4.8, 60.7593236328919)]
+ [TestCase(5.2, 90.638879219786)]
+ [TestCase(5.6, 135.215052644935)]
+ [TestCase(6, 201.715636122456)]
+ [TestCase(6.4, 300.923349714678)]
+ [TestCase(6.8, 448.924202712783)]
+ [TestCase(7.2, 669.715755490113)]
+ [TestCase(7.6, 999.098197777775)]
+ [TestCase(8, 1490.47916125218)]
+ [TestCase(8.4, 2223.53348628359)]
+ public void Cosh_ReturnsCorrectResult(double input, double expectedResult)
+ {
+ var actualResult = (double)XLWorkbook.EvaluateExpr(string.Format("COSH({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actualResult, tolerance);
+ var actualResult2 = (double)XLWorkbook.EvaluateExpr(string.Format("COSH({0})", (-input).ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actualResult2, tolerance);
+ }
+
+ [TestCase(1, 0.642092616)]
+ [TestCase(2, -0.457657554)]
+ [TestCase(3, -7.015252551)]
+ [TestCase(4, 0.863691154)]
+ [TestCase(5, -0.295812916)]
+ [TestCase(6, -3.436353004)]
+ [TestCase(7, 1.147515422)]
+ [TestCase(8, -0.147065064)]
+ [TestCase(9, -2.210845411)]
+ [TestCase(10, 1.542351045)]
+ [TestCase(11, -0.004425741)]
+ [TestCase(Math.PI * 0.5, 0)]
+ [TestCase(45, 0.617369624)]
+ [TestCase(-2, 0.457657554)]
+ [TestCase(-3, 7.015252551)]
+ public void Cot(double input, double expected)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"COT({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expected, actual, tolerance * 10.0);
+ }
+
+ [Test]
+ public void Cot_Input0()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("COT(0)"));
+ }
+
+ [TestCase(-10, -1.000000004)]
+ [TestCase(-9, -1.00000003)]
+ [TestCase(-8, -1.000000225)]
+ [TestCase(-7, -1.000001663)]
+ [TestCase(-6, -1.000012289)]
+ [TestCase(-5, -1.000090804)]
+ [TestCase(-4, -1.00067115)]
+ [TestCase(-3, -1.004969823)]
+ [TestCase(-2, -1.037314721)]
+ [TestCase(-1, -1.313035285)]
+ [TestCase(1, 1.313035285)]
+ [TestCase(2, 1.037314721)]
+ [TestCase(3, 1.004969823)]
+ [TestCase(4, 1.00067115)]
+ [TestCase(5, 1.000090804)]
+ [TestCase(6, 1.000012289)]
+ [TestCase(7, 1.000001663)]
+ [TestCase(8, 1.000000225)]
+ [TestCase(9, 1.00000003)]
+ [TestCase(10, 1.000000004)]
+ public void Coth_Examples(double input, double expected)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"COTH({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expected, actual, tolerance * 10.0);
+ }
+
+ [Test]
+ public void Cot_On0_ThrowsDivisionByZeroException()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(@"COTH(0)"));
+ }
+
+ [TestCase(-10, 1.838163961)]
+ [TestCase(-9, -2.426486644)]
+ [TestCase(-8, -1.010756218)]
+ [TestCase(-7, -1.522101063)]
+ [TestCase(-6, 3.578899547)]
+ [TestCase(-5, 1.042835213)]
+ [TestCase(-4, 1.321348709)]
+ [TestCase(-3, -7.086167396)]
+ [TestCase(-2, -1.09975017)]
+ [TestCase(-1, -1.188395106)]
+ [TestCase(1, 1.188395106)]
+ [TestCase(2, 1.09975017)]
+ [TestCase(3, 7.086167396)]
+ [TestCase(4, -1.321348709)]
+ [TestCase(5, -1.042835213)]
+ [TestCase(6, -3.578899547)]
+ [TestCase(7, 1.522101063)]
+ [TestCase(8, 1.010756218)]
+ [TestCase(9, 2.426486644)]
+ [TestCase(10, -1.838163961)]
+ public void Csc_ReturnsCorrectValues(double input, double expected)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"CSC({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expected, actual, tolerance * 10);
+ }
+
+ [Test]
+ public void Csc_On0_ThrowsDivisionByZeroException()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(@"CSC(0)"));
+ }
+
+
+ [TestCase("FF", 16, 255)]
+ [TestCase("111", 2, 7)]
+ [TestCase("zap", 36, 45745)]
+ public void Decimal(string inputString, int radix, int expectedResult)
+ {
+ var actualResult = XLWorkbook.EvaluateExpr($"DECIMAL(\"{inputString}\", {radix})");
+ Assert.AreEqual(expectedResult, actualResult);
+ }
+
+ [Test]
+ public void Decimal_ZeroIsZeroInAnyRadix([Range(2, 36)] int radix)
+ {
+ Assert.AreEqual(0, XLWorkbook.EvaluateExpr($"DECIMAL(\"0\", {radix})"));
+ }
+
+ [Theory]
+ public void Decimal_ReturnsErrorForRadiansGreater36([Range(37, 255)] int radix)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr($"DECIMAL(\"0\", {radix})"));
+ }
+
+ [TestCase(0, 0)]
+ [TestCase(Math.PI, 180)]
+ [TestCase(Math.PI * 2, 360)]
+ [TestCase(1, 57.2957795130823)]
+ [TestCase(2, 114.591559026165)]
+ [TestCase(3, 171.887338539247)]
+ [TestCase(4, 229.183118052329)]
+ [TestCase(5, 286.478897565412)]
+ [TestCase(6, 343.774677078494)]
+ [TestCase(7, 401.070456591576)]
+ [TestCase(8, 458.366236104659)]
+ [TestCase(9, 515.662015617741)]
+ [TestCase(10, 572.957795130823)]
+ [TestCase(Math.PI * 0.5, 90)]
+ [TestCase(Math.PI * 1.5, 270)]
+ [TestCase(Math.PI * 0.25, 45)]
+ [TestCase(-1, -57.2957795130823)]
+ public void Degrees_ReturnsCorrectResult(double input, double expected)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"DEGREES({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expected, actual, tolerance);
+ }
+
+ [Theory]
+ public void Decimal_ReturnsErrorForRadiansSmaller2([Range(-5, 1)] int radix)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr($"DECIMAL(\"0\", {radix})"));
+ }
+
+ [TestCase(1.5, 2)]
+ [TestCase(3, 4)]
+ [TestCase(2, 2)]
+ [TestCase(-1, -2)]
+ [TestCase(0, 0)]
+ [TestCase(Math.PI, 4)]
+ public void Even_ReturnsCorrectResults(double input, int expectedResult)
+ {
+ var actual = (int)XLWorkbook.EvaluateExpr(string.Format(@"EVEN({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actual);
+ }
+
+ [TestCase(0, 1)]
+ [TestCase(1, Math.E)]
+ [TestCase(2, 7.38905609893065)]
+ [TestCase(3, 20.0855369231877)]
+ [TestCase(4, 54.5981500331442)]
+ [TestCase(5, 148.413159102577)]
+ [TestCase(6, 403.428793492735)]
+ [TestCase(7, 1096.63315842846)]
+ [TestCase(8, 2980.95798704173)]
+ [TestCase(9, 8103.08392757538)]
+ [TestCase(10, 22026.4657948067)]
+ [TestCase(11, 59874.1417151978)]
+ [TestCase(12, 162754.791419004)]
+ public void Exp_ReturnsCorrectResults(double input, double expectedResult)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"EXP({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actual, tolerance);
+ }
+
+ [TestCase(0, 1L)]
+ [TestCase(1, 1L)]
+ [TestCase(2, 2L)]
+ [TestCase(3, 6L)]
+ [TestCase(4, 24L)]
+ [TestCase(5, 120L)]
+ [TestCase(6, 720L)]
+ [TestCase(7, 5040L)]
+ [TestCase(8, 40320L)]
+ [TestCase(9, 362880L)]
+ [TestCase(10, 3628800L)]
+ [TestCase(11, 39916800L)]
+ [TestCase(12, 479001600L)]
+ [TestCase(13, 6227020800L)]
+ [TestCase(14, 87178291200L)]
+ [TestCase(15, 1307674368000L)]
+ [TestCase(16, 20922789888000L)]
+ [TestCase(0.1, 1L)]
+ [TestCase(2.3, 2L)]
+ [TestCase(2.8, 2L)]
+ public void Fact_ReturnsCorrectResult(double input, long expectedResult)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"FACT({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actual);
+ }
+
+ [Theory]
+ public void Fact_ThrowsNumberExceptionForNegativeInput([Range(-10, -1)] int input)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"FACT({0})", input.ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [Test]
+ public void Fact_ThrowsValueExceptionForNonNumericInput()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"FACT(""x"")")));
+ }
+
+ [TestCase(0, 1L)]
+ [TestCase(1, 1L)]
+ [TestCase(2, 2L)]
+ [TestCase(3, 3L)]
+ [TestCase(4, 8L)]
+ [TestCase(5, 15L)]
+ [TestCase(6, 48L)]
+ [TestCase(7, 105L)]
+ [TestCase(8, 384L)]
+ [TestCase(9, 945L)]
+ [TestCase(10, 3840L)]
+ [TestCase(11, 10395L)]
+ [TestCase(12, 46080L)]
+ [TestCase(13, 135135L)]
+ [TestCase(14, 645120)]
+ [TestCase(15, 2027025)]
+ [TestCase(16, 10321920)]
+ [TestCase(-1, 1L)]
+ [TestCase(0, 1)]
+ [TestCase(0.1, 1L)]
+ [TestCase(1.4, 1L)]
+ [TestCase(2.3, 2L)]
+ [TestCase(2.8, 2L)]
+ public void FactDouble_ReturnsCorrectResult(double input, long expectedResult)
+ {
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"FACTDOUBLE({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedResult, actual);
+ }
+
+ [Theory]
+ public void FactDouble_ThrowsNumberExceptionForInputSmallerThanMinus1([Range(-10, -2)] int input)
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"FACTDOUBLE({0})", input.ToString(CultureInfo.InvariantCulture))));
+ }
+
+ [Test]
+ public void FactDouble_ThrowsValueExceptionForNonNumericInput()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(string.Format(@"FACTDOUBLE(""x"")")));
+ }
+
[Test]
public void Floor()
{
@@ -49,42 +901,29 @@
[Test]
// Functions have to support a period first before we can implement this
- public void FloorMath()
+ [TestCase(24.3, 5, null, 20)]
+ [TestCase(6.7, null, null, 6)]
+ [TestCase(-8.1, 2, null, -10)]
+ [TestCase(5.5, 2.1, 0, 4.2)]
+ [TestCase(5.5, -2.1, 0, 4.2)]
+ [TestCase(5.5, 2.1, -1, 4.2)]
+ [TestCase(5.5, -2.1, -1, 4.2)]
+ [TestCase(-5.5, 2.1, 0, -6.3)]
+ [TestCase(-5.5, -2.1, 0, -6.3)]
+ [TestCase(-5.5, 2.1, -1, -4.2)]
+ [TestCase(-5.5, -2.1, -1, -4.2)]
+ public void FloorMath(double input, double? step, int? mode, double expectedResult)
{
- double actual;
+ string parameters = input.ToString(CultureInfo.InvariantCulture);
+ if (step != null)
+ {
+ parameters = parameters + ", " + step?.ToString(CultureInfo.InvariantCulture);
+ if (mode != null)
+ parameters = parameters + ", " + mode?.ToString(CultureInfo.InvariantCulture);
+ }
- actual = (double)XLWorkbook.EvaluateExpr(@"FLOOR.MATH(24.3, 5)");
- Assert.AreEqual(20, actual, tolerance);
-
- actual = (double)XLWorkbook.EvaluateExpr(@"FLOOR.MATH(6.7)");
- Assert.AreEqual(6, actual, tolerance);
-
- actual = (double)XLWorkbook.EvaluateExpr(@"FLOOR.MATH(-8.1, 2)");
- Assert.AreEqual(-10, actual, tolerance);
-
- actual = (double)XLWorkbook.EvaluateExpr(@"FLOOR.MATH(5.5, 2.1, 0)");
- Assert.AreEqual(4.2, actual, tolerance);
-
- actual = (double)XLWorkbook.EvaluateExpr(@"FLOOR.MATH(5.5, -2.1, 0)");
- Assert.AreEqual(4.2, actual, tolerance);
-
- actual = (double)XLWorkbook.EvaluateExpr(@"FLOOR.MATH(5.5, 2.1, -1)");
- Assert.AreEqual(4.2, actual, tolerance);
-
- actual = (double)XLWorkbook.EvaluateExpr(@"FLOOR.MATH(5.5, -2.1, -1)");
- Assert.AreEqual(4.2, actual, tolerance);
-
- actual = (double)XLWorkbook.EvaluateExpr(@"FLOOR.MATH(-5.5, 2.1, 0)");
- Assert.AreEqual(-6.3, actual, tolerance);
-
- actual = (double)XLWorkbook.EvaluateExpr(@"FLOOR.MATH(-5.5, -2.1, 0)");
- Assert.AreEqual(-6.3, actual, tolerance);
-
- actual = (double)XLWorkbook.EvaluateExpr(@"FLOOR.MATH(-5.5, 2.1, -1)");
- Assert.AreEqual(-4.2, actual, tolerance);
-
- actual = (double)XLWorkbook.EvaluateExpr(@"FLOOR.MATH(-5.5, -2.1, -1)");
- Assert.AreEqual(-4.2, actual, tolerance);
+ var actual = (double)XLWorkbook.EvaluateExpr(string.Format(@"FLOOR.MATH({0})", parameters));
+ Assert.AreEqual(expectedResult, actual, tolerance);
}
[Test]
@@ -122,6 +961,300 @@
Assert.AreEqual(0.7, actual, tolerance);
}
+ [TestCase(0, 1)]
+ [TestCase(0.3, 1.0467516)]
+ [TestCase(0.6, 1.21162831)]
+ [TestCase(0.9, 1.60872581)]
+ [TestCase(1.2, 2.759703601)]
+ [TestCase(1.5, 14.1368329)]
+ [TestCase(1.8, -4.401367872)]
+ [TestCase(2.1, -1.980801656)]
+ [TestCase(2.4, -1.356127641)]
+ [TestCase(2.7, -1.10610642)]
+ [TestCase(3.0, -1.010108666)]
+ [TestCase(3.3, -1.012678974)]
+ [TestCase(3.6, -1.115127532)]
+ [TestCase(3.9, -1.377538917)]
+ [TestCase(4.2, -2.039730601)]
+ [TestCase(4.5, -4.743927548)]
+ [TestCase(4.8, 11.42870421)]
+ [TestCase(5.1, 2.645658426)]
+ [TestCase(5.4, 1.575565187)]
+ [TestCase(5.7, 1.198016873)]
+ [TestCase(6.0, 1.041481927)]
+ [TestCase(6.3, 1.000141384)]
+ [TestCase(6.6, 1.052373922)]
+ [TestCase(6.9, 1.225903187)]
+ [TestCase(7.2, 1.643787029)]
+ [TestCase(7.5, 2.884876262)]
+ [TestCase(7.8, 18.53381902)]
+ [TestCase(8.1, -4.106031636)]
+ [TestCase(8.4, -1.925711244)]
+ [TestCase(8.7, -1.335743646)]
+ [TestCase(9.0, -1.097537906)]
+ [TestCase(9.3, -1.007835594)]
+ [TestCase(9.6, -1.015550252)]
+ [TestCase(9.9, -1.124617578)]
+ [TestCase(10.2, -1.400039323)]
+ [TestCase(10.5, -2.102886109)]
+ [TestCase(10.8, -5.145888341)]
+ [TestCase(11.1, 9.593612018)]
+ [TestCase(11.4, 2.541355049)]
+ [TestCase(45, 1.90359)]
+ [TestCase(30, 6.48292)]
+ public void Sec_ReturnsCorrectNumber(double input, double expectedOutput)
+ {
+ double result = (double)XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"SEC({0})",
+ input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedOutput, result, 0.00001);
+
+ // as the secant is symmetric for positive and negative numbers, let's assert twice:
+ double resultForNegative = (double)XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"SEC({0})",
+ (-input).ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedOutput, resultForNegative, 0.00001);
+ }
+
+ [Test]
+ public void Sec_ThrowsCellValueExceptionOnNonNumericValue()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"SEC(number)")));
+ }
+
+ [TestCase(-9, 0.00024682)]
+ [TestCase(-8, 0.000670925)]
+ [TestCase(-7, 0.001823762)]
+ [TestCase(-6, 0.004957474)]
+ [TestCase(-5, 0.013475282)]
+ [TestCase(-4, 0.036618993)]
+ [TestCase(-3, 0.099327927)]
+ [TestCase(-2, 0.265802229)]
+ [TestCase(-1, 0.648054274)]
+ [TestCase(0, 1)]
+ public void Sech_ReturnsCorrectNumber(double input, double expectedOutput)
+ {
+ double result = (double)XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"SECH({0})",
+ input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedOutput, result, 0.00001);
+
+ // as the secant is symmetric for positive and negative numbers, let's assert twice:
+ double resultForNegative = (double)XLWorkbook.EvaluateExpr(
+ string.Format(
+ @"SECH({0})",
+ (-input).ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expectedOutput, resultForNegative, 0.00001);
+ }
+
+ ///
+ /// refers to Example 1 from the Excel documentation,
+ ///
+ ///
+ ///
+ ///
+ [TestCase(63000, "SUMIF(A1:A4,\">160000\", B1:B4)")]
+ [TestCase(900000, "SUMIF(A1:A4,\">160000\")")]
+ [TestCase(21000, "SUMIF(A1:A4, 300000, B1:B4)")]
+ [TestCase(28000, "SUMIF(A1:A4, \">\" &C1, B1:B4)")]
+ public void SumIf_ReturnsCorrectValues_ReferenceExample1FromMicrosoft(int expectedOutcome, string formula)
+ {
+ using (var wb = new XLWorkbook())
+ {
+ wb.ReferenceStyle = XLReferenceStyle.A1;
+
+ var ws = wb.AddWorksheet("Sheet1");
+ ws.Cell(1, 1).Value = 100000;
+ ws.Cell(1, 2).Value = 7000;
+ ws.Cell(2, 1).Value = 200000;
+ ws.Cell(2, 2).Value = 14000;
+ ws.Cell(3, 1).Value = 300000;
+ ws.Cell(3, 2).Value = 21000;
+ ws.Cell(4, 1).Value = 400000;
+ ws.Cell(4, 2).Value = 28000;
+
+ ws.Cell(1, 3).Value = 300000;
+
+ Assert.AreEqual(expectedOutcome, (double)ws.Evaluate(formula));
+ }
+ }
+
+ ///
+ /// refers to Example 2 from the Excel documentation,
+ ///
+ ///
+ ///
+ ///
+ [TestCase(2000, "SUMIF(A2:A7,\"Fruits\", C2:C7)")]
+ [TestCase(12000, "SUMIF(A2:A7,\"Vegetables\", C2:C7)")]
+ [TestCase(4300, "SUMIF(B2:B7, \"*es\", C2:C7)")]
+ [TestCase(400, "SUMIF(A2:A7, \"\", C2:C7)")]
+ public void SumIf_ReturnsCorrectValues_ReferenceExample2FromMicrosoft(int expectedOutcome, string formula)
+ {
+ using (var wb = new XLWorkbook())
+ {
+ wb.ReferenceStyle = XLReferenceStyle.A1;
+
+ var ws = wb.AddWorksheet("Sheet1");
+ ws.Cell(2, 1).Value = "Vegetables";
+ ws.Cell(3, 1).Value = "Vegetables";
+ ws.Cell(4, 1).Value = "Fruits";
+ ws.Cell(5, 1).Value = "";
+ ws.Cell(6, 1).Value = "Vegetables";
+ ws.Cell(7, 1).Value = "Fruits";
+
+ ws.Cell(2, 2).Value = "Tomatoes";
+ ws.Cell(3, 2).Value = "Celery";
+ ws.Cell(4, 2).Value = "Oranges";
+ ws.Cell(5, 2).Value = "Butter";
+ ws.Cell(6, 2).Value = "Carrots";
+ ws.Cell(7, 2).Value = "Apples";
+
+ ws.Cell(2, 3).Value = 2300;
+ ws.Cell(3, 3).Value = 5500;
+ ws.Cell(4, 3).Value = 800;
+ ws.Cell(5, 3).Value = 400;
+ ws.Cell(6, 3).Value = 4200;
+ ws.Cell(7, 3).Value = 1200;
+
+ ws.Cell(1, 3).Value = 300000;
+
+ Assert.AreEqual(expectedOutcome, (double)ws.Evaluate(formula));
+ }
+ }
+
+ ///
+ /// refers to Example 1 to SumIf from the Excel documentation.
+ /// As SumIfs should behave the same if called with three parameters, we can take that example here again.
+ ///
+ ///
+ ///
+ ///
+ [TestCase(63000, "SUMIFS(B1:B4, \">160000\", A1:A4)")]
+ [TestCase(21000, "SUMIFS(B1:B4, 300000, A1:A4)")]
+ [TestCase(28000, "SUMIFS(B1:B4, \">\" &C1, A1:A4)")]
+ public void SumIfs_ReturnsCorrectValues_ReferenceExampleForSumIf1FromMicrosoft(int expectedOutcome, string formula)
+ {
+ using (var wb = new XLWorkbook())
+ {
+ wb.ReferenceStyle = XLReferenceStyle.A1;
+
+ var ws = wb.AddWorksheet("Sheet1");
+ ws.Cell(1, 1).Value = 100000;
+ ws.Cell(1, 2).Value = 7000;
+ ws.Cell(2, 1).Value = 200000;
+ ws.Cell(2, 2).Value = 14000;
+ ws.Cell(3, 1).Value = 300000;
+ ws.Cell(3, 2).Value = 21000;
+ ws.Cell(4, 1).Value = 400000;
+ ws.Cell(4, 2).Value = 28000;
+
+ ws.Cell(1, 3).Value = 300000;
+
+ Assert.AreEqual(expectedOutcome, (double)ws.Evaluate(formula));
+ }
+ }
+
+ ///
+ /// refers to Example 2 to SumIf from the Excel documentation.
+ /// As SumIfs should behave the same if called with three parameters, we can take that example here again.
+ ///
+ ///
+ ///
+ ///
+ [TestCase(2000, "SUMIFS(C2:C7, \"Fruits\", A2:A7)")]
+ [TestCase(12000, "SUMIFS(C2:C7, \"Vegetables\", A2:A7)")]
+ [TestCase(4300, "SUMIFS(C2:C7, \"*es\", B2:B7)")]
+ [TestCase(400, "SUMIFS(C2:C7, \"\", A2:A7)")]
+ public void SumIfs_ReturnsCorrectValues_ReferenceExample2FromMicrosoft(int expectedOutcome, string formula)
+ {
+ using (var wb = new XLWorkbook())
+ {
+ wb.ReferenceStyle = XLReferenceStyle.A1;
+
+ var ws = wb.AddWorksheet("Sheet1");
+ ws.Cell(2, 1).Value = "Vegetables";
+ ws.Cell(3, 1).Value = "Vegetables";
+ ws.Cell(4, 1).Value = "Fruits";
+ ws.Cell(5, 1).Value = "";
+ ws.Cell(6, 1).Value = "Vegetables";
+ ws.Cell(7, 1).Value = "Fruits";
+
+ ws.Cell(2, 2).Value = "Tomatoes";
+ ws.Cell(3, 2).Value = "Celery";
+ ws.Cell(4, 2).Value = "Oranges";
+ ws.Cell(5, 2).Value = "Butter";
+ ws.Cell(6, 2).Value = "Carrots";
+ ws.Cell(7, 2).Value = "Apples";
+
+ ws.Cell(2, 3).Value = 2300;
+ ws.Cell(3, 3).Value = 5500;
+ ws.Cell(4, 3).Value = 800;
+ ws.Cell(5, 3).Value = 400;
+ ws.Cell(6, 3).Value = 4200;
+ ws.Cell(7, 3).Value = 1200;
+
+ ws.Cell(1, 3).Value = 300000;
+
+ Assert.AreEqual(expectedOutcome, (double)ws.Evaluate(formula));
+ }
+ }
+
+ ///
+ /// refers to example data and formula to SumIfs in the Excel documentation,
+ ///
+ ///
+ [TestCase(20, "=SUMIFS(A2:A9, B2:B9, \"=A*\", C2:C9, \"Tom\")")]
+ [TestCase(30, "=SUMIFS(A2:A9, B2:B9, \"<>Bananas\", C2:C9, \"Tom\")")]
+ public void SumIfs_ReturnsCorrectValues_ReferenceExampleFromMicrosoft(
+ int result,
+ string formula)
+ {
+ using (var wb = new XLWorkbook())
+ {
+ wb.ReferenceStyle = XLReferenceStyle.A1;
+ var ws = wb.AddWorksheet("Sheet1");
+
+ ws.Cell(1, 1).Value = 5;
+ ws.Cell(1, 2).Value = "Apples";
+ ws.Cell(1, 3).Value = "Tom";
+
+ ws.Cell(2, 1).Value = 4;
+ ws.Cell(2, 2).Value = "Apples";
+ ws.Cell(2, 3).Value = "Sarah";
+
+ ws.Cell(3, 1).Value = 15;
+ ws.Cell(3, 2).Value = "Artichokes";
+ ws.Cell(3, 3).Value = "Tom";
+
+ ws.Cell(4, 1).Value = 3;
+ ws.Cell(4, 2).Value = "Artichokes";
+ ws.Cell(4, 3).Value = "Sarah";
+
+ ws.Cell(5, 1).Value = 22;
+ ws.Cell(5, 2).Value = "Bananas";
+ ws.Cell(5, 3).Value = "Tom";
+
+ ws.Cell(6, 1).Value = 12;
+ ws.Cell(6, 2).Value = "Bananas";
+ ws.Cell(6, 3).Value = "Sarah";
+
+ ws.Cell(7, 1).Value = 10;
+ ws.Cell(7, 2).Value = "Carrots";
+ ws.Cell(7, 3).Value = "Tom";
+
+ ws.Cell(8, 1).Value = 33;
+ ws.Cell(8, 2).Value = "Carrots";
+ ws.Cell(8, 3).Value = "Sarah";
+ }
+ }
+
+
[Test]
public void SumProduct()
{
@@ -139,5 +1272,36 @@
Assert.Throws(() => ws.Evaluate("SUMPRODUCT(A1:A10, B1:B5)"));
}
}
+
+ [TestCase(1, 0.850918128)]
+ [TestCase(2, 0.275720565)]
+ [TestCase(3, 0.09982157)]
+ [TestCase(4, 0.03664357)]
+ [TestCase(5, 0.013476506)]
+ [TestCase(6, 0.004957535)]
+ [TestCase(7, 0.001823765)]
+ [TestCase(8, 0.000670925)]
+ [TestCase(9, 0.00024682)]
+ [TestCase(10, 0.000090799859712122200000)]
+ [TestCase(11, 0.0000334034)]
+ public void CSch_CalculatesCorrectValues(double input, double expectedOutput)
+ {
+ Assert.AreEqual(expectedOutput, (double)XLWorkbook.EvaluateExpr($@"CSCH({input})"), 0.000000001);
+ }
+
+ [Test]
+ public void Csch_ReturnsDivisionByZeroErrorOnInput0()
+ {
+ Assert.Throws(() => XLWorkbook.EvaluateExpr("CSCH(0)"));
+ }
+
+ [TestCase(8.9, 8)]
+ [TestCase(-8.9, -9)]
+ public void Int(double input, double expected)
+ {
+ var actual = XLWorkbook.EvaluateExpr(string.Format(@"INT({0})", input.ToString(CultureInfo.InvariantCulture)));
+ Assert.AreEqual(expected, actual);
+
+ }
}
}
diff --git a/ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs b/ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs
index 2550868..a0bb2a2 100644
--- a/ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs
+++ b/ClosedXML_Tests/Excel/CalcEngine/StatisticalTests.cs
@@ -91,6 +91,117 @@
Assert.AreEqual(24, value);
}
+ [TestCase(@"=COUNTIF(Data!E:E, ""J*"")", 13)]
+ [TestCase(@"=COUNTIF(Data!E:E, ""*i*"")", 21)]
+ [TestCase(@"=COUNTIF(Data!E:E, ""*in*"")", 9)]
+ [TestCase(@"=COUNTIF(Data!E:E, ""*i*l"")", 9)]
+ [TestCase(@"=COUNTIF(Data!E:E, ""*i?e*"")", 9)]
+ [TestCase(@"=COUNTIF(Data!E:E, ""*o??s*"")", 10)]
+ [TestCase(@"=COUNTIF(Data!X1:X1000, """")", 1000)]
+ [TestCase(@"=COUNTIF(Data!E1:E44, """")", 1)]
+ public void CountIf_ConditionWithWildcards(string formula, int expectedResult)
+ {
+ var ws = workbook.Worksheets.First();
+
+ int value = ws.Evaluate(formula).CastTo();
+ Assert.AreEqual(expectedResult, value);
+ }
+
+ [TestCase("x", @"=COUNTIF(A1:A1, ""?"")", 1)]
+ [TestCase("x", @"=COUNTIF(A1:A1, ""~?"")", 0)]
+ [TestCase("?", @"=COUNTIF(A1:A1, ""~?"")", 1)]
+ [TestCase("~?", @"=COUNTIF(A1:A1, ""~?"")", 0)]
+ [TestCase("~?", @"=COUNTIF(A1:A1, ""~~~?"")", 1)]
+ [TestCase("?", @"=COUNTIF(A1:A1, ""~~?"")", 0)]
+ [TestCase("~?", @"=COUNTIF(A1:A1, ""~~?"")", 1)]
+ [TestCase("~x", @"=COUNTIF(A1:A1, ""~~?"")", 1)]
+ [TestCase("*", @"=COUNTIF(A1:A1, ""~*"")", 1)]
+ [TestCase("~*", @"=COUNTIF(A1:A1, ""~*"")", 0)]
+ [TestCase("~*", @"=COUNTIF(A1:A1, ""~~~*"")", 1)]
+ [TestCase("*", @"=COUNTIF(A1:A1, ""~~*"")", 0)]
+ [TestCase("~*", @"=COUNTIF(A1:A1, ""~~*"")", 1)]
+ [TestCase("~x", @"=COUNTIF(A1:A1, ""~~*"")", 1)]
+ [TestCase("~xyz", @"=COUNTIF(A1:A1, ""~~*"")", 1)]
+ public void CountIf_MoreWildcards(string cellContent, string formula, int expectedResult)
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+
+ ws.Cell(1, 1).Value = cellContent;
+
+ Assert.AreEqual(expectedResult, (double)ws.Evaluate(formula));
+ }
+ }
+
+ [TestCase("=COUNTIFS(B1:D1, \"=Yes\")", 1)]
+ [TestCase("=COUNTIFS(B1:B4, \"=Yes\", C1:C4, \"=Yes\")", 2)]
+ [TestCase("= COUNTIFS(B4:D4, \"=Yes\", B2:D2, \"=Yes\")", 1)]
+ public void CountIfs_ReferenceExample1FromExcelDocumentations(
+ string formula,
+ int expectedOutcome)
+ {
+ using (var wb = new XLWorkbook())
+ {
+ wb.ReferenceStyle = XLReferenceStyle.A1;
+
+ var ws = wb.AddWorksheet("Sheet1");
+
+ ws.Cell(1, 1).Value = "Davidoski";
+ ws.Cell(1, 2).Value = "Yes";
+ ws.Cell(1, 3).Value = "No";
+ ws.Cell(1, 4).Value = "No";
+
+ ws.Cell(2, 1).Value = "Burke";
+ ws.Cell(2, 2).Value = "Yes";
+ ws.Cell(2, 3).Value = "Yes";
+ ws.Cell(2, 4).Value = "No";
+
+ ws.Cell(3, 1).Value = "Sundaram";
+ ws.Cell(3, 2).Value = "Yes";
+ ws.Cell(3, 3).Value = "Yes";
+ ws.Cell(3, 4).Value = "Yes";
+
+ ws.Cell(4, 1).Value = "Levitan";
+ ws.Cell(4, 2).Value = "No";
+ ws.Cell(4, 3).Value = "Yes";
+ ws.Cell(4, 4).Value = "Yes";
+
+ Assert.AreEqual(expectedOutcome, (int)ws.Evaluate(formula));
+ }
+ }
+
+ [Test]
+ public void CountIfs_SingleCondition()
+ {
+ var ws = workbook.Worksheets.First();
+ int value;
+ value = ws.Evaluate(@"=COUNTIFS(D3:D45,""Central"")").CastTo();
+ Assert.AreEqual(24, value);
+
+ value = ws.Evaluate(@"=COUNTIFS(D:D,""Central"")").CastTo();
+ Assert.AreEqual(24, value);
+
+ value = workbook.Evaluate(@"=COUNTIFS(Data!D:D,""Central"")").CastTo();
+ Assert.AreEqual(24, value);
+ }
+
+ [TestCase(@"=COUNTIFS(Data!E:E, ""J*"")", 13)]
+ [TestCase(@"=COUNTIFS(Data!E:E, ""*i*"")", 21)]
+ [TestCase(@"=COUNTIFS(Data!E:E, ""*in*"")", 9)]
+ [TestCase(@"=COUNTIFS(Data!E:E, ""*i*l"")", 9)]
+ [TestCase(@"=COUNTIFS(Data!E:E, ""*i?e*"")", 9)]
+ [TestCase(@"=COUNTIFS(Data!E:E, ""*o??s*"")", 10)]
+ [TestCase(@"=COUNTIFS(Data!X1:X1000, """")", 1000)]
+ [TestCase(@"=COUNTIFS(Data!E1:E44, """")", 1)]
+ public void CountIfs_SingleConditionWithWildcards(string formula, int expectedResult)
+ {
+ var ws = workbook.Worksheets.First();
+
+ int value = ws.Evaluate(formula).CastTo();
+ Assert.AreEqual(expectedResult, value);
+ }
+
[OneTimeTearDown]
public void Dispose()
{
diff --git a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs
index 161f17a..007b492 100644
--- a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs
+++ b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs
@@ -60,7 +60,7 @@
var doubleList = new List { 1.0 / 0.0 };
cell.Value = doubleList;
- Assert.AreNotEqual(XLCellValues.Number, cell.DataType);
+ Assert.AreNotEqual(XLDataType.Number, cell.DataType);
}
[Test]
@@ -71,7 +71,7 @@
var doubleList = new List { 0.0 / 0.0 };
cell.Value = doubleList;
- Assert.AreNotEqual(XLCellValues.Number, cell.DataType);
+ Assert.AreNotEqual(XLDataType.Number, cell.DataType);
}
[Test]
@@ -169,7 +169,7 @@
IXLCell cell = ws.Cell("A1");
cell.Value = "NaN";
- Assert.AreNotEqual(XLCellValues.Number, cell.DataType);
+ Assert.AreNotEqual(XLDataType.Number, cell.DataType);
}
[Test]
@@ -179,7 +179,7 @@
IXLCell cell = ws.Cell("A1");
cell.Value = "Nan";
- Assert.AreNotEqual(XLCellValues.Number, cell.DataType);
+ Assert.AreNotEqual(XLDataType.Number, cell.DataType);
}
[Test]
@@ -241,7 +241,7 @@
IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1");
DateTime outValue;
var date = 5545454;
- ws.FirstCell().SetValue(date).DataType = XLCellValues.DateTime;
+ ws.FirstCell().SetValue(date).DataType = XLDataType.DateTime;
bool success = ws.FirstCell().TryGetValue(out outValue);
Assert.IsFalse(success);
}
@@ -414,7 +414,7 @@
cell.Value = "Test";
Assert.AreEqual("Test", cell.Value);
- Assert.AreEqual(XLCellValues.Text, cell.DataType);
+ Assert.AreEqual(XLDataType.Text, cell.DataType);
string s = null;
cell.SetValue(s);
diff --git a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs
index 5b1fc42..87d5960 100644
--- a/ClosedXML_Tests/Excel/Loading/LoadingTests.cs
+++ b/ClosedXML_Tests/Excel/Loading/LoadingTests.cs
@@ -32,7 +32,8 @@
@"Misc\AllShapes.xlsx",
@"Misc\TableHeadersWithLineBreaks.xlsx",
@"Misc\TableWithNameNull.xlsx",
- @"Misc\DuplicateImageNames.xlsx"
+ @"Misc\DuplicateImageNames.xlsx",
+ @"Misc\InvalidPrintArea.xlsx"
};
foreach (var file in files)
@@ -125,7 +126,7 @@
var ws = wb.Worksheets.First();
foreach (var cell in ws.CellsUsed())
{
- Assert.AreEqual(XLCellValues.DateTime, cell.DataType);
+ Assert.AreEqual(XLDataType.DateTime, cell.DataType);
}
}
}
diff --git a/ClosedXML_Tests/Excel/Misc/FormulaTests.cs b/ClosedXML_Tests/Excel/Misc/FormulaTests.cs
index 3ff4c55..f514295 100644
--- a/ClosedXML_Tests/Excel/Misc/FormulaTests.cs
+++ b/ClosedXML_Tests/Excel/Misc/FormulaTests.cs
@@ -112,7 +112,7 @@
{
var ws = wb.AddWorksheet("Sheet1");
ws.Cell("A1").Value = new DateTime(2016, 1, 1);
- ws.Cell("A1").DataType = XLCellValues.DateTime;
+ ws.Cell("A1").DataType = XLDataType.DateTime;
ws.Cell("A2").FormulaA1 = @"=IF(A1 = """", ""A"", ""B"")";
var actual = ws.Cell("A2").Value;
diff --git a/ClosedXML_Tests/Excel/PageSetup/HeaderFooterTests.cs b/ClosedXML_Tests/Excel/PageSetup/HeaderFooterTests.cs
index 18fe221..002df23 100644
--- a/ClosedXML_Tests/Excel/PageSetup/HeaderFooterTests.cs
+++ b/ClosedXML_Tests/Excel/PageSetup/HeaderFooterTests.cs
@@ -33,5 +33,19 @@
var newHeader = ws.PageSetup.Header.Center.GetText(XLHFOccurrence.EvenPages);
Assert.AreEqual("Changed header", newHeader);
}
+
+ [TestCase("")]
+ [TestCase("&L&C&\"Arial\"&9 19-10-2017 \n&9&\"Arial\" &P &N &R")] // https://github.com/ClosedXML/ClosedXML/issues/563
+ public void CanSetHeaderFooter(string s)
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws = wb.AddWorksheet("Sheet1");
+ {
+ var header = ws.PageSetup.Header as XLHeaderFooter;
+ header.SetInnerText(XLHFOccurrence.AllPages, s);
+ }
+ }
+ }
}
}
diff --git a/ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs b/ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs
index 0bef674..ab15754 100644
--- a/ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs
+++ b/ClosedXML_Tests/Excel/RichText/XLRichStringTests.cs
@@ -18,7 +18,7 @@
IXLWorksheet ws = new XLWorkbook().Worksheets.Add("Sheet1");
IXLCell cell = ws.Cell(1, 1);
cell.RichText.AddText("12");
- cell.DataType = XLCellValues.Number;
+ cell.DataType = XLDataType.Number;
Assert.AreEqual(12.0, cell.GetDouble());
@@ -30,7 +30,7 @@
Assert.AreEqual("1234", cell.GetString());
- Assert.AreEqual(XLCellValues.Number, cell.DataType);
+ Assert.AreEqual(XLDataType.Number, cell.DataType);
Assert.AreEqual(1234.0, cell.GetDouble());
}
@@ -147,11 +147,11 @@
Assert.AreEqual(true, cell.HasRichText);
- cell.DataType = XLCellValues.Text;
+ cell.DataType = XLDataType.Text;
Assert.AreEqual(true, cell.HasRichText);
- cell.DataType = XLCellValues.Number;
+ cell.DataType = XLDataType.Number;
Assert.AreEqual(false, cell.HasRichText);
diff --git a/ClosedXML_Tests/Excel/Styles/XLFillTests.cs b/ClosedXML_Tests/Excel/Styles/XLFillTests.cs
index 6177890..72abc22 100644
--- a/ClosedXML_Tests/Excel/Styles/XLFillTests.cs
+++ b/ClosedXML_Tests/Excel/Styles/XLFillTests.cs
@@ -26,16 +26,16 @@
[Test]
public void BackgroundPatternEqualCheck()
{
- var fill1 = new XLFill {PatternBackgroundColor = XLColor.Blue};
- var fill2 = new XLFill {PatternBackgroundColor = XLColor.Blue};
+ var fill1 = new XLFill {BackgroundColor = XLColor.Blue};
+ var fill2 = new XLFill {BackgroundColor = 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};
+ var fill1 = new XLFill {BackgroundColor = XLColor.Blue};
+ var fill2 = new XLFill {BackgroundColor = XLColor.Red};
Assert.IsFalse(fill1.Equals(fill2));
}
@@ -48,8 +48,8 @@
var cf = worksheet.Cell(2, 2).AddConditionalFormat();
var style = cf.WhenNotBlank();
style
- .Border.SetOutsideBorder(XLBorderStyleValues.Thick)
- .Border.SetOutsideBorderColor(XLColor.Blue);
+ .Border.SetOutsideBorder(XLBorderStyleValues.Thick)
+ .Border.SetOutsideBorderColor(XLColor.Blue);
Assert.AreEqual(style.Border.BottomBorder, XLBorderStyleValues.Thick);
Assert.AreEqual(style.Border.TopBorder, XLBorderStyleValues.Thick);
@@ -62,4 +62,4 @@
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 25eeb50..9d30ab8 100644
--- a/ClosedXML_Tests/Excel/Tables/TablesTests.cs
+++ b/ClosedXML_Tests/Excel/Tables/TablesTests.cs
@@ -566,6 +566,73 @@
}
[Test]
+ public void TableAsDynamicEnumerable()
+ {
+ var l = new List()
+ {
+ new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 },
+ new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 }
+ };
+
+ using (var wb = new XLWorkbook())
+ {
+ IXLWorksheet ws = wb.AddWorksheet("Sheet1");
+ var table = ws.FirstCell().InsertTable(l);
+
+ foreach (var d in table.AsDynamicEnumerable())
+ {
+ Assert.DoesNotThrow(() =>
+ {
+ object value;
+ value = d.FirstColumn;
+ value = d.SecondColumn;
+ value = d.UnOrderedColumn;
+ value = d.SomeFieldNotProperty;
+ });
+ }
+ }
+ }
+
+ [Test]
+ public void TableAsDotNetDataTable()
+ {
+ var l = new List()
+ {
+ new TestObjectWithAttributes() { Column1 = "a", Column2 = "b", MyField = 4, UnOrderedColumn = 999 },
+ new TestObjectWithAttributes() { Column1 = "c", Column2 = "d", MyField = 5, UnOrderedColumn = 777 }
+ };
+
+ using (var wb = new XLWorkbook())
+ {
+ IXLWorksheet ws = wb.AddWorksheet("Sheet1");
+ var table = ws.FirstCell().InsertTable(l).AsNativeDataTable();
+
+ Assert.AreEqual(4, table.Columns.Count);
+ Assert.AreEqual("FirstColumn", table.Columns[0].ColumnName);
+ Assert.AreEqual("SecondColumn", table.Columns[1].ColumnName);
+ Assert.AreEqual("SomeFieldNotProperty", table.Columns[2].ColumnName);
+ Assert.AreEqual("UnOrderedColumn", table.Columns[3].ColumnName);
+
+ Assert.AreEqual(typeof(String), table.Columns[0].DataType);
+ Assert.AreEqual(typeof(String), table.Columns[1].DataType);
+ Assert.AreEqual(typeof(Double), table.Columns[2].DataType);
+ Assert.AreEqual(typeof(Double), table.Columns[3].DataType);
+
+ var dr = table.Rows[0];
+ Assert.AreEqual("b", dr["FirstColumn"]);
+ Assert.AreEqual("a", dr["SecondColumn"]);
+ Assert.AreEqual(4, dr["SomeFieldNotProperty"]);
+ Assert.AreEqual(999, dr["UnOrderedColumn"]);
+
+ dr = table.Rows[1];
+ Assert.AreEqual("d", dr["FirstColumn"]);
+ Assert.AreEqual("c", dr["SecondColumn"]);
+ Assert.AreEqual(5, dr["SomeFieldNotProperty"]);
+ Assert.AreEqual(777, dr["UnOrderedColumn"]);
+ }
+ }
+
+ [Test]
public void TestTableCellTypes()
{
using (var wb = new XLWorkbook())
diff --git a/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs b/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs
index 76f612e..07a930c 100644
--- a/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs
+++ b/ClosedXML_Tests/Excel/Worksheets/XLWorksheetTests.cs
@@ -161,6 +161,27 @@
}
[Test]
+ public void TryGetWorksheet()
+ {
+ using (var wb = new XLWorkbook())
+ {
+ var ws1 = wb.AddWorksheet("Sheet1");
+ var ws2 = wb.AddWorksheet("Sheet2");
+
+ IXLWorksheet ws;
+ Assert.IsTrue(wb.Worksheets.TryGetWorksheet("Sheet1", out ws));
+ Assert.IsTrue(wb.Worksheets.TryGetWorksheet("sheet1", out ws));
+ Assert.IsTrue(wb.Worksheets.TryGetWorksheet("sHEeT1", out ws));
+ Assert.IsFalse(wb.Worksheets.TryGetWorksheet("Sheeeet2", out ws));
+
+ Assert.IsTrue(wb.TryGetWorksheet("Sheet1", out ws));
+ Assert.IsTrue(wb.TryGetWorksheet("sheet1", out ws));
+ Assert.IsTrue(wb.TryGetWorksheet("sHEeT1", out ws));
+ Assert.IsFalse(wb.TryGetWorksheet("Sheeeet2", out ws));
+ }
+ }
+
+ [Test]
public void HideWorksheet()
{
using (var ms = new MemoryStream())
@@ -193,5 +214,25 @@
}
}
}
+
+ [Test]
+ public void CanCopySheetsWithAllAnchorTypes()
+ {
+ using (var stream = TestHelper.GetStreamFromResource(TestHelper.GetResourcePath(@"Examples\ImageHandling\ImageAnchors.xlsx")))
+ using (var wb = new XLWorkbook(stream))
+ {
+ var ws = wb.Worksheets.First();
+ ws.CopyTo("Copy1");
+
+ var ws2 = wb.Worksheets.Skip(1).First();
+ ws2.CopyTo("Copy2");
+
+ var ws3 = wb.Worksheets.Skip(2).First();
+ ws3.CopyTo("Copy3");
+
+ var ws4 = wb.Worksheets.Skip(3).First();
+ ws3.CopyTo("Copy4");
+ }
+ }
}
}
diff --git a/ClosedXML_Tests/Resource/Examples/AutoFilter/CustomAutoFilter.xlsx b/ClosedXML_Tests/Resource/Examples/AutoFilter/CustomAutoFilter.xlsx
index 2ee0c8d..156af42 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 0b2fb27..ca26674 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 7221dae..1e430a1 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 4e069ba..e396345 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 2e35af2..70c8e96 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 8210ecf..be26aca 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 d729b73..ea65770 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 e2ac29f..83b5a8d 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 5c9ae0a..775345e 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 8e28b85..80e81a7 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 a9216c5..797dc0b 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 965c332..e58bfc1 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 4721b41..a0c3791 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 4db382d..8e1cc60 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/CFDataBarNegative.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBarNegative.xlsx
index fa46948..8ad081e 100644
--- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBarNegative.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFDataBarNegative.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEndsWith.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFEndsWith.xlsx
index e2d4308..bfb06cd 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 a75c503..bbfa6d4 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 07e8628..4b6a481 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 fb91ef7..0ef2377 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 e57b38d..84f5931 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 e952a7f..0677026 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 0d31d2a..d396c20 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 e233171..f2a8f5b 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 1b3b379..22026b6 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 7d1bd15..4eabc7c 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 531411d..72e5631 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 9b07849..c808164 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 e19f30e..cc432eb 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/ConditionalFormatting/CFStopIfTrue.xlsx b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx
index 9894731..de67d1e 100644
--- a/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/ConditionalFormatting/CFStopIfTrue.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Delete/DeleteFewWorksheets.xlsx b/ClosedXML_Tests/Resource/Examples/Delete/DeleteFewWorksheets.xlsx
index 0bfcae5..df718c9 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 3a4822a..31ef954 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 d2a90ba..40e2d5d 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 3ec78e0..ecd11ca 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 30a397a..a27f51c 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 c5abda2..cd861ef 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 3dcec19..7c3a2ec 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 ec9111e..0d98696 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 c71500f..5b1a0db 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 e18cf50..9765c38 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 7109c2e..fc3c33f 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 3f4195a..6c5eccc 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 ec4c484..d7b945b 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 d791985..d628b28 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 961f52c..f313701 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 28c4b9b..03b9b20 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 d7b9afd..7b3e5a2 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 f451273..e86beba 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 d2e119b..c5979d8 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 c49d20a..513d951 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
index f1dde09..131fba0 100644
--- a/ClosedXML_Tests/Resource/Examples/Misc/FormulasWithEvaluation.xlsx
+++ 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 65e4082..ac2714c 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 084e291..2587ee6 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 1f99477..792f768 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 d724e36..a4ab6f6 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 d9d1a57..f5db9c4 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/LambdaExpressions.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/LambdaExpressions.xlsx
index 939001d..368f016 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 e5120d4..3860d72 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 2cbaac9..f0c9c03 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 4590850..5f01c13 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 235f17a..1017afd 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 abeeb15..65936c4 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 9102f0a..4d275a2 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 a1aa8d0..1a15711 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 b02ab54..d988cd1 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 3b08f53..5c55455 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 7e28ec6..d9fba2c 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
index 2e7c839..12aad44 100644
--- a/ClosedXML_Tests/Resource/Examples/Misc/WorkbookProtection.xlsx
+++ 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 5464356..f0d7374 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 062d427..2f6805b 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 13debb0..c55e060 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 e03a6b5..30bfbcc 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 fd83a80..f91eecc 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 03fb5e2..6096e00 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 247daba..d6f65c7 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 95291f8..014ea30 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 5e18500..95daf5a 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 064601a..faa24e2 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 6148e44..741e75f 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 8e79c44..31c5290 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 1fbbe5a..ed8b923 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 dabfb5f..0b17544 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 9588f7d..bfafa65 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 e3717c5..b0621bc 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 2b450d6..a4a86da 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 adecfee..b4e6aeb 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 453328f..1c6a1ed 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 bd2c3d6..e426613 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 08344e9..36b889d 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 4d136e2..c7f029d 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 037fc86..0303805 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/WalkingRanges.xlsx b/ClosedXML_Tests/Resource/Examples/Ranges/WalkingRanges.xlsx
index e12dfc5..ee46beb 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 2f0be53..f7a57c8 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 5c98025..8855354 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 69a0c15..457bb99 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 86e20d3..9e9a109 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 4422537..ea00b0c 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 abe42a8..b2670c0 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 2af3891..4d52bd6 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 389f0f6..9e19202 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 a9c9728..af7d4b4 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 5a5ee64..23184a3 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 472f826..f10a5f6 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 407d189..2201621 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 f7421af..2ada7d9 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/UsingPhonetics.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/UsingPhonetics.xlsx
index 86fe3e6..b334a6d 100644
--- a/ClosedXML_Tests/Resource/Examples/Styles/UsingPhonetics.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Styles/UsingPhonetics.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Styles/UsingRichText.xlsx b/ClosedXML_Tests/Resource/Examples/Styles/UsingRichText.xlsx
index 90ef8fc..b83ccde 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/Examples/Tables/InsertingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Tables/InsertingTables.xlsx
index 89de679..05cfa2c 100644
--- a/ClosedXML_Tests/Resource/Examples/Tables/InsertingTables.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Tables/InsertingTables.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Tables/ResizingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Tables/ResizingTables.xlsx
index dad3954..5d223ac 100644
--- a/ClosedXML_Tests/Resource/Examples/Tables/ResizingTables.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Tables/ResizingTables.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Examples/Tables/UsingTables.xlsx b/ClosedXML_Tests/Resource/Examples/Tables/UsingTables.xlsx
index 288d1fe..39402fe 100644
--- a/ClosedXML_Tests/Resource/Examples/Tables/UsingTables.xlsx
+++ b/ClosedXML_Tests/Resource/Examples/Tables/UsingTables.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/Resource/Misc/InvalidPrintArea.xlsx b/ClosedXML_Tests/Resource/Misc/InvalidPrintArea.xlsx
new file mode 100644
index 0000000..361a7de
--- /dev/null
+++ b/ClosedXML_Tests/Resource/Misc/InvalidPrintArea.xlsx
Binary files differ
diff --git a/ClosedXML_Tests/TestHelper.cs b/ClosedXML_Tests/TestHelper.cs
index bf85115..646d9d0 100644
--- a/ClosedXML_Tests/TestHelper.cs
+++ b/ClosedXML_Tests/TestHelper.cs
@@ -75,36 +75,23 @@
using (var wb = new XLWorkbook(filePath1))
wb.SaveAs(filePath2, true, evaluateFormulae);
- bool success = true;
-#pragma warning disable 162
- try
+ if (CompareWithResources)
+
{
- //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 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);
+ string message;
+ var 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);
- }
+ Assert.IsTrue(success, formattedMessage);
}
}
- finally
- {
- //if (success && File.Exists(filePath)) File.Delete(filePath);
- }
-#pragma warning restore 162
}
public static string GetResourcePath(string filePartName)