PHPOffice/PhpSpreadsheet · error · PhpOffice\PhpSpreadsheet\Exception
{$range} is an invalid range for AutoFilter
Error message
{$range} is an invalid range for AutoFilter What it means
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.
Source
Thrown at src/PhpSpreadsheet/Worksheet/AutoFilter.php:129
*/
public function setRange(AddressRange|string|array $range = ''): self
{
$this->evaluated = false;
// extract coordinate
if ($range !== '') {
[, $range] = Worksheet::extractSheetTitle(Validations::validateCellRange($range), true);
}
if (empty($range)) {
// Discard all column rules
$this->columns = [];
$this->range = '';
return $this;
}
if (ctype_digit($range) || ctype_alpha($range)) {
throw new Exception("{$range} is an invalid range for AutoFilter");
}
$this->range = $range;
// Discard any column rules that are no longer valid within this range
[$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($this->range);
foreach ($this->columns as $key => $value) {
$colIndex = Coordinate::columnIndexFromString($key);
if (($rangeStart[0] > $colIndex) || ($rangeEnd[0] < $colIndex)) {
unset($this->columns[$key]);
}
}
return $this;
}
public function setRangeToMaxRow(): self
{
$this->evaluated = false;View on GitHub (pinned to 65b080eef4)
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
Example fix
// before
$sheet->getAutoFilter()->setRange('A');
// after
$sheet->getAutoFilter()->setRange($sheet->calculateWorksheetDimension()); // e.g. 'A1:F20' Defensive patterns
Strategy: validation
Validate before calling
if (!preg_match('/[a-z]/i', $range) || !preg_match('/\d/', $range)) {
throw new InvalidArgumentException("AutoFilter range needs both column and row: '$range'");
}
$autoFilter->setRange($range); Type guard
function isFullCellRange(string $range): bool
{
return preg_match('/[a-z]/i', $range) === 1 && preg_match('/\d/', $range) === 1;
} Try / catch
try {
$autoFilter->setRange($range);
} catch (\PhpOffice\PhpSpreadsheet\Exception $e) {
$autoFilter->setRange($sheet->calculateWorksheetDimension());
} Prevention
- Always derive the range from calculateWorksheetDimension() for data-driven sheets
- Never pass a bare column letter or row number to setRange
When it happens
Trigger: $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.
Common situations: Deriving the filter range from one axis (e.g. 'A' . $row) instead of a full 'A1:C10' string; incorrectly trimming a user-supplied range.
Related errors
- No autofilter range is defined.
- Tab ratio must be between 0 and 1000.
- Text rotation {$angleInDegrees} should be a value between -9
- Invalid Worksheet for specified Range
- Column is outside of current autofilter range.
AI-assisted analysis of PHPOffice/PhpSpreadsheet@65b080eef4 (2026-08-17).
Data as JSON: /api/errors/1e139aa17d718932.
Report an issue: GitHub.