Skip to content

Редактирование Office-документов

EditableDocument — это read-modify-write-аналог Document. Он сохраняет каждую нетронутую OPC-часть — изображения, диаграммы, стили, темы, отношения — дословно, поэтому ваши правки не переформатируют окружающее содержимое и не ломают потребителей дальше по цепочке.

Редактирование поддерживается для DOCX, XLSX и PPTX. Legacy DOC, XLS и PPT — только для чтения; нужно их править — сначала конвертируйте через save_as.

Что вы можете

Операция DOCX XLSX PPTX Метод
Замена текста в body / placeholder’ах 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");

Сохранение в байты (для upload / стриминга)

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. Результат — минимально возможный дифф между входом и выходом: дружелюбно к VCS, проверке подписей и 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).

Смотрите также