本文簡要分析一下如何如何使用C#簡單實現合並和拆分word文檔。平時我們在處理多個word文檔時,可能會想要將兩個文檔合並為一個,或者是將某個文檔的一部分添加到另一個文檔中,有的時候也會想要將文檔拆分。在Word中,合並或拆分文檔最簡單的方式就是打開一個原文檔的副本文件,復制我們需要的部分,刪除不需要的部分,然后再保存文檔。使用這種方法在文檔比較多或者比較大時手動操作起來比較費時,以下是使用C#實現合並一個Word文檔的某一個section到另一個文檔或者合並兩個完整的Word文檔到一個單獨的文檔以及如何根據section和page break來拆分一個Word文檔的方法。
第一部分:合並Word文檔
為了數據的保密性,我新創建了兩個簡單的word文檔,如下圖:
文檔1
文檔2
合並一個Word文檔的某一個section到另一個文檔
//加載文檔1和文檔2 Document doc1 = new Document(); doc1.LoadFromFile("Sales Report.docx", FileFormat.Docx); Document doc2 = new Document(); doc2.LoadFromFile("Stories.docx", FileFormat.Docx); //獲取文檔2的第一個section Section sec = doc2.Sections[0]; //克隆該section並把它添加到文檔1 doc1.Sections.Add(sec.Clone()); doc1.SaveToFile("Mergesection.docx", FileFormat.Docx);
效果圖:
合並兩個完整的Word文檔到一個單獨的文檔
//加載文檔1 Document document = new Document(); document.LoadFromFile("Sales Report.docx", FileFormat.Docx); //將文檔2的所有內容插入到文檔1 document.InsertTextFromFile("Stories.docx", FileFormat.Docx); //將結果另存為到另一個單獨的文檔 document.SaveToFile("MergeFiles.docx", FileFormat.Docx);
效果圖:
第二部分:拆分Word文檔
根據section break拆分Word文檔
//加載源文檔 Document document = new Document(); document.LoadFromFile("Stories.docx"); //定義一個新的文檔對象 Document newWord; //遍歷源文檔的所有section,克隆每個section並將其添加至一個新的word文檔,然后保存文檔
for (int i = 0; i < document.Sections.Count; i++) { newWord = new Document(); newWord.Sections.Add(document.Sections[i].Clone()); newWord.SaveToFile(String.Format(@"test\output_{0}.docx", i)); }
效果圖:
根據page break拆分Word文檔
如下文檔含有兩個page break分別在第一頁和第二頁的末尾:
//加載源文檔
Document original = new Document(); original.LoadFromFile("New Zealand.docx"); //創建一個新的文檔並給它添加一個section
Document newWord = new Document(); Section section = newWord.AddSection(); int index = 0; //遍歷源文檔的所有section,檢測page break並根據page break拆分文檔
foreach (Section sec in original.Sections) { foreach (DocumentObject obj in sec.Body.ChildObjects) { if (obj is Paragraph) { Paragraph para = obj as Paragraph; section.Body.ChildObjects.Add(para.Clone()); foreach (DocumentObject parobj in para.ChildObjects) { if (parobj is Break && (parobj as Break).BreakType == BreakType.PageBreak) { int i = para.ChildObjects.IndexOf(parobj); for (int j = i; j < para.ChildObjects.Count; j++) { section.Body.LastParagraph.ChildObjects.RemoveAt(i); } newWord.SaveToFile(String.Format("result/out-{0}.docx", index), FileFormat.Docx); index++; newWord = new Document(); section = newWord.AddSection(); section.Body.ChildObjects.Add(para.Clone()); while (i >= 0) { section.Paragraphs[0].ChildObjects.RemoveAt(i); i--; } if (section.Paragraphs[0].ChildObjects.Count == 0) { section.Body.ChildObjects.RemoveAt(0); } } } } if (obj is Table) { section.Body.ChildObjects.Add(obj.Clone()); } } } newWord.SaveToFile(String.Format("result/out-{0}.docx", index), FileFormat.Docx);
效果圖:
完整代碼:
合並
using Spire.Doc; namespace Merge_Word_Document { class Program { static void Main(string[] args) { //合並一個Word文檔的某一個section到另一個文檔
/*Document doc1 = new Document(); doc1.LoadFromFile("Sales Report.docx", FileFormat.Docx); Document doc2 = new Document(); doc2.LoadFromFile("Stories.docx", FileFormat.Docx); Section sec = doc2.Sections[0]; doc1.Sections.Add(sec.Clone()); doc1.SaveToFile("Mergesection.docx", FileFormat.Docx);*/
//合並兩個完整的Word文檔到一個單獨的文檔
Document document = new Document(); document.LoadFromFile("Sales Report.docx", FileFormat.Docx); document.InsertTextFromFile("Stories.docx", FileFormat.Docx); document.SaveToFile("MergeFiles.docx", FileFormat.Docx); } } }
拆分
using System; using Spire.Doc; using Spire.Doc.Documents; namespace Split_Word_Document { class Program { static void Main(string[] args) { //根據section拆分
/*Document document = new Document(); document.LoadFromFile("Stories.doc"); Document newWord; for (int i = 0; i < document.Sections.Count; i++) { newWord = new Document(); newWord.Sections.Add(document.Sections[i].Clone()); newWord.SaveToFile(String.Format(@"test\out_{0}.docx", i)); }*/
//根據page break拆分
Document original = new Document(); original.LoadFromFile("New Zealand.docx"); Document newWord = new Document(); Section section = newWord.AddSection(); int index = 0; foreach (Section sec in original.Sections) { foreach (DocumentObject obj in sec.Body.ChildObjects) { if (obj is Paragraph) { Paragraph para = obj as Paragraph; section.Body.ChildObjects.Add(para.Clone()); foreach (DocumentObject parobj in para.ChildObjects) { if (parobj is Break && (parobj as Break).BreakType == BreakType.PageBreak) { int i = para.ChildObjects.IndexOf(parobj); for (int j = i; j < para.ChildObjects.Count; j++) { section.Body.LastParagraph.ChildObjects.RemoveAt(i); } newWord.SaveToFile(String.Format("result/out-{0}.docx", index), FileFormat.Docx); index++; newWord = new Document(); section = newWord.AddSection(); section.Body.ChildObjects.Add(para.Clone()); while (i >= 0) { section.Paragraphs[0].ChildObjects.RemoveAt(i); i--; } if (section.Paragraphs[0].ChildObjects.Count == 0) { section.Body.ChildObjects.RemoveAt(0); } } } } if (obj is Table) { section.Body.ChildObjects.Add(obj.Clone()); } } } newWord.SaveToFile(String.Format("result/out-{0}.docx", index), FileFormat.Docx); } } }
注意:這里我使用了一個免費的word API(http://freeword.codeplex.com)。