Skip to content

Commit e419b92

Browse files
author
Mark Baker
committed
Autofilter expressions - TopTen, and minor patches
1 parent ef3ea15 commit e419b92

File tree

4 files changed

+55
-24
lines changed

4 files changed

+55
-24
lines changed

Classes/PHPExcel/Worksheet/AutoFilter.php

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -426,12 +426,6 @@ private static function _filterTestInPeriodDateSet($cellValue,$monthSet)
426426
return FALSE;
427427
}
428428

429-
private static function _filterTypeTopTenFilters($cellValue,$testSet)
430-
{
431-
echo 'CALLING _filterTypeTopTenFilters',PHP_EOL;
432-
return TRUE;
433-
}
434-
435429
/**
436430
* Search/Replace arrays to convert Excel wildcard syntax to a regexp syntax for preg_matching
437431
*
@@ -448,7 +442,7 @@ private static function _filterTypeTopTenFilters($cellValue,$testSet)
448442
* @param PHPExcel_Worksheet_AutoFilter_Column $filterColumn
449443
* @return mixed[]
450444
*/
451-
private function _dynamicFilterDateRange($dynamicRuleType, $filterColumn)
445+
private function _dynamicFilterDateRange($dynamicRuleType, &$filterColumn)
452446
{
453447
$rDateType = PHPExcel_Calculation_Functions::getReturnDateType();
454448
PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_PHP_NUMERIC);
@@ -541,7 +535,7 @@ private function _dynamicFilterDateRange($dynamicRuleType, $filterColumn)
541535

542536
// Set the filter column rule attributes ready for writing
543537
$filterColumn->setAttributes(array( 'val' => $val,
544-
'maxVal', $maxVal
538+
'maxVal' => $maxVal
545539
)
546540
);
547541

@@ -562,6 +556,22 @@ private function _dynamicFilterDateRange($dynamicRuleType, $filterColumn)
562556
);
563557
}
564558

