{"record":{"id":"74cd191b9b5760b9","repo":"iOfficeAI/OfficeCLI","slug":"invalid-datarange-datarange-expected-format","errorCode":null,"errorMessage":"Invalid dataRange: '{dataRange}'. Expected format: 'Sheet1!A1:D5', 'A1:B3', or a defined-name","messagePattern":"Invalid dataRange: '(.+?)'\\. Expected format: 'Sheet1!A1:D5', 'A1:B3', or a defined-name","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs","lineNumber":437,"sourceCode":"                throw new ArgumentException($\"DefinedName '{trimmedInput}' not found\");\n            dataRange = match.Text!;\n        }\n\n        // Parse sheet name and range\n        string rangeSheetName = defaultSheetName;\n        string rangePart = dataRange.Trim();\n        var bangIdx = rangePart.IndexOf('!');\n        if (bangIdx >= 0)\n        {\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.","sourceCodeStart":419,"sourceCodeEnd":455,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs#L419-L455","documentation":"After optional defined-name resolution, ParseDataRangeForChart strips '$' and splits the range on ':'; if it is not exactly two parts it throws. This catches ranges with no colon (single cell) or extra colons, and also covers a resolved defined-name whose referent is a single cell or malformed. A well-formed 'Sheet1!$A$1:$B$2' is fine because '$' is removed first.","triggerScenarios":"dataRange=A1 (single cell, cannot form series); dataRange=A1:B2:C3; a defined name pointing at a single cell like A1.","commonSituations":"Passing a single cell as chart data; copy-paste introducing an extra colon; defined-name referent collapsed to one cell.","solutions":["Use a real two-dimensional range 'A1:D5'.","Fix the defined name so its referent is a proper range.","Ensure the range string has exactly one ':' after '$' stripping.","Validate the shape before calling AddChart."],"exampleFix":"// before\nprops[\"dataRange\"] = \"Sheet1!A1\";  // single cell -> throw\n\n// after\nprops[\"dataRange\"] = \"Sheet1!A1:D5\";","handlingStrategy":"validation","validationCode":"static bool IsTwoAnchorRange(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 (!IsTwoAnchorRange(dataRange))\n    throw new ArgumentException($\"dataRange must be a two-anchor range: {dataRange}\");","typeGuard":"static bool IsTwoAnchorRange(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 real two-dimensional range, not a single cell, as chart data.","Ensure defined-name referents are proper ranges.","Strip '$' in your own validation to mirror the parser.","Guard against extra colons from concatenation."],"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"}