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.0y quieres una biblioteca mantenida - Necesitas
.xlsy.xlsxdesde una sola biblioteca - Quieres migrar el corpus a
.xlsxde una vez y olvidarte del formato heredado - También necesitas
.doc,.ppt,.docxo.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
- Migración desde openpyxl — para
.xlsx - Conversión: heredado → OOXML — qué hace
save_as - Benchmarks de rendimiento