diff --git a/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs b/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs index 83d872a..e1b6e51 100644 --- a/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs +++ b/ClosedXML/Excel/CalcEngine/CalcEngineHelpers.cs @@ -44,6 +44,9 @@ var cs = criteria as string; if (cs != null) { + if (value is string && (value as string).Trim() == "") + return cs == ""; + if (cs == "") return cs.Equals(value); @@ -54,7 +57,7 @@ var expression = string.Format("{0}{1}", value, cs); // add quotes if necessary - var pattern = @"(\w+)(\W+)(\w+)"; + var pattern = @"([\w\s]+)(\W+)(\w+)"; var m = Regex.Match(expression, pattern); if (m.Groups.Count == 4) { diff --git a/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs index a7f0cf7..dfd9d25 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs @@ -329,7 +329,9 @@ { // get parameters 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 sumRange = p.Count < 3 ? + p[0] as XObjectExpression : + p[2] as XObjectExpression; // range of values to sum up var criteria = p[1].Evaluate(); // the criteria to evaluate // build list of values in range and sumRange @@ -338,10 +340,10 @@ { rangeValues.Add(value); } - var sumRangeValues = new List(); - foreach (var value in sumRange) + var sumRangeValues = new List(); + foreach (var cell in ((CellRangeReference)sumRange.Value).Range.Cells()) { - sumRangeValues.Add(value); + sumRangeValues.Add(cell); } // compute total @@ -351,7 +353,7 @@ { if (CalcEngineHelpers.ValueSatisfiesCriteria(rangeValues[i], criteria, ce)) { - tally.AddValue(sumRangeValues[i]); + tally.AddValue(sumRangeValues[i].Value); } } diff --git a/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs b/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs index 5176d9c..2bdb25a 100644 --- a/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs +++ b/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs @@ -1128,6 +1128,54 @@ } } + [Test] + public void SumIf_ReturnsCorrectValues_WhenCalledOnFullColumn() + { + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Data"); + var data = new object[] + { + new { Id = "A", Value = 2}, + new { Id = "B", Value = 3}, + new { Id = "C", Value = 2}, + new { Id = "A", Value = 1}, + new { Id = "B", Value = 4} + }; + ws.Cell("A1").InsertTable(data); + var formula = "=SUMIF(A:A,\"=A\",B:B)"; + var value = ws.Evaluate(formula); + Assert.AreEqual(3, value); + } + } + + [Test] + public void SumIf_ReturnsCorrectValues_WhenFormulaBelongToSameRange() + { + + using (var wb = new XLWorkbook()) + { + var ws = wb.AddWorksheet("Data"); + var data = new object[] + { + new { Id = "A", Value = 2}, + new { Id = "B", Value = 3}, + new { Id = "C", Value = 2}, + new { Id = "A", Value = 1}, + new { Id = "B", Value = 4}, + + }; + ws.Cell("A1").InsertTable(data); + ws.Cell("A7").SetValue("Sum A"); + // SUMIF formula + var formula = "=SUMIF(A:A,\"=A\",B:B)"; + ws.Cell("B7").SetFormulaA1(formula); + var value = ws.Cell("B7").Value; + Assert.AreEqual(3, value); + } + } + + /// /// 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.