blob: 2a4a077b22a2962447c0ea207da7a988aafa4744 [file] [log] [blame]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OfficeOpenXml.FormulaParsing.ExpressionGraph;
using OfficeOpenXml.Utils;
namespace OfficeOpenXml.FormulaParsing.Excel.Functions.Math
{
public class Sumsq : HiddenValuesHandlingFunction
{
public override CompileResult Execute(IEnumerable<FunctionArgument> arguments, ParsingContext context)
{
var retVal = 0d;
if (arguments != null)
{
foreach (var arg in arguments)
{
retVal += Calculate(arg, context);
}
}
return CreateResult(retVal, DataType.Decimal);
}
private double Calculate(FunctionArgument arg, ParsingContext context, bool isInArray = false)
{
var retVal = 0d;
if (ShouldIgnore(arg))
{
return retVal;
}
if (arg.Value is IEnumerable<FunctionArgument>)
{
foreach (var item in (IEnumerable<FunctionArgument>)arg.Value)
{
retVal += Calculate(item, context, true);
}
}
else
{
var cs = arg.Value as ExcelDataProvider.IRangeInfo;
if (cs != null)
{
foreach (var c in cs)
{
if (ShouldIgnore(c, context) == false)
{
CheckForAndHandleExcelError(c);
retVal += System.Math.Pow(c.ValueDouble, 2);
}
}
}
else
{
CheckForAndHandleExcelError(arg);
if (IsNumericString(arg.Value) && !isInArray)
{
var value = ConvertUtil.GetValueDouble(arg.Value);
return System.Math.Pow(value, 2);
}
var ignoreBool = isInArray;
retVal += System.Math.Pow(ConvertUtil.GetValueDouble(arg.Value, ignoreBool), 2);
}
}
return retVal;
}
}
}