DocumentFormat.OpenXml生成多Sheet的xlsx文件报错:格式与扩展名不匹配
问题修复方案
该报错仅在多Sheet场景下出现,基本都是Sheet元数据配置不匹配导致的,可按以下优先级排查修复:
1. 校验Sheet基础属性合法性
- 每个Sheet的
SheetId必须是全局唯一的正整数,不能重复,也不能为0 - 每个Sheet的
Name属性不能重复,长度不能超过31个字符,不能包含\ / ? * [ ]这类非法字符
2. 校验关系Id映射正确性
每个Sheet的r:id属性必须和WorkbookPart到对应WorksheetPart的关系Id完全匹配,不能错配或者重复,以下是正确的多Sheet生成代码示例:
using (var spreadsheetDocument = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook)) { // 初始化工作簿 WorkbookPart workbookPart = spreadsheetDocument.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets()); // 循环生成多个Sheet for (int i = 0; i < 需要生成的Sheet数量; i++) { // 创建工作表部件 WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); worksheetPart.Worksheet = new Worksheet(new SheetData()); // 注册Sheet信息 Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), // 必须用API自动获取关系Id,禁止手动硬编码 SheetId = (uint)i + 1, // 从1开始递增,保证唯一 Name = $"工作表{i+1}" // 保证名称唯一、无特殊字符 }; sheets.Append(sheet); // 这里写当前Sheet的行、单元格数据填充逻辑 SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>(); // ... 填充数据的业务代码 } workbookPart.Workbook.Save(); }
3. 排查资源匹配问题
确保Sheets集合中添加的Sheet条目数量,和你创建的WorksheetPart数量完全一致,不存在多增、漏增的情况。
快速自检方法
如果修复后还是报错,可以把生成的.xlsx文件后缀修改为.zip,解压后查看xl/workbook.xml文件里的<sheets>节点,核对每个Sheet的属性,再查看xl/_rels/workbook.xml.rels里的关系项,确认每个关系Id都对应到了正确的worksheets/sheetX.xml文件,且对应文件存在、格式合法。
内容的提问来源于stack exchange,提问作者The Inquisitive Coder
相关产品推荐
相关产品推荐

