Migração a partir do openpyxl
O Office Oxide lê XLSX 18× mais rápido que o openpyxl (5,0 ms contra 94,5 ms em média em 1.802 arquivos), com a maior taxa de sucesso entre as bibliotecas testadas. Ele também lê .xls legado diretamente — algo que o openpyxl simplesmente não faz.
Quando migrar
Troque se você faz qualquer uma destas coisas:
- Lê células, linhas, planilhas ou tabelas de
.xlsxpara ingestão / RAG / dashboards - Converte planilhas em Markdown ou HTML
- Precisa de suporte a
.xlssem adicionarxlrd(descontinuado desde a 2.0) ou chamar o LibreOffice - Quer também processar
.docx,.pptxou DOC/PPT legados sem dependências extras - Usa
EditableDocumentpara escrever células em templates
Fique no openpyxl se:
- Você constrói XLSX complexos do zero, com gráficos, formatação condicional, estilos nomeados e tabelas dinâmicas (o openpyxl é a opção em Python puro mais completa para criação)
- Precisa de avaliação de fórmulas em Python puro
Instalação
pip uninstall openpyxl
pip install office-oxide
Guia rápido lado a lado
Abrir uma pasta de trabalho
openpyxl
from openpyxl import load_workbook
wb = load_workbook("budget.xlsx", data_only=True)
office_oxide
from office_oxide import Document
with Document.open("budget.xlsx") as doc:
...
Iterar células da planilha
openpyxl
from openpyxl import load_workbook
wb = load_workbook("budget.xlsx", data_only=True)
for sheet in wb.worksheets:
for row in sheet.iter_rows(values_only=True):
print(row)
office_oxide
from office_oxide import Document
with Document.open("budget.xlsx") as doc:
ir = doc.to_ir()
for section in ir["sections"]:
print(f"# {section.get('title')}")
for el in section["elements"]:
if el["kind"] == "Table":
for row in el["rows"]:
print(row)
Para acesso mais rico por célula (tipos, fórmulas, células mescladas), desça até o módulo XLSX:
with Document.open("budget.xlsx") as doc:
xlsx = doc.as_xlsx()
for sheet in xlsx.sheets():
for cell in sheet.cells():
print(cell.address(), cell.value(), cell.value_type())
Ler uma única célula
openpyxl
wb = load_workbook("budget.xlsx", data_only=True)
sheet = wb["Q4"]
val = sheet["B5"].value
office_oxide
with Document.open("budget.xlsx") as doc:
val = doc.as_xlsx().sheet("Q4").cell("B5").value()
Escrever células (templating)
openpyxl
from openpyxl import load_workbook
wb = load_workbook("template.xlsx")
ws = wb["Summary"]
ws["A1"] = "Total"
ws["B1"] = 42.5
ws["C1"] = True
wb.save("filled.xlsx")
office_oxide
from office_oxide import EditableDocument
with EditableDocument.open("template.xlsx") as ed:
ed.set_cell(0, "A1", "Total") # sheet 0 = primeira planilha
ed.set_cell(0, "B1", 42.5)
ed.set_cell(0, "C1", True)
ed.save("filled.xlsx")
sheet_index começa em zero; cell_ref é a notação A1 padrão. Para resolver nome da planilha → índice, leia a pasta de trabalho uma vez e chame sheets().
Converter para Markdown / HTML
openpyxl — nada embutido; você precisa renderizar as linhas à mão.
office_oxide
with Document.open("budget.xlsx") as doc:
md = doc.to_markdown() # uma seção ## por planilha, tabelas GFM
Ler nomes de planilhas
openpyxl
wb = load_workbook("budget.xlsx")
print(wb.sheetnames)
office_oxide
with Document.open("budget.xlsx") as doc:
print([s.name() for s in doc.as_xlsx().sheets()])
Lendo .xls legado
O openpyxl não abre .xls. A solução histórica era o xlrd, descontinuado para .xls desde a 2.0 e sem manutenção.
office_oxide
from office_oxide import Document
with Document.open("legacy.xls") as doc:
print(doc.plain_text())
doc.save_as("modern.xlsx") # migração em uma linha
Desempenho
| Biblioteca | Média | p99 | Taxa de sucesso |
|---|---|---|---|
| office_oxide | 5,0 ms | 40 ms | 97,8% |
| python-calamine | 13,9 ms | 183 ms | 96,6% |
| openpyxl | 94,5 ms | 698 ms | 96,2% |
Um pipeline de análise típico que lê 100.000 planilhas por dia: 8 horas e 18 minutos com openpyxl, 26 minutos com office_oxide.
O que se perde
EditableDocument.set_cell escreve valores brutos de célula; ele não modifica formatos numéricos, formatação condicional, gráficos nem intervalos nomeados (essas partes são preservadas literalmente). Para construção de XLSX com estilização completa, use openpyxl ou desça até office_oxide.xlsx::create::XlsxBuilder.
Veja também
- Escrever células XLSX — matriz completa de tipos e casos extremos
- Migração a partir do xlrd — para
.xlslegado - Benchmarks de desempenho