559+
private function _calculateTopTenValue($columnID,$startRow,$endRow,$ruleType,$ruleValue) {
560+
$range = $columnID.$startRow.':'.$columnID.$endRow;
561+
$dataValues = PHPExcel_Calculation_Functions::flattenArray(
562+
$this->_workSheet->rangeToArray($range,NULL,TRUE,FALSE)
563+
);
564+
565+
$dataValues = array_filter($dataValues);
566+
if ($ruleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) {
567+
rsort($dataValues);
568+
} else {
569+
sort($dataValues);
570+
}
571+
572+
return array_pop(array_slice($dataValues,0,$ruleValue));
573+
}
574+
565575
/**
566576
* Apply the AutoFilter rules to the AutoFilter Range
567577
*
@@ -573,7 +583,7 @@ public function showHideRows()
573583
list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->_range);
574584

575585
// The heading row should always be visible
576-
echo 'AutoFilter Heading Row ',$rangeStart[1],' is always SHOWN',PHP_EOL;
586+
// echo 'AutoFilter Heading Row ',$rangeStart[1],' is always SHOWN',PHP_EOL;
577587
$this->_workSheet->getRowDimension($rangeStart[1])->setVisible(TRUE);
578588

579589
$columnFilterTests = array();
@@ -717,32 +727,49 @@ public function showHideRows()
717727
$ruleValues = array();
718728
$dataRowCount = $rangeEnd[1] - $rangeStart[1];
719729
foreach($rules as $rule) {
720-
var_dump($rule);
721730
// We should only ever have one Dynamic Filter Rule anyway
722731
$toptenRuleType = $rule->getGrouping();
723732
$ruleValue = $rule->getValue();
733+
$ruleOperator = $rule->getOperator();
734+
}
735+
if ($ruleOperator === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) {
736+
$ruleValue = floor($ruleValue * ($dataRowCount / 100));
724737
}
725-
var_dump($toptenRuleType);
726-
var_dump($ruleValue);
738+
if ($ruleValue < 1) $ruleValue = 1;
739+
if ($ruleValue > 500) $ruleValue = 500;
740+
741+
$maxVal = $this->_calculateTopTenValue($columnID,$rangeStart[1]+1,$rangeEnd[1],$toptenRuleType,$ruleValue);
742+
743+
$operator = ($toptenRuleType == PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP)
744+
? PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL
745+
: PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_LESSTHANOREQUAL;
746+
$ruleValues[] = array( 'operator' => $operator,
747+
'value' => $maxVal
748+
);
727749
$columnFilterTests[$columnID] = array(
728-
'method' => '_filterTypeTopTenFilters',
729-
'arguments' => $ruleValues
750+
'method' => '_filterTestInCustomDataSet',
751+
'arguments' => array( 'filterRules' => $ruleValues,
752+
'join' => PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_OR
753+
)
754+
);
755+
$filterColumn->setAttributes(
756+
array('maxVal' => $maxVal)
730757
);
731758
break;
732759
}
733760
}
734761

735-
echo 'Column Filter Test CRITERIA',PHP_EOL;
736-
var_dump($columnFilterTests);
737-
762+
// echo 'Column Filter Test CRITERIA',PHP_EOL;
763+
// var_dump($columnFilterTests);
764+
//
738765
// Execute the column tests for each row in the autoFilter range to determine show/hide,
739766
for ($row = $rangeStart[1]+1; $row <= $rangeEnd[1]; ++$row) {
740-
echo 'Testing Row = ',$row,PHP_EOL;
767+
// echo 'Testing Row = ',$row,PHP_EOL;
741768
$result = TRUE;
742769
foreach($columnFilterTests as $columnID => $columnFilterTest) {
743-
echo 'Testing cell ',$columnID.$row,PHP_EOL;
770+
// echo 'Testing cell ',$columnID.$row,PHP_EOL;
744771
$cellValue = $this->_workSheet->getCell($columnID.$row)->getCalculatedValue();
745-
echo 'Value is ',$cellValue,PHP_EOL;
772+
// echo 'Value is ',$cellValue,PHP_EOL;
746773
// Execute the filter test
747774
$result = $result &&
748775
call_user_func_array(
@@ -752,13 +779,13 @@ public function showHideRows()
752779
$columnFilterTest['arguments']
753780
)
754781
);
755-
echo (($result) ? 'VALID' : 'INVALID'),PHP_EOL;
782+
// echo (($result) ? 'VALID' : 'INVALID'),PHP_EOL;
756783
// If filter test has resulted in FALSE, exit the loop straightaway rather than running any more tests
757784
if (!$result)
758785
break;
759786
}
760787
// Set show/hide for the row based on the result of the autoFilter result
761-
echo (($result) ? 'SHOW' : 'HIDE'),PHP_EOL;
788+
// echo (($result) ? 'SHOW' : 'HIDE'),PHP_EOL;
762789
$this->_workSheet->getRowDimension($row)->setVisible($result);
763790
}
764791

Classes/PHPExcel/Writer/Excel2007/Workbook.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ private function _writeCalcPr(PHPExcel_Shared_XMLWriter $objWriter = null, $reca
197197
$objWriter->writeAttribute('calcId', '124519');
198198
$objWriter->writeAttribute('calcMode', 'auto');
199199
// fullCalcOnLoad isn't needed if we've recalculating for the save
200-
$objWriter->writeAttribute('fullCalcOnLoad', ($recalcRequired) ? '1' : '0');
200+
$objWriter->writeAttribute('fullCalcOnLoad', ($recalcRequired) ? '0' : '1');
201201

202202
$objWriter->endElement();
203203
}

Classes/PHPExcel/Writer/Excel2007/Worksheet.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ private function _writeSheetPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPE
151151
$autoFilterRange = $pSheet->getAutoFilter()->getRange();
152152
if (!empty($autoFilterRange)) {
153153
$objWriter->writeAttribute('filterMode', 1);
154-
// $pSheet->getAutoFilter()->showHideRows();
154+
$pSheet->getAutoFilter()->showHideRows();
155155
}
156156

157157
// tabColor

Tests/runall.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828
/** Error reporting */
2929
error_reporting(E_ALL);
3030

31+
if (PHP_SAPI != 'cli') {
32+
die ('This script executes all tests, and should only be run from the command line');
33+
}
34+
3135
// List of tests
3236
$aTests = array(
3337
'01simple.php'

0 commit comments

Comments
 (0)