Skip to main content

Python bindings for OpenXLSX-NX using nanobind

Project description

PyOpenXLSX

PyPI version Python versions Downloads Build Status Docs Status Codecov License

[!IMPORTANT] pyopenxlsx uses OpenXLSX-NX (v1.0.0+), a specialized C++ fork that includes critical performance optimizations and functional enhancements (such as agile encryption, streaming I/O, vector shapes, threaded comments, and custom properties) not currently available in the upstream repository.

pyopenxlsx is a high-performance Python binding for the OpenXLSX-NX C++ library. It aims to provide significantly faster read/write speeds compared to pure Python libraries like openpyxl, while maintaining a Pythonic API design.

Core Features

  • High Performance: Powered by the modern C++17 OpenXLSX-NX library.
  • Pythonic API: Intuitive interface with properties, iterators, and context managers.
  • Streaming I/O: Bypass the DOM entirely with XLStreamWriter and XLStreamReader for memory-efficient bulk data processing.
  • Security: Full support for ECMA-376 Standard and Agile Encryption (read/write password-protected files) and granular worksheet protection.
  • Async Support: async/await support for key I/O operations.
  • Rich Styling: Comprehensive support for fonts, fills, borders, alignments, and number formats.
  • Extended Metadata: Support for both standard and custom document properties.
  • Advanced Content: Support for images, vector shapes, hyperlinks (external/internal), and modern threaded comments.
  • Memory Safety: Combines C++ efficiency with Python's automatic memory management.

Tech Stack

Component Technology
C++ Core OpenXLSX-NX
Bindings nanobind
Build System scikit-build-core & CMake

pyopenxlsx vs openpyxl: Feature Comparison

While openpyxl is a great pure-Python library, pyopenxlsx is designed to solve critical performance bottlenecks and add modern enterprise features by leveraging a C++ engine.

Feature / Capability pyopenxlsx (OpenXLSX-NX) openpyxl Notes
Underlying Engine C++17 (nanobind wrapped) Pure Python pyopenxlsx is heavily optimized for low-level memory management.
Execution Speed Extremely Fast (Up to 160x) Slower Pure Python loop overhead makes parsing large files sluggish.
Memory Footprint Minimal (C++ Memory Mapping) High Parsing large files in openpyxl often leads to OOM errors.
Asyncio Support Native (await load_workbook_async) ❌ No pyopenxlsx offloads heavy I/O to a threadpool, perfect for Web APIs (FastAPI/Django).
Agile Encryption (Passwords) Native Read & Write ❌ No openpyxl cannot read/write password-protected .xlsx files without 3rd-party decryption tools.
Threaded Comments Full Support (Conversations/Replies) ❌ No / Can be lost pyopenxlsx supports modern Excel conversational comments and resolution states.
Vector Shapes Native Support (20+ Shapes) ❌ No Draw complex vector shapes (Arrows, Flowcharts, etc.) directly.
Formula Evaluation Built-in C++ Engine ❌ No pyopenxlsx can statically evaluate simple formulas without Excel installed.
Streaming I/O Direct to disk with Styles ⚠️ Partial (WriteOnly) pyopenxlsx can stream styled data directly to the archive, bypassing the DOM.
Granular Sheet Protection Deep Control (20+ specific flags) ✅ Yes pyopenxlsx exposes extensive ECMA-376 locking options.
Styles Architecture Declarative (Index-based) ⚠️ Object-based pyopenxlsx reuses style indices, saving massive amounts of memory on huge datasets.
Charts ⚠️ Basic (Bar, Line, etc.) Highly Advanced openpyxl currently has more mature support for extremely complex/3D charts.
Environment Pre-compiled Wheels required Any Python env pyopenxlsx provides wheels for major OS/Architectures via CI.

Installation

From PyPI (Recommended)

# Using pip
pip install pyopenxlsx

# Using uv
uv pip install pyopenxlsx

From Source

# Using uv
uv pip install .

# Or using pip
pip install .

Development Installation

uv pip install -e .

Quick Start

Create and Save a Workbook

from pyopenxlsx import Workbook

# Create a new workbook
with Workbook() as wb:
    ws = wb.active
    ws.title = "MySheet"
    
    # Write data
    ws["A1"].value = "Hello"
    ws["B1"].value = 42
    ws.cell(row=2, column=1).value = 3.14
    
    # Save
    wb.save("example.xlsx")

Custom Properties

from pyopenxlsx import Workbook

with Workbook() as wb:
    # Set custom document properties
    wb.custom_properties["Author"] = "Curry Tang"
    wb.custom_properties["Project"] = "PyOpenXLSX"
    wb.save("props.xlsx")

Hyperlinks

from pyopenxlsx import Workbook

