Skip to main content

EzXl

PyPI version Python versions PyPI status License CI Docs uv linter type checker

Logo

EzXl is a lightweight Python library for Excel automation via COM (win32com) on Windows — open workbooks, manipulate sheets, interact with the ribbon, and convert between formats, all from a clean Python API.

📦 Installation

Standard

# Create and activate a virtual environment
python -m venv .venv
.venv\Scripts\activate

# Install in development mode with the `dev` dependency group
uv sync --group dev

pywin32 post-install step (mandatory)

Warning: pywin32 requires a post-install script to register COM components. This step is mandatory and must be run once after installation. Skipping it will cause COM dispatch to fail.

python .venv/Scripts/pywin32_postinstall.py -install

Corporate offline environment

In restricted environments without PyPI access, install from local wheel files only. No network requests are made during installation. Configure your pip to point to a local wheel directory:

pip install --no-index --find-links=\\share\wheels -e . --group dev

Optional pywinauto backend

To enable the pywinauto GUI automation backend (UIA-based, locale-independent):

pip install -e ".[pywinauto]"

Note: Ensure your Python interpreter bitness (32-bit or 64-bit) matches the installed Excel. COM dispatch will fail on a mismatch. Verify with:

python -c "import struct; print(struct.calcsize('P') * 8)"

🚀 Quick Start

from ezxl import ExcelApp

# Open a workbook and read from a sheet
with ExcelApp(mode="dispatch", visible=True) as xl:
    wb = xl.open("C:/reports/budget.xlsx")
    sheet = wb.sheet("Summary")
    value = sheet.cell("B2").value
    print(value)
    wb.save()

# Attach to a running Excel instance (left running on exit)
with ExcelApp(mode="attach") as xl:
    xl.gui.ribbon.execute("FileSave")

# Attach if Excel is open, start a private instance otherwise.
# Excel is only quit on exit when ezxl started it.
with ExcelApp(mode="auto") as xl:
    wb = xl.workbook()

🎯 Key Features

  • ✅ COM Automation: open, attach, navigate Excel via win32com
  • ✅ GUI Interaction: ribbon, menus, dialogs, and SendKeys via win32com
  • ✅ Swappable GUI Backends: COM or pywinauto, injected via protocol ABCs
  • ✅ File I/O: xlsx↔csv conversion via polars+fastexcel (no Excel required)
  • ✅ Closed-file Formatting: colors, fonts, and borders via openpyxl
  • ✅ Thread Safety: COM STA model enforced, thread identity checked at construction
  • ✅ Full Type Hints: complete typing for IDEs and linters
  • ✅ Corporate Ready: offline wheel install, proxy support

📚 Documentation

Full documentation is available online: neuraaak.github.io/ezxl

🧪 Testing

# Install dev dependencies
uv sync --group dev

# Run unit tests (no Excel required) - what CI runs
uv run poe test-ci

# Run the whole suite, integration tests included (requires local Excel)
uv run poe test

Note: Integration tests marked with @pytest.mark.excel require a locally installed Excel instance. They are excluded from CI/CD pipelines and are intended for local verification only.

🛠️ Development Setup

# Clone the repository
git clone https://github.com/neuraaak/ezxl.git
cd ezxl

# Create and activate a virtual environment
python -m venv .venv
.venv\Scripts\activate

# Install in development mode with all dev dependencies
uv sync --group dev

# Mandatory: register pywin32 COM components
python .venv/Scripts/pywin32_postinstall.py -install

# Set up git hooks
git config core.hooksPath .hooks

See the Development Guide for detailed setup instructions.

🔌 API Overview

🖥️ COM Automation (5)

Symbol Description
ExcelApp COM session — dispatch or attach, context manager
WorkbookProxy Workbook open/save/close, sheet access
SheetProxy Sheet navigation, cell access
CellProxy Single cell read/write
RangeProxy Range selection and bulk operations

🎛️ GUI Interaction (4)

Symbol Description
GUIProxy Unified GUI facade with swappable backends
RibbonProxy Ribbon execution and state via COM
MenuProxy Legacy CommandBar traversal via COM
DialogProxy File pickers and alerts via COM

🔌 GUI Backends — pywinauto (4)

Symbol Description
PywinautoRibbonBackend Ribbon via keyboard shortcuts (locale-independent)
PywinautoMenuBackend Menu traversal via UIA
PywinautoDialogBackend File pickers via UIA + Win32
PywinautoKeysBackend Keystroke injection via pywinauto

📂 File I/O (5)

Symbol Description
read_excel Read xlsx into a polars DataFrame
read_csv Read csv into a polars DataFrame
xlsx_to_csv Convert xlsx to csv (no Excel required)
csv_to_xlsx Convert csv to xlsx (no Excel required)
ExcelFormatter Closed-file formatting (colors, fonts, borders)

📦 Dependencies

  • pywin32>=306 — COM driver (win32com.client), Windows-only
  • polars>=1.0.0 — DataFrame I/O engine
  • fastexcel>=0.11.0 — Fast xlsx reader (Rust binding)
  • xlsxwriter>=3.0.0 — xlsx write backend for polars
  • openpyxl>=3.1.0 — Closed-file formatting
  • ezplog>=2.0.0 — Structured logging

Optional:

  • pywinauto>=0.6.8 — UI Automation backend (locale-independent GUI interaction)

📄 License

MIT License – See LICENSE file for details.


ezxl — Excel automation made simple, reliable, and Pythonic. 🐍

Metadata

Release files for ezxl 1.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ezxl 1.4.0
File Size Uploaded
ezxl-1.4.0.tar.gz 146.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ezxl 1.4.0
File Interpreter ABI Platform
ezxl-1.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 219.4 kB

Release files / ezxl-1.4.0.tar.gz

Download URL ezxl-1.4.0.tar.gz
Size 146.4 kB
Tags Source
SHA-256 checksum
How to use checksums
9b9e58ac95d0a0f9fd0b7b85be5192ffd2721b99b37900e4bb260074e8247cb6
BLAKE2b-256 checksum
How to use checksums
49de94f371d2ca860b81e76a772f401dcd05e1d4596e891be0ea53307cd62fc2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Release files / ezxl-1.4.0-py3-none-any.whl

Download URL ezxl-1.4.0-py3-none-any.whl
Size 73.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9391e947c55330dab60e872872dd7158f5d88d5f60d9c34d7520968313e32471
BLAKE2b-256 checksum
How to use checksums
62546e8d92614ccf4096d5ba97cac964f45f0a55770add9ea8eb7938e2cca287
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Release history Release notifications | RSS feed

This release

1.4.0 This release

2 release files

1.2.0

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page