Python-Bibliothek für Office — Schnellstart
office_oxide ist die schnellste Python-Bibliothek für Office-Dokumente. Reiner Rust-Kern, idiomatische Python-API, keine Laufzeit-Abhängigkeiten. DOCX, XLSX, PPTX (sowie die Altformate DOC, XLS, PPT) werden in unter einer Millisekunde gelesen — 8- bis 100-mal schneller als python-docx, openpyxl und python-pptx.
Installation
pip install office-oxide
Wheels für CPython 3.8–3.14 sind für Linux, macOS und Windows veröffentlicht. Der Distributionsname auf PyPI ist office-oxide (mit Bindestrich); der Importname ist office_oxide (mit Unterstrich).
Ein Dokument lesen
from office_oxide import Document
with Document.open("report.docx") as doc:
print(doc.plain_text())
Oder als einfacher Funktionsaufruf:
import office_oxide
print(office_oxide.extract_text("report.docx"))
Kern-API
Document.open erkennt das Format an der Dateierweiterung (und prüft per Magic-Bytes nach). Akzeptiert str, bytes oder beliebige os.PathLike. Als Context Manager nutzen, damit nativer Speicher deterministisch freigegeben wird.
from pathlib import Path
from office_oxide import Document
with Document.open(Path("data/deck.pptx")) as doc:
print(doc.format) # "pptx"
print(doc.plain_text()) # str
print(doc.to_markdown()) # str — GitHub-flavored Markdown
print(doc.to_html()) # str — semantisches HTML
ir = doc.to_ir() # verschachteltes dict (DocumentIR)
doc.save_as("deck.docx") # auch altes PPT → PPTX möglich
Wenn die Datei nicht auf der Platte liegt, aus rohen Bytes öffnen:
data = open("report.xlsx", "rb").read()
with Document.from_bytes(data, "xlsx") as doc:
print(doc.plain_text())
Modul-Shortcuts:
import office_oxide
office_oxide.extract_text("file.docx") # → str
office_oxide.to_markdown("file.pptx") # → str
office_oxide.to_html("file.xlsx") # → str
office_oxide.version() # → "0.1.0"
Bearbeiten
EditableDocument bewahrt alle unveränderten OPC-Teile (Bilder, Diagramme, Stile, Beziehungen) beim Speichern unverändert. Nur DOCX, XLSX und PPTX werden unterstützt.
from office_oxide import EditableDocument
with EditableDocument.open("template.docx") as ed:
n = ed.replace_text("{{name}}", "Alice")
print(f"{n} Ersetzungen")
ed.save("out.docx")
Text in DOCX / PPTX ersetzen
from office_oxide import EditableDocument
with EditableDocument.open("slides.pptx") as ed:
ed.replace_text("Q3", "Q4")
ed.replace_text("2024", "2025")
ed.save("slides_q4.pptx")
replace_text läuft in DOCX über <w:t>-Elemente und in PPTX über <a:t> auf jeder Folie. Liefert die Zahl der Ersetzungen zurück.
XLSX-Zellen schreiben
from office_oxide import EditableDocument
with EditableDocument.open("budget.xlsx") as ed:
ed.set_cell(0, "A1", "Total") # Zeichenkette
ed.set_cell(0, "B1", 42.5) # Zahl (int geht auch)
ed.set_cell(0, "C1", True) # Boolean
ed.set_cell(0, "D1", None) # leer
ed.save("budget.xlsx")
sheet_index ist nullbasiert; cell_ref nutzt die Standard-Tabellenkalkulationsnotation (A1, AA12).
Format-unabhängige IR
doc.to_ir() liefert ein verschachteltes dict, das Rusts DocumentIR widerspiegelt: Abschnitte mit Überschriften, Absätzen, Tabellen, Listen und Bildern. Praktisch für Pipelines und um LLMs strukturierten Kontext zu liefern.
ir = doc.to_ir()
for section in ir["sections"]:
print(section.get("title"))
for el in section["elements"]:
kind = el["kind"] # "Heading" | "Paragraph" | "Table" | "List" | ...
Bytes-basierte Pipelines
from_bytes spart Tempdateien in serverlosen und Streaming-Workflows:
import requests
from office_oxide import Document
data = requests.get("https://example.com/doc.docx").content
with Document.from_bytes(data, "docx") as doc:
print(doc.to_markdown())
Altformate
DOC, XLS und PPT laufen über dieselbe API. Über die Endung wird automatisch der Legacy-CFB-Parser gewählt; save_as schreibt transparent ein modernes OOXML:
with Document.open("legacy.doc") as doc:
print(doc.plain_text())
doc.save_as("legacy.docx") # DOC → DOCX in einer Zeile
Fehler
Parse- und IO-Fehler lösen OfficeOxideError aus. IO-Fehler in save_as werden in IOError verpackt.
from office_oxide import Document, OfficeOxideError
try:
with Document.open("weird.file") as doc:
print(doc.plain_text())
except OfficeOxideError as e:
print(f"office_oxide fehlgeschlagen: {e}")
except FileNotFoundError:
print("Datei nicht gefunden")
Fehlersuche
| Symptom | Wahrscheinliche Ursache |
|---|---|
OfficeOxideError: unsupported format: "" |
Pfad ohne Erweiterung — Document.from_bytes(data, "docx") verwenden. |
RuntimeError: Document is closed |
Du hast den with-Block verlassen, hältst aber noch eine Referenz. Frisch öffnen. |
ImportError: _native |
Die Wheel passt nicht zur Plattform. pip install --force-reinstall office-oxide. |
| Legacy-DOC liest Müll | Die Datei ist ggf. verschlüsselt (Word 97 RC4). office_oxide entschlüsselt nicht — vorher mit LibreOffice entschlüsseln. |
| Unicode-Probleme unter Windows | pathlib.Path statt Byte-Pfaden verwenden; Document.open regelt die Plattform-Kodierung. |
Siehe auch
- Migration von python-docx — Drop-in-Ersatz, 14× schneller
- Migration von openpyxl — gleiche XLSX-Abdeckung, 18× schneller
- Migration von python-pptx — PPTX 46× schneller
- Performance-Benchmarks — vollständige Zahlen über 6.062 Dateien
- Paket auf PyPI