2012-11-26 12 views
9

私は、EPPlusライブラリの3.1リリースを使用してExcelファイルのワークシートにアクセスしようとしています。次のいずれかの方法を試すと、System.ArgumentException : An item with the same key has already been addedが得られます。EPPlusでワークシートにアクセスするには?

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

これはとても壊れても持っていることは非常に基本的な機能のように思える..私は何か間違ったことをやっていますか?

+0

は、それがExcelファイルは、 'xls'ファイルが元々あったことは可能ですか? EPPlusは 'xlsx'だけを理解します。最初に手動で 'xlsx'として保存してください。 –

答えて

4

問題のブックには名前付き範囲が定義されています。これらは問題を引き起こしていたので、私は必要なデータだけで新しいxlsxファイルを作成しました。

+0

私はこれが2歳であることを知っていますが、これがあなたの問題を解決すれば、あなた自身の答えを受け入れて、同じ問題を抱えている可能性のある人のために強調してください。 – psubsee2003

+0

私は名前付き範囲を削除しました。それは助けになりませんでした。ポイントは、Worksheetsオブジェクト自体が例外をスローするということです。 –

21

私はExcelは、インデックス1からワークシートをしていることを信じて、インデックス0

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

は、最初のワークシートを読み取るために

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

する必要がありません。

+2

それに接続するExcelとかなりのすべてで、インデックスは0ではなく1から始まります。ありがとう。 – Doruk

13

また、あなたが名前を参照することによって、それらを管理することができます

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

少なくともEpplus持つあなたは、単に最初のワークシートにアクセスするには、次の使用することができ3.1.3.0。

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

ていることを確認し、作成またはMSエクセルで保存されたドキュメント(ないのOpenOffice、リブレオフィスなど)

関連する問題