天天看點

C# 合并及拆分Word文檔

本文簡要分析一下如何如何使用C#簡單實作合并和拆分word文檔。平時我們在處理多個word文檔時,可能會想要将兩個文檔合并為一個,或者是将某個文檔的一部分添加到另一個文檔中,有的時候也會想要将文檔拆分。在Word中,合并或拆分文檔最簡單的方式就是打開一個原文檔的副本檔案,複制我們需要的部分,删除不需要的部分,然後再儲存文檔。使用這種方法在文檔比較多或者比較大時手動操作起來比較費時,以下是使用C#實作合并一個Word文檔的某一個section到另一個文檔或者合并兩個完整的Word文檔到一個單獨的文檔以及如何根據section和page break來拆分一個Word文檔的方法。

第一部分:合并Word文檔

為了資料的保密性,我新建立了兩個簡單的word文檔,如下圖:

C# 合并及拆分Word文檔
文檔1
C# 合并及拆分Word文檔

文檔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);      

效果圖:

C# 合并及拆分Word文檔

合并兩個完整的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);      
C# 合并及拆分Word文檔

第二部分:拆分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));
}      
C# 合并及拆分Word文檔

根據page break拆分Word文檔

如下文檔含有兩個page break分别在第一頁和第二頁的末尾:

C# 合并及拆分Word文檔
//加載源文檔
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);      
C# 合并及拆分Word文檔

完整代碼:

合并

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)。

繼續閱讀