iOfficeAI/OfficeCLI · error · ArgumentException

Sheet not found: {rangeSheetName}

Error message

Sheet not found: {rangeSheetName}

What it means

After splitting the sheet prefix off dataRange (e.g. 'Sheet1!A1:D5' -> sheet 'Sheet1'), ParseDataRangeForChart resolves the sheet via FindWorksheet and throws this terse 'Sheet not found' if it misses. Same resolution rules as the dump family (case-insensitive, sheet[N]/sheet[last] aliases). The message does not list available sheets.

Source

Thrown at src/officecli/Handlers/Excel/ExcelHandler.Helpers.Chart.cs:446

        {
            rangeSheetName = rangePart[..bangIdx].Trim('\'');
            rangePart = rangePart[(bangIdx + 1)..];
        }

        // Strip any $ signs for parsing
        var cleanRange = rangePart.Replace("$", "");
        var rangeParts = cleanRange.Split(':');
        if (rangeParts.Length != 2)
            throw new ArgumentException($"Invalid dataRange: '{dataRange}'. Expected format: 'Sheet1!A1:D5', 'A1:B3', or a defined-name");

        var (startCol, startRow) = ParseCellReference(rangeParts[0]);
        var (endCol, endRow) = ParseCellReference(rangeParts[1]);
        var startColIdx = ColumnNameToIndex(startCol);
        var endColIdx = ColumnNameToIndex(endCol);

        // Find the worksheet and read cells
        var ws = FindWorksheet(rangeSheetName)
            ?? throw new ArgumentException($"Sheet not found: {rangeSheetName}");
        var sheetData = GetSheet(ws).GetFirstChild<SheetData>();
        if (sheetData == null)
            throw new ArgumentException($"Sheet '{rangeSheetName}' has no data");

        // Build cell lookup. Track value, the originating Cell (for DataType),
        // and a "is blank" flag for cells that exist but carry no value.
        // R20-03: blank-vs-zero distinction is needed for dispBlanksAs=gap.
        // R20-04: DataType drives header detection — only string-typed
        // first-row cells are treated as series names.
        var cellLookup = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
        var cellTypeLookup = new Dictionary<string, Cell>(StringComparer.OrdinalIgnoreCase);
        var cellPresent = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
        foreach (var row in sheetData.Elements<Row>())
        {
            var rowIdx = (int)(row.RowIndex?.Value ?? 0);
            if (rowIdx < startRow || rowIdx > endRow) continue;
            foreach (var cell in row.Elements<Cell>())
            {

View on GitHub (pinned to 1ced45e900)

Solutions

  1. Verify the sheet exists via GetDumpSheetNames() before adding the chart.
  2. Use a sheet[N]/sheet[last] alias if you only know the position.
  3. Fix the defined name's referent to point at an existing sheet.
  4. Re-author the dataRange against the current sheet name.

Example fix

// before
props["dataRange"] = "OldData!A1:D5";  // 'OldData' renamed -> throw

// after
props["dataRange"] = "Sales!A1:D5";  // current name
// or use the positional alias:
props["dataRange"] = "sheet[1]!A1:D5";
Defensive patterns

Strategy: validation

Validate before calling

var sheet = dataRange.Contains('!') ? dataRange[..dataRange.IndexOf('!')].Trim('\'') : defaultSheet;
if (!handler.GetDumpSheetNames().Contains(sheet, StringComparer.OrdinalIgnoreCase))
    throw new ArgumentException($"Chart dataRange sheet '{sheet}' does not exist");

Prevention

When it happens

Trigger: dataRange=NoSuchSheet!A1:D5; a defined name whose referent points at a renamed or deleted sheet.

Common situations: Sheet renamed after the chart was authored; defined-name referent left stale after sheet deletion; typo in the sheet prefix.

Related errors


AI-assisted analysis of iOfficeAI/OfficeCLI@1ced45e900 (2026-08-13). Data as JSON: /api/errors/010a26bc84069fbf. Report an issue: GitHub.