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,
 | 
					            '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') {
 | 
				
			||||||
 | 
				
			|||||||
@ -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);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user