Skip to content

Migration von openpyxl

Office Oxide liest XLSX 18× schneller als openpyxl (5,0 ms gegenüber 94,5 ms Mittelwert über 1 802 Dateien) und hat die höchste Erfolgsquote aller getesteten Bibliotheken. Es liest auch Legacy-.xls direkt — was openpyxl überhaupt nicht kann.

Wann migrieren

Wechseln Sie, wenn Sie eines dieser Dinge tun:

  • Zellen, Zeilen, Blätter oder Tabellen aus .xlsx für Ingest / RAG / Dashboards lesen
  • Tabellen in Markdown oder HTML konvertieren
  • .xls-Support benötigen, ohne xlrd (seit 2.0 veraltet) hinzuzufügen oder LibreOffice aufzurufen
  • Zusätzlich .docx, .pptx oder Legacy-DOC/PPT verarbeiten wollen, ohne weitere Abhängigkeiten
  • EditableDocument zum Schreiben von Zellen in Templates nutzen

Bleiben Sie bei openpyxl, wenn:

  • Sie komplexe XLSX von Grund auf bauen — mit Charts, bedingter Formatierung, benannten Styles und Pivot-Tabellen (openpyxl ist die stärkste Pure-Python-Option für vollumfängliche Erzeugung)
  • Sie Formel-Evaluation in reinem Python brauchen

Installation

pip uninstall openpyxl
pip install office-oxide

Spickzettel im Direktvergleich

Arbeitsmappe öffnen

openpyxl

from openpyxl import load_workbook

wb = load_workbook("budget.xlsx", data_only=True)

office_oxide

from office_oxide import Document

with Document.open("budget.xlsx") as doc:
    ...

Über Blattzellen iterieren

openpyxl

from openpyxl import load_workbook

wb = load_workbook("budget.xlsx", data_only=True)
for sheet in wb.worksheets:
    for row in sheet.iter_rows(values_only=True):
        print(row)

office_oxide

from office_oxide import Document

with Document.open("budget.xlsx") as doc:
    ir = doc.to_ir()

for section in ir["sections"]:
    print(f"# {section.get('title')}")
    for el in section["elements"]:
        if el["kind"] == "Table":
            for row in el["rows"]:
                print(row)

Für detaillierteren Zellzugriff (Typen, Formeln, verbundene Zellen) geht es ins XLSX-Modul:

with Document.open("budget.xlsx") as doc:
    xlsx = doc.as_xlsx()
    for sheet in xlsx.sheets():
        for cell in sheet.cells():
            print(cell.address(), cell.value(), cell.value_type())

Einzelne Zelle lesen

openpyxl

wb = load_workbook("budget.xlsx", data_only=True)
sheet = wb["Q4"]
val = sheet["B5"].value

office_oxide

with Document.open("budget.xlsx") as doc:
    val = doc.as_xlsx().sheet("Q4").cell("B5").value()

Zellen schreiben (Templating)

openpyxl

from openpyxl import load_workbook

wb = load_workbook("template.xlsx")
ws = wb["Summary"]
ws["A1"] = "Total"
ws["B1"] = 42.5
ws["C1"] = True
wb.save("filled.xlsx")

office_oxide

from office_oxide import EditableDocument

with EditableDocument.open("template.xlsx") as ed:
    ed.set_cell(0, "A1", "Total")    # sheet 0 = erstes Blatt
    ed.set_cell(0, "B1", 42.5)
    ed.set_cell(0, "C1", True)
    ed.save("filled.xlsx")

sheet_index ist nullbasiert; cell_ref ist Standard-A1-Notation. Um Blattnamen → Index aufzulösen, lesen Sie die Mappe einmal und rufen sheets() auf.

Konvertierung zu Markdown / HTML

openpyxl — nicht eingebaut; Sie müssten Zeilen selbst rendern.

office_oxide

with Document.open("budget.xlsx") as doc:
    md = doc.to_markdown()    # ein ##-Abschnitt pro Blatt, GFM-Tabellen

Blattnamen lesen

openpyxl

wb = load_workbook("budget.xlsx")
print(wb.sheetnames)

office_oxide

with Document.open("budget.xlsx") as doc:
    print([s.name() for s in doc.as_xlsx().sheets()])

Legacy-.xls lesen

openpyxl kann .xls nicht öffnen. Der historische Workaround war xlrd, seit 2.0 für .xls veraltet und nicht mehr gepflegt.

office_oxide

from office_oxide import Document

with Document.open("legacy.xls") as doc:
    print(doc.plain_text())
    doc.save_as("modern.xlsx")    # Einzeiler-Migration

Performance

Bibliothek Mittel p99 Erfolgsquote
office_oxide 5,0 ms 40 ms 97,8 %
python-calamine 13,9 ms 183 ms 96,6 %
openpyxl 94,5 ms 698 ms 96,2 %

Eine typische Analyse-Pipeline, die täglich 100 000 Tabellen liest: 8 Stunden 18 Minuten mit openpyxl, 26 Minuten mit office_oxide.

Was verloren geht

EditableDocument.set_cell schreibt Rohwerte in Zellen; Zahlenformate, bedingte Formatierung, Charts und benannte Bereiche werden nicht verändert (diese Teile bleiben wortgetreu erhalten). Für den Bau von XLSX mit vollem Styling nutzen Sie openpyxl oder steigen in office_oxide.xlsx::create::XlsxBuilder ab.

Siehe auch