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