第 05 章「事務処理を変える ── Office から離れる現実的な道筋」の 2 番目の角度: Word の差し込み印刷を Python に置き換える。
章のどの主張に対応するか
Word の起動 → 書式調整 → 保存 → メール送信 のサイクル: 1 件 5 分 × 1 日 30 件 = 月 50 時間。Markdown + Python 自動化で月 5 時間。45 時間の余裕ができる。
(章本文「実例: 数字で見る」より)
example-1 が「月次レポート生成」、これは 顧客一人ひとり宛のお手紙を一括生成 する。 Word の「差し込み印刷ウィザード」「メール差し込み」が、Markdown テンプレに置き換わる。
やること
- 入力:
data/recipients.csv(顧客 10 件 + プラン・更新日・残額)template.md(Jinja2 テンプレート、{{ company }}{{ name }}などで差し込み)
- 生成: 顧客ごとに 3 形式
- Markdown(社内チェック・編集用)
- PDF(郵送・印刷用、A4)
- TEXT(メール本文に貼り付け用)
- 計測: 10 件 × 3 形式 = 30 ファイルの生成時間
構成
example-2/
├── README.md
├── template.md ── Jinja2 テンプレ
├── mailmerge.py ── 差し込み + 3 形式生成
├── Makefile
├── results.md
├── data/recipients.csv ── 顧客 10 件
└── out/letters/
├── C001.md / C001.pdf / C001.txt
├── C002.md / C002.pdf / C002.txt
└── ... ── 計 30 ファイル
実行
pip install jinja2 markdown-it-py weasyprint
sudo apt install fonts-noto-cjk
make clean && make all
なぜこれが「実例」になるのか
Word の差し込み印刷は便利だが、書式とテンプレが Word ファイルの中に閉じる。
- 別の人にテンプレを渡すと「Word のバージョンが違う」「フォントが置換」
- バージョン管理しにくい(
.docxは Git diff が出ない) - メール本文用とは別にメールも作る必要がある
- Web 公開が要るならまた別形式
Markdown テンプレに切り替えると:
- テンプレが 1 ファイル(
template.md、人間が読める) - データが 1 ファイル(
recipients.csv、Excel でも開ける) - 同じソースから 3 形式(Markdown / PDF / TEXT)を生成
- Git で履歴管理(誰がいつ何を変えたか追える)
- AI が編集に並走(Claude に「文体をもっと丁寧に」と頼める)
これが章で言う「入口と出口だけ変換層」を顧客向け書類で実演する形。
テンプレートを変えると
template.md の 1 行を変えれば、10 件の出力すべてに反映:
-いつも Mochi.ai をご利用いただきありがとうございます。
+いつもご利用いただきありがとうございます。
make を再実行 → 30 ファイル更新。Word の差し込みでも一応できるが、
Git で diff が見えるかどうかがレビューの可否を決める。
計測結果 — 第 05 章 example-2
実行環境: Linux 6.18 / Python 3.x / Jinja2 / WeasyPrint 68.1 / markdown-it-py
一括生成(主目的)
=== 差し込み印刷結果 ===
対象 : 10 件
実行時間: 76.96 秒 (1 件あたり 7,696 ms)
Markdown 合計: 7.9 KB
PDF 合計 : 2,510.9 KB
TEXT 合計 : 7.6 KB
PDF 生成が支配的(WeasyPrint で 1 件 7.7 秒)。Markdown と TEXT の生成は ほぼ瞬時。
Word 差し込みとの比較
| 項目 | Word 差し込み | この Python |
|---|---|---|
| テンプレ作成 | Word + フィールド埋め込み | Markdown + {{ var }} |
| データ | Excel または CSV | CSV |
| 出力形式 | Word / PDF | Markdown / PDF / TEXT 同時 |
| 10 件生成 | 約 5 分(Word 起動 + 確認) | 約 77 秒(全自動) |
| バージョン管理 | "Binary changed" | テンプレと CSV の Git diff |
| AI 連携 | × | テンプレを Claude に書かせる |
サンプル出力(out/letters/C001.md)
# 契約更新のご案内
**山田農園 御中**
山田 太郎 様
いつも Mochi.ai をご利用いただきありがとうございます。
お客様のご契約は **スタンダードプラン**(月額 **1,980 円**)で、
**2026-08-01** に更新予定です。
## ご契約情報
| 項目 | 内容 |
|------|------|
| 顧客番号 | C001 |
| プラン | スタンダード |
| 月額 | 1,980 円 |
| 更新日 | 2026-08-01 |
| 当期末までの残額 | **5,940 円** |
...
PDF 版は同じ内容を A4 + Noto Serif CJK JP で印刷可能な形に。 TEXT 版はメール本文に貼り付けるだけで済む。
1 顧客 = 3 ファイル × 10 顧客 = 30 ファイル
$ ls out/letters/ | head -9
C001.md
C001.pdf
C001.txt
C002.md
C002.pdf
C002.txt
C003.md
C003.pdf
C003.txt
ファイル名 = 顧客 ID。Web フロントから「顧客 ID で更新案内 PDF を取得」 する API を作るのも簡単。
来月の運用
# 1. 新しい更新対象の CSV を data/ に置く
cp ~/Downloads/2026-09-renewals.csv data/recipients.csv
# 2. 走らせる
make all
# 3. PDF を一括メール送信(別途 SMTP スクリプト)
for f in out/letters/*.pdf; do
python3 send_email.py --to "$(...)" --attach "$f"
done
Word でやれば月 50 時間。Python なら月 1 時間。49 時間の節約は、 本当の仕事(顧客との対話、戦略判断)に回せる。
再現手順
pip install jinja2 markdown-it-py weasyprint
sudo apt install fonts-noto-cjk
make clean && make all