|  | 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; | 
|  | } | 
|  | } | 
|  | } |