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 formulaandnumfmt
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_excelparity.xz.read_excelruns 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, aZipStore, or an Icechunk session. - In-place edits.
wb["Inputs"]["B2"] = 42rewrites 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)
| File | Size | Uploaded | |
|---|---|---|---|
| excelizarr-0.1.0.tar.gz | 63.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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