Skip to main content

Create styled excel reports with declarative python.

Project description

xpyxl — Excel in Python

Compose polished spreadsheets with pure Python—no manual coordinates. You assemble rows/columns/cells; xpyxl handles layout, rendering, and styling with utility-style classes.

Core ideas

  • Positionless composition: Build sheets declaratively from row, col, cell, table, vstack, and hstack.
  • Composable styling: Tailwind-inspired utilities (typography, colors, alignment, number formats) applied via style=[...].
  • Deterministic rendering: Pure-data trees compiled into .xlsx files with predictable output—ideal for tests and CI diffing.

Installation

uv add xpyxl
pip install xpyxl

Getting started

import xpyxl as x

report = (
    x.workbook("Sales")[
        x.sheet("Summary")[
            x.row(style=[x.text_2xl, x.bold, x.text_blue])["Q3 Sales Overview"],
            x.row(style=[x.text_sm, x.text_gray])["Region", "Units", "Price"],
            x.row(style=[x.bg_primary, x.text_white, x.bold])["EMEA", 1200, 19.0],
            x.row()["APAC", 900, 21.0],
            x.row()["AMER", 1500, 18.5],
        ]
    ]
)

report.save("report.xlsx")

Primitives

x.row(style=[x.bold, x.bg_warning])[1, 2, 3, 4, 5]
x.col(style=[x.italic])["a", "b", "c"]
x.cell(style=[x.text_green, x.number_precision])[42100]
  • row[...] accepts any sequence (numbers, strings, dataclasses…)
  • col[...] stacks values vertically
  • cell[...] wraps a single scalar
  • All primitives accept style=[...]

Component: table

x.table(...) renders a header + body with optional style overrides. Combine with vstack/hstack for dashboards and reports.

sales_table = x.table(
    header=["Region", "Units", "Price"],
    header_style=[x.text_sm, x.text_gray, x.align_middle],
    style=[x.table_bordered, x.table_compact],
)[
    ["EMEA", 1200, 19.0],
    ["APAC", 900, 21.0],
    ["AMER", 1500, 18.5],
]

layout = x.vstack(
    x.row(style=[x.text_xl, x.bold])["Q3 Sales Overview"],
    x.space(),
    x.hstack(
        sales_table,
        x.cell(style=[x.text_sm, x.text_gray])["Generated with xpyxl"],
        gap=2,
    ),
)

Utility styles (non-exhaustive)

  • Typography: text_xs/_sm/_base/_lg/_xl/_2xl/_3xl, bold, italic, mono
  • Text colors: text_red, text_green, text_blue, text_orange, text_purple, text_black, text_gray
  • Backgrounds: bg_red, bg_primary, bg_muted, bg_success, bg_warning, bg_info
  • Layout & alignment: text_left, text_center, text_right, align_top/middle/bottom, wrap
  • Tables: table_bordered, table_banded, table_compact
  • Number/date formats: number_comma, number_precision, percent, currency_usd, currency_eur, date_short, datetime_short, time_short

Mix and match utilities freely—what you see is what you get.

Layout helpers

  • vstack(a, b, c, gap=1) vertically stacks components with optional blank rows between them.
  • hstack(a, b, gap=1) arranges components side by side with configurable column gaps.
  • space(rows=1, height=None) inserts empty rows (optionally with a fixed height).

Examples

  • Multi-sheet sales demo: see examples/multi_sheet_sales_demo.py.
    • Run it to generate a showcase workbook:
python examples/multi_sheet_sales_demo.py
  • Output: multi-sheet-sales-demo-output.xlsx with sheets Summary, Raw Data, Pipeline, and Glossary, demonstrating tables, stacks, spacing, and utility styles.

Types & ergonomics

  • Modern Python with full type hints.
  • Pure Python stack traces; easy to debug, script, and test.
  • Deterministic rendering for stable diffs in CI.

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

xpyxl-0.1.1.tar.gz (11.8 kB view details)

Uploaded Source

Built Distribution

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

xpyxl-0.1.1-py3-none-any.whl (11.8 kB view details)

Uploaded Python 3

File details

Details for the file xpyxl-0.1.1.tar.gz.

File metadata

  • Download URL: xpyxl-0.1.1.tar.gz
  • Upload date:
  • Size: 11.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xpyxl-0.1.1.tar.gz
Algorithm Hash digest
SHA256 01b7b0732f23e7a2497c96e8d058423520633aff684404be5f2af2671bc8a79a
MD5 b5e51e66137eb9ea703f2a7812e88480
BLAKE2b-256 2b8fad1e017cd647aa4e5bf6c6fd95e03cb2bfeac9c3f28027d5aaef8dc2ba68

See more details on using hashes here.

Provenance

The following attestation bundles were made for xpyxl-0.1.1.tar.gz:

Publisher: publish.yml on dakixr/xpyxl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file xpyxl-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: xpyxl-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 11.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for xpyxl-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c83df376dd0bb872808e91206952017832e75a77af5b92582c43473c4ecb711c
MD5 e97ca0dcfbb5e3d08e23ae518571d64e
BLAKE2b-256 2e1f0a8c522ac76b10722025cb38b64df40f5bdecd98e6e7be0bf5aa8fe44e2d

See more details on using hashes here.

Provenance

The following attestation bundles were made for xpyxl-0.1.1-py3-none-any.whl:

Publisher: publish.yml on dakixr/xpyxl

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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