创建WorksheetPart时触发OpenXML VerificationException问题排查
OpenXML迁移至.NET类库后触发VerificationException错误
问题详情
控制台应用中使用NuGet安装的3.0.2版本OpenXML运行代码完全正常,但将代码迁移到.NET类库项目(同样通过NuGet安装同版本OpenXML)并部署后,调用类库时抛出错误:
VerificationException: Method DocumentFormat.OpenXml.Packaging.OpenXmlPartContainer.AddNewPart: type argument 'DocumentFormat.OpenXml.Packaging.WorksheetPart' violates the constraint of type parameter 'T'
通过注释代码排查,发现报错时无法进入CreateExcel()方法,仅注释WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();这一行后就能正常步入方法,因此确定问题出在该行代码。
相关代码
internal static void CreateRawMtlExcel(List<RawMtl> Mtls, string OutputPath) { using (SpreadsheetDocument package = SpreadsheetDocument.Create(OutputPath, SpreadsheetDocumentType.Workbook)) { CreateExcel(package, Mtls); } } private static void CreateExcel(SpreadsheetDocument document, List<RawMtl> Mtls) { WorkbookPart workbookPart = document.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); // 触发错误的行 SheetData sheetData = new SheetData(); worksheetPart.Worksheet = new Worksheet(sheetData); workbookPart.Workbook.Save(); }
解决方案
这类错误本质是程序集版本不兼容或加载冲突,可按以下步骤排查解决:
- 统一OpenXML版本:确保调用类库的宿主项目(如原控制台应用)也安装了3.0.2版本的OpenXML,避免版本差异导致类型约束校验失败。
- 清理重建解决方案:删除所有项目的
bin、obj目录,清理NuGet缓存后重新编译,解决旧版本程序集残留问题。 - 匹配目标框架:检查类库与宿主项目的目标框架是否兼容,尽量保持版本一致或确保类库框架版本低于等于宿主项目。
- 添加程序集绑定重定向:若存在间接依赖的不同版本OpenXML,在宿主项目的配置文件中添加绑定重定向,强制统一使用3.0.2版本:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="DocumentFormat.OpenXml" publicKeyToken="8fb06cb64d019a17" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-3.0.2.0" newVersion="3.0.2.0" /> </dependentAssembly> </assemblyBinding> </runtime> - 重装NuGet包:卸载类库中的OpenXML包,清理缓存后重新安装,确保包文件完整无损坏。
内容的提问来源于stack exchange,提问作者sdMike77
相关产品推荐
相关产品推荐

