Converter DOC, XLS, PPT legados para OOXML
Office Oxide é a única biblioteca em Rust ou Python que lê Word 97–2003 (.doc), Excel 97–2003 (.xls) e PowerPoint 97–2003 (.ppt) e escreve seus equivalentes modernos em OOXML — sem JVM (Apache Tika), sem conversor externo (LibreOffice headless), sem licença comercial (Aspose).
save_as faz a conversão em uma chamada. Abra o arquivo legado, salve com extensão moderna; Office Oxide encaminha pelo IR e escreve um novo container OOXML.
Em uma linha
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");
Migração em massa
Migre o corpus em uma só linha.
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(())
}
Embrulhe o loop com rayon para migração paralela de grandes corpora.
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 ao round-trip
Office Oxide preserva a forma do conteúdo — parágrafos, tabelas, células, slides, listas, títulos — e os valores dentro deles. Algumas categorias não se transferem porque os formatos legados as guardam em estruturas proprietárias que o IR não modela:
| Categoria | Preservado | Notas |
|---|---|---|
| Texto de parágrafos | ✓ | Inclui runs de bold/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 inline; âncoras de imagem no XLS são descartadas |
| Comentários / revisões | — | Tracked changes são achatadas |
| Fórmulas (XLS) | só valores | Resultados em cache sobrevivem; expressões de fórmula não fazem round-trip |
| WordArt, SmartArt, gráficos | — | Re-renderize no formato-alvo se precisar |
| Criptografia | — | Descriptografe o arquivo legado primeiro (ex.: via LibreOffice) |
Para a maioria dos casos de LLM, indexação e arquivamento, o que importa é a fidelidade no nível de conteúdo — e Office Oxide entrega um DOCX/XLSX/PPTX totalmente editável em milissegundos.
Performance
Conversão por arquivo roda na mesma ordem de grandeza da extração de texto. Em um .doc típico do Word 97, espere milissegundos de um dígito de ponta a ponta.
Veja também
- Benchmarks de performance — números de extração de DOC/XLS/PPT
- Construir a partir do IR — o que
save_asfaz por baixo - Migrar do python-docx — sair de uma biblioteca Python específica de formato