.NET OpenXML SDK的SpreadsheetDocument.Open()方法为什么会抛出NullReferenceException?
我完全被这个难住了,并且在早上搜索谷歌时一无所获。.NET OpenXML SDK的SpreadsheetDocument.Open()方法为什么会抛出NullReferenceException?
我有一个看起来或多或少像这样的方法:
public void Open(string fileName, bool isEditable)
{
if(this.Document != null) this.Document.Close();
this.Document = SpreadSheetDocument.Open(fileName, isEditable);
}
这比只是稍微复杂(例如,规定使用预先设定的文件名,如果arg为null或ZLS) ,但这里没有涉及到这个问题。
当我运行这段代码时,我在那里的方法的最后一行得到一个NullReferenceException。根据MSDN文档,此方法应抛出的唯一例外是ArgumentNullException或OpenXMLPackageException。该文件没有在任何其他应用程序中打开,我尝试将其移动到各个位置,以防万一它是权限问题,而且它绝对是格式正确的.xslx文件,创建并保存在Excel中。
如果不是很明显,这是我编写的帮助程序类的一部分,用于减少打开电子表格和提取数据所涉及的工作负载,主要用于当它不像导入访问。 'this.Document'是SpreadsheetDocument类型的属性。这里的例外细节:
System.NullReferenceException was unhandled
Message=Object reference not set to an instance of an object.
Source=DocumentFormat.OpenXml
StackTrace:
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.get_FileOpenAccess()
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.SavePartContents()
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Dispose(Boolean disposing)
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Dispose()
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Close()
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.Load()
at DocumentFormat.OpenXml.Packaging.OpenXmlPackage.OpenCore(String path, Boolean readWriteMode)
at DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open(String path, Boolean isEditable, OpenSettings openSettings)
at DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open(String path, Boolean isEditable)
at CorbLib.OXML.Spreadsheets.XLDoc.Open(String fileName, Boolean isEditable) in C:\[path removed]\XLDoc.cs:line 37
at CorbLib.OXML.Spreadsheets.XLDoc.GetCell(String sheetName, String cellRef) in C:\[path removed]\XLDoc.cs:line 48
at CorbLib.OXML.Spreadsheets.XLDoc.GetCellsFromRange(String range, Boolean leaveOpen) in C:\[path removed]\XLDoc.cs:line 139
at CorbLib.OXML.Spreadsheets.XLDoc.GetCellValues(String range, Boolean leaveOpen) in C:\[path removed]\XLDoc.cs:line 116
at ConsoleApplication1.Program.Main(String[] args) in C:\[path removed]\Program.cs:line 14
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
任何援助将是巨大的帮助。
编辑:按在接受答案的评论,我已经修改了上面的方法如下...
public void Open(string fileName, bool isEditable)
{
/*unimportant bits*/
var fs = new FileStream(this.FullPath, FileMode.Open, FileAccess.Read);
this.Document = SpreadsheetDocument.Open(fs, this.IsEditable);
}
...现在它工作正常。
我认为这是DocumentFormat.OpenXml库中的一个错误。里面的装载功能有一个catch块,因为第一件事是调用Close方法:
try
{
// Some stuff
}
catch (OpenXMLPackageException)
{
Close();
throw;
}
当一个异常被抓住了Close()
方法被调用,但如果它之前发生它完全初始化和关闭方法本身抛出NullReferenceException,隐藏原来的一个。
您可能会在Visual Studio的输出窗口中看到问题。您应该能够捕获在Visual Studio调试中附加的正确错误(至少您会阅读原始异常消息)。
我希望它那么简单。这是当我走进最后一行时打印的所有内容: 步入:跨越非用户代码'CorbLib.OXML.Spreadsheets.XLDoc.FullPath.get' 步入:跨越非用户代码'CorbLib.OXML .Spreadsheets.XLDoc.IsEditable.get' DocumentFormat.OpenXml.dll中发生第一次机会例外'System.NullReferenceException' – burfl 2012-03-08 18:10:51
虽然我认为您对错误是正确的。我只是试着用(Stream,bool)超载来代替它,它运行得非常漂亮。非常令人沮丧。感谢您的正确方向! – burfl 2012-03-08 18:20:02