本文簡要分析一下如何如何使用C#簡單實作合并和拆分word文檔。平時我們在處理多個word文檔時,可能會想要将兩個文檔合并為一個,或者是将某個文檔的一部分添加到另一個文檔中,有的時候也會想要将文檔拆分。在Word中,合并或拆分文檔最簡單的方式就是打開一個原文檔的副本檔案,複制我們需要的部分,删除不需要的部分,然後再儲存文檔。使用這種方法在文檔比較多或者比較大時手動操作起來比較費時,以下是使用C#實作合并一個Word文檔的某一個section到另一個文檔或者合并兩個完整的Word文檔到一個單獨的文檔以及如何根據section和page break來拆分一個Word文檔的方法。
第一部分:合并Word文檔
為了資料的保密性,我新建立了兩個簡單的word文檔,如下圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYWNwYWNjZTYkJmZ3EzM4MDMkJDZmdTY2cjMyQzN4cDZfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
文檔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)。