| using System.Collections.Generic; |
| 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> arguments) { |
| foreach (var item in arguments) { |
| 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; |
| } |
| } |