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