チュートリアル

簡単にライブラリーを使用するためのチュートリアルコレクション

チュートリアル».NET»Spire.Doc for .NET»文書操作»C#/VB.NET:Word ドキュメントを分割する方法
2023-05-16

C#/VB.NET:Word ドキュメントを分割する方法

MS Word では、元のドキュメントから内容を手動で切り取り、新しいドキュメントに貼り付けることで、ドキュメントを分割することができます。この作業は簡単ですが、特に長いドキュメントを扱う場合、非常に面倒で時間がかかることもあります。この記事では、Spire.Doc for .NET を使用して、プログラムによって Word ドキュメントを複数のファイルに分割する方法について説明します。

Spire.Doc for .NET をインストールします

まず、Spire.Doc for .NET パッケージに含まれている DLL ファイルを .NET プロジェクトの参照として追加する必要があります。DLL ファイルは、このリンクからダウンロードするか、NuGet を介してインストールできます。

PM> Install-Package Spire.Doc

Word ドキュメントを改ページで分割する

Word ドキュメントには、改ページによって区切られた複数のページを含めることができます。Word ドキュメントを改ページで分割するには、以下の手順とコードを参照してください。

  • Document のインスタンスを作成します。
  • Document.LoadFromFile() メソッドを使用して Word ドキュメントを読み込みます。
  • 新しい Word ドキュメントを作成し、そこにセクションを追加します。
  • 元のドキュメントの各セクションにあるすべてのボディの子オブジェクトをループし、子オブジェクトが段落か表かを判断します。
  • セクションの子オブジェクトが表の場合は、Section.Body.ChildObjects.Add() メソッドを使用して、新規文書のセクションに直接追加します。
  • セクションの子オブジェクトが段落の場合、まず段落オブジェクトを新規文書のセクションに追加します。次に、段落の子オブジェクトをすべてループし、その子オブジェクトが改ページかどうかを判断します。
  • 段落の子オブジェクトが改ページであれば、そのインデックスを取得し、インデックスでその段落から改ページを削除します。
  • ドキュメントを保存し、上記の処理を繰り返します。
  • C#
  • VB.NET
using System;
using Spire.Doc;
using Spire.Doc.Documents;

namespace SplitByPageBreak
{
    class Program
    {
        static void Main(string[] args)
        {
            //Documentのインスタンスを作成する
            Document original = new Document();

            //Wordドキュメントを読み込む
            original.LoadFromFile("C:/サンプル.docx");

            //新しいWordドキュメントを作成し、それにセクションを追加する
            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;
                        sec.CloneSectionPropertiesTo(section);

                        //元のドキュメントのセクションにある段落オブジェクトを、新しいドキュメントのセクションに追加する
                        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);

                                //その段落から改ページを削除する
                                section.Body.LastParagraph.ChildObjects.RemoveAt(i);

                                //新しいWordドキュメントを保存する
                                newWord.SaveToFile(String.Format("result/分割-{0}.docx", index), FileFormat.Docx);
                                index++;

                                //新しいドキュメントを作成し、それにセクションを追加する
                                newWord = new Document();
                                section = newWord.AddSection();

                                //元のセクションの段落オブジェクトを、新しいドキュメントのセクションに追加する
                                section.Body.ChildObjects.Add(para.Clone());
                                if (section.Paragraphs[0].ChildObjects.Count == 0)
                                {
                                    //最初の空白の段落を削除する
                                    section.Body.ChildObjects.RemoveAt(0);
                                }
                                else
                                {
                                    //改ページ前の子オブジェクトを削除する
                                    while (i >= 0)
                                    {
                                        section.Paragraphs[0].ChildObjects.RemoveAt(i);
                                        i--;
                                    }
                                }
                            }
                        }
                    }
                    if (obj is Table)
                    {
                        //元セクションの表のオブジェクトを、新しいドキュメントのセクションに追加する
                        section.Body.ChildObjects.Add(obj.Clone());
                    }
                }
            }

            //ドキュメントを保存する
            newWord.SaveToFile(String.Format("result/分割-{0}.docx", index), FileFormat.Docx);

        }
    }
}
Imports System
Imports Spire.Doc
Imports Spire.Doc.Documents

