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)"으로 나눕니다 — 같은 스타일의 연속 구간입니다. Word는 사용자가 토큰 중간에 붙여넣거나 자동 수정한 경우 내부적으로 {{name}}을 세 개의 별도 런으로 렌더할 수 있습니다. replace_text는 런 경계를 가로지르는 매칭을 투명하게 처리합니다: 검색 전에 같은 스타일 윈도우의 인접 런을 병합합니다.

플레이스홀더에 특수 문자나 스타일이 들어간 span을 쓴다면, Word의 "스마트 따옴표"보다 {{name}} 같은 평범한 ASCII 토큰을 선호하세요 — 런 병합 비용을 최소화합니다.

XLSX는 다릅니다

replace_text는 XLSX에서 0을 반환합니다. 스프레드시트의 텍스트는 <w:t> / <a:t> 요소가 아니라 shared-strings 테이블과 셀 수식에 살기 때문이죠. 대신 set_cell을 사용하세요.

더 보기