Редагування Office-документів
EditableDocument — read-modify-write аналог Document. Він зберігає кожну незмінену OPC-частину — зображення, діаграми, стилі, теми, зв’язки — дослівно, тож ваші правки не переплавляють оточуючий контент і не ламають downstream-споживачів.
Редагування підтримується для DOCX, XLSX і PPTX. Legacy DOC, XLS та PPT — лише для читання; якщо треба правити, спершу конвертуйте через save_as.
Що ви можете
| Операція | DOCX | XLSX | PPTX | Метод |
|---|---|---|---|---|
| Заміна тексту в body / плейсхолдерах | ✓ | — | ✓ | replace_text |
| Запис значення клітинки (string / number / bool / empty) | — | ✓ | — | set_cell |
| Збереження на диск | ✓ | ✓ | ✓ | save |
| Збереження в байти | ✓ | ✓ | ✓ | save_to_bytes |
replace_text повертає 0 на XLSX (там немає елементів <w:t> чи <a:t>); для таблиць використовуйте set_cell.
Відкрити, відредагувати, зберегти
Python
from office_oxide import EditableDocument
with EditableDocument.open("template.docx") as ed:
ed.replace_text("{{name}}", "Alice")
ed.replace_text("{{date}}", "2026-04-19")
ed.save("filled.docx")
Rust
use office_oxide::edit::EditableDocument;
let mut ed = EditableDocument::open("template.docx")?;
ed.replace_text("{{name}}", "Alice");
ed.replace_text("{{date}}", "2026-04-19");
ed.save("filled.docx")?;
JavaScript
import { EditableDocument } from 'office-oxide';
using ed = EditableDocument.open('template.docx');
ed.replaceText('{{name}}', 'Alice');
ed.replaceText('{{date}}', '2026-04-19');
ed.save('filled.docx');
Go
ed, err := officeoxide.OpenEditable("template.docx")
defer ed.Close()
ed.ReplaceText("{{name}}", "Alice")
ed.ReplaceText("{{date}}", "2026-04-19")
ed.Save("filled.docx")
C#
using var ed = EditableDocument.Open("template.docx");
ed.ReplaceText("{{name}}", "Alice");
ed.ReplaceText("{{date}}", "2026-04-19");
ed.Save("filled.docx");
Збереження в байти (для аплоаду / стрімінгу)
Python
with EditableDocument.open("template.docx") as ed:
ed.replace_text("{{name}}", "Alice")
bytes_out = ed.save_to_bytes()
# відправте bytes_out у S3 / по HTTP / куди завгодно
Rust
let mut ed = EditableDocument::open("template.docx")?;
ed.replace_text("{{name}}", "Alice");
let mut buf = std::io::Cursor::new(Vec::new());
ed.write_to(&mut buf)?;
let bytes: Vec<u8> = buf.into_inner();
JavaScript
using ed = EditableDocument.open('template.docx');
ed.replaceText('{{name}}', 'Alice');
const bytes = ed.saveToBytes(); // Uint8Array
Що насправді означає «зберегти OPC-частини»
OOXML-файли — це ZIP-архіви, що містять десятки XML-частин плюс бінарні частини (зображення, шрифти, embedded objects). Наївні редактори при збереженні пересеріалізовують кожну частину, що може:
- Переставити зв’язки й зламати посилання
- Викинути розширені частини, які редактор не розуміє (custom XML, fallback-и AlternateContent)
- Переформатувати XML так, що поламаються downstream-діфи й підписи
EditableDocument переписує лише ті частини, до яких ви торкнулися. Решта копіюється byte-for-byte. Результат — найменший можливий діф між входом і виходом, дружній до системи контролю версій, перевірки підписів і round-trip через інші інструменти.
Коли йти у форматно-специфічний API
EditableDocument покриває 80% кейсів (шаблонізація, batch-fill, запис клітинок). Для багатшого редагування — додавання абзаців, вставка таблиць, корекція стилів, побудова слайдів з нуля — переходьте у форматно-специфічні API:
use office_oxide::docx::edit::DocxEditor;
let mut docx = DocxEditor::open("report.docx")?;
docx.append_paragraph("Новий розділ", Some("Heading2"));
docx.save("report.docx")?;
Форматно-специфічні редактори задокументовані в reference кожної прив’язки (Rust: docx::edit, xlsx::edit, pptx::edit).
Дивіться також
- Заміна тексту — API
replace_textдетально - Запис клітинок XLSX — типи клітинок, формати, edge cases
- Конвертація — спершу перетворіть legacy DOC/XLS/PPT у редагований OOXML