{"record":{"id":"3f6cdb50d9b5b069","repo":"PHPOffice/PhpSpreadsheet","slug":"start-column-startcolumn-is-beyond-highest-co","errorCode":null,"errorMessage":"Start column ({$startColumn}) is beyond highest column ({$this->worksheet->getHighestColumn()})","messagePattern":"Start column \\((.+?)\\) is beyond highest column \\((.+?)\\)","errorType":"exception","errorClass":"PhpOffice\\PhpSpreadsheet\\Exception","httpStatus":null,"severity":"warning","filePath":"src/PhpSpreadsheet/Worksheet/ColumnIterator.php","lineNumber":69,"sourceCode":"     * Destructor.\n     */\n    public function __destruct()\n    {\n        unset($this->worksheet);\n    }\n\n    /**\n     * (Re)Set the start column and the current column pointer.\n     *\n     * @param string $startColumn The column address at which to start iterating\n     *\n     * @return $this\n     */\n    public function resetStart(string $startColumn = 'A'): static\n    {\n        $startColumnIndex = Coordinate::columnIndexFromString($startColumn);\n        if ($startColumnIndex > Coordinate::columnIndexFromString($this->worksheet->getHighestColumn())) {\n            throw new Exception(\n                \"Start column ({$startColumn}) is beyond highest column ({$this->worksheet->getHighestColumn()})\"\n            );\n        }\n\n        $this->startColumnIndex = $startColumnIndex;\n        if ($this->endColumnIndex < $this->startColumnIndex) {\n            $this->endColumnIndex = $this->startColumnIndex;\n        }\n        $this->seek($startColumn);\n\n        return $this;\n    }\n\n    /**\n     * (Re)Set the end column.\n     *\n     * @param ?string $endColumn The column address at which to stop iterating\n     *","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/PHPOffice/PhpSpreadsheet/blob/65b080eef4d9fd11a5796135ab145883e5c3d6a6/src/PhpSpreadsheet/Worksheet/ColumnIterator.php#L51-L87","documentation":"ColumnIterator::resetStart() converts the requested start column to a numeric index and compares it with the worksheet's highest column. A start column to the right of the highest used column leaves nothing to iterate, so it throws with both addresses in the message.","triggerScenarios":"$sheet->getColumnIterator()->resetStart('Z') on a sheet whose getHighestColumn() is 'D'; also resetStart() after content shrinks.","commonSituations":"Hard-coded start columns for sheets with varying widths; running column iteration after deleting columns or on freshly created empty sheets.","solutions":["Start at or before the highest column: $sheet->getColumnIterator('A') or pass a column within range","Derive the start dynamically: min of your desired column and $sheet->getHighestColumn() by index comparison","Guard with Coordinate::columnIndexFromString($start) <= Coordinate::columnIndexFromString($sheet->getHighestColumn())"],"exampleFix":"// before\n$iterator = $sheet->getColumnIterator()->resetStart('Z');\n\n// after\n$start = 'A';\nif (\\PhpOffice\\PhpSpreadsheet\\Cell\\Coordinate::columnIndexFromString('Z') <= \\PhpOffice\\PhpSpreadsheet\\Cell\\Coordinate::columnIndexFromString($sheet->getHighestColumn())) {\n    $start = 'Z';\n}\n$iterator = $sheet->getColumnIterator($start);","handlingStrategy":"validation","validationCode":"use PhpOffice\\PhpSpreadsheet\\Cell\\Coordinate;\n$maxIdx = Coordinate::columnIndexFromString($sheet->getHighestColumn());\n$wantIdx = Coordinate::columnIndexFromString($startColumn);\nif ($wantIdx > $maxIdx) {\n    $startColumn = 'A'; // or throw, depending on your policy\n}\n$iterator = $sheet->getColumnIterator($startColumn);","typeGuard":"function columnWithinSheet(\\PhpOffice\\PhpSpreadsheet\\Worksheet\\Worksheet $sheet, string $column): bool\n{\n    return \\PhpOffice\\PhpSpreadsheet\\Cell\\Coordinate::columnIndexFromString($column)\n        <= \\PhpOffice\\PhpSpreadsheet\\Cell\\Coordinate::columnIndexFromString($sheet->getHighestColumn());\n}","tryCatchPattern":"try {\n    $iterator->resetStart($startColumn);\n} catch (\\PhpOffice\\PhpSpreadsheet\\Exception $e) {\n    $iterator->resetStart('A');\n}","preventionTips":["Compare column indexes, not letters, when validating against getHighestColumn()","Recalculate start columns after deleting columns or loading different sheets"],"tags":["iterator","column","bounds","worksheet","phpspreadsheet"],"backgroundTag":"index-out-of-bounds","analyzedSha":"65b080eef4d9fd11a5796135ab145883e5c3d6a6","analyzedAt":"2026-08-17T05:40:41.646Z","schemaVersion":2},"datasetVersion":"2026-08-17T09:17:11.063Z"}