{"record":{"id":"b3d330153e2457ac","repo":"iOfficeAI/OfficeCLI","slug":"invalid-categories-range-explicitvalue-expec","errorCode":null,"errorMessage":"Invalid categories range: '{explicitValue}'. Expected format: 'Sheet1!A2:A3' or 'A2:A3'.","messagePattern":"Invalid categories range: '(.+?)'\\. Expected format: 'Sheet1!A2:A3' or 'A2:A3'\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs","lineNumber":653,"sourceCode":"        {\n            var inline = ChartHelper.ParseCategories(properties) ?? Array.Empty<string>();\n            return (inline, null);\n        }\n\n        // Cell range form. Strip a leading 'Sheet'! prefix (same approach as dataRange).\n        string catSheetName = defaultSheetName;\n        string rangePart = trimmed;\n        var bangIdx = rangePart.IndexOf('!');\n        if (bangIdx >= 0)\n        {\n            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;","sourceCodeStart":635,"sourceCodeEnd":671,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs#L635-L671","documentation":"Same colon-split validation as the data range, but applied to the explicit categories reference. After '$' stripping the categories ref must split into exactly two parts, else it throws. Fires from the categories-parsing branch when an explicit categories ref is supplied.","triggerScenarios":"categories=A2 (single cell); categories=Sheet1!A2:A3:A4 (extra colon); categories built by concatenation that lost an anchor.","commonSituations":"Categories passed as a single cell ref where a range is required; overflow range from a selection; stray colon from manual editing.","solutions":["Pass a two-cell range 'A2:A3'.","Omit the categories property to let the chart use default series-axis categories.","Validate the string has exactly one ':' before calling.","Trim whitespace from the categories ref."],"exampleFix":"// before\nprops[\"categories\"] = \"Sheet1!A2\";  // single cell -> throw\n\n// after\nprops[\"categories\"] = \"Sheet1!A2:A10\";\n// or omit to use defaults","handlingStrategy":"validation","validationCode":"static bool IsTwoAnchorCats(string r)\n{\n    var bang = r.IndexOf('!');\n    var body = bang >= 0 ? r[(bang+1)..] : r;\n    return body.Replace(\"$\",\"\").Split(':') is { Length: 2 };\n}\n\nif (!string.IsNullOrEmpty(cats) && !IsTwoAnchorCats(cats))\n    throw new ArgumentException($\"categories must be a two-anchor range: {cats}\");","typeGuard":"static bool IsTwoAnchorCats(string r)\n{\n    var bang = r.IndexOf('!');\n    var body = bang >= 0 ? r[(bang+1)..] : r;\n    return body.Replace(\"$\",\"\").Split(':').Length == 2;\n}","tryCatchPattern":null,"preventionTips":["Pass a two-cell range for categories, or omit to use defaults.","Validate exactly one colon after stripping '$' and the sheet prefix.","Avoid single-cell or multi-colon categories refs."],"tags":["excel","ooxml","chart","range","validation"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}