You are here

public function PHPExcel_Worksheet_AutoFilter::showHideRows in Loft Data Grids 7.2

Same name and namespace in other branches
  1. 6.2 vendor/phpoffice/phpexcel/Classes/PHPExcel/Worksheet/AutoFilter.php \PHPExcel_Worksheet_AutoFilter::showHideRows()

* Apply the AutoFilter rules to the AutoFilter Range * *

Return value

PHPExcel_Worksheet_AutoFilter

Throws

PHPExcel_Exception *

File

vendor/phpoffice/phpexcel/Classes/PHPExcel/Worksheet/AutoFilter.php, line 602

Class

PHPExcel_Worksheet_AutoFilter
PHPExcel_Worksheet_AutoFilter

Code

public function showHideRows() {
  list($rangeStart, $rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->_range);

  //	The heading row should always be visible
  //		echo 'AutoFilter Heading Row ',$rangeStart[1],' is always SHOWN',PHP_EOL;
  $this->_workSheet
    ->getRowDimension($rangeStart[1])
    ->setVisible(TRUE);
  $columnFilterTests = array();
  foreach ($this->_columns as $columnID => $filterColumn) {
    $rules = $filterColumn
      ->getRules();
    switch ($filterColumn
      ->getFilterType()) {
      case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER:
        $ruleValues = array();

        //	Build a list of the filter value selections
        foreach ($rules as $rule) {
          $ruleType = $rule
            ->getRuleType();
          $ruleValues[] = $rule
            ->getValue();
        }

        //	Test if we want to include blanks in our filter criteria
        $blanks = FALSE;
        $ruleDataSet = array_filter($ruleValues);
        if (count($ruleValues) != count($ruleDataSet)) {
          $blanks = TRUE;
        }
        if ($ruleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_FILTER) {

          //	Filter on absolute values
          $columnFilterTests[$columnID] = array(
            'method' => '_filterTestInSimpleDataSet',
            'arguments' => array(
              'filterValues' => $ruleDataSet,
              'blanks' => $blanks,
            ),
          );
        }
        else {

          //	Filter on date group values
          $arguments = array(
            'date' => array(),
            'time' => array(),
            'dateTime' => array(),
          );
          foreach ($ruleDataSet as $ruleValue) {
            $date = $time = '';
            if (isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR]) && $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR] !== '') {
              $date .= sprintf('%04d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_YEAR]);
            }
            if (isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH]) && $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH] != '') {
              $date .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MONTH]);
            }
            if (isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY]) && $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY] !== '') {
              $date .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_DAY]);
            }
            if (isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR]) && $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR] !== '') {
              $time .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_HOUR]);
            }
            if (isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE]) && $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE] !== '') {
              $time .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_MINUTE]);
            }
            if (isset($ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND]) && $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND] !== '') {
              $time .= sprintf('%02d', $ruleValue[PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP_SECOND]);
            }
            $dateTime = $date . $time;
            $arguments['date'][] = $date;
            $arguments['time'][] = $time;
            $arguments['dateTime'][] = $dateTime;
          }

          //	Remove empty elements
          $arguments['date'] = array_filter($arguments['date']);
          $arguments['time'] = array_filter($arguments['time']);
          $arguments['dateTime'] = array_filter($arguments['dateTime']);
          $columnFilterTests[$columnID] = array(
            'method' => '_filterTestInDateGroupSet',
            'arguments' => array(
              'filterValues' => $arguments,
              'blanks' => $blanks,
            ),
          );
        }
        break;
      case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER:
        $customRuleForBlanks = FALSE;
        $ruleValues = array();

        //	Build a list of the filter value selections
        foreach ($rules as $rule) {
          $ruleType = $rule
            ->getRuleType();
          $ruleValue = $rule
            ->getValue();
          if (!is_numeric($ruleValue)) {

            //	Convert to a regexp allowing for regexp reserved characters, wildcards and escaped wildcards
            $ruleValue = preg_quote($ruleValue);
            $ruleValue = str_replace(self::$_fromReplace, self::$_toReplace, $ruleValue);
            if (trim($ruleValue) == '') {
              $customRuleForBlanks = TRUE;
              $ruleValue = trim($ruleValue);
            }
          }
          $ruleValues[] = array(
            'operator' => $rule
              ->getOperator(),
            'value' => $ruleValue,
          );
        }
        $join = $filterColumn
          ->getJoin();
        $columnFilterTests[$columnID] = array(
          'method' => '_filterTestInCustomDataSet',
          'arguments' => array(
            'filterRules' => $ruleValues,
            'join' => $join,
            'customRuleForBlanks' => $customRuleForBlanks,
          ),
        );
        break;
      case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER:
        $ruleValues = array();
        foreach ($rules as $rule) {

          //	We should only ever have one Dynamic Filter Rule anyway
          $dynamicRuleType = $rule
            ->getGrouping();
          if ($dynamicRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE || $dynamicRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_BELOWAVERAGE) {

            //	Number (Average) based
            //	Calculate the average
            $averageFormula = '=AVERAGE(' . $columnID . ($rangeStart[1] + 1) . ':' . $columnID . $rangeEnd[1] . ')';
            $average = PHPExcel_Calculation::getInstance()
              ->calculateFormula($averageFormula, NULL, $this->_workSheet
              ->getCell('A1'));

            //	Set above/below rule based on greaterThan or LessTan
            $operator = $dynamicRuleType === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMIC_ABOVEAVERAGE ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN;
            $ruleValues[] = array(
              'operator' => $operator,
              'value' => $average,
            );
            $columnFilterTests[$columnID] = array(
              'method' => '_filterTestInCustomDataSet',
              'arguments' => array(
                'filterRules' => $ruleValues,
                'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR,
              ),
            );
          }
          else {

            //	Date based
            if ($dynamicRuleType[0] == 'M' || $dynamicRuleType[0] == 'Q') {

              //	Month or Quarter
              sscanf($dynamicRuleType, '%[A-Z]%d', $periodType, $period);
              if ($periodType == 'M') {
                $ruleValues = array(
                  $period,
                );
              }
              else {
                --$period;
                $periodEnd = (1 + $period) * 3;
                $periodStart = 1 + $period * 3;
                $ruleValues = range($periodStart, periodEnd);
              }
              $columnFilterTests[$columnID] = array(
                'method' => '_filterTestInPeriodDateSet',
                'arguments' => $ruleValues,
              );
              $filterColumn
                ->setAttributes(array());
            }
            else {

              //	Date Range
              $columnFilterTests[$columnID] = $this
                ->_dynamicFilterDateRange($dynamicRuleType, $filterColumn);
              break;
            }
          }
        }
        break;
      case PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_TOPTENFILTER:
        $ruleValues = array();
        $dataRowCount = $rangeEnd[1] - $rangeStart[1];
        foreach ($rules as $rule) {

          //	We should only ever have one Dynamic Filter Rule anyway
          $toptenRuleType = $rule
            ->getGrouping();
          $ruleValue = $rule
            ->getValue();
          $ruleOperator = $rule
            ->getOperator();
        }
        if ($ruleOperator === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) {
          $ruleValue = floor($ruleValue * ($dataRowCount / 100));
        }
        if ($ruleValue < 1) {
          $ruleValue = 1;
        }
        if ($ruleValue > 500) {
          $ruleValue = 500;
        }
        $maxVal = $this
          ->_calculateTopTenValue($columnID, $rangeStart[1] + 1, $rangeEnd[1], $toptenRuleType, $ruleValue);
        $operator = $toptenRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP ? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL : PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL;
        $ruleValues[] = array(
          'operator' => $operator,
          'value' => $maxVal,
        );
        $columnFilterTests[$columnID] = array(
          'method' => '_filterTestInCustomDataSet',
          'arguments' => array(
            'filterRules' => $ruleValues,
            'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR,
          ),
        );
        $filterColumn
          ->setAttributes(array(
          'maxVal' => $maxVal,
        ));
        break;
    }
  }

  //		echo 'Column Filter Test CRITERIA',PHP_EOL;
  //		var_dump($columnFilterTests);
  //
  //	Execute the column tests for each row in the autoFilter range to determine show/hide,
  for ($row = $rangeStart[1] + 1; $row <= $rangeEnd[1]; ++$row) {

    //			echo 'Testing Row = ',$row,PHP_EOL;
    $result = TRUE;
    foreach ($columnFilterTests as $columnID => $columnFilterTest) {

      //				echo 'Testing cell ',$columnID.$row,PHP_EOL;
      $cellValue = $this->_workSheet
        ->getCell($columnID . $row)
        ->getCalculatedValue();

      //				echo 'Value is ',$cellValue,PHP_EOL;
      //	Execute the filter test
      $result = $result && call_user_func_array(array(
        'PHPExcel_Worksheet_AutoFilter',
        $columnFilterTest['method'],
      ), array(
        $cellValue,
        $columnFilterTest['arguments'],
      ));

      //				echo (($result) ? 'VALID' : 'INVALID'),PHP_EOL;
      //	If filter test has resulted in FALSE, exit the loop straightaway rather than running any more tests
      if (!$result) {
        break;
      }
    }

    //	Set show/hide for the row based on the result of the autoFilter result
    //			echo (($result) ? 'SHOW' : 'HIDE'),PHP_EOL;
    $this->_workSheet
      ->getRowDimension($row)
      ->setVisible($result);
  }
  return $this;
}