From 2251839f66349d3aeebe257a937b9b752a17f923 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 9 Aug 2012 12:38:11 +0100 Subject: [PATCH] Support for AutoFilter active filters in the Excel2007 Reader --- Classes/PHPExcel/Reader/Excel2007.php | 21 ++++++++++++------- Classes/PHPExcel/Worksheet/AutoFilter.php | 8 ++----- .../PHPExcel/Worksheet/AutoFilter/Column.php | 2 +- .../Worksheet/AutoFilter/Column/Rule.php | 17 ++++++++------- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/Classes/PHPExcel/Reader/Excel2007.php b/Classes/PHPExcel/Reader/Excel2007.php index 743f926..9457a51 100644 --- a/Classes/PHPExcel/Reader/Excel2007.php +++ b/Classes/PHPExcel/Reader/Excel2007.php @@ -1104,23 +1104,28 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader $column = $autoFilter->getColumnByOffset((integer) $filterColumn["colId"]); if ($filterColumn->filters) { $filters = $filterColumn->filters; + // Standard filters are always an OR join foreach ($filters->filter as $filterRule) { - echo 'FILTER RULE',PHP_EOL; - echo (string) $filterRule["val"],PHP_EOL; - echo (string) $filterRule["operator"],PHP_EOL; + $column->createRule()->setRule( + (string) $filterRule["operator"], + (string) $filterRule["val"] + ); } } if ($filterColumn->customFilters) { $customFilters = $filterColumn->customFilters; - echo (string) $customFilters["and"],PHP_EOL; + // Custom filters can an AND or an OR join + if ((isset($customFilters["and"])) && ($customFilters["and"] == 1)) { + $column->setAndOr(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_ANDOR_AND); + } foreach ($customFilters->customFilter as $customFilterRule) { - echo 'CUSTOM FILTER RULE',PHP_EOL; - echo (string) $customFilterRule["val"],PHP_EOL; - echo (string) $customFilterRule["operator"],PHP_EOL; + $column->createRule()->setRule( + (string) $customFilterRule["operator"], + (string) $customFilterRule["val"] + ); } } } - var_dump($autoFilter); } if ($xmlSheet && $xmlSheet->mergeCells && $xmlSheet->mergeCells->mergeCell && !$this->_readDataOnly) { diff --git a/Classes/PHPExcel/Worksheet/AutoFilter.php b/Classes/PHPExcel/Worksheet/AutoFilter.php index 6620dde..ada60bb 100644 --- a/Classes/PHPExcel/Worksheet/AutoFilter.php +++ b/Classes/PHPExcel/Worksheet/AutoFilter.php @@ -192,6 +192,7 @@ class PHPExcel_Worksheet_AutoFilter if (!isset($this->_columns[$pColumn])) { $this->_columns[$pColumn] = new PHPExcel_Worksheet_AutoFilter_Column($pColumn, $this); } + return $this->_columns[$pColumn]; } @@ -206,12 +207,7 @@ class PHPExcel_Worksheet_AutoFilter list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->_range); $pColumn = PHPExcel_Cell::stringFromColumnIndex($rangeStart[0] + $pColumnOffset - 1); - echo 'Filter rules to apply for column ',$pColumn,PHP_EOL; - - if (!isset($this->_columns[$pColumn])) { - $this->_columns[$pColumn] = new PHPExcel_Worksheet_AutoFilter_Column($pColumn, $this); - } - return $this->_columns[$pColumn]; + return $this->getColumn($pColumn); } /** diff --git a/Classes/PHPExcel/Worksheet/AutoFilter/Column.php b/Classes/PHPExcel/Worksheet/AutoFilter/Column.php index 33ca3e0..1cfd474 100644 --- a/Classes/PHPExcel/Worksheet/AutoFilter/Column.php +++ b/Classes/PHPExcel/Worksheet/AutoFilter/Column.php @@ -172,7 +172,7 @@ class PHPExcel_Worksheet_AutoFilter_Column public function setAndOr($pAndOr = self::AUTOFILTER_COLUMN_ANDOR_OR) { // Lowercase And/Or $pAndOr = strtolower($pAndOr); - if (!in_array($pDataType,self::$_ruleConnections)) { + if (!in_array($pAndOr,self::$_ruleConnections)) { throw new PHPExcel_Exception('Invalid rule connection for column AutoFilter.'); } diff --git a/Classes/PHPExcel/Worksheet/AutoFilter/Column/Rule.php b/Classes/PHPExcel/Worksheet/AutoFilter/Column/Rule.php index fa0e01d..e44d922 100644 --- a/Classes/PHPExcel/Worksheet/AutoFilter/Column/Rule.php +++ b/Classes/PHPExcel/Worksheet/AutoFilter/Column/Rule.php @@ -43,16 +43,20 @@ class PHPExcel_Worksheet_AutoFilter_Column_Rule const AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL = 'greaterThanOrEqual'; const AUTOFILTER_COLUMN_RULE_LESSTHAN = 'lessThan'; const AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL = 'lessThanOrEqual'; - /* Rule Operators (Numeric Special) which are translated to standard numeric operators with calculated values */ const AUTOFILTER_COLUMN_RULE_BETWEEN = 'between'; // greaterThanOrEqual 1 && lessThanOrEqual 2 + /* Rule Operators (Numeric Special) which are translated to standard numeric operators with calculated values */ const AUTOFILTER_COLUMN_RULE_TOPTEN = 'topTen'; // greaterThan calculated value const AUTOFILTER_COLUMN_RULE_TOPTENPERCENT = 'topTenPercent'; // greaterThan calculated value const AUTOFILTER_COLUMN_RULE_ABOVEAVERAGE = 'aboveAverage'; // Value is calculated as the average const AUTOFILTER_COLUMN_RULE_BELOWAVERAGE = 'belowAverage'; // Value is calculated as the average + /* Rule Operators (String) which are set as wild-carded values */ + const AUTOFILTER_COLUMN_RULE_BEGINSWITH = 'beginsWith'; // A* + const AUTOFILTER_COLUMN_RULE_ENDSWITH = 'endsWith'; // *Z + const AUTOFILTER_COLUMN_RULE_CONTAINS = 'contains'; // *B* + const AUTOFILTER_COLUMN_RULE_DOESNTCONTAIN = 'notEqual'; // notEqual *B* /* Rule Operators (Date Special) which are translated to standard numeric operators with calculated values */ const AUTOFILTER_COLUMN_RULE_BEFORE = 'lessThan'; const AUTOFILTER_COLUMN_RULE_AFTER = 'greaterThan'; - const AUTOFILTER_COLUMN_RULE_BETWEEN = 'between'; // greaterThanOrEqual 1 && lessThanOrEqual 2 const AUTOFILTER_COLUMN_RULE_YESTERDAY = 'yesterday'; const AUTOFILTER_COLUMN_RULE_TODAY = 'today'; const AUTOFILTER_COLUMN_RULE_TOMORROW = 'tomorrow'; @@ -71,11 +75,6 @@ class PHPExcel_Worksheet_AutoFilter_Column_Rule const AUTOFILTER_COLUMN_RULE_YEARTODATE = 'yearToDate'; // const AUTOFILTER_COLUMN_RULE_ALLDATESINMONTH = 'allDatesInMonth'; // for Month/February const AUTOFILTER_COLUMN_RULE_ALLDATESINQUARTER = 'allDatesInQuarter'; // for Quarter 2 - /* Rule Operators (String) which are set as wild-carded values */ - const AUTOFILTER_COLUMN_RULE_BEGINSWITH = 'beginsWith'; // A* - const AUTOFILTER_COLUMN_RULE_ENDSWITH = 'endsWith'; // *Z - const AUTOFILTER_COLUMN_RULE_CONTAINS = 'contains'; // *B* - const AUTOFILTER_COLUMN_RULE_DOESNTCONTAIN = 'notEqual'; // notEqual *B* /** * Autofilter Column @@ -147,6 +146,8 @@ class PHPExcel_Worksheet_AutoFilter_Column_Rule * @return PHPExcel_Worksheet_AutoFilter_Column_Rule */ public function setOperator($pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL) { + if (empty($pOperator)) + $pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL; $this->_operator = $pOperator; return $this; @@ -159,7 +160,7 @@ class PHPExcel_Worksheet_AutoFilter_Column_Rule * @throws Exception * @return PHPExcel_Worksheet_AutoFilter_Column_Rule */ - public function setRule($pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL, $pValue = '' { + public function setRule($pOperator = self::AUTOFILTER_COLUMN_RULE_EQUAL, $pValue = '') { $this->setOperator($pOperator); $this->setValue($pValue);