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

时间:2019-11-06 15:13:52

标签: c# excel openxml openxml-sdk

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

{{1}}

1 个答案:

答案 0 :(得分:0)

该错误消息表示您正在尝试添加已经具有父级OpenXmlElement(在此情况下为Sheet对象)的OpenXmlCompositeElement(在这种情况下为Sheets) )作为另一个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)));

在上面的代码行中,sheetsheet.CloneNode(true)替换,这将复制原始Sheet对象的深层副本,该对象没有父对象。因此,可以将克隆作为新子添加到另一个父中。

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

相关问题