Skip to content

Заміна тексту в DOCX і PPTX

replace_text(needle, replacement) обходить кожен елемент <w:t> у DOCX (тіло, колонтитули) та кожен <a:t> на кожному слайді й notes-слайді у PPTX. Повертає кількість виконаних замін.

Це правильний інструмент для заповнення шаблонів: задайте {{плейсхолдери}} у вихідному документі й заповнюйте їх у рантаймі.

Один прохід заміни

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 обходить кожен слайд і кожен notes-слайд.

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» — суцільні відрізки одного стилю. Word може внутрішньо рендерити {{name}} як три окремі run, якщо користувач вставив/автоматично виправив щось посередині токена. replace_text обробляє cross-run-збіги прозоро: перед пошуком зливає сусідні run одного стильового вікна.

Якщо в плейсхолдерах є спецсимволи або стилізовані span, надавайте перевагу простим ASCII-токенам типу {{name}} замість «смарт-лапок» Word — так мінімізуєте вартість cross-run-злиття.

XLSX — інакше

replace_text повертає 0 на XLSX, бо текст таблиць живе в shared-strings таблиці й у формулах клітинок, а не в елементах <w:t> / <a:t>. Використовуйте set_cell.

Дивіться також