OpenXML:如何将工作表复制到另一个工作簿?

问题描述 投票:0回答:1

我需要将一些工作簿的工作表合并到一个新的工作簿中。我试过的是这个,但是我得到“无法插入OpenXmlElement“ newChild”,因为它是树的一部分。“]

using (var document = SpreadsheetDocument.Create(destinationFileName, SpreadsheetDocumentType.Workbook))
{
    // Add a WorkbookPart to the document
    var workbookPart = document.AddWorkbookPart();
    workbookPart.Workbook = new Workbook();

    // Add a WorksheetPart to the WorkbookPart
    var worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
    worksheetPart.Worksheet = new Worksheet(new SheetData());

    foreach (var sourceFileName in sourceFileNames)
    {
        using (var sourceDocument = SpreadsheetDocument.Open(sourceFileName, false))
        {
            var sheet = (Sheet)sourceDocument.WorkbookPart.Workbook.Sheets.FirstChild;
            workbookPart.Workbook.AppendChild(new Worksheet(sheet));
        }
    }
}
c# excel openxml openxml-sdk
1个回答
0
投票

错误消息表示您正在尝试将已经具有父级OpenXmlElement(在这种情况下为Sheet对象)的OpenXmlCompositeElement(在这种情况下为Sheets)作为新子项添加到另一个[ C0](在这种情况下为OpenXmlCompositeElement。)>

在以下订单项中,您正在获取对已经具有父级Worksheet对象的Sheet对象的引用。

Sheets

[使用var sheet = (Sheet)sourceDocument.WorkbookPart.Workbook.Sheets.FirstChild; ,您正在尝试将相同的new Worksheet(sheet)添加到另一个父对象,即正在创建的sheet实例。那是行不通的。

[暂时考虑将Worksheet添加到Sheet是有意义的,您的第二行必须按如下方式重写:

Worksheet

在上面的代码行中,workbookPart.Workbook.AppendChild(new Worksheet(sheet.CloneNode(true))); 替换为sheet,这将复制原始的没有父级的sheet.CloneNode(true)对象。因此,可以将克隆作为新子项添加到另一个父项。

尽管上述解决方案是您眼前一个问题的答案(因为它避免了错误消息),但是您的代码没有意义,因为它不会创建有效的Open XML标记。 Sheet实例不应添加到Worksheet实例,并且Workbook实例不应添加到Sheet实例。这不是复制多个工作表的方式,这是一个非常复杂的任务,需要您创建多个工作表部分,将这些工作表部分链接到工作簿部分,并考虑共享的字符串,样式和其他内容。

© www.soinside.com 2019 - 2024. All rights reserved.