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
- Verify the sheet exists via GetDumpSheetNames() before adding the chart.
- Use a sheet[N]/sheet[last] alias if you only know the position.
- Fix the defined name's referent to point at an existing sheet.
- 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
- Verify the dataRange sheet exists before AddChart.
- Use a positional alias when only the index is known.
- Re-author defined-name referents after renaming/deleting sheets.
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
- Sheet '{rangeSheetName}' has no data
- Sheet not found: {catSheetName}
- Sheet '{catSheetName}' has no data
- DefinedName '{trimmedInput}' not found
- Invalid dataRange: '{dataRange}'. Expected format: 'Sheet1!A
AI-assisted analysis of iOfficeAI/OfficeCLI@1ced45e900 (2026-08-13).
Data as JSON: /api/errors/010a26bc84069fbf.
Report an issue: GitHub.