Skip to content

Office-Dokumente bearbeiten

EditableDocument ist das Read-modify-write-Pendant zu Document. Es bewahrt jeden unveränderten OPC-Teil — Bilder, Diagramme, Stile, Themes, Beziehungen — ohne Ausnahme, sodass deine Änderungen den umgebenden Inhalt nicht umbrechen und Downstream-Konsumenten nicht ungültig machen.

Bearbeiten wird unterstützt für DOCX, XLSX und PPTX. Ältere Formate wie DOC, XLS und PPT sind schreibgeschützt — konvertiere sie zuerst mit save_as, wenn du sie bearbeiten möchtest.

Was du tun kannst

Operation DOCX XLSX PPTX Methode
Text in Body / Platzhaltern ersetzen replace_text
Zellwert setzen (string / number / bool / leer) set_cell
Auf Disk speichern save
In Bytes speichern save_to_bytes

replace_text liefert auf XLSX 0 zurück (dort gibt es keine <w:t>- oder <a:t>-Elemente); für Tabellen stattdessen set_cell verwenden.

Öffnen, bearbeiten, speichern

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

In Bytes speichern (für Upload / Streaming)

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

Was „OPC-Teile bewahren" konkret bedeutet

OOXML-Dateien sind ZIP-Archive mit dutzenden XML-Teilen und binären Teilen (Bilder, Schriften, eingebettete Objekte). Einfache Editoren serialisieren beim Speichern alle Teile neu, was zu folgenden Problemen führen kann:

  • Beziehungen werden umgeordnet, wodurch Links kaputtgehen
  • Erweiterungsteile, die der Editor nicht kennt, werden verworfen (Custom XML, AlternateContent-Fallbacks)
  • Das XML wird so umformatiert, dass Downstream-Diffs und Signaturen brechen

EditableDocument schreibt nur die Teile neu, die du geändert hast. Alles andere wird Byte für Byte kopiert. Das Ergebnis ist der kleinstmögliche Unterschied zwischen Ein- und Ausgabe — ideal für Versionskontrolle, Signaturprüfung und den Austausch zwischen verschiedenen Tools.

Wann du die formatspezifische API nutzen solltest

EditableDocument deckt 80 % der Anwendungsfälle ab (Templating, Massenausfüllung, Zellschreibzugriffe). Für umfangreichere Änderungen — Absätze hinzufügen, Tabellen einfügen, Stile anpassen, Folien von Grund auf erstellen — wechsle zu den formatspezifischen APIs:

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

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

Die formatspezifischen Editoren sind in der Referenz jedes Bindings dokumentiert (Rust: docx::edit, xlsx::edit, pptx::edit).

Siehe auch