c# - 获取所有工作表

标签 c# .net excel epplus

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

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

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

抛出异常:EPPlus.dll 中的“System.NullReferenceException”

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

这是堆栈跟踪:
   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) ...

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

您可以下载并尝试其中一个“不起作用”的 xlsx 文件 here如果你想自己试试。

这是一个带有两个空工作表的空 xlsx 文件。

最佳答案

发生错误是因为工作簿中定义的名称引用了不再存在的工作表/表格/范围。 Referenced from here

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

enter image description here

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

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

关于c# - 获取所有工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62172348/

相关文章:

c# - ASP.NET 元素中弹出窗口的全局设置在哪里?

c# - 使用私钥对 PHP 进行数字签名,在 C# 中进行验证

c# - 区分 KeyboardHook 中的两个键盘

c# - 为什么要使用 IDataReader 而不是 DbDataReader?

excel - 在 VBA 中精确调整图表的大小

excel - 如何在工作簿的最后一页之后添加工作表?

c# - 如何在 vs2012 中将发布配置文件添加到新的 sln?

c# - 找不到 VSCode Unity OmniSharp .NETFramework

javascript - 在文本框中输入任何内容之前会出现验证错误消息

html - 如何使 HTML 表格可以复制粘贴到 Excel