SUBTOTAL options for ignoring hidden cells
This commit is contained in:
parent
7b90bb9394
commit
08ced34dfd
|
@ -1767,6 +1767,7 @@ class Calculation
|
|||
'category' => Category::CATEGORY_MATH_AND_TRIG,
|
||||
'functionCall' => [MathTrig::class, 'SUBTOTAL'],
|
||||
'argumentCount' => '2+',
|
||||
'passCellReference' => true,
|
||||
],
|
||||
'SUM' => [
|
||||
'category' => Category::CATEGORY_MATH_AND_TRIG,
|
||||
|
@ -3721,6 +3722,7 @@ class Calculation
|
|||
}
|
||||
// Reverse the order of the arguments
|
||||
krsort($args);
|
||||
|
||||
if (($passByReference) && ($argCount == 0)) {
|
||||
$args[] = $cellID;
|
||||
$argArrayVals[] = $this->showValue($cellID);
|
||||
|
@ -3744,7 +3746,6 @@ class Calculation
|
|||
}
|
||||
unset($arg);
|
||||
}
|
||||
|
||||
$result = call_user_func_array($functionCall, $args);
|
||||
|
||||
if ($functionName != 'MKMATRIX') {
|
||||
|
|
|
@ -1123,6 +1123,16 @@ class MathTrig
|
|||
return Functions::VALUE();
|
||||
}
|
||||
|
||||
protected static function filterHiddenArgs($cellReference, $args) {
|
||||
return array_filter($args,
|
||||
function ($index) use ($cellReference) {
|
||||
list(, $row, $column) = explode('.', $index);
|
||||
return $cellReference->getWorksheet()->getRowDimension($row)->getVisible() &&
|
||||
$cellReference->getWorksheet()->getColumnDimension($column)->getVisible();
|
||||
},
|
||||
ARRAY_FILTER_USE_KEY
|
||||
);
|
||||
}
|
||||
/**
|
||||
* SUBTOTAL.
|
||||
*
|
||||
|
@ -1136,33 +1146,56 @@ class MathTrig
|
|||
*/
|
||||
public static function SUBTOTAL(...$args)
|
||||
{
|
||||
$aArgs = Functions::flattenArray($args);
|
||||
$aArgs = Functions::flattenArrayIndexed($args);
|
||||
$cellReference = array_pop($aArgs);
|
||||
$subtotal = array_shift($aArgs);
|
||||
// var_dump($cellReference->getValue(), $aArgs); die();
|
||||
|
||||
// Calculate
|
||||
$subtotal = array_shift($aArgs);
|
||||
|
||||
if ((is_numeric($subtotal)) && (!is_string($subtotal))) {
|
||||
switch ($subtotal) {
|
||||
case 101:
|
||||
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
|
||||
case 1:
|
||||
return Statistical::AVERAGE($aArgs);
|
||||
case 102:
|
||||
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
|
||||
case 2:
|
||||
return Statistical::COUNT($aArgs);
|
||||
case 103:
|
||||
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
|
||||
case 3:
|
||||
return Statistical::COUNTA($aArgs);
|
||||
case 104:
|
||||
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
|
||||
case 4:
|
||||
return Statistical::MAX($aArgs);
|
||||
case 105:
|
||||
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
|
||||
case 5:
|
||||
return Statistical::MIN($aArgs);
|
||||
case 106:
|
||||
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
|
||||
case 6:
|
||||
return self::PRODUCT($aArgs);
|
||||
case 107:
|
||||
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
|
||||
case 7:
|
||||
return Statistical::STDEV($aArgs);
|
||||
case 108:
|
||||
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
|
||||
case 8:
|
||||
return Statistical::STDEVP($aArgs);
|
||||
case 109:
|
||||
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
|
||||
case 9:
|
||||
return self::SUM($aArgs);
|
||||
case 110:
|
||||
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
|
||||
case 10:
|
||||
return Statistical::VARFunc($aArgs);
|
||||
case 111:
|
||||
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
|
||||
case 11:
|
||||
return Statistical::VARP($aArgs);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue