2012-03-08 99 views
2

我完全被这个难住了,并且在早上搜索谷歌时一无所获。.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); 
} 

...现在它工作正常。

回答

3

我认为这是DocumentFormat.OpenXml库中的一个错误。里面的装载功能有一个catch块,因为第一件事是调用Close方法:

try 
{ 
    // Some stuff 
} 
catch (OpenXMLPackageException) 
{ 
    Close(); 
    throw; 
} 

当一个异常被抓住了Close()方法被调用,但如果它之前发生它完全初始化和关闭方法本身抛出NullReferenceException,隐藏原来的一个。

您可能会在Visual Studio的输出窗口中看到问题。您应该能够捕获在Visual Studio调试中附加的正确错误(至少您会阅读原始异常消息)。

+0

我希望它那么简单。这是当我走进最后一行时打印的所有内容: 步入:跨越非用户代码'CorbLib.OXML.Spreadsheets.XLDoc.FullPath.get' 步入:跨越非用户代码'CorbLib.OXML .Spreadsheets.XLDoc.IsEditable.get' DocumentFormat.OpenXml.dll中发生第一次机会例外'System.NullReferenceException' – burfl 2012-03-08 18:10:51

+0

虽然我认为您对错误是正确的。我只是试着用(Stream,bool)超载来代替它,它运行得非常漂亮。非常令人沮丧。感谢您的正确方向! – burfl 2012-03-08 18:20:02

相关问题