Aspose.Words:如何新增另一個WORD文件中的Node物件
阿新 • • 發佈:2019-02-14
首先看一段程式碼,這段程式碼意圖從docSource中獲取第一個表格,並插入docTarget的末尾:
1 var table = (Table)docSource.GetChild(NodeType.Table, 0, true); 2 docTarget.FirstSection.Body.ChildNodes.Add(table);
這段程式碼會丟擲異常:“The newChild was created from a different document than the one that created this node.”,這是什麼原因呢?
原因是,對於Aspose.Words的Node物件,它的一系列樣式和格式的控制,取決於它所在的DocumentBase父物件,這也是很多Aspose.Words物件宣告時,必須指定它的DocumentBase引數,比如宣告一個Table,應該如下:
1 Document doc=new Document(); 2 Table table=new Table(doc);
那麼,我們有沒有辦法新增另一個文件中的物件呢?有,必須通過Document.ImportNode方法或者使用NodeImporter物件。
這兩種方法思路都是將源文件中的Node匯入到目標文件中,再追加Node到合適的位置。
Document.ImportNode1 /// <summary> 2 /// A manual implementation of the Document.AppendDocument function which shows the generalNodeImporter3 /// steps of how a document is appended to another. 4 /// </summary> 5 /// <param name="dstDoc">The destination document where to append to.</param> 6 /// <param name="srcDoc">The source document.</param> 7 /// <param name="mode">The import mode to use when importing content from another document.</param> 8 public void AppendDocument(Document dstDoc, Document srcDoc, ImportFormatMode mode) 9 { 10 // Loop through all sections in the source document. 11 // Section nodes are immediate children of the Document node so we can just enumerate the Document. 12 foreach (Section srcSection in srcDoc) 13 { 14 // Because we are copying a section from one document to another, 15 // it is required to import the Section node into the destination document. 16 // This adjusts any document-specific references to styles, lists, etc. 17 // 18 // Importing a node creates a copy of the original node, but the copy 19 // is ready to be inserted into the destination document. 20 Node dstSection = dstDoc.ImportNode(srcSection, true, mode); 21 22 // Now the new section node can be appended to the destination document. 23 dstDoc.AppendChild(dstSection); 24 } 25 }
1 public static Document GenerateDocument(Document srcDoc, ArrayList nodes) 2 { 3 // Create a blank document. 4 Document dstDoc = new Document(); 5 // Remove the first paragraph from the empty document. 6 dstDoc.FirstSection.Body.RemoveAllChildren(); 7 8 // Import each node from the list into the new document. Keep the original formatting of the node. 9 NodeImporter importer = new NodeImporter(srcDoc, dstDoc, ImportFormatMode.KeepSourceFormatting); 10 11 foreach (Node node in nodes) 12 { 13 Node importNode = importer.ImportNode(node, true); 14 dstDoc.FirstSection.Body.AppendChild(importNode); 15 } 16 17 // Return the generated document. 18 return dstDoc; 19 }
參考文件: