Skip to content

Редагування Office-документів

EditableDocument — read-modify-write аналог Document. Він зберігає кожну незмінену OPC-частину — зображення, діаграми, стилі, теми, зв’язки — без жодних змін, тому ваші правки не переформатовують навколишній вміст і не ламають downstream-споживачів.

Редагування підтримується для DOCX, XLSX і PPTX. Застарілі формати DOC, XLS та PPT доступні лише для читання — якщо потрібно їх редагувати, спершу конвертуйте через save_as.

Що ви можете робити

Операція DOCX XLSX PPTX Метод
Заміна тексту в тілі / плейсхолдерах replace_text
Запис значення клітинки (string / number / bool / empty) set_cell
Збереження на диск save
Збереження в байти save_to_bytes

replace_text повертає 0 при виклику на XLSX (там немає елементів <w:t> чи <a:t>); для таблиць використовуйте set_cell.

Відкрити, відредагувати, зберегти

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")?;

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")

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");

C

int err = 0;
OfficeEditableHandle *ed = office_editable_open("template.docx", &err);
office_editable_replace_text(ed, "{{name}}", "Alice", &err);
office_editable_replace_text(ed, "{{date}}", "2026-04-19", &err);
office_editable_save(ed, "filled.docx", &err);
office_editable_free(ed);

Збереження в байти (для завантаження / стрімінгу)

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();

Python

with EditableDocument.open("template.docx") as ed:
    ed.replace_text("{{name}}", "Alice")
    bytes_out = ed.save_to_bytes()
    # upload bytes_out to S3 / send over HTTP / etc.

JavaScript

using ed = EditableDocument.open('template.docx');
ed.replaceText('{{name}}', 'Alice');
const bytes = ed.saveToBytes();   // Uint8Array

C

int err = 0;
OfficeEditableHandle *ed = office_editable_open("template.docx", &err);
office_editable_replace_text(ed, "{{name}}", "Alice", &err);

size_t out_len = 0;
uint8_t *buf = office_editable_save_to_bytes(ed, &out_len, &err);
/* stream buf[0..out_len], then: */
office_oxide_free_bytes(buf, out_len);
office_editable_free(ed);

Що насправді означає «зберегти OPC-частини»

OOXML-файли — це ZIP-архіви, що містять десятки XML-частин плюс бінарні частини (зображення, шрифти, вбудовані об’єкти). Примітивні редактори при збереженні повторно серіалізують кожну частину, що може призвести до:

  • Переупорядкування зв’язків та розриву посилань
  • Видалення розширених частин, яких редактор не розуміє (custom XML, fallback-и AlternateContent)
  • Переформатування XML у спосіб, що ламає downstream-діфи та підписи

EditableDocument переписує лише ті частини, які ви змінили. Все інше копіюється байт за байтом. Результат — мінімально можлива різниця між вхідними та вихідними даними, що є зручним для систем контролю версій, перевірки підписів і передачі між різними інструментами.

Коли варто переходити на формат-специфічний API

EditableDocument покриває 80% випадків (шаблонізація, пакетне заповнення, запис клітинок). Для складніших правок — додавання абзаців, вставка таблиць, зміна стилів, побудова слайдів з нуля — переходьте до формат-специфічних API:

use office_oxide::docx::edit::DocxEditor;

let mut docx = DocxEditor::open("report.docx")?;
docx.append_paragraph("New section", Some("Heading2"));
docx.save("report.docx")?;

Формат-специфічні редактори задокументовані в розділі reference кожного байндингу (Rust: docx::edit, xlsx::edit, pptx::edit).

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