2016-04-28 4 views
4

Я хочу объединить несколько файлов Excel с EPPlus в C#.C# EPPlus merge Файлы 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.ArgumentOutOfRangeException

в System.ThrowHelper.ThrowArgumentOutOfRangeException (ExceptionArgument аргумент, Ресурс ExceptionResource) в 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

Выглядит как возможная пропавшая функция/ошибка в библиотеке. Кажется, он разбился, потому что стили копируются, когда вы делаете это вручную, и их встроенный метод копирования также теряет стили. – Rob

ответ

3

Ниже приведен пример объединения нескольких файлов в один файл путем копирования всех листов из исходных файлов excel.

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)); 
Смежные вопросы