{"record":{"id":"b67a62c800c49ca4","repo":"PHPOffice/PhpSpreadsheet","slug":"sheet-worksheetname-does-not-exist","errorCode":null,"errorMessage":"Sheet {$worksheetName} does not exist.","messagePattern":"Sheet (.+?) does not exist\\.","errorType":"exception","errorClass":"PhpOffice\\PhpSpreadsheet\\Exception","httpStatus":null,"severity":"error","filePath":"src/PhpSpreadsheet/Spreadsheet.php","lineNumber":742,"sourceCode":"    {\n        $trimWorksheetName = StringHelper::strToUpper(trim($worksheetName, \"'\"));\n        foreach ($this->workSheetCollection as $worksheet) {\n            if (StringHelper::strToUpper($worksheet->getTitle()) === $trimWorksheetName) {\n                return $worksheet;\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Get sheet by name, throwing exception if not found.\n     */\n    public function getSheetByNameOrThrow(string $worksheetName): Worksheet\n    {\n        $worksheet = $this->getSheetByName($worksheetName);\n        if ($worksheet === null) {\n            throw new Exception(\"Sheet $worksheetName does not exist.\");\n        }\n\n        return $worksheet;\n    }\n\n    /**\n     * Get index for sheet.\n     *\n     * @return int index\n     */\n    public function getIndex(Worksheet $worksheet, bool $noThrow = false): int\n    {\n        foreach ($this->workSheetCollection as $key => $value) {\n            if ($value === $worksheet) {\n                return $key;\n            }\n        }\n        if ($noThrow) {","sourceCodeStart":724,"sourceCodeEnd":760,"githubUrl":"https://github.com/PHPOffice/PhpSpreadsheet/blob/65b080eef4d9fd11a5796135ab145883e5c3d6a6/src/PhpSpreadsheet/Spreadsheet.php#L724-L760","documentation":"Spreadsheet::getSheetByNameOrThrow() is the throwing variant of getSheetByName(): it looks a worksheet up by title and throws when the workbook has no sheet with that name (the non-throwing twin returns null). Lookup is case-insensitive on title, but the name must otherwise match exactly, including any whitespace.","triggerScenarios":"getSheetByNameOrThrow('Summary') when the sheet is titled 'Summary ' (trailing space), 'SUMMARY report', or was renamed by earlier code; reading a fixed name like 'Sheet1' from a file whose tabs were renamed; names built from user input or column values with hidden characters (newline, non-breaking space).","commonSituations":"Hard-coded sheet names versus user-maintained spreadsheets; names assembled dynamically (e.g. \"Week {$week}\") where the computed string does not match the tab; files where Excel stored the title with surrounding whitespace; locale/case differences after a file round-trip.","solutions":["List what actually exists: var_export($spreadsheet->getSheetNames()); and compare the exact strings (use var_dump to reveal whitespace).","Check first with $spreadsheet->sheetNameExists($name) (case-insensitive) before the throwing call.","trim() and normalize user-supplied names before lookup.","If absence is expected, use the non-throwing $spreadsheet->getSheetByName($name) and handle null yourself."],"exampleFix":"// before\n$sheet = $spreadsheet->getSheetByNameOrThrow('Summary'); // throws\n\n// after\n$name = trim($request->get('sheet'));\n$sheet = $spreadsheet->getSheetByName($name)\n    ?? $spreadsheet->getSheetByNameOrThrow($spreadsheet->getSheetNames()[0]);","handlingStrategy":"validation","validationCode":"$name = trim($name);\nif (!$spreadsheet->sheetNameExists($name)) {\n    throw new \\InvalidArgumentException(\"Unknown sheet '$name'. Available: \" . implode(', ', $spreadsheet->getSheetNames()));\n}\n$sheet = $spreadsheet->getSheetByNameOrThrow($name);","typeGuard":"function sheetNameIsKnown(\\PhpOffice\\PhpSpreadsheet\\Spreadsheet $s, string $name): bool\n{\n    return $s->sheetNameExists(trim($name));\n}","tryCatchPattern":"try {\n    $sheet = $spreadsheet->getSheetByNameOrThrow($name);\n} catch (\\PhpOffice\\PhpSpreadsheet\\Exception $e) {\n    // fall back to first tab, or surface available names to the caller\n    $sheet = $spreadsheet->getSheet(0);\n}","preventionTips":["trim() and normalize names from user input before lookup.","Log getSheetNames() alongside failures to reveal whitespace/case drift.","Use getSheetByName() + null check when absence is a normal path."],"tags":["worksheet","sheet-not-found","lookup-by-name","phpspreadsheet"],"backgroundTag":"sheet-not-found","analyzedSha":"65b080eef4d9fd11a5796135ab145883e5c3d6a6","analyzedAt":"2026-08-17T05:40:41.646Z","schemaVersion":2},"datasetVersion":"2026-08-17T09:17:11.063Z"}