Word文書の目次(TOC)は、文書に含まれる内容の概要を示します。さらに、ドキュメントの特定のセクションに移動できます。この記事では、C#を使用してプログラムでWord文書の目次を操作する方法を学習します。特に、この記事では、Word文書の目次を追加、抽出、更新、または削除する方法について説明します。

Word文書で目次を操作するC#API

Word文書の目次を操作するために、Aspose.Words for .NETを使用します。上記のAPIは、.NETアプリケーション内から基本的なWord自動化機能と高度なWord自動化機能を実行するように設計されています。さらに、Word文書の目次の操作をしっかりと把握できます。 APIをダウンロードするか、NuGetを使用してインストールできます。

PM> Install-Package Aspose.Words

C#を使用してWord文書に目次を追加する

Aspose.Words for .NETを使用して、目次をWord文書に追加する手順は次のとおりです。

次のコードサンプルは、C#でWord文書に目次を追加する方法を示しています。

// 完全な例とデータファイルについては、https://github.com/aspose-words/Aspose.Words-for-.NETにアクセスしてください。
// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();
// ドキュメントを初期化します。
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

// ドキュメントの先頭に目次を挿入します。
builder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u");

// 新しく挿入された目次は、最初は空になります。
// ドキュメントのフィールドを更新して入力する必要があります。
doc.UpdateFields();
dataDir = dataDir + "DocumentBuilderInsertTOC_out.doc";
doc.Save(dataDir);

C#を使用してWord文書から目次を抽出する

以下は、Word文書の目次からフィールドを抽出する手順です。

  • Documentクラスを使用してWordドキュメントをロードします。
  • Document.Range.Fieldsコレクションを使用して、ドキュメント内の各Fieldをループします。
  • Field.Typeプロパティを使用して、フィールドタイプがハイパーリンクであるかどうかを確認します。
  • フィールドがコンテンツセクションのテーブルの下にあるかどうかを確認します。
  • フィールドの情報を取得して印刷します。

次のコードサンプルは、C#を使用してWord文書から目次を抽出する方法を示しています。

// ドキュメントディレクトリへのパス。
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();

string fileName = "TOC.doc";
Aspose.Words.Document doc = new Aspose.Words.Document(dataDir + fileName);

foreach (Field field in doc.Range.Fields)
{
	if (field.Type.Equals(Aspose.Words.Fields.FieldType.FieldHyperlink))
	{
		FieldHyperlink hyperlink = (FieldHyperlink)field;
		if (hyperlink.SubAddress != null && hyperlink.SubAddress.StartsWith("_Toc"))
		{
			Paragraph tocItem = (Paragraph)field.Start.GetAncestor(NodeType.Paragraph);
			Console.WriteLine(tocItem.ToString(SaveFormat.Text).Trim());
			Console.WriteLine("------------------");
			if (tocItem != null)
			{
				Bookmark bm = doc.Range.Bookmarks[hyperlink.SubAddress];
				// この目次アイテムが指している場所を取得します
				Paragraph pointer = (Paragraph)bm.BookmarkStart.GetAncestor(NodeType.Paragraph);
				Console.WriteLine(pointer.ToString(SaveFormat.Text));
			}
		} // End If
	}// End If
}// End Foreach

C#を使用してWord文書の目次を更新する

Word文書にコンテンツを追加するときはいつでも、目次を更新する必要があります。プログラムで実行するには、ドキュメントを保存する前にDocument.UpdateFields()メソッドを呼び出す必要があります。

C#を使用してWord文書の目次を削除する

Aspose.Words for .NETでは、Word文書から目次を削除することもできます。この操作を実行する手順は次のとおりです。

  • まず、Documentクラスを使用してWordドキュメントをロードします。
  • 各TOCのFieldStartノードを取得して配列に格納します。
  • タイプFieldEnd(目次の終わり)のノードを取得するまで、ノードをループします。
  • Node.Remove()メソッドを使用してノードを削除し、更新されたドキュメントを保存します。

次のコードサンプルは、C#でWord文書から目次を削除する方法を示しています。

// 完全な例とデータファイルについては、https://github.com/aspose-words/Aspose.Words-for-.NETにアクセスしてください。
public static void Run()
{
    
    // ドキュメントディレクトリへのパス。
    string dataDir = RunExamples.GetDataDir_WorkingWithStyles();

    // TOCを含むドキュメントを開きます。
    Document doc = new Document(dataDir + "Document.TableOfContents.doc");

    // ドキュメントから最初の目次を削除します。
    RemoveTableOfContents(doc, 0);

    dataDir = dataDir + "Document.TableOfContentsRemoveToc_out.doc";
    // 出力を保存します。
    doc.Save(dataDir);
    
    Console.WriteLine("\nSpecified TOC from a document removed successfully.\nFile saved at " + dataDir);
}
///<summary>
///指定された目次フィールドをドキュメントから削除します。
///</summary>
///<param name="doc">フィールドを削除するドキュメント。</param>
///<param name="index">削除する目次のゼロベースのインデックス。</param>
public static void RemoveTableOfContents(Document doc, int index)
{
    // すばやくアクセスできるように、TOCフィールドのFieldStartノードをドキュメントに保存します。
    ArrayList fieldStarts = new ArrayList();
    // これは、指定されたTOC内で見つかったノードを格納するためのリストです。それらは削除されます
    // このメソッドの最後に。
    ArrayList nodeList = new ArrayList();

    foreach (FieldStart start in doc.GetChildNodes(NodeType.FieldStart, true))
    {
        if (start.FieldType == FieldType.FieldTOC)
        {
            // FieldTOCタイプのすべてのFieldStartを追加します。
            fieldStarts.Add(start);
        }
    }

    // 渡されたインデックスで指定された目次が存在することを確認します。
    if (index > fieldStarts.Count - 1)
        throw new ArgumentOutOfRangeException("TOC index is out of range");

    bool isRemoving = true;
    // 指定された目次のFieldStartを取得します。
    Node currentNode = (Node)fieldStarts[index];

    while (isRemoving)
    {
        // これらのノードを保存し、後で一度にすべて削除する方が安全です。
        nodeList.Add(currentNode);
        currentNode = currentNode.NextPreOrder(doc);

        // FieldTOCタイプのFieldEndノードに遭遇すると、最後にいることがわかります。
        // 現在の目次のうち、ここで停止できます。
        if (currentNode.NodeType == NodeType.FieldEnd)
        {
            FieldEnd fieldEnd = (FieldEnd)currentNode;
            if (fieldEnd.FieldType == FieldType.FieldTOC)
                isRemoving = false;
        }
    }

    // 指定された目次で見つかったすべてのノードを削除します。
    foreach (Node node in nodeList)
    {
        node.Remove();
    }
}

無料のAPIライセンスを取得する

評価の制限なしにAPIを試してみたい場合は、無料の一時ライセンスを取得できます。

結論

この記事では、C#を使用してWord文書の目次を操作する方法を学習しました。ステップバイステップガイドとコードサンプルは、Word文書から目次を追加、更新、抽出、および削除する方法を示しています。 ドキュメントを使用して、C#Word自動化APIの詳細を調べることができます。ご質問やご不明な点がございましたら、フォーラムからお問い合わせください。

関連項目