使用OpenXML SDK 2.5为SpreadsheetDocument设置格式无效问题
使用OpenXML SDK 2.5设置Excel单元格格式无效的排查与解决
问题场景
我使用OpenXML SDK 2.5创建SpreadsheetDocument(Excel文件),为单元格设置加粗格式后,生成的文件在Excel中打开时格式完全不生效,同时存在以下情况:
- 生成文件通过了代码内验证器和OpenXML SDK 2.5 Productivity Tool验证器的校验
- 尝试从Excel保存的正常文件中复制XML代码片段到生成文件,多数操作会导致文件无效
- 检查XML结构:工作表数据到样式表的引用关系正确,加粗样式的XML定义格式无误
问题根源
经过数小时排查,发现问题出在样式表(Stylesheet)内元素的顺序不符合OpenXML规范。
OpenXML对样式表的元素顺序有严格要求,必须遵循:NumberingFormats → Fonts → Fills → Borders → CellStyleFormats → CellFormats → CellStyles → DifferentialFormats → TableStyles → Colors
我之前构建样式表时随意调整了元素顺序(例如将CellFormats放在Fonts之前),虽然XML验证器未报错,但Excel读取时会直接忽略不符合顺序的样式表内容,导致所有格式设置失效。
解决方法
严格按照规范顺序构建样式表元素,即使不需要某些元素(如自定义数字格式),也需保留空节点以保证结构完整性:
示例代码
// 创建样式表实例 Stylesheet stylesheet = new Stylesheet(); // 1. 数字格式节点(空节点,保留结构) stylesheet.AppendChild(new NumberingFormats()); // 2. 字体:定义加粗字体 Fonts fonts = new Fonts(); // 添加默认字体(索引0) fonts.AppendChild(new Font()); // 添加加粗字体(索引1) Font boldFont = new Font(new Bold()); fonts.AppendChild(boldFont); stylesheet.AppendChild(fonts); // 3. 填充:添加默认填充样式 Fills fills = new Fills(); fills.AppendChild(new Fill(new PatternFill() { PatternType = PatternValues.None })); fills.AppendChild(new Fill(new PatternFill() { PatternType = PatternValues.Gray125 })); stylesheet.AppendChild(fills); // 4. 边框:添加默认边框 Borders borders = new Borders(); borders.AppendChild(new Border()); stylesheet.AppendChild(borders); // 5. 单元格样式格式节点 CellStyleFormats cellStyleFormats = new CellStyleFormats(); cellStyleFormats.AppendChild(new CellFormat()); stylesheet.AppendChild(cellStyleFormats); // 6. 单元格格式:引用加粗字体 CellFormats cellFormats = new CellFormats(); // 默认格式(索引0) cellFormats.AppendChild(new CellFormat()); // 自定义加粗格式(引用索引1的字体) cellFormats.AppendChild(new CellFormat() { FontId = 1 }); stylesheet.AppendChild(cellFormats); // 将样式表写入工作簿样式部件 WorkbookStylesPart stylesPart = workbookPart.AddNewPart<WorkbookStylesPart>(); stylesPart.Stylesheet = stylesheet; stylesPart.Stylesheet.Save();
之后在设置单元格格式时,指定StyleIndex为自定义格式的索引(示例中为1),即可让单元格生效加粗样式。
内容的提问来源于stack exchange,提问作者Martin Edelius
相关产品推荐
相关产品推荐

