C#EPPlus合并Excel文件

我想用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.ArgumentOutOfRangeException

System.Collections.Generic.List中的System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument参数,ExceptionResource资源) 1.get_Item(Int32 index) in OfficeOpenXml.ExcelStyleCollection 1.get_Item(Int32 PositionID)

我也尝试了Worksheet.Copy方法,但我失去了它的样式。

下面是通过应对源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));