{"record":{"id":"fa3d6104d1004c10","repo":"iOfficeAI/OfficeCLI","slug":"definedname-trimmedinput-not-found","errorCode":null,"errorMessage":"DefinedName '{trimmedInput}' not found","messagePattern":"DefinedName '(.+?)' not found","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs","lineNumber":419,"sourceCode":"        string? ExplicitCategoriesRef);\n\n    private (List<(string name, double[] values)> seriesData, string[]? categories, ChartRangeGeometry geometry) ParseDataRangeForChart(\n        string dataRange, string defaultSheetName, Dictionary<string, string> properties)\n    {\n        // CONSISTENCY(defined-name-range): if dataRange has no '!' and no ':' and\n        // looks like a workbook-defined name, resolve it to its referent range\n        // (e.g. \"MyData\" -> \"Sheet1!$A$1:$B$3\"). Excel charts accept defined-name\n        // references as a data source, so do the same here.\n        var trimmedInput = dataRange.Trim();\n        if (!trimmedInput.Contains('!') && !trimmedInput.Contains(':') &&\n            System.Text.RegularExpressions.Regex.IsMatch(trimmedInput, @\"^[A-Za-z_][A-Za-z0-9_\\.]*$\"))\n        {\n            var workbook = _doc.WorkbookPart?.Workbook;\n            var defNames = workbook?.GetFirstChild<DefinedNames>();\n            var match = defNames?.Elements<DefinedName>()\n                .FirstOrDefault(dn => string.Equals(dn.Name?.Value, trimmedInput, StringComparison.OrdinalIgnoreCase));\n            if (match == null || string.IsNullOrEmpty(match.Text))\n                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\");","sourceCodeStart":401,"sourceCodeEnd":437,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs#L401-L437","documentation":"In chart data-range parsing (ParseDataRangeForChart), if dataRange has no '!' and no ':' and matches an identifier pattern, the parser tries to resolve it as a workbook DefinedName. If no DefinedName matches case-insensitively, or the match's text is empty, it throws. This is the 'use a named range as the chart source' convenience path; a literal range bypasses it.","triggerScenarios":"chart dataRange=MyData where no defined name 'MyData' exists in the workbook; dataRange=Sales2024 after the name was deleted.","commonSituations":"Name typo; scope mismatch (the name lives at worksheet scope on a different sheet); the defined name was deleted or never created; the name's referent text is empty.","solutions":["Provide a literal range 'Sheet1!A1:D5' instead of a name.","Create or fix the defined name in the workbook before referencing it.","Verify the name's spelling and scope (workbook vs worksheet).","Read DefinedNames first to confirm the name resolves to non-empty text."],"exampleFix":"// before\nprops[\"dataRange\"] = \"MyData\";  // no such defined name -> throw\n\n// after\nprops[\"dataRange\"] = \"Sheet1!A1:D5\";\n// or create the name in the workbook first, then keep \"MyData\"","handlingStrategy":"validation","validationCode":"// If dataRange looks like a name, confirm it resolves before charting.\nif (!dataRange.Contains('!') && !dataRange.Contains(':')\n    && Regex.IsMatch(dataRange, @\"^[A-Za-z_][A-Za-z0-9_\\.]*$\"))\n{\n    if (!handler.DefinedNameExists(dataRange)) // your helper\n        throw new ArgumentException($\"No defined name '{dataRange}'; pass a literal range instead.\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Prefer a literal 'Sheet!A1:D5' range over a name to avoid resolution failures.","Verify the defined name's spelling and scope (workbook vs worksheet) before use.","Confirm the name's referent is non-empty.","Re-create names deleted during workbook edits."],"tags":["excel","ooxml","chart","defined-name","validation"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}