blob: cb18398b67ca073bf1e30e836754a030d696aede [file] [log] [blame]
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;
}
}