2016-04-28 25 views
4

複数のExcelファイルをC#でEPPlusとマージしたい。C#EPPlus Excelファイルをマージする

using (MemoryStream protocolStream = new MemoryStream()) 
{ 
    ExcelPackage pck = new ExcelPackage(); 
    HashSet<string> wsNames = new HashSet<string>(); 

    foreach (var file in files) 
    { 
     ExcelPackage copyPck = new ExcelPackage(new FileInfo(file)); 
     foreach (var ws in copyPck.Workbook.Worksheets) 
     { 
      string name = ws.Name; 
      int i = 1; 
      while (!wsNames.Add(ws.Name)) 
       name = ws.Name + i++; 
      ws.Name = name; 
      var copiedws = pck.Workbook.Worksheets.Add(name); 
      copiedws.WorksheetXml.LoadXml(ws.WorksheetXml.DocumentElement.OuterXml); 
     } 
    } 
    pck.SaveAs(protocolStream); 
    protocolStream.Position = 0; 
    using (FileStream fs = new FileStream(resultFile, FileMode.Create)) 
     protocolStream.CopyTo(fs); 
} 

しかし、私はpck.SaveAs(protocolStream)に次のエラーを取得:

私は次のことをやった System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument 引数である

System.ArgumentOutOfRangeExceptionが

をExceptionResourceリソース)in System.Collections.Generic.List 1.get_Item(Int32 index) in OfficeOpenXml.ExcelStyleCollection 1.get_Item(のInt32 PositionID)

私もWorksheet.Copy方法でそれを試してみましたが、私はそれでスタイリングを失います。

+0

どのラインで発生するのですか? – Rob

+0

質問を編集しました。エラーは 'pck.SaveAs(protocolStream)'で発生します。 – Tony

+1

ライブラリに欠けている可能性がある機能/バグのようです。手動で行うとスタイルがコピーされ、組み込みのCopyメソッドもスタイルを失うため、クラッシュするように見えます。 – Rob

答えて

3

ソースのExcelファイルからすべてのワークシートをコピーして、複数のファイルを1つにマージする例を示します。

var files = new string[] { @"P:\second.xlsx", @"P:\second.xlsx" }; 

     var resultFile = @"P:\result.xlsx"; 

     ExcelPackage masterPackage = new ExcelPackage(new FileInfo(@"P:\first.xlsx")); 
     foreach (var file in files) 
     { 
      ExcelPackage pckg = new ExcelPackage(new FileInfo(file)); 

      foreach (var sheet in pckg.Workbook.Worksheets) 
      { 
       //check name of worksheet, in case that worksheet with same name already exist exception will be thrown by EPPlus 

       string workSheetName = sheet.Name; 
       foreach (var masterSheet in masterPackage.Workbook.Worksheets) 
       { 
        if (sheet.Name == masterSheet.Name) 
        { 
         workSheetName = string.Format("{0}_{1}", workSheetName, DateTime.Now.ToString("yyyyMMddhhssmmm")); 
        } 
       } 

       //add new sheet 
       masterPackage.Workbook.Worksheets.Add(workSheetName, sheet); 
      } 
     } 

     masterPackage.SaveAs(new FileInfo(resultFile)); 
関連する問題