with Workbook() as wb:
    ws = wb.active
    ws["A1"].value = "Google"
    # External link
    ws.add_hyperlink("A1", "https://www.google.com", tooltip="Search")
    
    # Internal link to another sheet
    ws2 = wb.create_sheet("Data")
    ws["A2"].value = "See Data"
    ws.add_internal_hyperlink("A2", "Data!A1")
    
    wb.save("links.xlsx")

Read a Workbook

from pyopenxlsx import load_workbook

wb = load_workbook("example.xlsx")
ws = wb["MySheet"]
print(ws["A1"].value)  # Output: Hello
wb.close()

Async Operations

pyopenxlsx provides async/await support for all I/O-intensive operations, ensuring your event loop remains responsive.

import asyncio
from pyopenxlsx import Workbook, load_workbook_async, Font

async def main():
    # 1. Async context manager for automatic cleanup
    async with Workbook() as wb:
        ws = wb.active
        ws["A1"].value = "Async Data"
        
        # 2. Async stylesheet creation
        style_idx = await wb.add_style_async(font=Font(bold=True))
        ws["A1"].style_index = style_idx
        
        # 3. Async worksheet operations
        new_ws = await wb.create_sheet_async("AsyncSheet")
        await new_ws.append_async(["Dynamic", "Row", 123])
        
        # 4. Async range operations
        await new_ws.range("A1:C1").clear_async()
        
        # 5. Async save
        await wb.save_async("async_example.xlsx")

    # 6. Async load
    async with await load_workbook_async("async_example.xlsx") as wb:
        ws = wb.active
        print(ws["A1"].value)
        
        # 7. Async protection
        await ws.protect_async(password="secret")
        await ws.unprotect_async()

asyncio.run(main())

Styling

from pyopenxlsx import Workbook, Font, Fill, Border, Side, Alignment

wb = Workbook()
ws = wb.active

# Define styles using hex colors (ARGB) or names
# Hex colors can be 6-digit (RRGGBB) or 8-digit (AARRGGBB)
font = Font(name="Arial", size=14, bold=True, color="FF0000") # Red
fill = Fill(pattern_type="solid", color="FFFF00")              # Yellow
border = Border(
    left=Side(style="thin", color="000000"),
    right=Side(style="thin"),
    top=Side(style="thick"),
    bottom=Side(style="thin")
)
alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)

# Apply style
style_idx = wb.add_style(font=font, fill=fill, border=border, alignment=alignment)
ws["A1"].value = "Styled Cell"
ws["A1"].style_index = style_idx

wb.save("styles.xlsx")

Pivot Tables

Create dynamic pivot tables based on worksheet data.

from pyopenxlsx import Workbook
from pyopenxlsx._openxlsx import XLPivotTableOptions, XLPivotField, XLPivotSubtotal

with Workbook() as wb:
    # 1. Write source data
    ws = wb.active
    ws.title = "SalesData"
    ws.write_row(1, ["Region", "Product", "Sales"])
    ws.write_rows(2, [
        ["North", "Apples", 100],
        ["South", "Bananas", 300],
        ["North", "Oranges", 150]
    ])
    
    # 2. Create a separate sheet for the Pivot Table
    ws_pivot = wb.create_sheet("PivotSheet")
    
    # 3. Configure options
    options = XLPivotTableOptions()
    options.name = "SalesPivot"
    options.source_range = "SalesData!A1:C4"
    options.target_cell = "A3" # Note: Target cell must NOT include sheet name
    
    # 4. Define fields
    r = XLPivotField()
    r.name = "Region"
    r.subtotal = XLPivotSubtotal.Sum
    options.rows = [r]

    c = XLPivotField()
    c.name = "Product"
    c.subtotal = XLPivotSubtotal.Sum
    options.columns = [c]

    d = XLPivotField()
    d.name = "Sales"
    d.subtotal = XLPivotSubtotal.Sum
    d.custom_name = "Total Sales"
    options.data = [d]
    
    # 5. Add to the new sheet
    ws_pivot._sheet.add_pivot_table(options)
    
    wb.save("pivot.xlsx")

Insert Images and Vector Shapes

from pyopenxlsx import Workbook

wb = Workbook()
ws = wb.active

# 1. Insert image at A1, automatically maintaining aspect ratio
# Requires Pillow: pip install pillow
ws.add_image("logo.png", anchor="A1", width=200)

# 2. Or specify exact dimensions
ws.add_image("banner.jpg", anchor="B5", width=400, height=100)

# 3. Add Native Vector Shapes
ws.add_shape(
    row=2, col=5, shape_type="Arrow", 
    name="MyArrow", text="Point!", 
    fill_color="FF0000", line_width=2.5,
    rotation=90
)

wb.save("media.xlsx")

Comments & Threaded Replies

from pyopenxlsx import Workbook

wb = Workbook()
ws = wb.active

# 1. Simple or multiline legacy comments
ws["A1"].comment = "Short comment"

