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);
런(run) 경계에 대하여
DOCX와 PPTX는 텍스트를 「런(run)」 단위로 나눕니다. 런이란 동일한 스타일이 연속으로 적용된 문자 구간을 말합니다. 사용자가 토큰 중간에 붙여넣거나 자동 수정이 발생한 경우, Word는 {{name}}을 내부적으로 세 개의 별도 런으로 저장할 수 있습니다. replace_text는 이러한 런 경계를 가로지르는 일치를 투명하게 처리합니다. 검색 전에 동일한 스타일 창에 속하는 인접 런들을 먼저 합칩니다.
플레이스홀더에 특수 문자나 스타일이 들어간 스팬이 포함된다면, Word의 「스마트 따옴표」 대신 {{name}}처럼 단순한 ASCII 토큰을 사용하세요. 런 병합 비용을 최소화할 수 있습니다.
XLSX는 다릅니다
replace_text는 XLSX에 대해 0을 반환합니다. 스프레드시트의 텍스트는 <w:t> / <a:t> 요소가 아닌 shared-strings 테이블과 셀 수식에 저장되기 때문입니다. 스프레드시트 편집에는 set_cell을 사용하세요.