Convertir archivos 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) y sin licencia comercial (Aspose).
save_as realiza la conversión en una sola llamada. Abre el archivo heredado y guárdalo con la extensión moderna; Office Oxide lo procesa a través del IR y genera 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");
C
int err = 0;
OfficeDocumentHandle *doc = office_document_open("old.xls", &err);
if (!doc) { fprintf(stderr, "open failed: code=%d\n", err); return 1; }
/* target format inferred from the extension; legacy -> OOXML converts transparently */
if (office_document_save_as(doc, "modern.xlsx", &err) != 0) {
fprintf(stderr, "save_as failed: code=%d\n", err);
}
office_document_free(doc);
Migración masiva
Migra una colección de archivos entera en una sola línea.
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(())
}
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}")
C
/* migrate one file: open from path, save_as routes by the dst extension */
int migrate(const char *src, const char *dst) {
int err = 0;
OfficeDocumentHandle *doc = office_document_open(src, &err);
if (!doc) return err;
int rc = office_document_save_as(doc, dst, &err);
office_document_free(doc);
return rc == 0 ? 0 : err;
}
Para migración paralela de grandes colecciones, envuelve el bucle en rayon.
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é se conserva en la conversión
Office Oxide preserva la estructura del contenido — párrafos, tablas, celdas, diapositivas, listas, encabezados — y los valores que contienen. Algunas categorías no se transfieren porque los formatos heredados las almacenan en estructuras propietarias que el IR no modela:
| Categoría | Conservado | Notas |
|---|---|---|
| Texto de párrafos | ✓ | Incluye negrita/cursiva/subrayado |
| Listas | ✓ | Ordenadas + sin ordenar |
| Tablas | ✓ | Celdas, orden de filas, fila de encabezado |
| Valores de celda XLSX (string, número, bool) | ✓ | — |
| Nombres de hojas | ✓ | — |
| Títulos de diapositiva + cuerpo | ✓ | — |
| Hyperlinks | ✓ | — |
| Imágenes | parcial | DOC/PPT conservan imágenes incrustadas; las anclas de imagen en XLS se pierden |
| Comentarios / revisiones | — | Los cambios rastreados se incorporan al texto |
| Fórmulas (XLS) | solo valores | Los resultados en caché se conservan; las expresiones de fórmula no |
| WordArt, SmartArt, gráficos | — | Vuelve a crearlos en el formato destino si los necesitas |
| Cifrado | — | Descifra el archivo heredado primero (p. ej., con LibreOffice) |
En la mayoría de los casos de LLM, indexación y archivado, lo que importa es la fidelidad a nivel de contenido — y Office Oxide devuelve un DOCX/XLSX/PPTX completamente editable en milisegundos.
Rendimiento
La conversión por archivo va al mismo orden de magnitud que la extracción de texto. Con un .doc típico de Word 97, espera milisegundos de un solo dígito de extremo a extremo.
Véase también
- Benchmarks de rendimiento — cifras de extracción de DOC/XLS/PPT
- Construir desde IR — qué hace
save_aspor debajo - Migrar desde python-docx — dejar una librería Python específica de formato