diff --git a/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs b/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs
index e1b6e51..00d8a32 100644
--- a/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs
+++ b/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs
@@ -51,7 +51,9 @@
return cs.Equals(value);
// if criteria is an expression (e.g. ">20"), use calc engine
- if (cs[0] == '=' || cs[0] == '<' || cs[0] == '>')
+ if ((cs[0] == '=' && cs.IndexOfAny(new[] { '*', '?' }) < 0)
+ || cs[0] == '<'
+ || cs[0] == '>')
{
// build expression
var expression = string.Format("{0}{1}", value, cs);
@@ -79,6 +81,8 @@
// if criteria is a regular expression, use regex
if (cs.IndexOfAny(new[] { '*', '?' }) > -1)
{
+ if (cs[0] == '=') cs = cs.Substring(1);
+
var pattern = Regex.Replace(
cs,
"(" + String.Join(
@@ -99,5 +103,27 @@
Debug.Assert(false, "failed to evaluate criteria in SumIf");
return false;
}
+
+ internal static bool ValueIsBlank(object value)
+ {
+ return
+ value == null ||
+ value is string && ((string)value).Length == 0;
+ }
+
+ ///
+ /// Get total count of cells in the specified range without initalizing them all
+ /// (which might cause serious performance issues on column-wide calculations).
+ ///
+ /// Expression referring to the cell range.
+ /// Total number of cells in the range.
+ internal static long GetTotalCellsCount(XObjectExpression rangeExpression)
+ {
+ var range = ((rangeExpression)?.Value as CellRangeReference)?.Range;
+ if (range == null)
+ return 0;
+ return (long)(range.LastColumn().ColumnNumber() - range.FirstColumn().ColumnNumber() + 1) *
+ (long)(range.LastRow().RowNumber() - range.FirstRow().RowNumber() + 1);
+ }
}
}
diff --git a/ClosedXML/Excel/CalcEngine/Expression.cs b/ClosedXML/Excel/CalcEngine/Expression.cs
index ff1288c..a65b7ad 100644
--- a/ClosedXML/Excel/CalcEngine/Expression.cs
+++ b/ClosedXML/Excel/CalcEngine/Expression.cs
@@ -486,6 +486,9 @@
public IEnumerator GetEnumerator()
{
+ if (_value is string)
+ return new [] {(string) _value}.GetEnumerator();
+
return (_value as IEnumerable).GetEnumerator();
}
diff --git a/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs
index dfd9d25..4eb642e 100644
--- a/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs
+++ b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs
@@ -340,20 +340,22 @@
{
rangeValues.Add(value);
}
- var sumRangeValues = new List();
- foreach (var cell in ((CellRangeReference)sumRange.Value).Range.Cells())
+ var sumRangeValues = new List