Skip to content

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