Skip to main content

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 — see pptx-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 with customAttributions. Ported from agora/agora/services/keryx/client.py minus retry/metrics.
  • _batching.py — sync→async bridge, one persistent event loop. Ported from docx-studio/python-sdk/docx/_batching.py.
  • _session.pySession class owning the pycrdt Doc + 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 through Session.

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

athena_openpyxl-0.6.4.tar.gz (113.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

athena_openpyxl-0.6.4-py3-none-any.whl (62.1 kB view details)

Uploaded Python 3

File details

Details for the file athena_openpyxl-0.6.4.tar.gz.

File metadata

  • Download URL: athena_openpyxl-0.6.4.tar.gz
  • Upload date:
  • Size: 113.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.6

File hashes

Hashes for athena_openpyxl-0.6.4.tar.gz
Algorithm Hash digest
SHA256 b0ca74a52679b1228be99c29d688506f2663477fe757984c18b1b1ab6196e4fd
MD5 f7d6e816916f1f7a7c4d7ce1edcf035e
BLAKE2b-256 75e4efee2fa3f8538b46993fc824cb31d040147da64d65aa54840835f5a918c2

See more details on using hashes here.

File details

Details for the file athena_openpyxl-0.6.4-py3-none-any.whl.

File metadata

File hashes

Hashes for athena_openpyxl-0.6.4-py3-none-any.whl
Algorithm Hash digest
SHA256 5e87953c18033bb3ff8771fdf561519ab12896c438ff974faee57feb97a7c174
MD5 78a781a010498a3dd642a9754d7d6028
BLAKE2b-256 3a4b8fb906581e7863066509b2b85dafa5f0c4044f2e290c8e2d3cf42532b2af

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page