Skip to content

Редагування 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).

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