Skip to main content

Python XLSB/XLSX/XLSM Reader & Writer

A Python library for reading and writing XLSB and XLSX files efficiently, with existing-workbook updates for macro-enabled XLSM packages.

Installation

pip install xlspy

Usage

Basic Example

from xlspy import XlsbWriter
import datetime
from decimal import Decimal

data = [
    ["Name", "Age", "City", "info"],
    [-123, 2147483647, 2147483648, 2147483999],
    ["x", "y", "z", datetime.datetime.today()],
    ["Alice", 25, "New York", datetime.date.today()],
    ["Bob", 30, "London", Decimal(3.14)],
    ["Charlie", 35, "Paris", datetime.datetime.now()],
    [True, False, None, datetime.datetime.utcnow()]
]

# Initialize writer with a specific compression level
with XlsbWriter("output.xlsb", compressionLevel=6) as writer:
    # Add a visible sheet
    writer.add_sheet("Visible Sheet")
    writer.write_sheet(data)

    # Add a hidden sheet
    writer.add_sheet("Hidden Sheet", hidden=True)
    writer.write_sheet([["This sheet is hidden."]])

XlsxWriter Example

from xlspy import XlsxWriter
import datetime
from decimal import Decimal

data = [
    ["Name", "Age", "City", "info"],
    [-123, 2147483647, 2147483648, 2147483999],
    ["x", "y", "z", datetime.datetime.today()],
    ["Alice", 25, "New York", datetime.date.today()],
    ["Bob", 30, "London", Decimal(3.14)],
    ["Charlie", 35, "Paris", datetime.datetime.now()],
    [True, False, None, datetime.datetime.utcnow()]
]

# Initialize writer with a specific compression level
with XlsxWriter("output.xlsx", compressionLevel=6) as writer:
    # Add a visible sheet
    writer.add_sheet("Visible Sheet")
    writer.write_sheet(data)

    # Add a hidden sheet
    writer.add_sheet("Hidden Sheet", hidden=True)
    writer.write_sheet([["This sheet is hidden."]])

Cell Formatting (Number, Date, DateTime)

xlspy supports custom cell formatting for numbers, dates, and datetimes in both XLSB and XLSX output. Pass a (value, format_string) tuple to apply a format to a specific cell.

from xlspy import XlsxWriter, F  # or XlsbWriter
import datetime

with XlsxWriter("formatted.xlsx") as writer:
    writer.add_sheet("Formats")
    writer.write_sheet([
        ["Description", "Value"],
        ["Thousands separator", (100000, F.THOUSANDS_SEP)],
        ["Currency PLN",       (100000, F.CURRENCY_PLN)],
        ["Currency EUR",       (100000, F.CURRENCY_EUR)],
        ["Percentage",         (100000, F.PERCENTAGE)],
        ["Scientific",         (100000, F.SCIENTIFIC)],
        ["Two decimals",       (100000, F.TWO_DECIMALS)],
        ["Text",               (100000, F.TEXT)],
        ["Leading zeros",      (100000, F.LEADING_ZEROS)],
        ["Short date",         (datetime.date(2026,6,1), F.DATE_SHORT)],
        ["Long date",          (datetime.date(2026,6,1), F.DATE_LONG)],
        ["ISO date",           (datetime.date(2026,6,1), F.DATE_ISO)],
        ["Month + year",       (datetime.date(2026,6,1), F.DATE_MONTH_YEAR)],
        ["Weekday + date",     (datetime.date(2026,6,1), F.DATE_WEEKDAY)],
        ["Short datetime",     (datetime.datetime(2026,6,1,14,34), F.DATETIME_SHORT)],
        ["Time only",          (datetime.datetime(2026,6,1,14,34), F.TIME_HH_MM)],
        ["12h time",           (datetime.datetime(2026,6,1,14,34), F.TIME_12H)],
        ["ISO datetime",       (datetime.datetime(2026,6,1,14,34), F.DATETIME_ISO)],
    ])

Available Format Constants (xlspy.F)

