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

tcomlyy6  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(383)

我需要将一些工作簿的工作表合并到一个新的工作簿中。我尝试的是这样的,但是我得到“无法插入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));
        }
    }
}
wgx48brx

wgx48brx1#

此错误消息表示您正在尝试将已经具有父对象OpenXmlCompositeElement(在本例中为Sheets对象)的OpenXmlElement(在本例中为Sheet)作为新子对象添加到另一个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),这将创建一个没有父对象的原始Sheet对象的深层副本。因此,克隆对象可以作为新的子对象添加到另一个父对象。
虽然上述解决方案是您当前问题的答案(因为它避免了错误消息),您的代码没有意义,因为它没有创建有效的Open XML标记。不应将Worksheet示例添加到Workbook示例,也不应将Sheet示例添加到Worksheet示例。这不是复制多个工作表的方式,这是一项非常复杂的任务,需要您创建多个工作表部件,将这些工作表部件链接到工作簿部件,并考虑共享字符串、样式和其他内容。

相关问题