Skip to content

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