{"record":{"id":"48afe8829d042b93","repo":"iOfficeAI/OfficeCLI","slug":"sheet-catsheetname-has-no-data","errorCode":null,"errorMessage":"Sheet '{catSheetName}' has no data","messagePattern":"Sheet '(.+?)' has no data","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs","lineNumber":664,"sourceCode":"            catSheetName = rangePart[..bangIdx].Trim('\\'');\n            rangePart = rangePart[(bangIdx + 1)..];\n        }\n\n        var cleanRange = rangePart.Replace(\"$\", \"\");\n        var rangeParts = cleanRange.Split(':');\n        if (rangeParts.Length != 2)\n            throw new ArgumentException(\n                $\"Invalid categories range: '{explicitValue}'. Expected format: 'Sheet1!A2:A3' or 'A2:A3'.\");\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        var ws = FindWorksheet(catSheetName)\n            ?? throw new ArgumentException($\"Sheet not found: {catSheetName}\");\n        var sheetData = GetSheet(ws).GetFirstChild<SheetData>()\n            ?? throw new ArgumentException($\"Sheet '{catSheetName}' has no data\");\n\n        // Read the explicit-range cells directly (rows may differ from dataRange).\n        var lookup = new Dictionary<string, 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                if (cell.CellReference?.Value != null)\n                    lookup[cell.CellReference.Value] = GetCellDisplayValue(cell);\n        }\n\n        var labels = new List<string>();\n        for (int r = startRow; r <= endRow; r++)\n            for (int c = startColIdx; c <= endColIdx; c++)\n            {\n                var cellRef = $\"{IndexToColumnName(c)}{r}\";\n                lookup.TryGetValue(cellRef, out var v);","sourceCodeStart":646,"sourceCodeEnd":682,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs#L646-L682","documentation":"Same as error 672 but on the categories branch: after resolving the categories sheet, GetSheet(ws).GetFirstChild<SheetData>() is null, so the categories range cannot be read. Means the categories worksheet has no <sheetData> element at all.","triggerScenarios":"Pointing categories at a freshly added sheet that was never written to; categories ref on a stripped template sheet.","commonSituations":"Categories helper sheet created but not populated; wrong sheet chosen for categories.","solutions":["Populate the categories sheet before charting.","Omit explicit categories to use defaults.","Point categories at a sheet known to contain data."],"exampleFix":"// before\nhandler.AddSheet(\"Labels\");\nprops[\"categories\"] = \"Labels!A2:A10\";  // empty sheet -> throw\n\n// after\nhandler.Set(\"/Labels/A2\", \"Jan\");\nhandler.Set(\"/Labels/A3\", \"Feb\");\nprops[\"categories\"] = \"Labels!A2:A10\";","handlingStrategy":"validation","validationCode":"if (!handler.SheetHasData(catsSheetName)) // your helper\n    throw new InvalidOperationException($\"Populate '{catsSheetName}' before using it for categories.\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Populate the categories sheet before charting.","Omit explicit categories to use defaults when the sheet is empty.","Point categories at a sheet known to contain data."],"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"}