質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

Q&A

解決済

1回答

20779閲覧

ClosedXML で『同一のキーを含む項目が既に追加されています。』のエラー

morinokuma0621

総合スコア81

ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2012

Microsoft Visual Studio 2012は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2010の次のバージョンです

0グッド

0クリップ

投稿2016/12/28 01:25

編集2016/12/28 10:59

###発生している問題・エラーメッセージ
No 会社名 担当者名
といった感じに並んでいるタブ区切りの何百行とあるテキストデータを読み込んで、会社名別に担当者を振り分けたExcelファイルを作ろうと考え、ClosedXMLを利用してみました。ところが、13行目を読み込んだあたりでwb.SaveAs(tFiName);の箇所に、

同一のキーを含む項目が既に追加されています。

というエラーが表示され、書き込みができなくなります。当初テキストデータ自体が悪いのかと思い、エラーの出る行を冒頭に持っていくなど並べ替えてもみましたが、やはり13行目あたりで同じようなエラーがでています。結局別のファイルで試してみても似たような感じでエラーが出ました。

また、try catchでエラーを無視すると、3行ほどは同じようなエラーが出て、16行目あたりからは再び書き込みに成功し始めるようです。

ソースコードは下記のような感じです。1行読み込んで会社名からファイル名を生成、該当のファイルがなければマスターとなるExcelをコピー(tFiName)、そのファイルを開いて最終行に担当者名を追加、といった処理を加えています。

###該当のソースコード

C#

1tLine = sr.ReadLine();//StreamReaderでテキストデータを1行読み込み 2tList = tLine.Split('\t'); 3 4//tFiNameに生成したファイル名が入っています 5using (XLWorkbook wb = new XLWorkbook(tFiName)) 6using (IXLWorksheet ws = wb.Worksheet(2)) 7{ 8 row = ws.LastRowUsed().RowNumber() + 1; 9 for (int col = 1; col < tList.Length + 1; col++) 10 { 11 IXLCell cell = ws.Cell(row, col); 12 cell.Value = "'" + tList[col - 1]; 13 } 14 wb.SaveAs(tFiName); //ここに該当のエラーが表示されます 15 //wb.Save(); としても結果は一緒でした 16 //wb.Dispose(); を加えても結果は一緒でした 17} 18//ここまでをテキストデータ最終行が来るまで繰り返す

###補足情報(言語/FW/ツール等のバージョンなど)
Windows10
Visual Studio 2012
Windows Formsで作成しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決したみたいです。上記プログラムでは、一行読み込んでは書き込み保存、を繰り返していましたが、一行読み込んで書き込み、二行目を読み込んで会社名が一緒ならそのまま書き込んで三行目へ、会社名が違うなら一旦保存する、という形に作り替えましたところ、全行処理ができるようになりました。

おそらく、保存している間に次の書き込み処理が終わって再び同じファイルに保存しようとしていたため、ファイルが「すでに開いている」という状態になってこのエラーが出てたようです。ディレイなりロックなりする仕組みが必要だったようです。

ありがとうございました。

投稿2016/12/28 10:59

morinokuma0621

総合スコア81

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問