Skip to content

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 .xlsx para ingestão / RAG / dashboards
  • Converte planilhas em Markdown ou HTML
  • Precisa de suporte a .xls sem adicionar xlrd (descontinuado desde a 2.0) ou chamar o LibreOffice
  • Quer também processar .docx, .pptx ou DOC/PPT legados sem dependências extras
  • Usa EditableDocument para 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