{"record":{"id":"1e139aa17d718932","repo":"PHPOffice/PhpSpreadsheet","slug":"range-is-an-invalid-range-for-autofilter","errorCode":null,"errorMessage":"{$range} is an invalid range for AutoFilter","messagePattern":"(.+?) is an invalid range for AutoFilter","errorType":"exception","errorClass":"PhpOffice\\PhpSpreadsheet\\Exception","httpStatus":null,"severity":"error","filePath":"src/PhpSpreadsheet/Worksheet/AutoFilter.php","lineNumber":129,"sourceCode":"     */\n    public function setRange(AddressRange|string|array $range = ''): self\n    {\n        $this->evaluated = false;\n        // extract coordinate\n        if ($range !== '') {\n            [, $range] = Worksheet::extractSheetTitle(Validations::validateCellRange($range), true);\n        }\n\n        if (empty($range)) {\n            //    Discard all column rules\n            $this->columns = [];\n            $this->range = '';\n\n            return $this;\n        }\n\n        if (ctype_digit($range) || ctype_alpha($range)) {\n            throw new Exception(\"{$range} is an invalid range for AutoFilter\");\n        }\n\n        $this->range = $range;\n        //    Discard any column rules that are no longer valid within this range\n        [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($this->range);\n        foreach ($this->columns as $key => $value) {\n            $colIndex = Coordinate::columnIndexFromString($key);\n            if (($rangeStart[0] > $colIndex) || ($rangeEnd[0] < $colIndex)) {\n                unset($this->columns[$key]);\n            }\n        }\n\n        return $this;\n    }\n\n    public function setRangeToMaxRow(): self\n    {\n        $this->evaluated = false;","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/PHPOffice/PhpSpreadsheet/blob/65b080eef4d9fd11a5796135ab145883e5c3d6a6/src/PhpSpreadsheet/Worksheet/AutoFilter.php#L111-L147","documentation":"AutoFilter::setRange() normalizes the incoming reference and rejects values that are purely numeric ('5', a row-only reference) or purely alphabetic ('A', a column-only reference). An AutoFilter spans a two-dimensional cell range, so single-axis references are invalid.","triggerScenarios":"$sheet->getAutoFilter()->setRange('A'), setRange('1') or setRange('123') — typically produced when code builds the range from a single column letter or row number variable.","commonSituations":"Deriving the filter range from one axis (e.g. 'A' . $row) instead of a full 'A1:C10' string; incorrectly trimming a user-supplied range.","solutions":["Pass a full cell range such as 'A1:F20'","Derive it from actual content: $sheet->getAutoFilter()->setRange($sheet->calculateWorksheetDimension())","Pre-validate the range shape (must contain both digits and letters) before calling setRange"],"exampleFix":"// before\n$sheet->getAutoFilter()->setRange('A');\n\n// after\n$sheet->getAutoFilter()->setRange($sheet->calculateWorksheetDimension()); // e.g. 'A1:F20'","handlingStrategy":"validation","validationCode":"if (!preg_match('/[a-z]/i', $range) || !preg_match('/\\d/', $range)) {\n    throw new InvalidArgumentException(\"AutoFilter range needs both column and row: '$range'\");\n}\n$autoFilter->setRange($range);","typeGuard":"function isFullCellRange(string $range): bool\n{\n    return preg_match('/[a-z]/i', $range) === 1 && preg_match('/\\d/', $range) === 1;\n}","tryCatchPattern":"try {\n    $autoFilter->setRange($range);\n} catch (\\PhpOffice\\PhpSpreadsheet\\Exception $e) {\n    $autoFilter->setRange($sheet->calculateWorksheetDimension());\n}","preventionTips":["Always derive the range from calculateWorksheetDimension() for data-driven sheets","Never pass a bare column letter or row number to setRange"],"tags":["autofilter","range","validation","worksheet","phpspreadsheet"],"backgroundTag":"invalid-range","analyzedSha":"65b080eef4d9fd11a5796135ab145883e5c3d6a6","analyzedAt":"2026-08-17T05:40:41.646Z","schemaVersion":2},"datasetVersion":"2026-08-17T09:17:11.063Z"}