Office-Dokumente bearbeiten
EditableDocument ist das Read-modify-write-Pendant zu Document. Es bewahrt jeden unveränderten OPC-Teil — Bilder, Diagramme, Stile, Themes, Beziehungen — wortwörtlich, sodass deine Änderungen nicht den umgebenden Inhalt umbrechen oder Downstream-Konsumenten ungültig machen.
Bearbeiten wird unterstützt für DOCX, XLSX und PPTX. Legacy-DOC, -XLS und -PPT sind nur lesbar — wenn du sie bearbeiten willst, konvertiere zuerst mit save_as.
Was du machen kannst
| Operation | DOCX | XLSX | PPTX | Methode |
|---|---|---|---|---|
| Text in Body / Placeholdern 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 Spreadsheets set_cell benutzen.
Öffnen, bearbeiten, speichern
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");
In Bytes speichern (für Upload / Streaming)
Python
with EditableDocument.open("template.docx") as ed:
ed.replace_text("{{name}}", "Alice")
bytes_out = ed.save_to_bytes()
# bytes_out nach S3 hochladen / per HTTP rausschicken / etc.
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
Was „OPC-Teile bewahren" konkret bedeutet
OOXML-Dateien sind ZIP-Archive mit dutzenden XML-Teilen plus binären Teilen (Bilder, Schriftarten, eingebettete Objekte). Naive Editoren reserialisieren beim Speichern jeden Teil, was:
- Beziehungen umordnet und Links bricht
- Erweiterungs-Teile, die der Editor nicht versteht, droppt (Custom XML, AlternateContent-Fallbacks)
- XML so umformatiert, dass Downstream-Diffs und Signaturen brechen
EditableDocument schreibt nur die Teile neu, die du angefasst hast. Alles andere wird Byte für Byte kopiert. Das Ergebnis ist der kleinstmögliche Diff zwischen Input und Output — angenehm für Versionskontrolle, Signaturprüfung und Round-Trip durch andere Tools.
Wann zur formatspezifischen API greifen
EditableDocument deckt 80 % der Fälle ab (Templating, Batch-Fill, Zellschreibzugriffe). Für reichere Edits — Absätze hinzufügen, Tabellen einfügen, Stile anpassen, Folien von Grund auf bauen — ab in die formatspezifischen APIs:
use office_oxide::docx::edit::DocxEditor;
let mut docx = DocxEditor::open("report.docx")?;
docx.append_paragraph("Neuer Abschnitt", Some("Heading2"));
docx.save("report.docx")?;
Die formatspezifischen Editoren sind in der Referenz jeder Bindung dokumentiert (Rust: docx::edit, xlsx::edit, pptx::edit).
Siehe auch
- Text ersetzen — die
replace_text-API im Detail - XLSX-Zellen setzen — Zelltypen, Formate, Edge Cases
- Konvertierung — Legacy-DOC/XLS/PPT zuerst in OOXML wandeln