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.1.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.1-cp314-cp314-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.14Windows x86-64

pyopenxlsx-1.3.1-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.1-cp314-cp314-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

pyopenxlsx-1.3.1-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.1-cp313-cp313-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

pyopenxlsx-1.3.1-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.1-cp312-cp312-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

pyopenxlsx-1.3.1-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.1-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.1.tar.gz.

File metadata

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

File hashes

Hashes for pyopenxlsx-1.3.1.tar.gz
Algorithm Hash digest
SHA256 4e5ac9c63b32cea4bee1c9ffbb55448f045de33249d0101f86db5de4689dfce3
MD5 0973021f8979ffa2663ad5fadcb05e64
BLAKE2b-256 f28f51caf77e0cfbd75e63c22a229e8596f91096f73bcda85467484a93abaa5b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1.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.1-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: pyopenxlsx-1.3.1-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.12

File hashes

Hashes for pyopenxlsx-1.3.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 f11bb7f675fa601d4e97549e01d044c86b82a24902f378c55854602add144cb6
MD5 6aa6ed058119868031ec4ce97e15f250
BLAKE2b-256 c541e5515526cf4657be711977d91f929ebdfa951684fd8850f017cbe20ae3c2

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ec3b2e38b2a184f07cd5b8b8e07dae1718ebddfcc719e16534ab4e445027dd87
MD5 ef271d218c6be09b9d7760dec52569b6
BLAKE2b-256 dcbf0d3a2b15c2b704683e4bfdaddfe4239f67b6ef88ea2d273b01db9241cfc6

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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.1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 82a95c1a1f9905f2054b65e44112a602e88376c2d0b41e98d3cb5074abc84b8e
MD5 170f99853d6739db49687976528032a2
BLAKE2b-256 ba6416669b5f48aae8cbff1d9d02a098e150d07fca38000c30d2c3477efa7112

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: pyopenxlsx-1.3.1-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.12

File hashes

Hashes for pyopenxlsx-1.3.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e749df3ec5b6644baccf4ffe23f9a4d9371c49ec46544b3c530eb33a968d17ab
MD5 0ed59bf55b1663c1c1e69a0fddf4c381
BLAKE2b-256 9e7c303fc9839df0b9959935d6900be1b67bf5fe896f4f38f225d90c3b8d0e01

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5b2d9d3db89abd208e799023068c946c319caae3bd6389983045b3564cfb516c
MD5 9a3aa1e2d6e57280e647d08f77611d40
BLAKE2b-256 94693d7abc3e54c488f1787fec400596a8fc2b518d4e5d3876a3876fad42919c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 363310ee49a0893eca260335d68ceea000ac25998e4d819f75fab9446e149913
MD5 d88c1d0084c2fa23ea58a438ae6fddad
BLAKE2b-256 4afc0de2dc5d39cb0c9b41627e7d62fd424fa37e79e0d4dd99ad7d5a3194f69e

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: pyopenxlsx-1.3.1-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.12

File hashes

Hashes for pyopenxlsx-1.3.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 771ae77150f278f9a1bb79c50e2d9301e7b06c21f3f14c4bbb70fe18d82f48f4
MD5 dea99742a152b8e3b1154293312bb603
BLAKE2b-256 399dbc00985324ac3a03491fa536dfaadbe6730f4d0e3e52b5bf46d604038947

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e6a191e12139e50408380b7e7a382ada055accca3fdad2d1c9feab83e00ef548
MD5 f4b759ee9f80dc08baa3483bf73a0b86
BLAKE2b-256 accafcaea23c26521a6d09775d75f478675ab27e335b94347bf979a7d26e2945

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b145d8b8d13c82e7cecb2e6f911a324c19ad22d8dfaeb2d6ed6e5e9dd0f037f5
MD5 45f3907cefcbbe3be7481d94b5f32ee4
BLAKE2b-256 3cc960ca6cce33af43d890516553f8b772599bc4cca0ba83b57daf0f44e42882

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: pyopenxlsx-1.3.1-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.12

File hashes

Hashes for pyopenxlsx-1.3.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d7d4f4e61a6484ab1c71fa707a6d6becdc9b853a01a8b744ccc8e56e752f9d3b
MD5 4366c63fcac5f0cf7dd866e8326aba0a
BLAKE2b-256 678901c2bfeb6ac861f87ffed3425f1943e42aa950d04e41532dba6b0e4d5cf8

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9f9721196137e02985a79d5f5b4da4ebc544565a749b2a4d992d2161ef9b1006
MD5 44693f8c2e165b1106e47de2516f6809
BLAKE2b-256 18888fbf669dbb7573b6980433d3f278dc87a459726ba1b1040103e224fe79b0

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pyopenxlsx-1.3.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d6c1bc5b751c3e5a801506015fc2af9374899dd11c473cba288159dcaf5f2629
MD5 2464e0d96f66115c17a99a47b56644d9
BLAKE2b-256 01d6266cea7642e01094cd60d57d6d3fb5d8200e453ce94942a50234bdd130a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyopenxlsx-1.3.1-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