2016-04-28 24 views
4

Ich möchte mehrere Excel-Dateien mit EPPlus in C# zusammenführen.C# EPPlus Excel-Dateien zusammenführen

Ich habe die folgenden:

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); 
} 

Aber ich bekomme die folgende Fehlermeldung in pck.SaveAs(protocolStream):

System.ArgumentOutOfRangeException

in System.ThrowHelper.ThrowArgumentOutOfRangeException (ExceptionArgument Argument, ExceptionResource-Ressource) in System.Collections.Generic.List 1.get_Item(Int32 index) in OfficeOpenXml.ExcelStyleCollection 1.get_Item (Int32 PositionID)

Ich versuchte es auch mit der Worksheet.Copy Methode, aber ich verliere das Styling mit ihm.

+0

In welchen Zeilen tritt es auf? – Rob

+0

Ich habe die Frage bearbeitet. Der Fehler tritt in 'pck.SaveAs (ProtokollStream) 'auf. – Tony

+1

Sieht aus wie ein mögliches fehlendes Feature/Bug in der Bibliothek. Es scheint abzustürzen, da die Stile kopiert werden, wenn Sie es manuell tun, und ihre integrierte Kopiermethode verliert ebenfalls Stile. – Rob

Antwort

3

Hier ist ein Beispiel für das Zusammenführen mehrerer Dateien zu einem, indem alle Arbeitsblätter aus Quell-Excel-Dateien bearbeitet werden.

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