{"record":{"id":"650807ad9ebdd47f","repo":"iOfficeAI/OfficeCLI","slug":"invalid-sparkline-range-range-expected-an-a1","errorCode":null,"errorMessage":"Invalid sparkline range '{range}'. Expected an A1 range like A1:E1 (optionally sheet-qualified).","messagePattern":"Invalid sparkline range '(.+?)'\\. Expected an A1 range like A1:E1 \\(optionally sheet-qualified\\)\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/officecli/Handlers/Excel/ExcelHandler.Helpers.Validation.cs","lineNumber":594,"sourceCode":"    private static readonly System.Text.RegularExpressions.Regex CanonicalNumericLiteral =\n        new(@\"^-?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$\", System.Text.RegularExpressions.RegexOptions.Compiled);\n\n    internal static bool IsCanonicalNumericText(string text) => CanonicalNumericLiteral.IsMatch(text);\n\n    /// <summary>Shape-check a sparkline data range (\"A1:E1\" or\n    /// \"Sheet1!A1:E1\", whole rows/cols allowed). Arbitrary strings written\n    /// into &lt;xne:f&gt; make real Excel refuse the file while schema\n    /// validation stays green.</summary>\n    internal static void ValidateSparklineRange(string range)\n    {\n        var r = (range ?? \"\").Trim();\n        var bang = r.LastIndexOf('!');\n        if (bang >= 0) r = r[(bang + 1)..];\n        r = r.Replace(\"$\", \"\");\n        var ok = r.Length > 0 && r.Split(':').All(tok =>\n            System.Text.RegularExpressions.Regex.IsMatch(tok.Trim(), @\"^([A-Za-z]{1,3}\\d+|[A-Za-z]{1,3}|\\d+)$\"));\n        if (!ok)\n            throw new ArgumentException(\n                $\"Invalid sparkline range '{range}'. Expected an A1 range like A1:E1 (optionally sheet-qualified).\");\n        // Grid-bounds check, same family as ValidateSqref: shape-valid B0 or\n        // A99999999 landed verbatim in <xne:f>. Excel tolerates rather than\n        // rejects these, but the sparkline is silently broken — tighten to\n        // the severity every other cell-ref entry point now enforces.\n        foreach (var tok in r.Split(':'))\n        {\n            var tm = System.Text.RegularExpressions.Regex.Match(tok.Trim(),\n                @\"^([A-Za-z]{1,3})?(\\d+)?$\");\n            if (tm.Groups[1].Success && tm.Groups[1].Value.Length > 0)\n            {\n                var colIdx = ColumnNameToIndex(tm.Groups[1].Value.ToUpperInvariant());\n                if (colIdx < 1 || colIdx > 16384)\n                    throw new ArgumentException(\n                        $\"Invalid sparkline range '{range}': column '{tm.Groups[1].Value}' is outside Excel's grid (A..XFD).\");\n            }\n            if (tm.Groups[2].Success && tm.Groups[2].Value.Length > 0\n                && (!long.TryParse(tm.Groups[2].Value, out var rowN) || rowN < 1 || rowN > 1048576))","sourceCodeStart":576,"sourceCodeEnd":612,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Handlers/Excel/ExcelHandler.Helpers.Validation.cs#L576-L612","documentation":"The sparkline range string is not a valid A1 range. After stripping an optional sheet qualifier and $ signs, each colon-separated token must match ^([A-Za-z]{1,3}\\d+|[A-Za-z]{1,3}|\\d+)$ — a cell (col+row), a column-only, or a row-only token. Arbitrary strings written into <xne:f> make real Excel refuse the file while schema validation stays green.","triggerScenarios":"Passing a sparkline range like 'foo', 'A1:B', '' (empty), 'A1:B2:C3', or '1:2:3'. The All(...) check over split tokens fails.","commonSituations":"Wrong input format from a UI; missing range; passing a named range where an A1 range is expected; localized separators.","solutions":["Pass a valid A1 range such as 'A1:E1' (optionally sheet-qualified like 'Sheet1!A1:E1').","Use whole-row ('1:5') or whole-column ('A:E') forms if appropriate.","Build the range from cell indices to avoid malformed tokens."],"exampleFix":"// before\nsheet.SetSparkline(\"F1\", location: \"F1\", data: \"A1 to E1\");\n\n// after\nsheet.SetSparkline(\"F1\", location: \"F1\", data: \"A1:E1\");","handlingStrategy":"validation","validationCode":"static readonly Regex SparklineTok =\n    new(@\"^([A-Za-z]{1,3}\\d+|[A-Za-z]{1,3}|\\d+)$\");\nstatic bool IsValidSparklineRange(string range) {\n    var r = (range ?? \"\").Trim();\n    var bang = r.LastIndexOf('!');\n    if (bang >= 0) r = r[(bang + 1)..];\n    r = r.Replace(\"$\", \"\");\n    return r.Length > 0 && r.Split(':').All(t => SparklineTok.IsMatch(t.Trim()));\n}","typeGuard":null,"tryCatchPattern":"try { sheet.SetSparkline(loc, data); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"Expected an A1 range\")) {\n    // re-derive the range from cell indices\n}","preventionTips":["Build sparkline ranges from start/end cell indices, not free text.","Strip sheet qualifiers and '$' only if you re-validate afterwards."],"tags":["excel","sparkline","cell-reference","validation"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}