前提・実現したいこと
NPOIを使ってエクセル内のシート名を読み込もうとしています。
拡張子がxls形式(excel97-2003)では出来ることが、xlsx形式になると出来なくなります。
発生している問題・エラーメッセージ
エラーメッセージ
A part with the name 'xl/styles.xlm' already exsits : Packages shall not contain equivalent part names and package implementers shall neither create nor recognize packages with equivalent part names.[M1.12]
該当のソースコード
C#ここに言語名を入力
private void picAddExcelFile_Click(object sender, EventArgs e) //Excelファイルマークから読込 { try { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Excelファイル|*.xlsx;*.xlsm;*.xls"; //読込可能な拡張子の設定 openFileDialog.Title = "Excelファイルをリストに追加"; openFileDialog.Multiselect = true; if (openFileDialog.ShowDialog() != DialogResult.OK) //ここでファイルオープンウィンドウを表示 return; this.dgvExcelList.ClearSelection(); foreach (string fileName in openFileDialog.FileNames) //ファイル名をfileNameに読込 { if (File.Exists(fileName)) //ファイルが存在するか確認 { bool flag = false; foreach (DataGridViewRow row in (IEnumerable)this.dgvExcelList.Rows) { if (string.Compare(fileName, (string)row.Cells["clmFilePath"].Value, true) == 0) { flag = true; break; } } if (!flag) { Dictionary<string, int> sheetNameList = new ExcelNpoi().GetSheetNameList(fileName); //ここでGetSheetNameList();呼び出し int index = this.dgvExcelList.Rows.Add(); this.dgvExcelList.Rows[index].Cells["clmFileName"].Value = (object)Path.GetFileName(fileName); this.dgvExcelList.Rows[index].Cells["clmSheetName"].Value = (object)string.Join(",", sheetNameList.Keys.ToArray<string>()); this.dgvExcelList.Rows[index].Cells["clmFilePath"].Value = (object)fileName; this.dgvExcelList.Rows[index].Selected = true; } } } } catch (Exception ex) { int num = (int)MessageBox.Show(ex.Message); } } **これは厳密には別のクラスで宣言してます** public Dictionary<string, int> GetSheetNameList(string filePath) //エクセル内のシート名を返す { using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { IWorkbook workbook = WorkbookFactory.Create((Stream) fileStream, ImportOption.TextOnly); int numberOfSheets = workbook.NumberOfSheets; Dictionary<string, int> dictionary = new Dictionary<string, int>((IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase); for (int index = 0; index < numberOfSheets; ++index) { ISheet sheetAt = workbook.GetSheetAt(index); dictionary.Add(sheetAt.SheetName, index); } return dictionary; } }
試したこと
xlsファイルの場合は、GetSheetNameList();が正常に動作し、以降の処理も問題なく動きます。
xlsxファイルの場合は、WorkbookFactory.Create();実行後、picAddExcelFile_Click();のtry内のcatch (Exception ex)に引っかかり、上記のエラーメッセージが表示されます。
補足情報(FW/ツールのバージョンなど)
もういなくなってしまった人のプログラムで、社内に聞ける人がいないので投稿します。
エラー文を調べる限り、string.Compare();の関係エラーだと思うのですが、WorkbookFactory.Create();内で何が起きてるのかが分からず、
エラーの内容も調べてみましたが分かりません。
よろしくお願いします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/04 04:26