获取所有工作表

Get all worksheets

我在尝试使用 EPPlus 从 excel (xlsx) 文件中获取工作表(只是工作表名称)时遇到了这个非常奇怪的错误。

using (var ep = new ExcelPackage(new FileInfo(filePath)) {
    foreach (var ws in ep.Workbook.Worksheets)
        ....
}

这可以完美地工作(为什么不正确),但有时我发现 excel 文件在尝试获取工作表时只是抛出 System.NullReferenceException

抛出异常:'System.NullReferenceException' in EPPlus.dll

最让我困惑的是,当我调试它并逐步进行时,一切正常。

这是 StackTrace:

   at OfficeOpenXml.ExcelRangeBase..ctor(ExcelWorksheet xlWorksheet, String address)
   at OfficeOpenXml.ExcelNamedRangeCollection.Add(String Name, ExcelRangeBase Range)
   at OfficeOpenXml.ExcelWorkbook.GetDefinedNames()
   at OfficeOpenXml.ExcelPackage.get_Workbook()
   at isef.winformapp.Helpers.ExcelUtilities.GetWorksheets(String filePath) ...

我只是想知道是否有人遇到过类似的错误

如果您想自己尝试,可以下载并尝试其中一个 'not working' xlsx 文件 here

这是一个包含两个空工作表的空 xlsx 文件。

出现错误是因为工作簿中定义的名称引用了 sheet/table/range 不再存在的名称。 Referenced from here

首先我能够重现您的错误。其次,我删除了这些名称,您的代码运行良好。


不幸的是,每当您引用工作簿时都会发生异常,因此我看不到在包外解决此问题的明确方法。

var wb = ep.Workbook;  //also throws error when wb has invalid names