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

时间:2015-07-30 12:08:13

标签: c# excel openxml

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

3 个答案:

答案 0 :(得分:3)

使用Epplus可以轻松地将工作表从一个工作簿复制到另一个工作簿,这在Nuget中是免费的。

像这个例子的东西会复制一个工作表&从一个工作簿到另一个工作簿的所有数据,无需任何单独的函数循环遍历行以复制数据:

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

答案 1 :(得分:0)

您需要对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;
    }

答案 2 :(得分:0)

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

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