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

C# OpenXML:如何将工作表复制到另一个工作簿?,c#,excel,openxml,openxml-sdk,C#,Excel,Openxml,Openxml Sdk,我需要将一些工作簿的工作表合并到一个新工作簿中。我尝试的是这个,但是我得到了“不能插入OpenXmlElement”newChild“因为它是树的一部分” 使用(var document=SpreadsheetDocument.Create(destinationFileName,SpreadsheetDocumentType.工作簿)) { //将工作簿部件添加到文档中 var workbookPart=document.AddWorkbookPart(); workbookPart.工作簿=

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

使用(var document=SpreadsheetDocument.Create(destinationFileName,SpreadsheetDocumentType.工作簿))
{
//将工作簿部件添加到文档中
var workbookPart=document.AddWorkbookPart();
workbookPart.工作簿=新工作簿();
//将工作表部件添加到工作簿部件
var worksheetPart=workbookPart.AddNewPart();
worksheetPart.Worksheet=新工作表(new SheetData());
foreach(sourceFileNames中的var sourceFileName)
{
使用(var sourceDocument=SpreadsheetDocument.Open(sourceFileName,false))
{
var sheet=(sheet)sourceDocument.WorkbookPart.Workbook.Sheets.FirstChild;
workbookPart.工作簿.AppendChild(新工作表(工作表));
}
}
}

错误消息意味着您正试图将一个
OpenXmlElement
(本例中为
工作表
)添加到另一个
OpenXmlCompositeElement
(本例中为
工作表
)的父级
OpenXmlCompositeElement
(本例中为
工作表

在下面的行项目中,您正在获取对已具有父对象的
图纸
对象的引用

var sheet=(sheet)sourceDocument.WorkbookPart.Workbook.Sheets.FirstChild;
使用
新建工作表(sheet)
,您试图将相同的
工作表
添加到另一个父级,即您正在创建的
工作表
实例。这是行不通的

假设将
工作表
添加到
工作表
中是有意义的,您的第二行必须重写如下:

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

虽然上面的解决方案是对您当前问题的回答(因为它避免了错误消息),但您的代码没有意义,因为它没有创建有效的开放XML标记<代码>工作表实例不应添加到
工作簿
实例中,并且
工作表
实例不应添加到
工作表
实例中。这不是复制多个工作表的方法,这是一个非常复杂的任务,需要创建多个工作表部件,将这些工作表部件链接到工作簿部件,并考虑共享字符串、样式和其他事项。
workbookPart.Workbook.AppendChild(new Worksheet(sheet.CloneNode(true)));