Skip to content

Migración desde xlrd

xlrd era la biblioteca Python estándar para leer archivos .xls heredados (Excel 97–2003). Retiró el soporte de .xls en la 2.0 (2020) y recomienda migrar. Los rodeos de la comunidad — fijar xlrd<2.0, invocar LibreOffice, pasarse a python-calamine — tienen cada uno sus matices.

Office Oxide lee .xls directamente, 13× más rápido que la última versión de xlrd con soporte de .xls, y con mayor tasa de éxito. Como extra, puedes convertir .xls.xlsx en una línea.

Cuándo migrar

Cambia si se cumple alguna de estas condiciones:

  • Sigues en xlrd<2.0 y quieres una biblioteca mantenida
  • Necesitas .xls y .xlsx desde una sola biblioteca
  • Quieres migrar el corpus a .xlsx de una vez y olvidarte del formato heredado
  • También necesitas .doc, .ppt, .docx o .pptx — cubiertos por la misma instalación

Instalación

pip uninstall xlrd
pip install office-oxide

Chuleta comparativa

Abrir un .xls

xlrd

import xlrd

book = xlrd.open_workbook("legacy.xls")
sheet = book.sheet_by_index(0)

office_oxide

from office_oxide import Document

with Document.open("legacy.xls") as doc:
    xls = doc.as_xls()
    sheet = xls.sheets()[0]

Iterar celdas

xlrd

for row in range(sheet.nrows):
    for col in range(sheet.ncols):
        print(sheet.cell_value(row, col))

office_oxide

for cell in sheet.cells():
    print(cell.address(), cell.value())

Leer todas las celdas como una tabla (caso más habitual)

xlrd

import xlrd

book = xlrd.open_workbook("legacy.xls")
sheet = book.sheet_by_index(0)
rows = [
    [sheet.cell_value(r, c) for c in range(sheet.ncols)]
    for r in range(sheet.nrows)
]

office_oxide

from office_oxide import Document

with Document.open("legacy.xls") as doc:
    ir = doc.to_ir()

# Primera hoja → primera sección → primera tabla
table = next(el for el in ir["sections"][0]["elements"] if el["kind"] == "Table")
rows = table["rows"]

Nombres de hojas

xlrd

book = xlrd.open_workbook("legacy.xls")
print(book.sheet_names())

office_oxide

with Document.open("legacy.xls") as doc:
    print([s.name() for s in doc.as_xls().sheets()])

Convertir .xls → .xlsx (una línea)

Si tu ecosistema ya entiende .xlsx, la ruta de migración más limpia es convertir el corpus una vez y no volver a tocar .xls:

from office_oxide import Document

with Document.open("legacy.xls") as doc:
    doc.save_as("modern.xlsx")

Para un directorio completo:

from pathlib import Path
from office_oxide import Document

for src in Path("legacy").rglob("*.xls"):
    dst = src.with_suffix(".xlsx")
    with Document.open(src) as doc:
        doc.save_as(dst)

Rendimiento

Biblioteca .xls Media p99 Tasa de éxito
office_oxide 2,8 ms 75 ms 99,2 %
python-calamine 9,0 ms 96 ms 90,7 %
xlrd 36,6 ms 503 ms 93,1 %

Office Oxide es 13× más rápido que xlrd y tiene una tasa de éxito 6,1 puntos porcentuales mayor.

Qué se pierde

Las expresiones de fórmula, los nombres definidos y las cachés de fórmulas compartidas de xlrd no se exponen a través del IR. Los resultados de fórmulas en caché sí sobreviven — que es lo que suele necesitar el ecosistema downstream. Para las expresiones de fórmula, baja al módulo específico xls o convierte a .xlsx y usa xlsx.

Ver también