PythonコードでWord文書に目次を挿入する方法

効率的な文書の整理とナビゲーションは、長いWord文書にとって重要です。Word文書に目次（TOC）を組み込むことは、文書の読みやすさとアクセシビリティを向上させるための強力な方法の一つであり、読者が特定のセクションを迅速に見つけて関連コンテンツにジャンプできるようにします。Pythonの機能を活用することで、文書が進化するにつれて自動的に更新される目次を簡単に生成することができます。この記事では、**PythonプログラムでWord文書に目次を挿入**するための手順とコード例を提供し、簡単にプロフェッショナルな見た目の文書を作成する方法を説明します。

- **[Word文書にデフォルトの書式で目次を挿入する方法](#word文書にデフォルトの書式で目次を挿入する方法)**
- **[Word文書にカスタマイズされた書式で目次を挿入する方法](#word文書にカスタマイズされた書式で目次を挿入する方法)**

この記事で使用する方法には、[Spire.Doc for Python](https://www.e-iceblue.com/Introduce/doc-for-python.html)が必要です。このAPIは公式ウェブサイトからダウンロードするか、PyPIを介してインストールすることができます: `pip install Spire.Doc`.

## Word文書にデフォルトの書式で目次を挿入する方法
Word文書に目次を挿入するには、異なるレベルの見出しに基づいて目次を挿入することができます。文書に見出しレベルが設定されていない場合は、目次を挿入する前に **Paragraph.ApplyStyle(BuiltinStyle)** メソッドを使用して見出しレベルを設定することができます。
**Paragraph.AppendTOC(lowerLevel: int, upperLevel: int)** メソッドを使用することで、任意の段落に目次を挿入し、表示するタイトルを指定することができます。目次を挿入した後は、**Document.UpdateTableOfContents()** メソッドを使用して目次を更新し、その内容が正しく表示されるようにする必要があります。
- **Document** クラスのオブジェクトを作成し、**Document.LoadFromFile()** メソッドを使用してWord文書を読み込みます。
- **Document.AddSection()** メソッドを使用してセクションを追加し、**Section.AddParagraph()** メソッドを使用してセクションに段落を追加し、**Document.Sections.Insert(index: int, entity: Section)** メソッドを使用して新しいセクションをカバーセクションの後に挿入します。
- **Document.UpdateTableOfContents()** メソッドを使用して目次を更新します。
- **Document.SaveToFile()** メソッドを使用して文書を保存します。

**コードの例**
```Python
from spire.doc import *
from spire.doc.common import *

# Documentクラスのオブジェクトを作成する
doc = Document()

# Word文書を読み込む
doc.LoadFromFile("サンプル.docx")

# 目次用のセクションを作成する
section = doc.AddSection()

# セクションに段落を追加する
paragraph = section.AddParagraph()

# 段落に目次を追加する
paragraph.AppendTOC(1, 2)

# 目次のセクションをカバーセクションの後に挿入する
doc.Sections.Insert(1, section)

# 目次を更新する
doc.UpdateTableOfContents()

# 文書を保存する
doc.SaveToFile("output/デフォルトの目次.docx")
doc.Close()
```

**挿入の結果**
![Word文書にデフォルトの書式で目次を挿入](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/ac40794a-0a7a-7907-5c90-340d50aaf515.png)

## Word文書にカスタマイズされた書式で目次を挿入する方法
**TableOfContent** オブジェクトを初期化し、スイッチを使用して目次をカスタマイズすることもできます。たとえば、スイッチ"{\\o \"1-2\" \\n 1-1}"は、目次でレベル1からレベル3までの見出しを表示し、レベル1の見出しのページ番号を省略することを示しています。Word文書にカスタマイズされた目次を挿入するための詳細な手順は以下の通りです。

- **Document**クラスのオブジェクトを作成し、**Document.LoadFromFile()** メソッドを使用してWord文書を読み込みます。
- **Document.AddSection()** メソッドを使用して文書にセクションを追加し、**Section.AddParagraph()** メソッドを使用してセクションに段落を追加し、**Document.Sections.Insert()** メソッドを使用してセクションをカバーセクションの後に挿入します。
- **TableOfContents** クラスのオブジェクトを作成し、**Paragraph.Items.Add()** メソッドを使用して追加した段落に挿入します。
- 目次フィールドを終了させるために、**Paragraph.AppendFieldMark()** メソッドを使用してフィールドの区切りと終了マークを追加します。
- 作成した目次を文書の目次として設定するために、**Document.TOC** プロパティを使用します。
- **Document.SaveToFile()** メソッドを使用して文書を保存します。

**コードの例**
```Python
from spire.doc import *
from spire.doc.common import *

# Documentクラスのオブジェクトを作成し、Word文書を読み込む
doc = Document()
doc.LoadFromFile("サンプル.docx")

# セクションと段落を追加し、カバーセクションの後にセクションを挿入する
section = doc.AddSection()
paragraph = section.AddParagraph()
doc.Sections.Insert(1, section)

# スイッチを使用して目次をカスタマイズする
toc = TableOfContent(doc, "{\\o \"1-2\" \\n 1-1}")

# 段落に目次を挿入する
paragraph.Items.Add(toc)

# 目次フィールドを終了させるためにフィールドの区切りと終了マークを追加する
paragraph.AppendFieldMark(FieldMarkType.FieldSeparator)
paragraph.AppendFieldMark(FieldMarkType.FieldEnd)

# 文書の目次として目次フィールドを設定する
doc.TOC = toc

# 目次を更新する
doc.UpdateTableOfContents()
paragraph1 = doc.Sections.get_Item(2).Paragraphs.get_Item(1)
paragraph1.ApplyStyle(BuiltinStyle.Heading1)

# 文書を保存する
doc.SaveToFile("output/カスタムの目次.docx")
doc.Close()
```

**挿入の結果**
![Word文書にカスタマイズされた書式で目次を挿入](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/85c49f04-a045-5ebf-3e95-75dc122840ca.png)


## 結論
この記事では、Pythonを使用してWord文書に目次を挿入する方法を説明しました。これにより、バスルームや自動的に整理された文書を作成することができます。
Spire.Doc for Pythonには、Pythonで文書処理を容易にする多くの他の機能もあります。詳細な情報については、[Spire.Doc for Pythonのチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Spire.Doc-for-Python-Program-Guide-Content.html)をご覧ください。このAPIを使用して問題が発生した場合は、[Spire.Docフォーラム](https://www.e-iceblue.com/forum/spire-doc-f6.html)で技術サポートを受けることができます。
[一時ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)