{"record":{"id":"010a26bc84069fbf","repo":"iOfficeAI/OfficeCLI","slug":"sheet-not-found-rangesheetname","errorCode":null,"errorMessage":"Sheet not found: {rangeSheetName}","messagePattern":"Sheet not found: (.+?)","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs","lineNumber":446,"sourceCode":"        {\n            rangeSheetName = rangePart[..bangIdx].Trim('\\'');\n            rangePart = rangePart[(bangIdx + 1)..];\n        }\n\n        // Strip any $ signs for parsing\n        var cleanRange = rangePart.Replace(\"$\", \"\");\n        var rangeParts = cleanRange.Split(':');\n        if (rangeParts.Length != 2)\n            throw new ArgumentException($\"Invalid dataRange: '{dataRange}'. Expected format: 'Sheet1!A1:D5', 'A1:B3', or a defined-name\");\n\n        var (startCol, startRow) = ParseCellReference(rangeParts[0]);\n        var (endCol, endRow) = ParseCellReference(rangeParts[1]);\n        var startColIdx = ColumnNameToIndex(startCol);\n        var endColIdx = ColumnNameToIndex(endCol);\n\n        // Find the worksheet and read cells\n        var ws = FindWorksheet(rangeSheetName)\n            ?? throw new ArgumentException($\"Sheet not found: {rangeSheetName}\");\n        var sheetData = GetSheet(ws).GetFirstChild<SheetData>();\n        if (sheetData == null)\n            throw new ArgumentException($\"Sheet '{rangeSheetName}' has no data\");\n\n        // Build cell lookup. Track value, the originating Cell (for DataType),\n        // and a \"is blank\" flag for cells that exist but carry no value.\n        // R20-03: blank-vs-zero distinction is needed for dispBlanksAs=gap.\n        // R20-04: DataType drives header detection — only string-typed\n        // first-row cells are treated as series names.\n        var cellLookup = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);\n        var cellTypeLookup = new Dictionary<string, Cell>(StringComparer.OrdinalIgnoreCase);\n        var cellPresent = new HashSet<string>(StringComparer.OrdinalIgnoreCase);\n        foreach (var row in sheetData.Elements<Row>())\n        {\n            var rowIdx = (int)(row.RowIndex?.Value ?? 0);\n            if (rowIdx < startRow || rowIdx > endRow) continue;\n            foreach (var cell in row.Elements<Cell>())\n            {","sourceCodeStart":428,"sourceCodeEnd":464,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs#L428-L464","documentation":"After splitting the sheet prefix off dataRange (e.g. 'Sheet1!A1:D5' -> sheet 'Sheet1'), ParseDataRangeForChart resolves the sheet via FindWorksheet and throws this terse 'Sheet not found' if it misses. Same resolution rules as the dump family (case-insensitive, sheet[N]/sheet[last] aliases). The message does not list available sheets.","triggerScenarios":"dataRange=NoSuchSheet!A1:D5; a defined name whose referent points at a renamed or deleted sheet.","commonSituations":"Sheet renamed after the chart was authored; defined-name referent left stale after sheet deletion; typo in the sheet prefix.","solutions":["Verify the sheet exists via GetDumpSheetNames() before adding the chart.","Use a sheet[N]/sheet[last] alias if you only know the position.","Fix the defined name's referent to point at an existing sheet.","Re-author the dataRange against the current sheet name."],"exampleFix":"// before\nprops[\"dataRange\"] = \"OldData!A1:D5\";  // 'OldData' renamed -> throw\n\n// after\nprops[\"dataRange\"] = \"Sales!A1:D5\";  // current name\n// or use the positional alias:\nprops[\"dataRange\"] = \"sheet[1]!A1:D5\";","handlingStrategy":"validation","validationCode":"var sheet = dataRange.Contains('!') ? dataRange[..dataRange.IndexOf('!')].Trim('\\'') : defaultSheet;\nif (!handler.GetDumpSheetNames().Contains(sheet, StringComparer.OrdinalIgnoreCase))\n    throw new ArgumentException($\"Chart dataRange sheet '{sheet}' does not exist\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Verify the dataRange sheet exists before AddChart.","Use a positional alias when only the index is known.","Re-author defined-name referents after renaming/deleting sheets."],"tags":["excel","ooxml","chart","sheets","validation"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}