我在下面的代码中检查Null,即使传递了一个虚假路径,也会传递null测试。但是,当我返回工作簿时,抛出NullPointerException。在这种情况下,如何检查NullPointerReference?当我在调试时检查workBook变量时,它被设置为某个东西,我相信这一定是它传递Null检查的原因。
public static ExcelWorkbook OpenExcelWorkSheet(string file_path)
{
string EXCEL_FILE_EXTENSION = ".xlsx",
full_path = file_path + EXCEL_FILE_EXTENSION;
var excelFile = new FileInfo(full_path);
using (var package = new ExcelPackage(excelFile))
{
ExcelWorkbook workBook = package.Workbook;
if (workBook.Equals(null))
{
throw new Exception("ERROR!!!");
}
else { Console.Write("not null"); }
return workBook;
}
}
答案 0 :(得分:3)
查看the source code for ExcelPackage
,Workbook
属性永远不会返回null
。如果它的内部字段为Workbook
,则其getter将创建一个新的null
:
public ExcelWorkbook Workbook
{
get
{
if (_workbook == null)
{
var nsm = CreateDefaultNSM();
_workbook = new ExcelWorkbook(this, nsm);
_workbook.GetExternalReferences();
_workbook.GetDefinedNames();
}
return (_workbook);
}
}
知道这一点,我认为你可以安全地完全取消支票。
此外,正如其他人所说,您需要注意如何使用using
语句。处置ExcelPackage
后,其Workbook
将被处理(您可以在我链接的源代码中看到这种情况)。这可能是您看到从您的方法返回null
工作簿的原因,但并非您在using
语句中。在}
关闭using
之后不久,它就变为null
。
如果您有一个类用于包装EPPlus
的功能,那么您应该确保它:
ExcelPackage
一次,并保留对它的引用;执行此操作时不要使用using
语句ExcelPackage
引用;不要传递它或重新打开包IDisposable
,然后在处理包装时正确处置ExcelPackage
对象。这是一个例子*:
public class YourWrapper : IDisposable
{
private bool disposed;
public YourWrapper()
{
}
public YourWrapper(string path)
{
OpenExcelPackage(path);
}
public void OpenExcelPackage(string path)
{
Package = new ExcelPackage(path);
}
public ExcelPackage Package { get; private set; }
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
if (Package != null)
{
Package.Dispose();
Package = null;
}
}
}
this.disposed = true;
}
~YourWrapper()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
现在,只要您实例化包装器,就使用using
:
using (var wrapper = new YourWrapper())
{
// Do everything related to manipulating the Excel file here
}
一切都会得到很好的清理。
* 请将类/方法的名称更改为更合适的名称;这只是为了说明。