Skip to main content

excelizarr

A cloud-native representation of an .xlsx workbook. In Zarr. Yes, really.

A friend made me realise you could save an .xlsx spreadsheet as an HDF5 file. That raised an obvious question: why not Zarr? Then a workbook is chunked, compressed and cloud-readable, and with Icechunk it's version-controlled too.

import excelizarr as xz

wb = xz.xlsx_to_zarr("model.xlsx", "s3://bucket/model.zarr")

wb["Inputs!B2:D10"]                                               # fetches a few chunks
df = xz.read_excel("s3://bucket/model.zarr", sheet_name="Inputs")  # == pd.read_excel
xz.zarr_to_xlsx("s3://bucket/model.zarr", "roundtrip.xlsx")       # formulas intact

How it works

Each sheet becomes a zarr group of aligned, chunked (and sharded) 2D arrays:

  • kind: which type each cell holds
  • one array per value type: number, string, bool, temporal
  • formula and numfmt

Zarr never writes a chunk that's all fill value, so unused types and empty space cost nothing. A range read fetches only the chunks it overlaps, and the root's consolidated metadata means opening a workbook is a single read. See the format.

  • read_excel parity. xz.read_excel runs pandas' own Excel parser over the stored cells, so every keyword behaves the same, and a hypothesis property checks the frames match.
  • Round trips. Formulas, number formats, merged cells, column widths, frozen panes and defined names all survive xlsx → zarr → xlsx.
  • Any zarr store. Local, s3://, in memory, a ZipStore, or an Icechunk session.
  • In-place edits. wb["Inputs"]["B2"] = 42 rewrites the one shard that cell is in.

Is it fast?

On a 50,000 × 20 sheet (details):

read seconds
pd.read_excel (openpyxl) 2.97
pd.read_excel (calamine) 0.63
pd.read_hdf 0.017
xz.read_excel 0.22
100-cell range read 0.004

So HDF is still the right call for "the whole sheet as a DataFrame, fast". excelizarr is 14× faster than parsing the .xlsx, smaller on disk than either, and much better at the cloud-shaped jobs: range reads, partial access and version control.

From S3 (ap-southeast-2, from Australia), on a 500,000 × 20 sheet (details):

read seconds
pd.read_excel (openpyxl) 34.76
pd.read_excel (calamine) 8.26
download + pd.read_hdf 1.99
xz.read_excel 2.96
open + 100-cell range read 0.48

The range read costs the same at 10,000 rows as at 500,000: it only ever fetches the chunks it needs.

Development

pixi run test             # hypothesis-heavy test suite
pixi run -e docs docs     # executed MyST docs, warnings are errors
pixi run -e bench bench   # the benchmark above

Licence

The Not Fit For Purpose Licence, which is the Apache License 2.0 with a preamble. This tool is not fit for purpose. I don't care what your purpose is, this isn't it.

Metadata

Release files for excelizarr 0.1.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 excelizarr 0.1.0
File Size Uploaded
excelizarr-0.1.0.tar.gz 63.8 kB Details

Built distribution (wheel)

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

Total release size: 99.8 kB

Release files / excelizarr-0.1.0.tar.gz

Download URL excelizarr-0.1.0.tar.gz
Size 63.8 kB
Tags Source
SHA-256 checksum
How to use checksums
6ba4b5fea5397914ba20e2c35409fb66070f8ec7f7e93bf042001b54bbeaab53
BLAKE2b-256 checksum
How to use checksums
2a524495b1342e5630ee1f1ef7f1362922b9644aac01962278c49afc0cfb8838
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release files / excelizarr-0.1.0-py3-none-any.whl

Download URL excelizarr-0.1.0-py3-none-any.whl
Size 36.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
400923a540d229d5f02f2ac62e77ab55299d6a2a6927093375a2bb17332ab764
BLAKE2b-256 checksum
How to use checksums
dca4b81e9360924fd61ad59af238ea1ab07b574bf52d7c33e97ec6b67dbf01b3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 12, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

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