Legacy DOC, XLS, PPT in OOXML konvertieren
Office Oxide ist die einzige Rust-/Python-Bibliothek, die Word 97–2003 (.doc), Excel 97–2003 (.xls) und PowerPoint 97–2003 (.ppt) liest und ihre modernen OOXML-Pendants schreibt — ohne JVM (Apache Tika), ohne externen Konverter (LibreOffice headless), ohne kommerzielle Lizenz (Aspose).
save_as erledigt die Konvertierung in einem Aufruf. Öffne die Legacy-Datei, speichere sie unter modernem Suffix; Office Oxide schickt sie durch die IR und schreibt einen frischen OOXML-Container.
Einzeiler
Rust
use office_oxide::Document;
Document::open("old.doc")?.save_as("modern.docx")?;
Document::open("old.xls")?.save_as("modern.xlsx")?;
Document::open("old.ppt")?.save_as("modern.pptx")?;
Python
from office_oxide import Document
with Document.open("old.doc") as doc:
doc.save_as("modern.docx")
with Document.open("old.xls") as doc:
doc.save_as("modern.xlsx")
with Document.open("old.ppt") as doc:
doc.save_as("modern.pptx")
JavaScript
import { Document } from 'office-oxide';
using doc = Document.open('old.xls');
doc.saveAs('modern.xlsx');
Go
doc, _ := officeoxide.Open("old.xls")
defer doc.Close()
doc.SaveAs("modern.xlsx")
C#
using var doc = Document.Open("old.xls");
doc.SaveAs("modern.xlsx");
Massenmigration
Korpus in einer Zeile migrieren.
Python
from pathlib import Path
from office_oxide import Document
for src in Path("legacy").rglob("*"):
if src.suffix.lower() in {".doc", ".xls", ".ppt"}:
new_ext = {".doc": ".docx", ".xls": ".xlsx", ".ppt": ".pptx"}[src.suffix.lower()]
dst = Path("modern") / src.relative_to("legacy").with_suffix(new_ext)
dst.parent.mkdir(parents=True, exist_ok=True)
with Document.open(src) as doc:
doc.save_as(dst)
print(f"{src} → {dst}")
Rust
use office_oxide::Document;
use std::path::Path;
fn migrate(src: &Path, dst: &Path) -> office_oxide::Result<()> {
Document::open(src)?.save_as(dst)?;
Ok(())
}
Wickle die Schleife in rayon ein für parallele Migration großer Korpora.
Shell — über das CLI
find legacy/ -iname '*.doc' | parallel \
'office-oxide convert {} modern/{/.}.docx'
find legacy/ -iname '*.xls' | parallel \
'office-oxide convert {} modern/{/.}.xlsx'
find legacy/ -iname '*.ppt' | parallel \
'office-oxide convert {} modern/{/.}.pptx'
Was den Round-Trip übersteht
Office Oxide bewahrt die Inhaltsform — Absätze, Tabellen, Zellen, Folien, Listen, Überschriften — und die enthaltenen Werte. Ein paar Kategorien wandern nicht mit, weil Legacy-Formate sie in proprietären Strukturen kodieren, die die IR nicht modelliert:
| Kategorie | Übertragen | Anmerkungen |
|---|---|---|
| Absatztext | ✓ | Inklusive Bold-/Italic-/Underline-Runs |
| Listen | ✓ | Geordnet + ungeordnet |
| Tabellen | ✓ | Zellen, Zeilenreihenfolge, Header-Zeile |
| XLSX-Zellwerte (string, number, bool) | ✓ | — |
| Sheet-Namen | ✓ | — |
| Folientitel + Body | ✓ | — |
| Hyperlinks | ✓ | — |
| Bilder | partial | DOC/PPT bewahren Inline-Bilder; XLS-Bild-Anker werden gedroppt |
| Kommentare / Revisionen | — | Änderungsverfolgung wird flachgemacht |
| Formeln (XLS) | nur Werte | Gecachte Formel-Ergebnisse überleben; Formel-Ausdrücke nicht |
| WordArt, SmartArt, Diagramme | — | Im Zielformat neu rendern, falls benötigt |
| Verschlüsselung | — | Legacy-Datei vorher entschlüsseln (z. B. via LibreOffice) |
Für die meisten LLM-, Indexing- und Archiv-Use-Cases zählt die Inhaltsebene — und Office Oxide gibt dir in Millisekunden eine voll editierbare DOCX/XLSX/PPTX zurück.
Performance
Pro-Datei-Konvertierung läuft in derselben Größenordnung wie Textextraktion. Bei einer typischen Word-97-.doc rechne mit einstelligen Millisekunden end-to-end.
Siehe auch
- Performance-Benchmarks — DOC/XLS/PPT-Extraktionszahlen
- Aus IR bauen — was
save_asunter der Haube macht - Migration von python-docx — Wechsel von einer formatspezifischen Python-Bibliothek