Skip to content

DOCX・PPTXのテキスト置換

replace_text(needle, replacement) は、DOCXのすべての <w:t> 要素(本文、ヘッダー、フッター)と、PPTXのすべてのスライド・ノートスライド内の <a:t> 要素を走査します。戻り値は置換が行われた件数です。

テンプレート処理に最適なツールです。ソースドキュメントに {{プレースホルダー}} を定義しておき、実行時に値を埋め込みます。

シングルパス置換

Rust

use office_oxide::edit::EditableDocument;

let mut ed = EditableDocument::open("contract.docx")?;
let n = ed.replace_text("{{client_name}}", "Acme Corp");
println!("{n} replacements");
ed.save("contract_acme.docx")?;

Python

from office_oxide import EditableDocument

with EditableDocument.open("contract.docx") as ed:
    n = ed.replace_text("{{client_name}}", "Acme Corp")
    print(f"{n} replacements")
    ed.save("contract_acme.docx")

JavaScript

import { EditableDocument } from 'office-oxide';

using ed = EditableDocument.open('contract.docx');
const n = ed.replaceText('{{client_name}}', 'Acme Corp');
console.log(`${n} replacements`);
ed.save('contract_acme.docx');

Go

ed, _ := officeoxide.OpenEditable("contract.docx")
defer ed.Close()
n, _ := ed.ReplaceText("{{client_name}}", "Acme Corp")
fmt.Printf("%d replacements\n", n)
ed.Save("contract_acme.docx")

C#

using var ed = EditableDocument.Open("contract.docx");
long n = ed.ReplaceText("{{client_name}}", "Acme Corp");
Console.WriteLine($"{n} replacements");
ed.Save("contract_acme.docx");

C

int err = 0;
OfficeEditableHandle *ed = office_editable_open("contract.docx", &err);
int64_t n = office_editable_replace_text(ed, "{{client_name}}", "Acme Corp", &err);
printf("%lld replacements\n", (long long)n);
office_editable_save(ed, "contract_acme.docx", &err);
office_editable_free(ed);

複数キーの一括埋め込み

保存前にまとめて置換を行うことで、ファイルを何度も開き直す必要がなくなり、処理コストを大幅に削減できます。

Rust

let fields = [
    ("{{client_name}}",   "Acme Corp"),
    ("{{contract_date}}", "2026-04-19"),
    ("{{amount}}",        "$120,000"),
    ("{{tier}}",          "Enterprise"),
];

let mut ed = EditableDocument::open("contract.docx")?;
for (needle, value) in fields {
    ed.replace_text(needle, value);
}
ed.save("contract_acme.docx")?;

Python

fields = {
    "{{client_name}}":   "Acme Corp",
    "{{contract_date}}": "2026-04-19",
    "{{amount}}":        "$120,000",
    "{{tier}}":          "Enterprise",
}

with EditableDocument.open("contract.docx") as ed:
    for needle, value in fields.items():
        ed.replace_text(needle, value)
    ed.save("contract_acme.docx")

JavaScript

const fields = {
  '{{client_name}}':   'Acme Corp',
  '{{contract_date}}': '2026-04-19',
  '{{amount}}':        '$120,000',
  '{{tier}}':          'Enterprise',
};

using ed = EditableDocument.open('contract.docx');
for (const [k, v] of Object.entries(fields)) ed.replaceText(k, v);
ed.save('contract_acme.docx');

C

const char *keys[]   = { "{{client_name}}", "{{contract_date}}", "{{amount}}", "{{tier}}" };
const char *values[] = { "Acme Corp",       "2026-04-19",        "$120,000",   "Enterprise" };

int err = 0;
OfficeEditableHandle *ed = office_editable_open("contract.docx", &err);
for (size_t i = 0; i < 4; i++) {
    office_editable_replace_text(ed, keys[i], values[i], &err);
}
office_editable_save(ed, "contract_acme.docx", &err);
office_editable_free(ed);

PPTXのテンプレート処理

APIも動作もまったく同じです。replace_text はすべてのスライドとノートスライドを走査します。

Rust

let mut ed = EditableDocument::open("deck_template.pptx")?;
ed.replace_text("{{quarter}}", "Q4 2026");
ed.replace_text("{{growth}}",  "+18.4%");
ed.save("q4_deck.pptx")?;

Python

with EditableDocument.open("deck_template.pptx") as ed:
    ed.replace_text("{{quarter}}", "Q4 2026")
    ed.replace_text("{{growth}}",  "+18.4%")
    ed.save("q4_deck.pptx")

JavaScript

using ed = EditableDocument.open('deck_template.pptx');
ed.replaceText('{{quarter}}', 'Q4 2026');
ed.replaceText('{{growth}}',  '+18.4%');
ed.save('q4_deck.pptx');

Go

ed, _ := officeoxide.OpenEditable("deck_template.pptx")
defer ed.Close()
ed.ReplaceText("{{quarter}}", "Q4 2026")
ed.ReplaceText("{{growth}}", "+18.4%")
ed.Save("q4_deck.pptx")

C#

using var ed = EditableDocument.Open("deck_template.pptx");
ed.ReplaceText("{{quarter}}", "Q4 2026");
ed.ReplaceText("{{growth}}", "+18.4%");
ed.Save("q4_deck.pptx");

C

int err = 0;
OfficeEditableHandle *ed = office_editable_open("deck_template.pptx", &err);
office_editable_replace_text(ed, "{{quarter}}", "Q4 2026", &err);
office_editable_replace_text(ed, "{{growth}}",  "+18.4%", &err);
office_editable_save(ed, "q4_deck.pptx", &err);
office_editable_free(ed);

ランの境界について

DOCX・PPTXはテキストを「ラン」という単位に分割します。ランとは、同じスタイルが連続して適用された文字のまとまりです。ユーザーがトークンの途中で貼り付けや自動修正を行った場合、{{name}} が内部的に3つの独立したランとして保存されることがあります。replace_text はこのようなクロスラン一致を透過的に処理します。検索前に同じスタイルウィンドウの隣接するランを結合するためです。

プレースホルダーに特殊文字やスタイル付きスパンを使う場合は、Wordの「スマートクォート」よりも {{name}} のようなシンプルなASCIIトークンを推奨します。クロスラン結合のコストを最小化できます。

XLSXの扱いは異なります

replace_text はXLSXに対して 0 を返します。スプレッドシートのテキストは <w:t> / <a:t> 要素ではなく、共有文字列テーブルとセル数式に格納されているためです。スプレッドシートの編集には set_cell を使用してください。

関連ドキュメント