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

  1. Pass a full cell range such as 'A1:F20'
  2. Derive it from actual content: $sheet->getAutoFilter()->setRange($sheet->calculateWorksheetDimension())
  3. 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

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


AI-assisted analysis of PHPOffice/PhpSpreadsheet@65b080eef4 (2026-08-17). Data as JSON: /api/errors/1e139aa17d718932. Report an issue: GitHub.