# 2. Modern Threaded Comments (Conversations)
author_id = wb._doc.persons().add_person("Curry Tang")
threads = ws._sheet.threaded_comments()

root_comment = threads.add_comment("B2", author_id, "Please review this cell.")
threads.add_reply(root_comment.id(), author_id, "Fixed!")

wb.save("comments.xlsx")

Conditional Formatting

Highlight specific data using visual rules like color scales and data bars.

from pyopenxlsx import Workbook
from pyopenxlsx._openxlsx import XLColorScaleRule, XLDataBarRule, XLColor

wb = Workbook()
ws = wb.active
ws.write_rows(1, [[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 1. Color Scale Rule (Red to Green)
scale_rule = XLColorScaleRule(XLColor(255, 0, 0), XLColor(0, 255, 0))
ws.add_conditional_formatting("A1:C1", scale_rule)

# 2. Data Bar Rule (Blue bars)
bar_rule = XLDataBarRule(XLColor(0, 0, 255), show_value=True)
ws.add_conditional_formatting("A2:C2", bar_rule)

wb.save("conditional_formatting.xlsx")

High Performance Streams (Low Memory I/O)

For writing massive datasets without consuming memory for Python objects, use the direct stream writer.

from pyopenxlsx import Workbook

with Workbook() as wb:
    ws = wb.active
    
    # Open a direct XML stream writer
    writer = ws.stream_writer()
    
    writer.append_row(["ID", "Timestamp", "Value"])
    for i in range(1_000_000):
        # Writes directly to disk/archive; highly memory efficient
        writer.append_row([i, "2023-01-01", 99.9])
        
    writer.close()
    wb.save("massive_data.xlsx")

API Documentation

The full API documentation has been split into individual modules for easier reading. Please refer to the docs/ directory:


Performance

pyopenxlsx is built for speed. By leveraging the C++ OpenXLSX-NX engine and providing optimized bulk operations, it significantly outperforms pure-Python alternatives.

Benchmarks (pyopenxlsx vs openpyxl)

Scenario pyopenxlsx openpyxl Speedup
Load File (20,000 cells) ~0.95ms ~154.3ms 162x
Single Read (1 cell in large doc) ~2.6ms ~139.8ms 53.7x
Bulk Read (20,000 cells via values_only) ~7.8ms ~131.6ms 16.8x
Write Small (1,000 cells) ~4.7ms ~8.3ms 1.7x
Write Large (50,000 cells) ~124.4ms ~338.3ms 2.7x
Bulk Write Large (50,000 cells, numpy/range) ~39.8ms N/A 8.5x
Extreme Write (1,000,000 cells) ~1,539ms ~6,635ms 4.3x
Bulk Write Extreme (1,000,000 cells, numpy) ~649ms N/A 10.2x

Resource Usage (1,000,000 cells)

Library Execution Time Memory Delta CPU Load
pyopenxlsx (bulk write) ~0.65s ~200 MB ~99%
openpyxl ~6.6s ~600 MB* ~99%

[!NOTE] *Memory delta for openpyxl can be misleading due to Python's garbage collection timing during the benchmark. However, pyopenxlsx consistently shows lower memory pressure for bulk operations as data is handled primarily in C++.

Why is it faster?

  1. C++ Foundation: Core operations happen in highly optimized C++.
  2. Reduced Object Overhead: pyopenxlsx minimizes the creation of many Python Cell objects during bulk operations.
  3. Efficient Memory Mapping: Leverages the memory-efficient design of OpenXLSX-NX.
  4. Asynchronous I/O: Key operations are available as non-blocking coroutines to maximize throughput in concurrent applications.

Development

Run Tests

# Run all tests
uv run pytest

# With coverage
uv run pytest --cov=src/pyopenxlsx --cov-report=term-missing

License

BSD 3-Clause License. The underlying OpenXLSX-NX library is licensed under the MIT License, and nanobind under a BSD-style license.

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

pyopenxlsx-1.3.0.tar.gz (24.1 MB view details)

Uploaded Source

Built Distributions

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

pyopenxlsx-1.3.0-cp314-cp314-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.14Windows x86-64

pyopenxlsx-1.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pyopenxlsx-1.3.0-cp314-cp314-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pyopenxlsx-1.3.0-cp313-cp313-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.13Windows x86-64

pyopenxlsx-1.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pyopenxlsx-1.3.0-cp313-cp313-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pyopenxlsx-1.3.0-cp312-cp312-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.12Windows x86-64

pyopenxlsx-1.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pyopenxlsx-1.3.0-cp312-cp312-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pyopenxlsx-1.3.0-cp311-cp311-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.11Windows x86-64

pyopenxlsx-1.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.27+ x86-64manylinux: glibc 2.28+ x86-64

pyopenxlsx-1.3.0-cp311-cp311-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file pyopenxlsx-1.3.0.tar.gz.

File metadata

  • Download URL: pyopenxlsx-1.3.0.tar.gz
  • Upload date:
  • Size: 24.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyopenxlsx-1.3.0.tar.gz
Algorithm Hash digest
SHA256 91ac1b93deb49cd376a737802d8204396dbe2b6d89cc66733149bad339a03d7d
MD5 a5294a0a0fe988dc8d5023caf2f5a17c
BLAKE2b-256 ebb86d41304eb098cefeffb335117856c31034bd47e2be1e121f08a8912d8126

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0.tar.gz:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: pyopenxlsx-1.3.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyopenxlsx-1.3.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 3c91297d662993d979c645f9a4d283fe4f82ad8629e3a8d33edcf5200740a528
MD5 c6d13bb1ccc63f861ebb2c418f2c3543
BLAKE2b-256 d2fe56dfb90377ace350c101dc3d4b22b75e76e229d4cd82dd5002e6ed90690e

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp314-cp314-win_amd64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e54bf09bbe30fa81edd53c80a1e4ceeb8330f2990fc0163d00ae14ba699c47b2
MD5 47ccc0201321a1d738273280f35525d2
BLAKE2b-256 7ed1e153224d84ad6a34d4057c6d9c6d03a412c86d322d9b6486bbad211ead8b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 625eab9422aa126c66150ee619e72a6aba722c25936adb50592d1142af9490d9
MD5 81e388263d2a3318fc6ba6fc7ee61395
BLAKE2b-256 9df999020d73d5504aa0674366b0097ed40ece6b807b2b01d747e950f0df323f

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: pyopenxlsx-1.3.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyopenxlsx-1.3.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e368ab26673565b744d3c447ec350767549cc38a4a827e581ca7e0299f8951cb
MD5 a61e62a3b0f1ea5b769feea7a9e6b031
BLAKE2b-256 09c4c881e2e045b6d84cbccf0951d12a5cba0d146142543b946a10cc22d7369d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp313-cp313-win_amd64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 32f4604a2d802057dd1da11c0b8b99f60a92ced4178eb373b7e7d34cd75ec92a
MD5 795acefbacc83a0901226fbf1b85028d
BLAKE2b-256 c0e718e4b4fdb98348ed5540c8a82c9a459ddbde2358257583e80258c6a63cae

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 71c676406dc2f53b10122f8ba560b2363045cd68aec473ce01c3c2e3297989b6
MD5 ee79fa6f143993751e949d1321db66c5
BLAKE2b-256 918686e0a2cb7e83a835a4c05e70721600bb5ceadd49954df81a30a21284acbf

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: pyopenxlsx-1.3.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyopenxlsx-1.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 b560f678a6d21a1dd802a36d7ad80a4648eee19f8f5ab2ca9705c3b4fe581664
MD5 180f49ff792ddccd2b2e6f38f8fd994d
BLAKE2b-256 73ab92f332f0b416a64982ea31a0458931672b3ce684efae9f6d63a2b8c035f4

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp312-cp312-win_amd64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 63f5f291bce6c9f87fb7f63c929b978e4b1699b99e4f831956d6b365f73a6fe7
MD5 0673c836862c86307d76b0add2f9957e
BLAKE2b-256 cfaef5377fdbca06ebfb271f31cb816d5c52e88de4b3fda0e51a950effe25029

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7671ccd6cdf644ff778dcac5f249f5114bec5539e6bc93e06245f25a631fd810
MD5 4a6df8616b0f7ae282ce5a2e12e4d590
BLAKE2b-256 fa1205c7bc7775865e65ead34cb84cf9ccc80e9fdefb505f99e62935723618e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: pyopenxlsx-1.3.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyopenxlsx-1.3.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f80717de973db38e5574d9a5686325bcec2456da6a01721a049bda95963d56ba
MD5 c332b3e4ad09eea2c818537c351cc050
BLAKE2b-256 940208b7de3345693fe80e33c6c79123578bef4fda4ad8d2cd6b5203b75f34d3

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp311-cp311-win_amd64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1c4dc81d9f6a6ea3f7e19d617209bc9dcb0472647905f7eec73cd86b943e0cfe
MD5 44c432957f9a86f02556b1f5cfa45b2a
BLAKE2b-256 b2801146551820810dd41de34014c92f50bc371c53c63e38ab1a9304e0c246a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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

File details

Details for the file pyopenxlsx-1.3.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cb6cc8db10166ba93b4300cb9e5afa85171eac5614320c9c6189f453d5270ad5
MD5 acb85771c04f3273b191dbf4f9058a5e
BLAKE2b-256 db01793f7b1df4c1dea769832a9fe1aad7be289b256980d7ad4ed4dfa439a52e

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.0-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: build.yml on twn39/pyopenxlsx

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