Biblioteca Office para Python — Início Rápido
office_oxide é a biblioteca Python mais rápida para documentos do Office. Núcleo em Rust puro, API idiomática em Python, zero dependências em runtime. Lê DOCX, XLSX, PPTX (e os legados DOC, XLS, PPT) em menos de um milissegundo — 8 a 100× mais rápido que python-docx, openpyxl e python-pptx.
Instalação
pip install office-oxide
Wheels publicadas para CPython 3.8–3.14 em Linux, macOS e Windows. O nome no PyPI é office-oxide (com hífen); o import é office_oxide (com underscore).
Ler um documento
from office_oxide import Document
with Document.open("report.docx") as doc:
print(doc.plain_text())
Ou o helper de uma só chamada:
import office_oxide
print(office_oxide.extract_text("report.docx"))
API principal
Document.open detecta o formato pela extensão (e confirma com magic bytes). Aceita str, bytes ou qualquer os.PathLike. Use como context manager para liberar a memória nativa de forma determinística.
from pathlib import Path
from office_oxide import Document
with Document.open(Path("data/deck.pptx")) as doc:
print(doc.format) # "pptx"
print(doc.plain_text()) # str
print(doc.to_markdown()) # str — Markdown estilo GitHub
print(doc.to_html()) # str — HTML semântico
ir = doc.to_ir() # dict aninhado (DocumentIR)
doc.save_as("deck.docx") # legado PPT → PPTX também funciona
Para arquivos fora do disco, abra a partir de bytes:
data = open("report.xlsx", "rb").read()
with Document.from_bytes(data, "xlsx") as doc:
print(doc.plain_text())
Funções auxiliares do módulo:
import office_oxide
office_oxide.extract_text("file.docx") # → str
office_oxide.to_markdown("file.pptx") # → str
office_oxide.to_html("file.xlsx") # → str
office_oxide.version() # → "0.1.0"
Edição
EditableDocument preserva todas as partes OPC inalteradas (imagens, gráficos, estilos, relações) ao salvar. Apenas DOCX, XLSX e PPTX.
from office_oxide import EditableDocument
with EditableDocument.open("template.docx") as ed:
n = ed.replace_text("{{name}}", "Alice")
print(f"{n} substituições")
ed.save("out.docx")
Substituir texto em DOCX / PPTX
from office_oxide import EditableDocument
with EditableDocument.open("slides.pptx") as ed:
ed.replace_text("Q3", "Q4")
ed.replace_text("2024", "2025")
ed.save("slides_q4.pptx")
replace_text percorre elementos <w:t> no DOCX e <a:t> em cada slide do PPTX. Devolve a quantidade de substituições.
Escrever células XLSX
from office_oxide import EditableDocument
with EditableDocument.open("budget.xlsx") as ed:
ed.set_cell(0, "A1", "Total") # string
ed.set_cell(0, "B1", 42.5) # número (int também aceito)
ed.set_cell(0, "C1", True) # booleano
ed.set_cell(0, "D1", None) # vazio
ed.save("budget.xlsx")
sheet_index é zero-indexado; cell_ref segue a notação padrão (A1, AA12).
IR independente do formato
doc.to_ir() devolve um dict aninhado que espelha o DocumentIR do Rust: seções de títulos, parágrafos, tabelas, listas e imagens. Útil para pipelines e para alimentar contexto estruturado a LLMs.
ir = doc.to_ir()
for section in ir["sections"]:
print(section.get("title"))
for el in section["elements"]:
kind = el["kind"] # "Heading" | "Paragraph" | "Table" | "List" | ...
Pipelines em bytes
from_bytes evita arquivos temporários em fluxos serverless e de streaming:
import requests
from office_oxide import Document
data = requests.get("https://example.com/doc.docx").content
with Document.from_bytes(data, "docx") as doc:
print(doc.to_markdown())
Formatos legados
DOC, XLS e PPT usam a mesma API. A extensão escolhe o parser CFB legado automaticamente; save_as produz um OOXML moderno de forma transparente:
with Document.open("legacy.doc") as doc:
print(doc.plain_text())
doc.save_as("legacy.docx") # DOC → DOCX em uma linha
Erros
Falhas de parse e IO disparam OfficeOxideError. Falhas de IO em save_as são embrulhadas em IOError.
from office_oxide import Document, OfficeOxideError
try:
with Document.open("weird.file") as doc:
print(doc.plain_text())
except OfficeOxideError as e:
print(f"office_oxide falhou: {e}")
except FileNotFoundError:
print("arquivo não encontrado")
Solução de problemas
| Sintoma | Causa provável |
|---|---|
OfficeOxideError: unsupported format: "" |
O caminho não tem extensão — use Document.from_bytes(data, "docx"). |
RuntimeError: Document is closed |
Você saiu do with mas ainda mantém uma referência. Abra um handle novo. |
ImportError: _native |
A wheel não bate com sua plataforma. pip install --force-reinstall office-oxide. |
| DOC legado mostra texto embaralhado | O arquivo pode estar criptografado (Word 97 RC4). office_oxide não descriptografa — descriptografe primeiro com LibreOffice. |
| Problemas de Unicode no Windows | Use pathlib.Path em vez de caminhos em bytes; Document.open cuida da codificação da plataforma. |
Veja também
- Migrar do python-docx — substituição direta, 14× mais rápida
- Migrar do openpyxl — mesma cobertura para XLSX, 18× mais rápida
- Migrar do python-pptx — PPTX 46× mais rápida
- Benchmarks de performance — números completos sobre 6.062 arquivos
- Pacote no PyPI