Example #1
0
 /**
  * Write the AUTOFILTERINFO BIFF record. This is used to configure the number of autofilter select used in the sheet.
  */
 private function writeAutoFilterInfo()
 {
     $record = 0x9d;
     // Record identifier
     $length = 0x2;
     // Bytes to follow
     $rangeBounds = \PHPExcel\Cell::rangeBoundaries($this->phpSheet->getAutoFilter()->getRange());
     $iNumFilters = 1 + $rangeBounds[1][0] - $rangeBounds[0][0];
     $header = pack("vv", $record, $length);
     $data = pack("v", $iNumFilters);
     $this->append($header . $data);
 }
Example #2
0
 /**
  * Write Defined Name for autoFilter
  *
  * @param     \PHPExcel\Shared\XMLWriter    $objWriter         XML Writer
  * @param     \PHPExcel\Worksheet            $pSheet
  * @param     int                            $pSheetId
  * @throws     \PHPExcel\Writer\Exception
  */
 private function writeDefinedNameForAutofilter(\PHPExcel\Shared\XMLWriter $objWriter, \PHPExcel\Worksheet $pSheet = null, $pSheetId = 0)
 {
     // definedName for autoFilter
     $autoFilterRange = $pSheet->getAutoFilter()->getRange();
     if (!empty($autoFilterRange)) {
         $objWriter->startElement('definedName');
         $objWriter->writeAttribute('name', '_xlnm._FilterDatabase');
         $objWriter->writeAttribute('localSheetId', $pSheetId);
         $objWriter->writeAttribute('hidden', '1');
         // Create absolute coordinate and write as raw text
         $range = \PHPExcel\Cell::splitRange($autoFilterRange);
         $range = $range[0];
         //    Strip any worksheet ref so we can make the cell ref absolute
         if (strpos($range[0], '!') !== false) {
             list($ws, $range[0]) = explode('!', $range[0]);
         }
         $range[0] = \PHPExcel\Cell::absoluteCoordinate($range[0]);
         $range[1] = \PHPExcel\Cell::absoluteCoordinate($range[1]);
         $range = implode(':', $range);
         $objWriter->writeRawData('\'' . str_replace("'", "''", $pSheet->getTitle()) . '\'!' . $range);
         $objWriter->endElement();
     }
 }
Example #3
0
 /**
  * Write AutoFilter
  *
  * @param    \PHPExcel\Shared\XMLWriter                $objWriter        XML Writer
  * @param    \PHPExcel\Worksheet                        $pSheet            Worksheet
  * @throws    \PHPExcel\Writer\Exception
  */
 private function writeAutoFilter(\PHPExcel\Shared\XMLWriter $objWriter = null, \PHPExcel\Worksheet $pSheet = null)
 {
     $autoFilterRange = $pSheet->getAutoFilter()->getRange();
     if (!empty($autoFilterRange)) {
         // autoFilter
         $objWriter->startElement('autoFilter');
         // Strip any worksheet reference from the filter coordinates
         $range = \PHPExcel\Cell::splitRange($autoFilterRange);
         $range = $range[0];
         //    Strip any worksheet ref
         if (strpos($range[0], '!') !== false) {
             list($ws, $range[0]) = explode('!', $range[0]);
         }
         $range = implode(':', $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));
                     $objWriter->startElement($column->getFilterType());
                     if ($column->getJoin() == \PHPExcel\Worksheet\AutoFilter\Column::AUTOFILTER_COLUMN_JOIN_AND) {
                         $objWriter->writeAttribute('and', 1);
                     }
                     foreach ($rules as $rule) {
                         if ($column->getFilterType() === \PHPExcel\Worksheet\AutoFilter\Column::AUTOFILTER_FILTERTYPE_FILTER && $rule->getOperator() === \PHPExcel\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_EQUAL && $rule->getValue() === '') {
                             //    Filter rule for Blanks
                             $objWriter->writeAttribute('blank', 1);
                         } elseif ($rule->getRuleType() === \PHPExcel\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) {
                             //    Dynamic Filter Rule
                             $objWriter->writeAttribute('type', $rule->getGrouping());
                             $val = $column->getAttribute('val');
                             if ($val !== null) {
                                 $objWriter->writeAttribute('val', $val);
                             }
                             $maxVal = $column->getAttribute('maxVal');
                             if ($maxVal !== null) {
                                 $objWriter->writeAttribute('maxVal', $maxVal);
                             }
                         } elseif ($rule->getRuleType() === \PHPExcel\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_TOPTENFILTER) {
                             //    Top 10 Filter Rule
                             $objWriter->writeAttribute('val', $rule->getValue());
                             $objWriter->writeAttribute('percent', $rule->getOperator() === \PHPExcel\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT ? '1' : '0');
                             $objWriter->writeAttribute('top', $rule->getGrouping() === \PHPExcel\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP ? '1' : '0');
                         } else {
                             //    Filter, DateGroupItem or CustomFilter
                             $objWriter->startElement($rule->getRuleType());
                             if ($rule->getOperator() !== \PHPExcel\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_EQUAL) {
                                 $objWriter->writeAttribute('operator', $rule->getOperator());
                             }
                             if ($rule->getRuleType() === \PHPExcel\Worksheet\AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_DATEGROUP) {
                                 // Date Group filters
                                 foreach ($rule->getValue() as $key => $value) {
                                     if ($value > '') {
                                         $objWriter->writeAttribute($key, $value);
                                     }
                                 }
                                 $objWriter->writeAttribute('dateTimeGrouping', $rule->getGrouping());
                             } else {
                                 $objWriter->writeAttribute('val', $rule->getValue());
                             }
                             $objWriter->endElement();
                         }
                     }
                     $objWriter->endElement();
                     $objWriter->endElement();
                 }
             }
         }
         $objWriter->endElement();
     }
 }