我需要将一些工作簿的工作表合并到一个新的工作簿中。我尝试的是这样的,但是我得到“无法插入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));
}
}
}
1条答案
按热度按时间wgx48brx1#
此错误消息表示您正在尝试将已经具有父对象
OpenXmlCompositeElement
(在本例中为Sheets
对象)的OpenXmlElement
(在本例中为Sheet
)作为新子对象添加到另一个OpenXmlCompositeElement
(在本例中为Worksheet
)。在下面的行项目中,您正在抓取
Sheet
对象的指涉,而该对象已经有Sheets
父对象。对于
new Worksheet(sheet)
,您试图将同一个sheet
添加到另一个父示例,即您正在创建的Worksheet
示例。假设将
Sheet
添加到Worksheet
是有意义的,则必须将第二行重写如下:在上面的代码行中,
sheet
被替换为sheet.CloneNode(true)
,这将创建一个没有父对象的原始Sheet
对象的深层副本。因此,克隆对象可以作为新的子对象添加到另一个父对象。虽然上述解决方案是您当前问题的答案(因为它避免了错误消息),您的代码没有意义,因为它没有创建有效的Open XML标记。不应将
Worksheet
示例添加到Workbook
示例,也不应将Sheet
示例添加到Worksheet
示例。这不是复制多个工作表的方式,这是一项非常复杂的任务,需要您创建多个工作表部件,将这些工作表部件链接到工作簿部件,并考虑共享字符串、样式和其他内容。