AutorÃa | Ultima modificación | Ver Log |
<?phpnamespace PhpOffice\PhpSpreadsheet\Calculation\MathTrig;use PhpOffice\PhpSpreadsheet\Calculation\Functions;use PhpOffice\PhpSpreadsheet\Calculation\Information\ErrorValue;use PhpOffice\PhpSpreadsheet\Calculation\Information\ExcelError;class Sum{/*** SUM, ignoring non-numeric non-error strings. This is eventually used by SUMIF.** SUM computes the sum of all the values and cells referenced in the argument list.** Excel Function:* SUM(value1[,value2[, ...]])** @param mixed ...$args Data values*/public static function sumIgnoringStrings(mixed ...$args): float|int|string{$returnValue = 0;// Loop through the argumentsforeach (Functions::flattenArray($args) as $arg) {// Is it a numeric value?if (is_numeric($arg)) {$returnValue += $arg;} elseif (ErrorValue::isError($arg)) {return $arg;}}return $returnValue;}/*** SUM, returning error for non-numeric strings. This is used by Excel SUM function.** SUM computes the sum of all the values and cells referenced in the argument list.** Excel Function:* SUM(value1[,value2[, ...]])** @param mixed ...$args Data values*/public static function sumErroringStrings(mixed ...$args): float|int|string|array{$returnValue = 0;// Loop through the arguments$aArgs = Functions::flattenArrayIndexed($args);foreach ($aArgs as $k => $arg) {// Is it a numeric value?if (is_numeric($arg)) {$returnValue += $arg;} elseif (is_bool($arg)) {$returnValue += (int) $arg;} elseif (ErrorValue::isError($arg)) {return $arg;} elseif ($arg !== null && !Functions::isCellValue($k)) {// ignore non-numerics from cell, but fail as literals (except null)return ExcelError::VALUE();}}return $returnValue;}/*** SUMPRODUCT.** Excel Function:* SUMPRODUCT(value1[,value2[, ...]])** @param mixed ...$args Data values** @return float|int|string The result, or a string containing an error*/public static function product(mixed ...$args): string|int|float{$arrayList = $args;$wrkArray = Functions::flattenArray(array_shift($arrayList));$wrkCellCount = count($wrkArray);for ($i = 0; $i < $wrkCellCount; ++$i) {if ((!is_numeric($wrkArray[$i])) || (is_string($wrkArray[$i]))) {$wrkArray[$i] = 0;}}foreach ($arrayList as $matrixData) {$array2 = Functions::flattenArray($matrixData);$count = count($array2);if ($wrkCellCount != $count) {return ExcelError::VALUE();}foreach ($array2 as $i => $val) {if ((!is_numeric($val)) || (is_string($val))) {$val = 0;}$wrkArray[$i] *= $val;}}return array_sum($wrkArray);}}