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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body