Converter DOC, XLS, PPT legados para OOXML
Office Oxide é a única biblioteca em Rust ou Python capaz de ler Word 97–2003 (.doc), Excel 97–2003 (.xls) e PowerPoint 97–2003 (.ppt) e escrever os equivalentes modernos em OOXML — sem JVM (Apache Tika), sem conversor externo (LibreOffice headless) e sem licença comercial (Aspose).
save_as faz a conversão em uma única chamada. Abra o arquivo legado e salve com a extensão moderna; o Office Oxide o processa via IR e grava um contêiner OOXML novo.
Uma linha resolve
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);
Migração em massa
Migre um acervo inteiro com uma única linha de código.
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 migração paralela de grandes acervos, envolva o loop com rayon.
Shell — usando o 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'
O que sobrevive à conversão
Office Oxide preserva a estrutura do conteúdo — parágrafos, tabelas, células, slides, listas, títulos — e os valores neles contidos. Algumas categorias não são transferidas porque os formatos legados as armazenam em estruturas proprietárias que o IR não modela:
| Categoria | Preservado | Observações |
|---|---|---|
| Texto de parágrafos | ✓ | Incluindo negrito/itálico/sublinhado |
| Listas | ✓ | Ordenadas + não ordenadas |
| Tabelas | ✓ | Células, ordem das linhas, linha de cabeçalho |
| Valores de células XLSX (string, número, bool) | ✓ | — |
| Nomes de planilhas | ✓ | — |
| Títulos de slides + corpo | ✓ | — |
| Hyperlinks | ✓ | — |
| Imagens | parcial | DOC/PPT preservam imagens incorporadas; âncoras de imagem no XLS são descartadas |
| Comentários / revisões | — | Alterações rastreadas são incorporadas ao texto |
| Fórmulas (XLS) | apenas valores | Resultados em cache são preservados; expressões de fórmula não sobrevivem |
| WordArt, SmartArt, gráficos | — | Recrie no formato de destino se necessário |
| Criptografia | — | Descriptografe o arquivo legado antes (ex.: via LibreOffice) |
Para a maioria dos casos de LLM, indexação e arquivamento, o que importa é a fidelidade no nível do conteúdo — e o Office Oxide entrega um DOCX/XLSX/PPTX totalmente editável em milissegundos.
Desempenho
A conversão por arquivo ocorre na mesma ordem de grandeza que a extração de texto. Em um .doc típico do Word 97, espere milissegundos de um dígito do início ao fim.
Veja também
- Benchmarks de desempenho — números de extração de DOC/XLS/PPT
- Construir a partir do IR — o que
save_asfaz internamente - Migrar do python-docx — saindo de uma biblioteca Python específica de formato