{"record":{"id":"ad82b1f541f18056","repo":"iOfficeAI/OfficeCLI","slug":"sheet-rangesheetname-has-no-data","errorCode":null,"errorMessage":"Sheet '{rangeSheetName}' 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":449,"sourceCode":"        }\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.\n        var cellLookup = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);\n        var cellTypeLookup = new Dictionary<string, Cell>(StringComparer.OrdinalIgnoreCase);\n        var cellPresent = new HashSet<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            {\n                if (cell.CellReference?.Value != null)\n                {\n                    cellLookup[cell.CellReference.Value] = GetCellDisplayValue(cell);","sourceCodeStart":431,"sourceCodeEnd":467,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs#L431-L467","documentation":"After resolving the sheet for the chart data range, ParseDataRangeForChart reads GetSheet(ws).GetFirstChild<SheetData>(); if that element is absent (a worksheet with no <sheetData> child at all) it throws. A sheet that merely has empty rows still carries a <sheetData/>, so this specifically means the element is missing -- e.g. a freshly added sheet never written to.","triggerScenarios":"AddSheet then immediately AddChart before writing any cells; charting against a template sheet whose sheetData was stripped; pointing dataRange at a brand-new empty sheet.","commonSituations":"Programmatic creation ordering (sheet created but not populated); importing a skeleton workbook with placeholder sheets.","solutions":["Write data to the sheet first, then add the chart.","Point dataRange at a populated sheet.","Confirm the sheet has a SheetData element / at least one row before charting."],"exampleFix":"// before\nhandler.AddSheet(\"Chart1\");\nhandler.AddChart(\"Chart1\", dataRange: \"Chart1!A1:D5\"); // no sheetData -> throw\n\n// after\nhandler.AddSheet(\"Chart1\");\nhandler.Set(\"/Chart1/A1\", \"Q1\"); // forces <sheetData> to exist\nhandler.AddChart(\"Chart1\", dataRange: \"Chart1!A1:D5\");","handlingStrategy":"validation","validationCode":"// Ensure the data sheet is populated before charting.\nif (!handler.SheetHasData(dataSheetName)) // your helper: presence of <sheetData>\n    throw new InvalidOperationException($\"Write data to '{dataSheetName}' before adding a chart.\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always write cells to a sheet before adding a chart that reads it.","Confirm a <sheetData> element exists / at least one row is present.","Order operations: AddSheet -> write data -> AddChart."],"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"}