2012-11-26 20 views
9

Ich verwende die Version 3.1 der EPPlus-Bibliothek, um auf ein Arbeitsblatt in einer Excel-Datei zuzugreifen. Wenn ich eine der folgenden Methoden versuche, bekomme ich eine System.ArgumentException : An item with the same key has already been added.Zugriff auf Arbeitsblätter in EPPlus?

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

    // OR 

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

Exception Stack:

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() 

Dies scheint sehr grundlegende Funktionalität werden müssen, so gebrochen .. bin ich etwas falsch gemacht?

+0

Ist es möglich, dass die Excel-Datei war eine 'xls' Datei ursprünglich? EPPlus versteht nur 'xlsx'. Versuchen Sie es zunächst manuell als 'xlsx' zu speichern. –

Antwort

4

Die betreffende Arbeitsmappe hatte Bereiche definiert definiert. Diese verursachten Probleme, also erstellte ich eine neue xlsx-Datei mit den Daten, die ich brauchte, und sie konnte gut öffnen.

+0

Ich weiß, das ist 2 Jahre alt, aber wenn dies Ihr Problem gelöst hat, sollten Sie Ihre eigene Antwort akzeptieren, um es für andere zu markieren, die das gleiche Problem haben könnten – psubsee2003

+0

das war die einzige wahrscheinliche Lösung für mich, unter allen Antworten. Ich habe Named Ranges gelöscht; Es hat nicht geholfen. Punkt ist, dass das Worksheets-Objekt die Ausnahme selbst auslöst. –

21

Ich glaube, dass Excel-Arbeitsblatt aus tut Index 1 nicht Index 0

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

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

sollte das erste Arbeitsblatt zu lesen.

+2

In Excel und hübsch alles, was damit verbunden ist, beginnen Indizes mit 1, nicht 0. Schöne Erinnerung. Vielen Dank. – Doruk

13

Außerdem können Sie sie verwalten, indem Sie den Namen Referenzierung:

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

Mindestens mit Epplus 3.1.3.0 können Sie einfach das erste Arbeitsblatt Zugriff auf die folgenden verwenden.

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

Stellen Sie sicher, das Dokument erstellt oder gespeichert mit MS Excel (nicht Openoffice, Libreoffice, etc.)