PythonでWord文書に条件付き差し込み印刷を作成・実行する方法

メールマージ フィールドとIFフィールドは、Word文書で非常に便利なフィールドの二つです。前者は差し込み印刷（メールマージ）に使用され、データに基づいてカスタマイズされたWord文書を一括作成できます。後者は条件に基づいて異なる内容を表示するために使用されます。IFフィールドとメールマージフィールドを組み合わせることで、条件付き差し込み印刷を実現し、差し込み印刷の応用範囲を拡大することができます。Pythonを使用すると、このプロセスを自動化し、より便利な一括操作を実現できます。
この記事では、**Pythonを使用してWord文書で条件付き差し込み印刷（メールマージ）フィールドを作成し、条件付き差し込み印刷を実行する方法**を紹介します。

- **[Pythonを使用してWord文書で条件付き差し込み印刷フィールドを作成する](#pythonを使用してword文書で条件付き差し込み印刷フィールドを作成する)**
- **[Pythonを使用してWord文書の条件付き差し込み印刷を実行する](#pythonを使用してword文書の条件付き差し込み印刷を実行する)**

この記事で使用する方法には、[Spire.Doc for Python](https://jp.e-iceblue.com/download/spire-doc-for-python.html)が必要です。PyPI：`pip install Spire.Doc`。

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)

## Pythonを使用してWord文書で条件付き差し込み印刷フィールドを作成する
メールマージフィールドを`IFフィールド`に挿入することで、条件付き差し込み印刷フィールドを作成できます。作成する際には、段落にIFフィールドと開始コードを挿入し、その後にメールマージフィールドを挿入し、最後に残りのコードとフィールドの終了マークを挿入します。
以下は条件付き差し込み印刷フィールドの作成手順の例です：
1. 必要なモジュールをインポートします。
2. `Document`オブジェクトを作成し、Word文書を作成します。
3. 文書にセクションを追加し、ページ設定を行います。
4. 段落スタイルを作成し、セクションに段落とテキストを追加してスタイルを設定します。
5. `IfField`オブジェクトを作成し、その開始コードを`IfField.Code`プロパティで設定し、`Paragraph.Items.Add()`メソッドを使用して段落に追加します。
6. `Paragraph.AppendField()`を使用して後続にメールマージフィールドを追加します。
7. `Paragraph.AppendText()`を使用してメールマージフィールドの後に残りのコードを追加します。
8. `Paragraph.AppendFieldMark()`メソッドを使用して最後にフィールドの終了マークを追加し、`IfField.End`プロパティでIFフィールドの終了位置として設定します。
9. `Document.SaveToFile()`メソッドを使用して文書を保存します。
10. リソースを解放します。

**コード例**
```python
from spire.doc import *

# Document インスタンスを作成
doc = Document()

# 文書にセクションを追加
section = doc.AddSection()

# ページサイズと余白を設定
section.PageSetup.PageSize = PageSize.A4()
section.PageSetup.Margins.All = 50

# 段落スタイルを作成
style = ParagraphStyle(doc)
style.Name = "Style1"
style.CharacterFormat.FontName = "Yu Gothic UI"
style.CharacterFormat.FontSize = 14
doc.Styles.Add(style)

# 段落を追加してスタイルを設定
paragraph = section.AddParagraph()
paragraph.AppendField("Name", FieldType.FieldMergeField)
paragraph.AppendText("様")
paragraph.ApplyStyle(style.Name)
paragraph = section.AddParagraph()
paragraph.AppendText("拝啓\r\n")
paragraph.ApplyStyle(style.Name)

# 段落に IF フィールドを追加
paragraph = section.AddParagraph()
ifField = IfField(doc)
ifField.Type = FieldType.FieldIf
ifField.Code = "IF "
paragraph.Items.Add(ifField)
# IF フィールドのコードにメールマージフィールドを追加
paragraph.AppendField("CustomerType", FieldType.FieldMergeField)
paragraph.AppendText(" = ")
paragraph.AppendText("\"VIP\"")
paragraph.AppendText(" \"親愛なるVIP顧客様、いつもご愛顧いただきありがとうございます！特別な無料配送サービスをご提供します。\"")
paragraph.AppendText("\"追加の特典を随時提供しますので、当社の告知やメールをご確認ください。\"")
# 最後にフィールド終了マークを追加して IF フィールドを終了
endIf = paragraph.AppendFieldMark(FieldMarkType.FieldEnd)
ifField.End = endIf
paragraph.ApplyStyle(style.Name)

# 段落を追加してスタイルを設定
paragraph = section.AddParagraph()
paragraph.AppendText("ご利用総額（￥）：")
paragraph.AppendField("TotalSpent", FieldType.FieldMergeField)
paragraph.ApplyStyle(style.Name)
paragraph = section.AddParagraph()
paragraph.AppendText("\r\n敬具\r\n株式会社")
paragraph.ApplyStyle(style.Name)

# 文書を保存
doc.SaveToFile("output/条件付き差し込み印刷.docx", FileFormat.Docx)
doc.Close()
```

結果ファイル
![PythonでWord文書で条件付き差し込み印刷フィールドを作成する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/142d7579-01b3-fc76-bb9f-01cc8e39a41f.png)

## Pythonを使用してWord文書の条件付き差し込み印刷を実行する
`Document.MailMerge.Execute()`メソッドを使用して差し込み印刷を実行し、その後`Document.IsUpdateFields`でフィールドを更新して最終的な条件付き差し込み印刷の結果を表示できます。
以下は操作手順です：
1. 必要なモジュールをインポートします。
2. マージに使用するテーブルのデータをリストとして読み込みます。
3. データ行を繰り返し処理し、ヘッダーをスキップします。
4. `Document`オブジェクトを作成し、マージする`Word`文書を読み込みます。
    * `Document.MailMerge.GetMergeFieldNames()`メソッドを使用して文書内のメールマージフィールドの名前をリストとして取得します。
    * `Document.MailMerge.Execute()`メソッドを使用してデータを使って差し込み印刷を実行します。
    * `Document.IsUpdateFields`プロパティを`True`に設定してIFフィールドを更新します。
    * `Document.SaveToFile()`メソッドを使用して文書を保存します。
5. リソースを解放します。

**コード例**
```python
from spire.doc import *
import csv

# CSV ファイルからデータを読み込み
data = []
with open("Sample.csv", "r", encoding="utf-8") as csvfile:
    read = csv.reader(csvfile)
    for row in read:
        data.append(row)

# データ行を繰り返し処理し、ヘッダー行をスキップ
for i in range(1, len(data)):
    # Document インスタンスを作成し、Word 文書を読み込み
    doc = Document("output/条件付き差し込み印刷.docx")
    # 文書からフィールド名を取得
    fieldNames = doc.MailMerge.GetMergeFieldNames()
    # 差し込み印刷を実行
    doc.MailMerge.Execute(fieldNames, data[i])
    # IF フィールドを更新
    doc.IsUpdateFields = True
    # 文書を保存
    doc.SaveToFile(f"output/customers/{data[i][0]}.docx", FileFormat.Docx2019)
    doc.Close()

csvfile.close()
```

結果ファイル
![Pythonを使用してWord文書の条件付き差し込み印刷を実行する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/3943b307-2f4f-d528-f831-84bbc15db962.png)

この記事では、Pythonを使用してWord文書で条件付き差し込み印刷フィールドを作成し、条件付き差し込み印刷を実行する方法を紹介しました。

さらに詳しいWord文書の処理方法については、[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)をご覧ください。