mirror of
https://github.com/retailcrm/PHPExcel.git
synced 2024-11-29 16:56:03 +03:00
Initial Writer code for autofilter selections
This commit is contained in:
parent
1bd83a115e
commit
303a6443ed
@ -1107,8 +1107,9 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
|
|||||||
foreach ($xmlSheet->autoFilter->filterColumn as $filterColumn) {
|
foreach ($xmlSheet->autoFilter->filterColumn as $filterColumn) {
|
||||||
$column = $autoFilter->getColumnByOffset((integer) $filterColumn["colId"]);
|
$column = $autoFilter->getColumnByOffset((integer) $filterColumn["colId"]);
|
||||||
if ($filterColumn->filters) {
|
if ($filterColumn->filters) {
|
||||||
|
$column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER);
|
||||||
$filters = $filterColumn->filters;
|
$filters = $filterColumn->filters;
|
||||||
// Standard filters are always an OR join
|
// Standard filters are always an OR join, so no join rule needed
|
||||||
foreach ($filters->filter as $filterRule) {
|
foreach ($filters->filter as $filterRule) {
|
||||||
$column->createRule()->setRule(
|
$column->createRule()->setRule(
|
||||||
(string) $filterRule["operator"],
|
(string) $filterRule["operator"],
|
||||||
@ -1116,20 +1117,32 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if ($filterColumn->dynamicFilter) {
|
||||||
|
$column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_DYNAMICFILTER);
|
||||||
|
// We should only ever have one dynamic filter
|
||||||
|
foreach ($filterColumn->dynamicFilter as $filterRule) {
|
||||||
|
$column->createRule()->setRule(
|
||||||
|
(string) $filterRule["operator"],
|
||||||
|
(string) $filterRule["val"]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
if ($filterColumn->customFilters) {
|
if ($filterColumn->customFilters) {
|
||||||
|
$column->setFilterType(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER);
|
||||||
$customFilters = $filterColumn->customFilters;
|
$customFilters = $filterColumn->customFilters;
|
||||||
// Custom filters can an AND or an OR join
|
// Custom filters can an AND or an OR join
|
||||||
if ((isset($customFilters["and"])) && ($customFilters["and"] == 1)) {
|
if ((isset($customFilters["and"])) && ($customFilters["and"] == 1)) {
|
||||||
$column->setAndOr(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_ANDOR_AND);
|
$column->setAndOr(PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_ANDOR_AND);
|
||||||
}
|
}
|
||||||
foreach ($customFilters->customFilter as $customFilterRule) {
|
foreach ($customFilters->customFilter as $filterRule) {
|
||||||
$column->createRule()->setRule(
|
$column->createRule()->setRule(
|
||||||
(string) $customFilterRule["operator"],
|
(string) $filterRule["operator"],
|
||||||
(string) $customFilterRule["val"]
|
(string) $filterRule["val"]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
var_dump($autoFilter);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($xmlSheet && $xmlSheet->mergeCells && $xmlSheet->mergeCells->mergeCell && !$this->_readDataOnly) {
|
if ($xmlSheet && $xmlSheet->mergeCells && $xmlSheet->mergeCells->mergeCell && !$this->_readDataOnly) {
|
||||||
|
@ -271,7 +271,7 @@ class PHPExcel_Worksheet_AutoFilter
|
|||||||
* referenced as a property of its parent.
|
* referenced as a property of its parent.
|
||||||
*/
|
*/
|
||||||
public function __toString() {
|
public function __toString() {
|
||||||
return $this->_range;
|
return (string) $this->_range;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -35,15 +35,23 @@
|
|||||||
*/
|
*/
|
||||||
class PHPExcel_Worksheet_AutoFilter_Column
|
class PHPExcel_Worksheet_AutoFilter_Column
|
||||||
{
|
{
|
||||||
/* Column Datatypes */
|
const AUTOFILTER_FILTERTYPE_FILTER = 'filter';
|
||||||
const AUTOFILTER_COLUMN_DATATYPE_STRING = 's';
|
const AUTOFILTER_FILTERTYPE_CUSTOMFILTER = 'customFilter';
|
||||||
const AUTOFILTER_COLUMN_DATATYPE_NUMBER = 'n';
|
// Supports no more than 2 rules, with an And/Or join criteria
|
||||||
const AUTOFILTER_COLUMN_DATATYPE_DATE = 'd';
|
// if more than 1 rule is defined
|
||||||
|
const AUTOFILTER_FILTERTYPE_DYNAMICFILTER = 'dynamicFilter';
|
||||||
|
// Even though the filter rule is constant, the filtered data can vary
|
||||||
|
// e.g. filtered by date = TODAY
|
||||||
|
|
||||||
private static $_dataTypes = array(
|
private static $_filterTypes = array(
|
||||||
self::AUTOFILTER_COLUMN_DATATYPE_STRING,
|
// Currently we're not handling
|
||||||
self::AUTOFILTER_COLUMN_DATATYPE_NUMBER,
|
// colorFilter
|
||||||
self::AUTOFILTER_COLUMN_DATATYPE_DATE,
|
// extLst
|
||||||
|
// iconFilter
|
||||||
|
// topTen
|
||||||
|
self::AUTOFILTER_FILTERTYPE_FILTER,
|
||||||
|
self::AUTOFILTER_FILTERTYPE_CUSTOMFILTER,
|
||||||
|
self::AUTOFILTER_FILTERTYPE_DYNAMICFILTER,
|
||||||
);
|
);
|
||||||
|
|
||||||
/* Multiple Rule Connections */
|
/* Multiple Rule Connections */
|
||||||
@ -72,11 +80,11 @@ class PHPExcel_Worksheet_AutoFilter_Column
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Autofilter Column DataType
|
* Autofilter Column Filter Type
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $_dataType = NULL;
|
private $_filterType = self::AUTOFILTER_FILTERTYPE_FILTER;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -153,6 +161,32 @@ class PHPExcel_Worksheet_AutoFilter_Column
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get AutoFilter Type
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getFilterType() {
|
||||||
|
return $this->_filterType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set AutoFilter Type
|
||||||
|
*
|
||||||
|
* @param string $pfilterType
|
||||||
|
* @throws Exception
|
||||||
|
* @return PHPExcel_Worksheet_AutoFilter_Column
|
||||||
|
*/
|
||||||
|
public function setFilterType($pfilterType = self::AUTOFILTER_FILTERTYPE_FILTER) {
|
||||||
|
if (!in_array($pfilterType,self::$_filterTypes)) {
|
||||||
|
throw new PHPExcel_Exception('Invalid filter type for column AutoFilter.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_filterType = $pfilterType;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get AutoFilter Multiple Rules And/Or
|
* Get AutoFilter Multiple Rules And/Or
|
||||||
*
|
*
|
||||||
@ -181,37 +215,6 @@ class PHPExcel_Worksheet_AutoFilter_Column
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get AutoFilter Column Data Type
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getDataType() {
|
|
||||||
if ($this->_dataType === NULL) {
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->_dataType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set AutoFilter Column Data Type
|
|
||||||
*
|
|
||||||
* @param string $pDataType Data Type
|
|
||||||
* @throws Exception
|
|
||||||
* @return PHPExcel_Worksheet_AutoFilter_Column
|
|
||||||
*/
|
|
||||||
public function setDataType($pDataType = self::AUTOFILTER_COLUMN_DATATYPE_STRING) {
|
|
||||||
// Lowercase datatype
|
|
||||||
$pDataType = strtolower($pDataType);
|
|
||||||
if (!in_array($pDataType,self::$_dataTypes)) {
|
|
||||||
throw new PHPExcel_Exception('Invalid datatype for column AutoFilter.');
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->_dataType = $pDataType;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all AutoFilter Column Rules
|
* Get all AutoFilter Column Rules
|
||||||
*
|
*
|
||||||
@ -262,6 +265,7 @@ class PHPExcel_Worksheet_AutoFilter_Column
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete a specified AutoFilter Column Rule
|
* Delete a specified AutoFilter Column Rule
|
||||||
|
* If the number of rules is reduced to 1, then we reset And/Or logic to Or
|
||||||
*
|
*
|
||||||
* @param integer $pIndex Rule index in the ruleset array
|
* @param integer $pIndex Rule index in the ruleset array
|
||||||
* @return PHPExcel_Worksheet_AutoFilter_Column
|
* @return PHPExcel_Worksheet_AutoFilter_Column
|
||||||
@ -269,7 +273,12 @@ class PHPExcel_Worksheet_AutoFilter_Column
|
|||||||
public function deleteRule($pIndex) {
|
public function deleteRule($pIndex) {
|
||||||
if (isset($this->_ruleset[$pIndex])) {
|
if (isset($this->_ruleset[$pIndex])) {
|
||||||
unset($this->_ruleset[$pIndex]);
|
unset($this->_ruleset[$pIndex]);
|
||||||
|
// If we've just deleted down to a single rule, then reset And/Or joining to Or
|
||||||
|
if (count($this->_ruleset) <= 1) {
|
||||||
|
$this->setAndOr(self::AUTOFILTER_COLUMN_ANDOR_OR);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -744,6 +744,39 @@ class PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_Writ
|
|||||||
$range = implode(':', $range);
|
$range = implode(':', $range);
|
||||||
|
|
||||||
$objWriter->writeAttribute('ref', str_replace('$','',$range));
|
$objWriter->writeAttribute('ref', str_replace('$','',$range));
|
||||||
|
|
||||||
|
$columns = $pSheet->getAutoFilter()->getColumns();
|
||||||
|
if (count($columns > 0)) {
|
||||||
|
foreach($columns as $columnID => $column) {
|
||||||
|
$rules = $column->getRules();
|
||||||
|
if (count($rules > 0)) {
|
||||||
|
$objWriter->startElement('filterColumn');
|
||||||
|
$objWriter->writeAttribute('colId', $pSheet->getAutoFilter()->getColumnOffset($columnID));
|
||||||
|
|
||||||
|
// We'll keep things simple and always group our filters, even if there's only one
|
||||||
|
$objWriter->startElement( $column->getFilterType() . 's');
|
||||||
|
if ($column->getAndOr() == PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_ANDOR_AND) {
|
||||||
|
$objWriter->writeAttribute('and', 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($rules as $rule) {
|
||||||
|
$objWriter->startElement($column->getFilterType());
|
||||||
|
|
||||||
|
if ($rule->getOperator() !== PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL) {
|
||||||
|
$objWriter->writeAttribute('operator', $rule->getOperator());
|
||||||
|
}
|
||||||
|
$objWriter->writeAttribute('val', $rule->getValue());
|
||||||
|
|
||||||
|
$objWriter->endElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
$objWriter->endElement();
|
||||||
|
|
||||||
|
$objWriter->endElement();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$objWriter->endElement();
|
$objWriter->endElement();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user