Skip to content

在 DOCX 与 PPTX 中替换文本

replace_text(needle, replacement) 会遍历 DOCX 中每一个 <w:t> 元素(正文、页眉、页脚),以及 PPTX 中每张幻灯片和备注幻灯片里的每一个 <a:t>。它返回替换次数。

这是模板化的正确工具:在源文档里定义 {{占位符}},在运行时填入。

单次替换

Python

from office_oxide import EditableDocument

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

Rust

use office_oxide::edit::EditableDocument;

let mut ed = EditableDocument::open("contract.docx")?;
let n = ed.replace_text("{{client_name}}", "Acme Corp");
println!("{n} 处替换");
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} 处替换`);
ed.save('contract_acme.docx');

Go

ed, _ := officeoxide.OpenEditable("contract.docx")
defer ed.Close()
n, _ := ed.ReplaceText("{{client_name}}", "Acme Corp")
fmt.Printf("%d 处替换\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} 处替换");
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")

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")?;

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');

PPTX 模板

同一 API、同样语义 — replace_text 走遍每张幻灯片和每张备注幻灯片。

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")

关于 run 边界

DOCX 与 PPTX 把文本分成「run」 — 同一样式的连续段。如果用户在某个 token 中间粘贴或自动更正,Word 内部可能把 {{name}} 渲染成三个独立的 run。replace_text 透明处理跨 run 匹配:在搜索前合并相同样式窗口里的相邻 run。

如果你的占位符里有特殊字符或带样式的 span,优先使用像 {{name}} 这样的纯 ASCII token,而不是 Word 的「智能引号」 — 这样跨 run 合并的成本最小。

XLSX 例外

replace_text 在 XLSX 上返回 0,因为电子表格的文本住在 shared-strings 表和单元格公式里,而不是 <w:t> / <a:t> 元素中。请改用 set_cell

相关链接