C# EPPlus 合并 Excel 文件

7
我想在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.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) 在 System.Collections.Generic.List1.get_Item(Int32 index) 在 OfficeOpenXml.ExcelStyleCollection1.get_Item(Int32 PositionID)

我也尝试使用Worksheet.Copy方法,但是这样会导致样式丢失。


它出现在哪几行? - Rob
我编辑了这个问题。错误出现在 pck.SaveAs(protocolStream) - AlteGurke
1
似乎是库中可能缺少的功能/错误。当您手动复制样式时,它似乎会崩溃,并且其内置的复制方法也会丢失样式。 - Rob
嗯,那样就不好了。所以我必须逐个遍历所有单元格并手动复制样式和值... - AlteGurke
1个回答

7
这里是将多个文件合并成一个的实例,通过复制源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));

在第一个工作表中复制行,不包括标题? - Kiquenet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接