1 |
efrain |
1 |
<?php
|
|
|
2 |
|
|
|
3 |
namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
|
|
4 |
|
|
|
5 |
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
|
|
|
6 |
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
|
|
|
7 |
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column;
|
|
|
8 |
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule;
|
|
|
9 |
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet as ActualWorksheet;
|
|
|
10 |
|
|
|
11 |
class AutoFilter extends WriterPart
|
|
|
12 |
{
|
|
|
13 |
/**
|
|
|
14 |
* Write AutoFilter.
|
|
|
15 |
*/
|
|
|
16 |
public static function writeAutoFilter(XMLWriter $objWriter, ActualWorksheet $worksheet): void
|
|
|
17 |
{
|
|
|
18 |
$autoFilterRange = $worksheet->getAutoFilter()->getRange();
|
|
|
19 |
if (!empty($autoFilterRange)) {
|
|
|
20 |
// autoFilter
|
|
|
21 |
$objWriter->startElement('autoFilter');
|
|
|
22 |
|
|
|
23 |
// Strip any worksheet reference from the filter coordinates
|
|
|
24 |
$range = Coordinate::splitRange($autoFilterRange);
|
|
|
25 |
$range = $range[0];
|
|
|
26 |
// Strip any worksheet ref
|
|
|
27 |
[$ws, $range[0]] = ActualWorksheet::extractSheetTitle($range[0], true);
|
|
|
28 |
$range = implode(':', $range);
|
|
|
29 |
|
|
|
30 |
$objWriter->writeAttribute('ref', str_replace('$', '', $range));
|
|
|
31 |
|
|
|
32 |
$columns = $worksheet->getAutoFilter()->getColumns();
|
|
|
33 |
if (count($columns) > 0) {
|
|
|
34 |
foreach ($columns as $columnID => $column) {
|
|
|
35 |
$colId = $worksheet->getAutoFilter()->getColumnOffset($columnID);
|
|
|
36 |
self::writeAutoFilterColumn($objWriter, $column, $colId);
|
|
|
37 |
}
|
|
|
38 |
}
|
|
|
39 |
$objWriter->endElement();
|
|
|
40 |
}
|
|
|
41 |
}
|
|
|
42 |
|
|
|
43 |
/**
|
|
|
44 |
* Write AutoFilter's filterColumn.
|
|
|
45 |
*/
|
|
|
46 |
public static function writeAutoFilterColumn(XMLWriter $objWriter, Column $column, int $colId): void
|
|
|
47 |
{
|
|
|
48 |
$rules = $column->getRules();
|
|
|
49 |
if (count($rules) > 0) {
|
|
|
50 |
$objWriter->startElement('filterColumn');
|
|
|
51 |
$objWriter->writeAttribute('colId', "$colId");
|
|
|
52 |
|
|
|
53 |
$objWriter->startElement($column->getFilterType());
|
|
|
54 |
if ($column->getJoin() == Column::AUTOFILTER_COLUMN_JOIN_AND) {
|
|
|
55 |
$objWriter->writeAttribute('and', '1');
|
|
|
56 |
}
|
|
|
57 |
|
|
|
58 |
foreach ($rules as $rule) {
|
|
|
59 |
self::writeAutoFilterColumnRule($column, $rule, $objWriter);
|
|
|
60 |
}
|
|
|
61 |
|
|
|
62 |
$objWriter->endElement();
|
|
|
63 |
|
|
|
64 |
$objWriter->endElement();
|
|
|
65 |
}
|
|
|
66 |
}
|
|
|
67 |
|
|
|
68 |
/**
|
|
|
69 |
* Write AutoFilter's filterColumn Rule.
|
|
|
70 |
*/
|
|
|
71 |
private static function writeAutoFilterColumnRule(Column $column, Rule $rule, XMLWriter $objWriter): void
|
|
|
72 |
{
|
|
|
73 |
if (
|
|
|
74 |
($column->getFilterType() === Column::AUTOFILTER_FILTERTYPE_FILTER) &&
|
|
|
75 |
($rule->getOperator() === Rule::AUTOFILTER_COLUMN_RULE_EQUAL) &&
|
|
|
76 |
($rule->getValue() === '')
|
|
|
77 |
) {
|
|
|
78 |
// Filter rule for Blanks
|
|
|
79 |
$objWriter->writeAttribute('blank', '1');
|
|
|
80 |
} elseif ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) {
|
|
|
81 |
// Dynamic Filter Rule
|
|
|
82 |
$objWriter->writeAttribute('type', $rule->getGrouping());
|
|
|
83 |
$val = $column->getAttribute('val');
|
|
|
84 |
if ($val !== null) {
|
|
|
85 |
$objWriter->writeAttribute('val', "$val");
|
|
|
86 |
}
|
|
|
87 |
$maxVal = $column->getAttribute('maxVal');
|
|
|
88 |
if ($maxVal !== null) {
|
|
|
89 |
$objWriter->writeAttribute('maxVal', "$maxVal");
|
|
|
90 |
}
|
|
|
91 |
} elseif ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_TOPTENFILTER) {
|
|
|
92 |
// Top 10 Filter Rule
|
|
|
93 |
$ruleValue = $rule->getValue();
|
|
|
94 |
if (!is_array($ruleValue)) {
|
|
|
95 |
$objWriter->writeAttribute('val', "$ruleValue");
|
|
|
96 |
}
|
|
|
97 |
$objWriter->writeAttribute('percent', (($rule->getOperator() === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) ? '1' : '0'));
|
|
|
98 |
$objWriter->writeAttribute('top', (($rule->getGrouping() === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) ? '1' : '0'));
|
|
|
99 |
} else {
|
|
|
100 |
// Filter, DateGroupItem or CustomFilter
|
|
|
101 |
$objWriter->startElement($rule->getRuleType());
|
|
|
102 |
|
|
|
103 |
if ($rule->getOperator() !== Rule::AUTOFILTER_COLUMN_RULE_EQUAL) {
|
|
|
104 |
$objWriter->writeAttribute('operator', $rule->getOperator());
|
|
|
105 |
}
|
|
|
106 |
if ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_DATEGROUP) {
|
|
|
107 |
// Date Group filters
|
|
|
108 |
$ruleValue = $rule->getValue();
|
|
|
109 |
if (is_array($ruleValue)) {
|
|
|
110 |
foreach ($ruleValue as $key => $value) {
|
|
|
111 |
$objWriter->writeAttribute($key, "$value");
|
|
|
112 |
}
|
|
|
113 |
}
|
|
|
114 |
$objWriter->writeAttribute('dateTimeGrouping', $rule->getGrouping());
|
|
|
115 |
} else {
|
|
|
116 |
$ruleValue = $rule->getValue();
|
|
|
117 |
if (!is_array($ruleValue)) {
|
|
|
118 |
$objWriter->writeAttribute('val', "$ruleValue");
|
|
|
119 |
}
|
|
|
120 |
}
|
|
|
121 |
|
|
|
122 |
$objWriter->endElement();
|
|
|
123 |
}
|
|
|
124 |
}
|
|
|
125 |
}
|