openpyxl からの移行
Office Oxide は XLSX を openpyxl より 18 倍高速 に読み取ります(1,802 ファイルで平均 5.0 ms 対 94.5 ms)。テストしたどのライブラリよりもパス率が高く、レガシー .xls を直接読めます — openpyxl ではまったくできません。
いつ移行するか
以下のいずれかをやっているなら切り替えを:
.xlsxからセル、行、シート、テーブルを読み取って取り込み / RAG / ダッシュボードに使う- スプレッドシートを Markdown または HTML に変換
xlrd(2.0 以降非推奨)を追加したり LibreOffice にシェルアウトしたりせず.xlsをサポートしたい- 依存を増やさずに
.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 記法です。シート名 → インデックスを解決するには、ワークブックを 1 回読んで sheets() を呼びます。
Markdown / HTML に変換
openpyxl — 組み込みなし; 行を自分でレンダリングする必要があります。
office_oxide
with Document.open("budget.xlsx") as doc:
md = doc.to_markdown() # シートごとに 1 つの ## セクション、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 でしたが、2.0 以降 .xls は非推奨で、メンテナンスもされていません。
office_oxide
from office_oxide import Document
with Document.open("legacy.xls") as doc:
print(doc.plain_text())
doc.save_as("modern.xlsx") # 1 行で移行
パフォーマンス
| ライブラリ | 平均 | p99 | 通過率 |
|---|---|---|---|
| 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% |
毎日 10 万スプレッドシートを読む典型的な分析パイプライン: openpyxl で 8 時間 18 分、office_oxide で 26 分。
失われるもの
EditableDocument.set_cell は生のセル値を書きます; 数値フォーマット、条件付き書式、チャート、名前付き範囲は変更しません(それらの部分は逐語的に保持されます)。フルスタイリングでの XLSX 構築には openpyxl を使うか、office_oxide.xlsx::create::XlsxBuilder に降ります。
関連項目
- XLSX セルを設定 — 完全な型マトリクスとエッジケース
- xlrd からの移行 — レガシー
.xls向け - パフォーマンスベンチマーク