Number Date DateTime
F.THOUSANDS_SEP — #,##0 F.DATE_SHORT — dd.mm.yyyy F.DATETIME_SHORT — dd.mm.yyyy hh:mm
F.CURRENCY_PLN — #,##0.00 "zł" F.DATE_LONG — d mmmm yyyy F.DATETIME_LONG — d mmmm yyyy hh:mm:ss
F.CURRENCY_EUR — #,##0.00 € F.DATE_DAY_MONTH_YEAR — dd-mm-yyyy F.TIME_HH_MM — hh:mm
F.PERCENTAGE — 0% F.DATE_ISO — yyyy-mm-dd F.TIME_HH_MM_SS — hh:mm:ss
F.SCIENTIFIC — 0.00E+00 F.DATE_MONTH_YEAR — mmmm yyyy F.TIME_12H — h:mm AM/PM
F.TWO_DECIMALS — #,##0.00 F.DATE_WEEKDAY — dddd, d mmmm yyyy F.DATETIME_24H — dd.mm.yyyy hh:mm:ss
F.TEXT — @ F.DATE_DAY_MONTH — d mmmm F.DATETIME_ISO — yyyy-mm-dd"T"hh:mm:ss
F.LEADING_ZEROS — 000000000 F.DATE_YEAR_ONLY — yyyy F.TIME_MS — hh:mm:ss.000

You can also use custom format strings directly:

writer.write_sheet([
    ["Custom", (1234.56, '#,##0.00 "USD"')],
    ["Date",   (datetime.date(2026,6,1), 'dd.mm.yyyy')],
])

The formatting works transparently on both XlsxWriter and XlsbWriter.

Writing pandas / polars DataFrames (optional)

xlspy can write a DataFrame directly to .xlsx or .xlsb. pandas and polars are optional — xlspy has no required dependencies and imports them lazily only when you actually pass a DataFrame:

pip install xlspy[pandas]   # pandas support
pip install xlspy[polars]   # polars support

The quickest way is the one-liner to_xlsx / to_xlsb:

import pandas as pd
from xlspy import to_xlsx, to_xlsb

df = pd.DataFrame({
    "name": ["Alice", "Bob"],
    "age": [25, 30],
    "joined": pd.to_datetime(["2024-01-15", "2023-06-01"]),
})

to_xlsx(df, "people.xlsx")
to_xlsb(df, "people.xlsb")

The same works for polars, with an identical API:

import polars as pl
from xlspy import to_xlsb

df = pl.DataFrame({"name": ["Alice", "Bob"], "age": [25, 30]})
to_xlsb(df, "people.xlsb")

For full control, use the writer method, which behaves exactly like write_sheet and writes into the last sheet added with add_sheet:

import pandas as pd
from xlspy import XlsxWriter, F

df = pd.DataFrame({
    "joined": pd.to_datetime(["2024-01-15", "2023-06-01"]),
    "age": [25, 30],
})

with XlsxWriter("report.xlsx") as writer:
    writer.add_sheet("Data")
    writer.write_dataframe(
        df,
        include_index=True,
        na_rep="n/a",
        formats={"joined": F.DATE_ISO, "age": F.THOUSANDS_SEP},
    )
    writer.add_sheet("Notes")
    writer.write_sheet([["Generated by xlspy"]])

Options

Parameter Applies to Meaning
include_index pandas only Prepend the index as leading column(s); all MultiIndex levels are written. polars has no index and raises ValueError.
na_rep both Text written for missing cells (None / NaN / NaT / NA). Default is None, i.e. an empty cell.
formats both {column_name: format_string} mapping, using the constants from xlspy.F.

Values are converted to the types the writers understand:

DataFrame value Written as
int / float / str / bool / Decimal native cell
pandas.Timestamp, datetime.datetime date/time cell
pandas.Timedelta, datetime.timedelta day fraction (Excel duration; apply F.TIME_* for display)
datetime.time (incl. polars.Time) day fraction (apply F.TIME_* for display)
numpy scalars (int64, float32, bool_, ...) native Python value
None, NaN, NaT, NA empty cell (or na_rep)
MultiIndex columns flattened by joining the levels with a space

See examples/dataframe_*.py and examples/polars_to_xlsx_xlsb.py for full, runnable scripts, indexed in examples/README.md.

Updating an Existing Workbook

XlsxUpdater (also for macro-enabled .xlsm files) and XlsbUpdater replace the data region of an existing workbook while keeping the workbook structure, styles, drawings and unrelated sheets. They are useful when a workbook contains pivot tables: the worksheet source range and pivot-cache refresh metadata are updated together.

from xlspy import XlsxUpdater, XlsbUpdater

rows = [
    ["Alice", 42],
    ["Bob", 37],
]

