Improve cloning of worksheet to handle autoFilter area cleanly

This commit is contained in:
Mark Baker 2012-08-29 00:24:13 +01:00
parent dbe64c5044
commit 2f4620c3f9
3 changed files with 16 additions and 10 deletions

View File

@ -2777,6 +2777,10 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
} elseif ($key == '_drawingCollection') { } elseif ($key == '_drawingCollection') {
$newCollection = clone $this->_drawingCollection; $newCollection = clone $this->_drawingCollection;
$this->_drawingCollection = $newCollection; $this->_drawingCollection = $newCollection;
} elseif (($key == '_autoFilter') && (is_a($this->_autoFilter,'PHPExcel_Worksheet_AutoFilter'))) {
$newAutoFilter = clone $this->_autoFilter;
$this->_autoFilter = $newAutoFilter;
$this->_autoFilter->setParent($this);
} else { } else {
$this->{$key} = unserialize(serialize($val)); $this->{$key} = unserialize(serialize($val));
} }

View File

@ -587,7 +587,7 @@ class PHPExcel_Worksheet_AutoFilter
list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->_range); list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($this->_range);
// The heading row should always be visible // The heading row should always be visible
echo 'AutoFilter Heading Row ',$rangeStart[1],' is always SHOWN',PHP_EOL; // echo 'AutoFilter Heading Row ',$rangeStart[1],' is always SHOWN',PHP_EOL;
$this->_workSheet->getRowDimension($rangeStart[1])->setVisible(TRUE); $this->_workSheet->getRowDimension($rangeStart[1])->setVisible(TRUE);
$columnFilterTests = array(); $columnFilterTests = array();
@ -763,17 +763,17 @@ class PHPExcel_Worksheet_AutoFilter
} }
} }
echo 'Column Filter Test CRITERIA',PHP_EOL; // echo 'Column Filter Test CRITERIA',PHP_EOL;
var_dump($columnFilterTests); // var_dump($columnFilterTests);
//
// Execute the column tests for each row in the autoFilter range to determine show/hide, // Execute the column tests for each row in the autoFilter range to determine show/hide,
for ($row = $rangeStart[1]+1; $row <= $rangeEnd[1]; ++$row) { for ($row = $rangeStart[1]+1; $row <= $rangeEnd[1]; ++$row) {
echo 'Testing Row = ',$row,PHP_EOL; // echo 'Testing Row = ',$row,PHP_EOL;
$result = TRUE; $result = TRUE;
foreach($columnFilterTests as $columnID => $columnFilterTest) { foreach($columnFilterTests as $columnID => $columnFilterTest) {
echo 'Testing cell ',$columnID.$row,PHP_EOL; // echo 'Testing cell ',$columnID.$row,PHP_EOL;
$cellValue = $this->_workSheet->getCell($columnID.$row)->getCalculatedValue(); $cellValue = $this->_workSheet->getCell($columnID.$row)->getCalculatedValue();
echo 'Value is ',$cellValue,PHP_EOL; // echo 'Value is ',$cellValue,PHP_EOL;
// Execute the filter test // Execute the filter test
$result = $result && $result = $result &&
call_user_func_array( call_user_func_array(
@ -783,13 +783,13 @@ class PHPExcel_Worksheet_AutoFilter
$columnFilterTest['arguments'] $columnFilterTest['arguments']
) )
); );
echo (($result) ? 'VALID' : 'INVALID'),PHP_EOL; // echo (($result) ? 'VALID' : 'INVALID'),PHP_EOL;
// If filter test has resulted in FALSE, exit the loop straightaway rather than running any more tests // If filter test has resulted in FALSE, exit the loop straightaway rather than running any more tests
if (!$result) if (!$result)
break; break;
} }
// Set show/hide for the row based on the result of the autoFilter result // Set show/hide for the row based on the result of the autoFilter result
echo (($result) ? 'SHOW' : 'HIDE'),PHP_EOL; // echo (($result) ? 'SHOW' : 'HIDE'),PHP_EOL;
$this->_workSheet->getRowDimension($row)->setVisible($result); $this->_workSheet->getRowDimension($row)->setVisible($result);
} }
@ -815,7 +815,7 @@ class PHPExcel_Worksheet_AutoFilter
$this->$key = array(); $this->$key = array();
foreach ($value as $k => $v) { foreach ($value as $k => $v) {
$this->$key[$k] = clone $v; $this->$key[$k] = clone $v;
// attache the new cloned Column to this new cloned Autofilter object // attach the new cloned Column to this new cloned Autofilter object
$this->$key[$k]->setParent($this); $this->$key[$k]->setParent($this);
} }
} else { } else {

View File

@ -369,6 +369,8 @@ class PHPExcel_Worksheet_AutoFilter_Column
$this->$key = array(); $this->$key = array();
foreach ($value as $k => $v) { foreach ($value as $k => $v) {
$this->$key[$k] = clone $v; $this->$key[$k] = clone $v;
// attach the new cloned Rule to this new cloned Autofilter Cloned object
$this->$key[$k]->setParent($this);
} }
} else { } else {
$this->$key = $value; $this->$key = $value;