ClosedXML生成的XLSX文件无法在MS Spreadsheet Compare中打开求助
解决ClosedXML生成的XLSX无法被MS Spreadsheet Compare打开的问题
我之前也碰到过一模一样的情况——用ClosedXML老版本生成的Excel文件能被Excel正常打开,但一放到Spreadsheet Compare里就报“Attempted to read past the end of the stream”错误,本质原因是Spreadsheet Compare对OpenXML规范的合规性要求比Excel严格得多,而旧版ClosedXML生成的文件缺少了一些OpenXML标准要求的必填部件/元数据,Excel的容错机制会自动补全这些内容,但Spreadsheet Compare不会。
问题根源
ClosedXML 0.92.1是比较旧的版本,它在生成基础工作簿时,可能遗漏了以下关键内容:
- 默认的单元格样式部件(OpenXML规范要求工作簿必须包含基础样式定义)
- 完整的文档元数据(比如
LastModifiedBy、Subject等属性) - 某些OpenXML命名空间的完整声明
解决方案
1. 优先升级ClosedXML版本
这是最省心的办法,0.92.1之后的版本(比如0.102.x及以上的稳定版)修复了大量OpenXML合规性问题,升级后生成的文件大概率能直接被Spreadsheet Compare识别。
2. 若无法升级,手动补充缺失内容
如果暂时不能升级版本,可以在代码里强制添加必要的部件和属性,让生成的文件符合OpenXML规范:
using (var workbook = new XLWorkbook()) { // 设置完整的文档元数据,不要只加Author和Title workbook.Properties.Author = "Me"; workbook.Properties.Title = "Title"; workbook.Properties.Subject = "Auto-generated Spreadsheet"; workbook.Properties.LastModifiedBy = "Me"; workbook.Properties.Created = DateTime.Now; workbook.Properties.Modified = DateTime.Now; var worksheet = workbook.AddWorksheet("Sheet 1"); worksheet.Row(1).Cell(1).SetValue("test"); // 强制生成默认样式部件,这是老版本ClosedXML容易遗漏的 var normalStyle = workbook.Styles.CreateNamedStyle("Normal"); normalStyle.Font.FontName = "Calibri"; normalStyle.Font.FontSize = 11; workbook.SaveAs(@"c:\temp\testing.xlsx"); }
验证方法
修改代码后生成文件:
- 直接用Spreadsheet Compare打开测试,应该不会再报错
- 可以用OpenXML SDK的
OpenXmlValidator工具校验文件,确认合规性:using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Validation; var validator = new OpenXmlValidator(); using (var spreadsheetDocument = SpreadsheetDocument.Open(@"c:\temp\testing.xlsx", false)) { var errors = validator.Validate(spreadsheetDocument); foreach (var error in errors) { Console.WriteLine($"Error: {error.Description}"); } }
如果没有输出错误,说明文件已经符合OpenXML规范了。
内容的提问来源于stack exchange,提问作者NerdBrick
相关产品推荐
相关产品推荐