updater = XlsxUpdater("template.xlsx")
print(updater.get_sheet_names())
updater.replace_sheet_data("Data", rows, headers=["Name", "Amount"])
updater.save("result.xlsx")       # use save() to replace the input atomically

# The XLSB API is identical:
binary_updater = XlsbUpdater("template.xlsb")
binary_updater.replace_sheet_data("Data", rows, headers=["Name", "Amount"])
binary_updater.save("result.xlsb")

# XLSM uses the same XML updater.  The VBA project is preserved byte-for-byte.
macro_updater = XlsxUpdater("template.xlsm")
macro_updater.replace_sheet_data("Data", rows, headers=["Name", "Amount"])
macro_updater.save("result.xlsm")

XlsmUpdater is an explicit alias of XlsxUpdater for .xlsm inputs. The updater does not parse, execute or rewrite VBA; xl/vbaProject.bin and other unrelated macro parts are copied as opaque ZIP members.

For a database cursor or another one-pass source, use the streaming variant. Rows are written through bounded-memory temporary files, so the complete result set is not kept in Python memory. Multiple sheets may be streamed on the same updater before save():

def rows_from_cursor(cursor):
    while True:
        row = cursor.fetchone()
        if row is None:
            break
        yield list(row)

updater = XlsxUpdater("template.xlsx")  # also accepts .xlsm; use XlsbUpdater for .xlsb
updater.replace_sheet_data_stream(
    "Data",
    rows_from_cursor(cursor),
    headers=["Name", "Amount"],
)
updater.save("result.xlsx")              # or result.xlsb

The streaming API requires save() for its memory-bounded write path. to_bytes() necessarily creates the complete archive in memory because it returns the complete file as bytes. The original replace_sheet_data() API is unchanged and remains available for in-memory inputs.

Rows may be any iterable, including a generator. Only trailing rows consisting entirely of None are removed; blank rows in the middle are preserved. By default, the updater inherits the dominant style of each existing column. Use style_fallback="general" to write new cells with the General style. Existing writer-style (value, format_string) tuples are accepted for compatibility, but updating a workbook does not create new styles.

When a pivot cache is present, keep the source column schema (column order and count) unchanged; changing the schema requires rebuilding the pivot cache and is outside the updater's scope.

