SUBTOTAL options for ignoring hidden cells

This commit is contained in:
MarkBaker 2017-03-19 14:17:20 +00:00
parent 7b90bb9394
commit 08ced34dfd
2 changed files with 38 additions and 4 deletions

View File

@ -1767,6 +1767,7 @@ class Calculation
'category' => Category::CATEGORY_MATH_AND_TRIG, 'category' => Category::CATEGORY_MATH_AND_TRIG,
'functionCall' => [MathTrig::class, 'SUBTOTAL'], 'functionCall' => [MathTrig::class, 'SUBTOTAL'],
'argumentCount' => '2+', 'argumentCount' => '2+',
'passCellReference' => true,
], ],
'SUM' => [ 'SUM' => [
'category' => Category::CATEGORY_MATH_AND_TRIG, 'category' => Category::CATEGORY_MATH_AND_TRIG,
@ -3721,6 +3722,7 @@ class Calculation
} }
// Reverse the order of the arguments // Reverse the order of the arguments
krsort($args); krsort($args);
if (($passByReference) && ($argCount == 0)) { if (($passByReference) && ($argCount == 0)) {
$args[] = $cellID; $args[] = $cellID;
$argArrayVals[] = $this->showValue($cellID); $argArrayVals[] = $this->showValue($cellID);
@ -3744,7 +3746,6 @@ class Calculation
} }
unset($arg); unset($arg);
} }
$result = call_user_func_array($functionCall, $args); $result = call_user_func_array($functionCall, $args);
if ($functionName != 'MKMATRIX') { if ($functionName != 'MKMATRIX') {

View File

@ -1123,6 +1123,16 @@ class MathTrig
return Functions::VALUE(); 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. * SUBTOTAL.
* *
@ -1136,33 +1146,56 @@ class MathTrig
*/ */
public static function SUBTOTAL(...$args) 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 // Calculate
$subtotal = array_shift($aArgs);
if ((is_numeric($subtotal)) && (!is_string($subtotal))) { if ((is_numeric($subtotal)) && (!is_string($subtotal))) {
switch ($subtotal) { switch ($subtotal) {
case 101:
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
case 1: case 1:
return Statistical::AVERAGE($aArgs); return Statistical::AVERAGE($aArgs);
case 102:
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
case 2: case 2:
return Statistical::COUNT($aArgs); return Statistical::COUNT($aArgs);
case 103:
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
case 3: case 3:
return Statistical::COUNTA($aArgs); return Statistical::COUNTA($aArgs);
case 104:
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
case 4: case 4:
return Statistical::MAX($aArgs); return Statistical::MAX($aArgs);
case 105:
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
case 5: case 5:
return Statistical::MIN($aArgs); return Statistical::MIN($aArgs);
case 106:
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
case 6: case 6:
return self::PRODUCT($aArgs); return self::PRODUCT($aArgs);
case 107:
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
case 7: case 7:
return Statistical::STDEV($aArgs); return Statistical::STDEV($aArgs);
case 108:
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
case 8: case 8:
return Statistical::STDEVP($aArgs); return Statistical::STDEVP($aArgs);
case 109:
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
case 9: case 9:
return self::SUM($aArgs); return self::SUM($aArgs);
case 110:
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
case 10: case 10:
return Statistical::VARFunc($aArgs); return Statistical::VARFunc($aArgs);
case 111:
$aArgs = self::filterHiddenArgs($cellReference, $aArgs);
case 11: case 11:
return Statistical::VARP($aArgs); return Statistical::VARP($aArgs);
} }