{"record":{"id":"2f2f47a2fea8579c","repo":"iOfficeAI/OfficeCLI","slug":"invalid-sheet-name-name-length-name-length","errorCode":null,"errorMessage":"Invalid sheet name '{name}': length {name.Length} exceeds Excel's 31-char limit.","messagePattern":"Invalid sheet name '(.+?)': length (.+?) exceeds Excel's 31-char limit\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/officecli/Handlers/Excel/ExcelHandler.Helpers.Validation.cs","lineNumber":324,"sourceCode":"            // Column index check: ColumnNameToIndex would throw on overflow,\n            // but we want a clean validation message. Compute manually.\n            int colIdx = 0;\n            foreach (var ch in col) colIdx = colIdx * 26 + (ch - 'A' + 1);\n            if (colIdx < 1 || colIdx > 16384 || row < 1 || row > 1048576)\n            {\n                throw new ArgumentException(\n                    $\"Formula contains out-of-range cell reference '{m.Value}'. \" +\n                    \"Excel limits: rows 1-1048576, columns A-XFD.\");\n            }\n        }\n    }\n\n    internal static void ValidateSheetName(string name)\n    {\n        if (string.IsNullOrWhiteSpace(name))\n            throw new ArgumentException(\"Invalid sheet name: name cannot be empty or whitespace.\");\n        if (name.Length > 31)\n            throw new ArgumentException(\n                $\"Invalid sheet name '{name}': length {name.Length} exceeds Excel's 31-char limit.\");\n        var forbidden = new[] { '\\\\', '/', '?', '*', ':', '[', ']' };\n        var hit = name.IndexOfAny(forbidden);\n        if (hit >= 0)\n            throw new ArgumentException(\n                $\"Invalid sheet name '{name}': contains forbidden character '{name[hit]}'. Excel rejects any of: \\\\ / ? * : [ ]\");\n        if (name.StartsWith('\\'') || name.EndsWith('\\''))\n            throw new ArgumentException(\n                $\"Invalid sheet name '{name}': cannot start or end with an apostrophe (').\");\n        if (name.Equals(\"History\", StringComparison.OrdinalIgnoreCase))\n            throw new ArgumentException(\n                \"Invalid sheet name 'History': reserved by Excel for the change-history sheet.\");\n    }\n\n    /// <summary>\n    /// R35-3: cross-workbook cell formulas like \"=[Other.xlsx]Sheet1!A1\" or\n    /// \"=[1]Sheet1!A1\" need an externalLinks part to resolve. Without one,\n    /// Excel opens the file but the formula shows #REF!. Reject up-front","sourceCodeStart":306,"sourceCodeEnd":342,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Handlers/Excel/ExcelHandler.Helpers.Validation.cs#L306-L342","documentation":"Excel caps worksheet names at 31 characters. The library enforces this at validation time (name.Length > 31) so the resulting workbook can be opened by real Excel without a repair prompt. Longer names are a hard OOXML/schema constraint, not a soft preference.","triggerScenarios":"AddSheet or rename with a string longer than 31 chars. The length check runs after the empty/whitespace guard, so a 32+ char non-blank name trips here.","commonSituations":"User-supplied titles; auto-generated names from file metadata or headers; localized names that expanded in translation; concatenated identifiers.","solutions":["Truncate or abbreviate the name to <= 31 characters.","If the full name matters, store it in a cell or a custom property instead of the sheet tab.","Validate length at the UI boundary and show the limit to the user."],"exampleFix":"// before\nwb.AddSheet(\"Quarterly Financial Summary by Region and Product Line 2026\");\n\n// after\nvar name = longName.Length > 31 ? longName.Substring(0, 31) : longName;\nwb.AddSheet(name);","handlingStrategy":"validation","validationCode":"const int MaxSheetNameLen = 31;\nstatic string ClampSheetName(string n) =>\n    n.Length <= MaxSheetNameLen ? n : n.Substring(0, MaxSheetNameLen);","typeGuard":null,"tryCatchPattern":"try { wb.AddSheet(name); }\ncatch (ArgumentException ex) when (ex.Message.Contains(\"31-char limit\")) {\n    wb.AddSheet(name.Substring(0, 31));\n}","preventionTips":["Show the 31-char limit in the UI input field.","Truncate user titles before they reach the workbook API."],"tags":["excel","sheet-name","validation","limits"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}