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
- Text ersetzen — die
replace_text-API im Detail - XLSX-Zellen setzen — Zelltypen, Formate und Grenzfälle
- Konvertierung — ältere DOC/XLS/PPT-Dateien zuerst in bearbeitbares OOXML umwandeln