Skip to content

Міграція з 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.

Див. також