如何在EPPlus中访问工作表?

23

我正在使用EPPlus库的3.1版本来尝试访问Excel文件中的工作表。当我尝试使用以下任何一种方法时,都会出现System.ArgumentException:已添加具有相同键的项错误。

using (ExcelPackage package = new ExcelPackage(new FileInfo(sourceFilePath)))
{
   var worksheet = package.Workbook.Worksheets[0];

   // OR

   foreach (var excelWorksheet in package.Workbook.Worksheets)
   ...
}

异常堆栈:

System.ArgumentException : An item with the same key has already been added.
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
   at OfficeOpenXml.ExcelNamedRangeCollection.Add(String Name, ExcelRangeBase Range)
   at OfficeOpenXml.ExcelWorkbook.GetDefinedNames()
   at OfficeOpenXml.ExcelPackage.get_Workbook()

这似乎是非常基本的功能,但是它如此不稳定... 我有做错什么吗?


Excel文件最初可能是“xls”文件格式吗?EPPlus只能理解“xlsx”。先尝试手动将其保存为“xlsx”格式。 - Tim Schmelter
6个回答

33

我相信 Excel 的工作表从索引 1 开始,而不是索引 0

 var worksheet = package.Workbook.Worksheets[0]; 

应该是这样的

var worksheet = package.Workbook.Worksheets[1];

阅读第一个工作表。


2
在Excel及与其相连的其他方面中,索引从1开始,而不是0。这是一个不错的提醒。谢谢。 - Doruk

24

此外,您可以通过引用名称来管理它们:

var worksheet = package.Workbook.Worksheets["Sheet1"];

8

至少在 Epplus 3.1.3.0 中,您可以简单地使用以下方法访问第一个工作表。

ExcelWorksheet workSheet = excel.Workbook.Worksheets.First();

7

这个工作簿中定义了命名范围,导致出现问题。因此我创建了一个新的xlsx文件,只包含所需的数据,然后它能够正常打开。


我知道这已经是两年前的事了,但如果这个解决方案解决了你的问题,你应该接受自己的答案,以帮助突出显示给可能遇到相同问题的其他人。 - psubsee2003
这是在所有答案中对我来说唯一可能的解决方案。我删除了命名区域,但没有帮助。问题在于 Worksheets 对象本身会抛出异常。 - Alireza Ahmadi Rad

3

请确保使用MS Excel创建或保存文档(而不是OpenOffice,Libre Office等其他软件)


0

访问/查找所有工作表,我使用了:

 var file = new FileInfo(filename);

 ExcelPackage pck = new ExcelPackage(file);
           
 foreach (var excelWorksheet in pck.Workbook.Worksheets) 
 {
     Console.WriteLine("found sheet: " + excelWorksheet.Name);
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接