On Windows, the generated workbook can be checked with the installed Excel COM server (the script opens files read-only using Excel's normal loader):

powershell -ExecutionPolicy Bypass -File tools\validate_excel_com.ps1 result.xlsx result.xlsb

Reading XLSB and XLSX Files

Reading files is done via the ExcelReader class, which automatically detects the format.

from xlspy import ExcelReader

with ExcelReader("input.xlsx") as reader:  # or .xlsb
    names = reader.get_sheet_names()
    print(f"Sheets: {names}")

    for sheet_name in names:
        rows = reader.read_all(sheet_name)
        for row in rows:
            print(row)

# Generator usage (memory efficient for large files):
with ExcelReader("large_file.xlsb") as reader:
    for row in reader.get_rows("Sheet1"):
        print(row)

Streaming from a Database (Netezza)

This example shows how to stream data directly from a database query into an XLSB file using nzpy-extended. This is highly memory-efficient as it doesn't load the entire dataset into memory.

First, ensure you have nzpy-extended installed:

pip install nzpy-extended

Then, you can use a generator function to feed data to XlsbWriter.

import os
from typing import Generator
from xlspy import XlsbWriter

# --- Configuration ---
NZ_CONFIG = {
    "host": os.environ.get("NZ_DEV_HOST", "your_host"),
    "port": int(os.environ.get("NZ_DEV_PORT", "5480")),
    "database": os.environ.get("NZ_DEV_DB", "your_db"),
    "user": os.environ.get("NZ_DEV_USER", "your_user"),
    "password": os.environ.get("NZ_DEV_PASSWORD", "your_password"),
}
QUERY = "SELECT * FROM YourTable"
OUTPUT_FILENAME = "db_output.xlsb"


def row_generator(cursor) -> Generator[list, None, None]:
    """Yields column headers first, then each data row."""
    headers = [column[0] for column in cursor.description]
    yield headers
    while row := cursor.fetchone():
        yield list(row)


# --- Main Execution ---
try:
    import nzpy_extended.sync as nzpy

    with nzpy.connect(**NZ_CONFIG) as conn:
        cursor = conn.cursor()
        cursor.execute(QUERY)

        with XlsbWriter(OUTPUT_FILENAME) as writer:
            writer.add_sheet("Database Export")
            writer.write_sheet(row_generator(cursor))
            writer.add_sheet("SQL Query", hidden=True)
            writer.write_sheet([["SQL"], [QUERY]])

    print(f"Successfully created '{OUTPUT_FILENAME}'")

except Exception as e:
    print(f"An unexpected error occurred: {e}")

Performance

xlspy is designed for high performance. Since version 0.1.0, the library includes a C extension (_c_core) that accelerates XLSB read and write. The C extension is enabled by default (compiled automatically on install). Set XLSPY_DISABLE_C_EXT=1 to force the pure Python fallback.

All benchmarks: 50000 × 50 dataset (2.5M cells). Tests performed on Windows 11 (Python 3.14, AMD64).

Write

Library Format Time Size
xlspy (C_EXT) XLSB 1.02 s 7.25 MB
xlspy (Python) XLSB 2.54 s 7.25 MB
xlspy XLSX 5.35 s 6.34 MB
xlsxwriter XLSX 9.80 s 11.57 MB

Read

Library Format Time Notes
xlspy (C_EXT) XLSB 1.39 s default, compiled C
xlspy XLSX 4.72 s uses expat XML parser (C)
xlspy (Python) XLSB 6.41 s pure Python fallback
openpyxl XLSX 7.85 s read-only mode

Analysis

The 4.6× read speedup comes from two factors:

  • ~60–70% — native C compilation, no interpreter overhead per record
  • ~30–40% — algorithm simplification: flat array indexed by col − first_col instead of Dict[int, Any], no isinstance per cell, no BiffReader.read_worksheet() method call per record

Run the benchmarks yourself with examples/performance_test.py.

Repository

https://github.com/KrzysztofDusko/xlspy/

Metadata

Release files for xlspy 0.5.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 xlspy 0.5.0
File Size Uploaded Provenance
xlspy-0.5.0.tar.gz 94.4 kB With provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for xlspy 0.5.0
File
xlspy-0.5.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
xlspy-0.5.0-cp314-cp314-musllinux_1_2_x86_64.whl CPython 3.14 CPython 3.14 Linux musl 1.2+ x86-64 Details
xlspy-0.5.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.5+ x86-64, Linux glibc 2.28+ x86-64 Details
xlspy-0.5.0-cp314-cp314-macosx_11_0_arm64.whl CPython 3.14 CPython 3.14 macOS 11.0+ ARM64 Details
xlspy-0.5.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
xlspy-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ x86-64 Details
xlspy-0.5.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.5+ x86-64, Linux glibc 2.28+ x86-64 Details
xlspy-0.5.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
xlspy-0.5.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
xlspy-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ x86-64 Details
xlspy-0.5.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64, Linux glibc 2.5+ x86-64 Details
xlspy-0.5.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details

Total release size: 1.2 MB

Release files / xlspy-0.5.0.tar.gz

Download URL xlspy-0.5.0.tar.gz
Size 94.4 kB
Tags Source
SHA-256 checksum
How to use checksums
ca68edb2d647c1a5120b954c69d61b479d593fccc61bf07bfb8104f3a0fe969a
BLAKE2b-256 checksum
How to use checksums
32b36762282cb3a5fea10a45ec7190281b5eb967ae940d78fdce275e48b8aeb1
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp314-cp314-win_amd64.whl

Download URL xlspy-0.5.0-cp314-cp314-win_amd64.whl
Size 80.0 kB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
d57867241560f25d88b874451e25263f4870ad5fc9f9cd058af7b40db5a54a95
BLAKE2b-256 checksum
How to use checksums
aea2b130d7485d156f6206615d27fd7ae58c22b67d7c157ac036b7a4f4bb6150
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp314-cp314-musllinux_1_2_x86_64.whl

Download URL xlspy-0.5.0-cp314-cp314-musllinux_1_2_x86_64.whl
Size 107.3 kB
Tags CPython 3.14 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
5e64453cf0cb1c9ed18a5a56e7777e152eb4e6eb9145a48bc56109cc8ccf81c0
BLAKE2b-256 checksum
How to use checksums
6ee647841d7a3030f2d98988b305c70efa8fb85ac3311527929a56b982e43faf
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl

Download URL xlspy-0.5.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Size 107.9 kB
Tags CPython 3.14 Linux glibc 2.28+ x86-64 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
86330405b73a5f73dc719e1d9d1d586dbf932b947f143fca195eb097f240aa9f
BLAKE2b-256 checksum
How to use checksums
28271cc9764035f998cf4d075c1f8e91a9e0964674dce8af0c2d1a169f41b5a6
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp314-cp314-macosx_11_0_arm64.whl

Download URL xlspy-0.5.0-cp314-cp314-macosx_11_0_arm64.whl
Size 77.4 kB
Tags CPython 3.14 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c68db94126461ac83e36d95218ce22b70b66087e396a22980e686c67bf753c99
BLAKE2b-256 checksum
How to use checksums
986601b07c1ef51794348c8ab9eaf2876ebf43f110bf1311269da70df45d7db2
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp313-cp313-win_amd64.whl

Download URL xlspy-0.5.0-cp313-cp313-win_amd64.whl
Size 79.6 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
b6eac14250fd47152a975b9b8a851492164493735527509e27d4456fa1fd0dfc
BLAKE2b-256 checksum
How to use checksums
f3ee7f8b788dd5713d0c29848d261a71590715d43f0ca8700a4e260b94652918
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl

Download URL xlspy-0.5.0-cp313-cp313-musllinux_1_2_x86_64.whl
Size 107.3 kB
Tags CPython 3.13 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
a3ae6eb952ff17d0311fe6dda3909561aa9f9fc2e354bc88f1701047f8673909
BLAKE2b-256 checksum
How to use checksums
bd4bd39c74abb3c511b52e13cfbf4fdea3ce440a7a1e8f02d0d07df6d4ea31c2
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl

Download URL xlspy-0.5.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Size 107.9 kB
Tags CPython 3.13 Linux glibc 2.28+ x86-64 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
c245c6acb754f6370296d0d21135f3b4b6162a3e16907e3c2041c9a21f1ef53c
BLAKE2b-256 checksum
How to use checksums
765d8d686be01a5b813be8d5405b37d860ee6dc21591a96a8b00b3d754c8bee6
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL xlspy-0.5.0-cp313-cp313-macosx_11_0_arm64.whl
Size 77.4 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
8cba54c56134e30d91265798d7c0aade233b4d01030138fff6c415c47c0e8ed9
BLAKE2b-256 checksum
How to use checksums
b903e74b686d06e8502812a757b61ee5086a310a0ceabc522b0b311107314b8c
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp312-cp312-win_amd64.whl

Download URL xlspy-0.5.0-cp312-cp312-win_amd64.whl
Size 79.6 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
48a01414629602db789f16da9e2acc56e17fbf53ea7e14e95e51bed298f98740
BLAKE2b-256 checksum
How to use checksums
6be20c4271e08bf1ba169da8ee8dd446a3e38a3177ae6025b38a6e9b03238fa8
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl

Download URL xlspy-0.5.0-cp312-cp312-musllinux_1_2_x86_64.whl
Size 107.3 kB
Tags CPython 3.12 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
fcce1cfd5e6f7c1edde09603fab41613f3822b2247dc2b7c6dc6a075bda27b4a
BLAKE2b-256 checksum
How to use checksums
98e2033e50c489695b64d9bb1463960eca7e1cec4f5fad63956b4dfd7f4e8607
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl

Download URL xlspy-0.5.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Size 107.9 kB
Tags CPython 3.12 Linux glibc 2.28+ x86-64 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
ea0922732e65c45beab8de0328aa0050a01208e523d70214a538755e47ca438f
BLAKE2b-256 checksum
How to use checksums
fd695f297c9fbe73ac2642303da5d6bb3d1eb42e7f35a63c457b3f52ff5f04c4
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 15, 2026.

Transparency log

Release files / xlspy-0.5.0-cp312-cp312-macosx_11_0_arm64.whl

Download URL xlspy-0.5.0-cp312-cp312-macosx_11_0_arm64.whl
Size 77.4 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
c820ae528c708d857ee892aeaab6483dd5941428ac8faf9ef3f97d53594cc63b
BLAKE2b-256 checksum
How to use checksums
8c988f0523becfabfaec089266a83bf9607b9b98180694006932749916438ca6
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 15, 2026.

Transparency log

Security for xlspy 0.5.0

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.

Full provenance

All 13 files in this release have been uploaded with provenance metadata.

Select from 13 files

Attestation for xlspy-0.5.0.tar.gz

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 15, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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