Namespace SplitByPageBreak
    Class Program
        Shared Sub Main(ByVal args() As String)
            'Documentのインスタンスを作成する
            Dim original As Document = New Document()

            'Wordドキュメントを読み込む
            original.LoadFromFile("C:/サンプル.docx")

            '新しいWordドキュメントを作成し、それにセクションを追加する
            Dim NewWord As Document = New Document()
            Dim section As Section = NewWord.AddSection()
            Dim index As Integer = 0

            '元のドキュメントに含まれるすべてのセクションをループする
            Dim sec As Section
            For Each sec In original.Sections
                '各セクションのボディーの子オブジェクトをすべてループする。
                Dim obj As DocumentObject
                For Each obj In sec.Body.ChildObjects
                    If TypeOf obj Is Paragraph Then
                        Dim para As Paragraph = obj As Paragraph 
                        sec.CloneSectionPropertiesTo(section)

                        '元のドキュメントのセクションにある段落オブジェクトを、新しいドキュメントのセクションに追加する
                        section.Body.ChildObjects.Add(para.Clone())

                        '各段落のすべての子オブジェクトをループし、オブジェクトが改ページであるかどうかを判断する
                        Dim parobj As DocumentObject
                        For Each parobj In para.ChildObjects
                            If TypeOf parobj Is Break && (parobj as Break).BreakType = BreakType.PageBreak Then
                                '段落内の改ページのインデックスを取得する
                                Dim i As Integer = para.ChildObjects.IndexOf(parobj)

                                'その段落から改ページを削除する
                                section.Body.LastParagraph.ChildObjects.RemoveAt(i)

                                '新しいWordドキュメントを保存する
                                NewWord.SaveToFile(String.Format("result/分割-{0}.docx", index), FileFormat.Docx)
                                index = index + 1

                                '新しいドキュメントを作成し、それにセクションを追加する
                                NewWord = New Document()
                                section = NewWord.AddSection()

                                '元のセクションの段落オブジェクトを、新しいドキュメントのセクションに追加する
                                section.Body.ChildObjects.Add(para.Clone())
                                If section.Paragraphs(0).ChildObjects.Count = 0 Then
                                    '最初の空白の段落を削除する
                                    section.Body.ChildObjects.RemoveAt(0)
                                Else
                                    '改ページ前の子オブジェクトを削除する
                                    While i >= 0
                                        section.Paragraphs(0).ChildObjects.RemoveAt(i)
                                        i = i - 1
                                    End While
                                End If
                            End If
                        Next
                    End If
                    If TypeOf obj Is Table Then
                        '元セクションの表のオブジェクトを、新しいドキュメントのセクションに追加する
                        section.Body.ChildObjects.Add(obj.Clone())
                    End If
                Next
            Next

            'ドキュメントを保存する
            NewWord.SaveToFile(String.Format("result/分割-{0}.docx", index), FileFormat.Docx)

        End Sub
    End Class
End Namespace

C#/VB.NET:Word ドキュメントを分割する方法

Word ドキュメントをセクション区切りで分割する

Word ドキュメントでは、セクションは、それ自身のページ書式を含むドキュメントの一部分です。複数のセクションを含むドキュメントの場合、Spire.Doc for .NET はセクションの区切りによるドキュメントの分割もサポートしています。詳しい手順は以下の通りです。

  • Document のインスタンスを作成します。
  • Document.LoadFromFile() メソッドを使用して Word ドキュメントを読み込みます。
  • 新しい Document のオブジェクトを作成します。
  • 元の Word ドキュメントのすべてのセクションをループします。
  • Document.Sections.Clone() メソッドを使用して、元のドキュメントの各セクションをコピーします。
  • Document.Sections.Add() メソッドを使用して、コピーしたセクションを新しいセクションとして新しいドキュメントに追加します。
  • Document.SaveToFile() メソッドを使用して、ドキュメントを保存します。
  • C#
  • VB.NET
using System;
using Spire.Doc;

namespace SplitBySectionBreak
{
    class Program
    {
        static void Main(string[] args)
        {
            //Documentのインスタンスを作成する
            Document document = new Document();

            //Wordドキュメントを読み込む
            document.LoadFromFile("C:/サンプル.docx");

            //新しいDocumentのオブジェクトを作成する
            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\出力_{0}.docx", i));
            }
        }
    }
}
Imports System
Imports Spire.Doc

Namespace SplitBySectionBreak
    Class Program
        Shared Sub Main(ByVal args() As String)
            'Documentのインスタンスを作成する
            Dim document As Document = New Document()

            'Wordドキュメントを読み込む
            document.LoadFromFile("C:/サンプル.docx")

            '新しいDocumentのオブジェクトを作成する
            Dim NewWord As Document
            '元のドキュメント内のすべてのセクションをループする
            Dim i As Integer
            For i = 0 To document.Sections.Count - 1 Step i + 1
                NewWord = New Document()

                '元ドキュメントの各セクションをコピーして、新しいセクションとして新ドキュメントに追加する
                NewWord.Sections.Add(document.Sections(i).Clone())

                'ドキュメントを保存する
                NewWord.SaveToFile(String.Format("test\出力_{0}.docx", i))
            Next
        End Sub
    End Class
End Namespace

C#/VB.NET:Word ドキュメントを分割する方法

一時ライセンスを申請する

結果ドキュメントから評価メッセージを削除したい場合、または機能制限を取り除く場合は、についてこのメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。にお問い合わせ、30 日間有効な一時ライセンスを取得してください。

Read 522 times