Drop-in replacement for openpyxl that connects to XLSX Studio for real-time collaboration
Project description
athena-openpyxl
openpyxl-shaped Python SDK that writes directly to Athena's Keryx-backed spreadsheet Y.Docs. No HTTP middleware on the data path — mirrors athena-python-docx.
Status: v0.2.0 — Tier-A surface complete (full openpyxl public API up to formatting + dates), Tier-B surfaces (tables / data validation / conditional formatting / defined names / comments / images / hyperlinks) wired through the Keryx Y.Doc.
Quick start
from openpyxl import Workbook
with Workbook("asset_abc123") as wb: # opens Keryx session, runs initial sync
ws = wb.active
ws["A1"] = "Hello"
ws["A2"] = 42
ws["A3"] = "=SUM(A2)"
wb.save() # flushes pending updates to Keryx
Branch + agent attribution:
from openpyxl import Workbook
with Workbook(
"asset_abc",
branch="suggest-run-7",
custom_attributions=[
{"k": "agent_id", "v": "spreadsheet-author"},
{"k": "user_message_tracking_id", "v": "msg_xyz"},
],
) as wb:
wb.active["A1"] = "agent edit"
wb.save()
Bulk writes via batch context (one logical activity-log entry):
from openpyxl import Workbook
with Workbook("asset_abc") as wb:
ws = wb.active
with wb.batch():
for row_idx in range(1, 1001):
ws.cell(row_idx, 1, f"row {row_idx}")
wb.save()
Environment
The SDK reads these env vars (Daytona-managed in production):
| Variable | Required | Notes |
|---|---|---|
KERYX_WS_URL |
✓ | e.g. wss://keryx-staging.athenaintel.com |
ATHENA_WORKSPACE_ID |
✓ | workspace routing segment |
KERYX_COLLAB_TOKEN |
one of | pre-minted JWT (preferred — Daytona injects this) |
KERYX_AUTH_PRIVATE_KEY |
one of | ECDSA P-384 JWK/PEM; used to sign locally for dev |
ATHENA_SERVICE_USER_ID |
yuserid JWT claim, defaults to athena@athenaintel.com |
Install (development)
cd xlsx-studio/python-sdk
uv venv && uv pip install -e ".[dev]"
uv run pytest tests/
Public surface (v0.2.0)
Tier A — Core (fully implemented):
| Surface | Status |
|---|---|
Workbook lifecycle (Workbook(asset_id), load_workbook, save, close, ctx mgr) |
✅ |
Sheet listing (sheetnames, worksheets, active, wb[title]) |
✅ |
Single-cell I/O (ws['A1'], ws.cell(r, c), cell.value) |
✅ |
Range access (ws['A1:C3'], ws['A:C'], ws[1]) |
✅ |
Bulk writes (ws.append, iter_rows, iter_cols) |
✅ |
Dimensions (column_dimensions, row_dimensions, width, height, hidden, outline_level, group) |
✅ |
Structural mutations (create_sheet, remove, move_sheet, copy_worksheet, ws.title = x) |
✅ |
Merged cells (merge_cells, unmerge_cells, merged_cells) |
✅ |
Freeze panes (ws.freeze_panes) |
✅ |
Auto filter (ws.auto_filter.ref) |
✅ |
Cell formatting (font, fill, alignment, border, protection, number_format, style) |
✅ |
| Date / datetime / time values | ✅ |
Tier B — Common (wired through Keryx Y.Doc):
| Surface | Status |
|---|---|
wb.defined_names / DefinedName |
✅ |
ws.tables / Table / TableStyleInfo |
✅ |
ws.data_validations / DataValidation |
✅ |
ws.conditional_formatting / Rule classes |
✅ |
cell.comment / Comment |
✅ |
cell.hyperlink / Hyperlink |
✅ |
ws.add_image / Image |
✅ |
wb.named_styles / NamedStyle (object model only) |
partial |
Tier C — Advanced (raises UnsupportedFeatureError):
- Charts and chartsheets (waiting on the cross-studio chart engine extraction from
pptx-studio— seepptx-studio/docs/CHARTING_REFACTOR_PLAN_2026-04-21.md). - Pivot tables.
- Sheet/workbook protection write side.
- Page setup write side.
- Macros / VBA passthrough.
See docs/API_PARITY_EXCEPTIONS.md for the canonical list of intentional deviations.
Architecture
Agent code (openpyxl idiom)
↓
Workbook / Worksheet / Cell (sync facade)
↓ _batching.run_sync → persistent background event loop thread
Session (pycrdt Doc + Keryx connection, branch + custom_attributions)
↓ _keryx_client: ECDSA P-384 JWT + y-websocket sync protocol
Keryx ←→ Olympus (@rowsncolumns/y-spreadsheet renderer)
(same Y.Doc; room = "{workspace}/{asset_id}")
_keryx_client.py— ECDSA P-384 JWT signing, y-websocket sync step1/step2/update frames, awareness state withcustomAttributions. Ported fromagora/agora/services/keryx/client.pyminus retry/metrics._batching.py— sync→async bridge, one persistent event loop. Ported fromdocx-studio/python-sdk/docx/_batching.py._session.py—Sessionclass owning the pycrdtDoc+ WebSocket; exposes per-cell I/O, dimension setters, structural mutations, merges, freeze panes, filter, xf registry, batch mode.cell/,worksheet/,workbook/,dimensions.py,styles/,comments/,formatting/,drawing/— openpyxl-shaped surface that routes throughSession.
Publishing
bash ../scripts/publish-python-sdk.sh 0.2.0
Development workflow
# Install editable + dev tools.
uv venv && uv pip install -e ".[dev]"
# Run the unit suite (no Keryx required).
uv run pytest tests/ -x
# Lint.
uv run ruff check openpyxl tests
Tests
The SDK ships ~190 unit tests covering: utility helpers, all five style descriptors (Font / Fill / Alignment / Border / Protection / NamedStyle), Workbook lifecycle / registry / flush_all, single-cell I/O, range access, iter_rows / iter_cols, append, max_row / max_column, dimensions, structural mutations, merges, freeze panes, auto filter, cell formatting, dates, comments, hyperlinks, and the UnsupportedFeatureError boundary.
Tests stub the Keryx WebSocket connection and operate against an in-memory pycrdt Doc — no network access required.
The integration / parity / fidelity lanes live separately (see the roadmap doc at xlsx-studio/docs/ATHENA_OPENPYXL_ROADMAP_2026-04-29.md).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file athena_openpyxl-0.6.0.tar.gz.
File metadata
- Download URL: athena_openpyxl-0.6.0.tar.gz
- Upload date:
- Size: 57.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a3b739f5b9b8a948c6129e2a4a0e70943f6fa6874985028d1dc35d3871e097f
|
|
| MD5 |
5265ffff3914a955f2ec1e97ca58c551
|
|
| BLAKE2b-256 |
4bac936771f5aa99829ecf7e7f05a61889f3d85e246517b4483467b87dec7b1f
|
File details
Details for the file athena_openpyxl-0.6.0-py3-none-any.whl.
File metadata
- Download URL: athena_openpyxl-0.6.0-py3-none-any.whl
- Upload date:
- Size: 58.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
de47d1d22ec79540f97b02a1faa3c913b26ca69a1828a9effa9108e77d9fe63c
|
|
| MD5 |
8aaef2ca9160504da1dc2fa28c4edb67
|
|
| BLAKE2b-256 |
5c40cece68ea7eb209b65372705788403206ef5be5a49bb7ea400235bc41bc04
|