Міграція з openpyxl
Office Oxide читає XLSX у 18 разів швидше за openpyxl (5,0 мс проти 94,5 мс у середньому на 1 802 файлах) і має найвищу частку успішного розбору серед усіх протестованих бібліотек. Він також читає застарілий .xls напряму — чого openpyxl не вміє взагалі.
Коли мігрувати
Перемикайтеся, якщо ви робите щось із цього:
- Читаєте клітинки, рядки, аркуші або таблиці з
.xlsxдля інжесту / RAG / дашбордів - Конвертуєте таблиці в Markdown чи HTML
- Потрібна підтримка
.xlsбез додаванняxlrd(застарілий з 2.0) чи виклику LibreOffice - Хочете обробляти також
.docx,.pptxабо застарілі DOC/PPT без додаткових залежностей - Використовуєте
EditableDocumentдля запису клітинок у шаблонах
Залишайтеся на openpyxl, якщо:
- Ви будуєте складні XLSX з нуля — з діаграмами, умовним форматуванням, іменованими стилями та зведеними таблицями (openpyxl — найпотужніший варіант на чистому Python для повнофункціонального створення)
- Потрібна оцінка формул на чистому Python
Встановлення
pip uninstall openpyxl
pip install office-oxide
Порівняльна шпаргалка
Відкриття робочої книги
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:
...
Ітерація клітинок аркуша
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)
Для багатшого поклітинкового доступу (типи, формули, об’єднані клітинки) спускайтеся в модуль 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())
Читання однієї клітинки
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()
Запис клітинок (шаблонізація)
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 = перший аркуш
ed.set_cell(0, "B1", 42.5)
ed.set_cell(0, "C1", True)
ed.save("filled.xlsx")
sheet_index — нульовий; cell_ref — стандартна A1-нотація. Щоб перетворити ім’я аркуша на індекс, прочитайте книгу один раз і викличте sheets().
Конвертація в Markdown / HTML
openpyxl — нічого вбудованого; рядки довелося б рендерити самому.
office_oxide
with Document.open("budget.xlsx") as doc:
md = doc.to_markdown() # один розділ ## на аркуш, GFM-таблиці
Читання імен аркушів
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()])
Читання застарілого .xls
openpyxl не відкриває .xls. Історичним обхідним шляхом був xlrd, для .xls визнаний застарілим з версії 2.0 і більше не підтримується.
office_oxide
from office_oxide import Document
with Document.open("legacy.xls") as doc:
print(doc.plain_text())
doc.save_as("modern.xlsx") # міграція в один рядок
Продуктивність
| Бібліотека | Середнє | p99 | Частка успіху |
|---|---|---|---|
| office_oxide | 5,0 мс | 40 мс | 97,8% |
| python-calamine | 13,9 мс | 183 мс | 96,6% |
| openpyxl | 94,5 мс | 698 мс | 96,2% |
Типовий аналітичний конвеєр, що читає 100 000 таблиць на день: 8 годин 18 хвилин на openpyxl, 26 хвилин на office_oxide.
Що втрачається
EditableDocument.set_cell пише сирі значення клітинок; він не змінює числові формати, умовне форматування, діаграми чи іменовані діапазони (ці частини зберігаються дослівно). Для збирання XLSX із повним стилізуванням використовуйте openpyxl або спускайтеся в office_oxide.xlsx::create::XlsxBuilder.
Див. також
- Встановлення клітинок XLSX — повна матриця типів і граничні випадки
- Міграція з xlrd — для застарілого
.xls - Бенчмарки продуктивності