我需要将一些工作簿的工作表合并到一个新的工作簿中。我试过的是这个,但是我得到“无法插入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));
}
}
}
错误消息表示您正在尝试将已经具有父级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
实例。这不是复制多个工作表的方式,这是一个非常复杂的任务,需要您创建多个工作表部分,将这些工作表部分链接到工作簿部分,并考虑共享的字符串,样式和其他内容。