Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
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
}