Convertir DOC, XLS, PPT heredados a OOXML
Office Oxide es la única biblioteca en Rust o Python que lee Word 97–2003 (.doc), Excel 97–2003 (.xls) y PowerPoint 97–2003 (.ppt) y escribe sus equivalentes modernos en OOXML — sin JVM (Apache Tika), sin convertidor externo (LibreOffice headless), sin licencia comercial (Aspose).
save_as hace la conversión en una sola llamada. Abre el archivo heredado, guárdalo con una extensión moderna; Office Oxide lo encamina por el IR y escribe un contenedor OOXML nuevo.
En una línea
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");
Migración masiva
Migra un corpus en una sola línea.
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(())
}
Envuelve el loop en rayon para migración paralela de corpus grandes.
Shell — con el 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'
Qué sobrevive al round-trip
Office Oxide preserva la forma del contenido — párrafos, tablas, celdas, diapositivas, listas, títulos — y los valores dentro. Algunas categorías no se transfieren porque los formatos heredados las guardan en estructuras propietarias que el IR no modela:
| Categoría | Preservado | Notas |
|---|---|---|
| Texto de párrafo | ✓ | Incluye runs de negrita/cursiva/subrayado |
| Listas | ✓ | Ordenadas + sin ordenar |
| Tablas | ✓ | Celdas, orden de filas, fila de cabecera |
| Valores de celda XLSX (string, número, bool) | ✓ | — |
| Nombres de hoja | ✓ | — |
| Títulos de diapositiva + cuerpo | ✓ | — |
| Hyperlinks | ✓ | — |
| Imágenes | parcial | DOC/PPT preservan imágenes inline; las anclas de imagen XLS se pierden |
| Comentarios / revisiones | — | Tracked changes se aplanan |
| Fórmulas (XLS) | solo valores | Los resultados cacheados sobreviven; las expresiones de fórmula no |
| WordArt, SmartArt, gráficos | — | Re-renderiza en el formato destino si los necesitas |
| Cifrado | — | Descifra el archivo heredado antes (p. ej. con LibreOffice) |
Para la mayoría de casos de LLM, indexación y archivado lo que importa es la fidelidad a nivel de contenido — y Office Oxide te devuelve un DOCX/XLSX/PPTX completamente editable en milisegundos.
Rendimiento
La conversión por archivo va en la misma orden de magnitud que la extracción de texto. En un .doc típico de Word 97, espera milisegundos de un solo dígito end-to-end.
Véase también
- Benchmarks de rendimiento — números de extracción DOC/XLS/PPT
- Construir desde IR — qué hace
save_aspor debajo - Migrar desde python-docx — saliendo de una librería Python específica de formato