在 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。
相关链接
- 设置 XLSX 单元格 — 表格编辑
- 编辑概览 —
EditableDocument保留什么 - 批处理 — 对很多记录跑模板