如何使用 openXML 将两个工作表聚合到一个工作簿?

How to aggregate two worksheets to one workbook using openXML?

我想将另一个工作簿中的两个不同工作表聚合到一个工作簿中,但我不知道如何使用 openXML 执行此操作。我只想创建一个包含两个工作表的工作簿。我不需要将工作表合并为一个。如何使用 openXML 将两个工作表聚合到一个工作簿?

您需要对 OpenXml SDK 的引用。 一个如何创建工作簿的小例子。 根据需要调用第二种方法 AddWorksheet

    private static SpreadsheetDocument CreateWorkbook(Stream stream)
    {
        // Create the Excel workbook
        var spreadSheet = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook, false);

        // Create the parts and the corresponding objects
        // Workbook
        spreadSheet.AddWorkbookPart();
        spreadSheet.WorkbookPart.Workbook = new Workbook();
        spreadSheet.WorkbookPart.Workbook.Save();

        // Shared string table
        var sharedStringTablePart = spreadSheet.WorkbookPart.AddNewPart<SharedStringTablePart>();
        sharedStringTablePart.SharedStringTable = new SharedStringTable();
        sharedStringTablePart.SharedStringTable.Save();

        // Sheets collection
        spreadSheet.WorkbookPart.Workbook.Sheets = new Sheets();
        spreadSheet.WorkbookPart.Workbook.Save();

        // Stylesheet
        var workbookStylesPart = spreadSheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();
        workbookStylesPart.Stylesheet = new Stylesheet();
        workbookStylesPart.Stylesheet.Save();


        return spreadSheet;
    }

    private static WorksheetPart AddWorksheet(SpreadsheetDocument spreadsheet, string name)
    {
        // Add the worksheetpart
        var worksheetPart = spreadsheet.WorkbookPart.AddNewPart<WorksheetPart>();
        worksheetPart.Worksheet = new Worksheet(new SheetData());


        uint sheetId = 1;
        var sheets = spreadsheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
        if (sheets.Elements<Sheet>().Any())
        {
            sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
        }

        // Add the sheet and make relation to workbook
        var sheet = new Sheet
        {
            Id = spreadsheet.WorkbookPart.GetIdOfPart(worksheetPart),
            SheetId = sheetId,
            Name = name
        };

        sheets.Append(sheet);

        worksheetPart.Worksheet.Save();
        spreadsheet.WorkbookPart.Workbook.Save();

        return worksheetPart;
    }

使用 Nuget 免费提供的 Epplus 将工作表从一个工作簿复制到另一个工作簿很容易。

类似这个例子的东西会一次性将一个工作表及其所有数据从一个工作簿复制到另一个工作簿,而不需要任何单独的函数来遍历行来复制数据:

        FileInfo fInfoSrc = new FileInfo(@"C:\Temp\Source.xlsx");
        FileInfo fInfoDest = new FileInfo(@"C:\Temp\Destination.xlsx");
        using (var source = new ExcelPackage(fInfoSrc))
        {
            using (var destination = new ExcelPackage(fInfoDest))
            {
                var srcWorksheet = source.Workbook.Worksheets["SourceWorksheet"];
                var destWorksheet = destination.Workbook.Worksheets.Add("destinationWorksheetName", srcWorksheet);
                destination.Save();
            }
        }

我选择的最佳方式是打开目标文件并循环打开包含要复制的工作表的源文件。接下来,我使用具有深度模式的克隆节点方法将每一行从源文件克隆到目标文件。我在目标文件工作表的特定索引中插入的这个克隆行。

好的方法是像在这个问题的其他答案中一样使用 EPPlus,但是当我将它与定义名称(命名范围)的 excel 文件一起使用时,它无法正常工作。