Skip to main content

Python bindings for OpenXLSX using nanobind

Project description

PyOpenXLSX

PyPI version Python versions Downloads Build Status Codecov License

[!IMPORTANT] pyopenxlsx currently uses a specialized fork of the OpenXLSX library (v1.0.0+), which includes critical performance optimizations and functional enhancements (such as custom properties and improved hyperlink handling) not currently available in the upstream repository.

pyopenxlsx is a high-performance Python binding for the OpenXLSX 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 library.
  • Pythonic API: Intuitive interface with properties, iterators, and context managers.
  • 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, hyperlinks (external/internal), and comments.
  • Memory Safety: Combines C++ efficiency with Python's automatic memory management.

Tech Stack

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

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

from pyopenxlsx import Workbook

wb = Workbook()
ws = wb.active

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

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

wb.save("images.xlsx")

Comments

Comments are automatically resized to fit their content by default.

from pyopenxlsx import Workbook

wb = Workbook()
ws = wb.active

# Simple or multiline comments - all will auto-size perfectly
ws["A1"].comment = "Short comment"
ws["B2"].comment = "Line 1: High performance\nLine 2: Pythonic API\nLine 3: Auto-sized by default!"

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_text=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 engine and providing optimized bulk operations, it significantly outperforms pure-Python alternatives.

Benchmarks (pyopenxlsx vs openpyxl)

Scenario pyopenxlsx openpyxl Speedup
Read (20,000 cells) ~7.2ms ~145ms 20.2x
Write (1,000 cells) ~4.8ms ~8.1ms 1.7x
Write (50,000 cells) ~169ms ~305ms 1.8x
Bulk Write (50,000 cells) ~74ms N/A 4.1x
Iteration (20,000 cells) ~80ms ~150ms 1.9x
Bulk Write (1,000,000 cells) ~1.5s ~6.2s 4.1x

Resource Usage (1,000,000 cells)

Library Execution Time Memory Delta CPU Load
pyopenxlsx ~1.5s ~400 MB ~99%
openpyxl ~6.2s ~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.
  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 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.0.0.tar.gz (2.8 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.0.0-cp314-cp314-win_amd64.whl (885.1 kB view details)

Uploaded CPython 3.14Windows x86-64

pyopenxlsx-1.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (877.1 kB view details)

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

pyopenxlsx-1.0.0-cp314-cp314-macosx_11_0_arm64.whl (797.0 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pyopenxlsx-1.0.0-cp313-cp313-win_amd64.whl (862.1 kB view details)

Uploaded CPython 3.13Windows x86-64

pyopenxlsx-1.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (876.8 kB view details)

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

pyopenxlsx-1.0.0-cp313-cp313-macosx_11_0_arm64.whl (796.8 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pyopenxlsx-1.0.0-cp312-cp312-win_amd64.whl (862.1 kB view details)

Uploaded CPython 3.12Windows x86-64

pyopenxlsx-1.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (876.8 kB view details)

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

pyopenxlsx-1.0.0-cp312-cp312-macosx_11_0_arm64.whl (796.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pyopenxlsx-1.0.0-cp311-cp311-win_amd64.whl (860.8 kB view details)

Uploaded CPython 3.11Windows x86-64

pyopenxlsx-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (877.9 kB view details)

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

pyopenxlsx-1.0.0-cp311-cp311-macosx_11_0_arm64.whl (797.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for pyopenxlsx-1.0.0.tar.gz
Algorithm Hash digest
SHA256 c836a1c4247e416b2186197d3957fb15b13490ef1fa9625b2ad5b0f75ccd2d31
MD5 16c251eba4b900707bf65aba8f56707a
BLAKE2b-256 35ccc9efca5b08549fc1a1fd1d2cda14b4fc41337ab505336ab742d3a45da4ec

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pyopenxlsx-1.0.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 885.1 kB
  • 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.0.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 91f7969974ca8bb7eae7adb34d46201317b621b94ae4d0e75569cbf05dd888cb
MD5 6d551ad2015a31c519722d77d5c10b82
BLAKE2b-256 5f746b2b2591b71b3c74aae23f56d0a176e9fb5c01122783a6d7d6d79c632a59

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8a23bc5be8bf81c07150ee256b41453dc84421c38fb571e0a3abcb319317c989
MD5 c96b046e95964919710d93d352fba969
BLAKE2b-256 660a49c37ae2a8779e8927c3e0a7380ed2f54bd94a802b06183c1ee882ecc7cf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.0.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 68a38385cf37582b2e78dd4c9f9cdc91e48cc1e0b96f5700f800f048efa88fe8
MD5 db041c37f1dc9029d60aec43d281c707
BLAKE2b-256 94180210e837b181ef0437373cea943d26ed5d0a06b991d34e5f596406bc60e0

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pyopenxlsx-1.0.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 862.1 kB
  • 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.0.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 ebd3d644c98d3521135ec9afcfe03cdef6427690813fc49cc19b355243990958
MD5 261e28fee8594bf9afbbacf707161ad6
BLAKE2b-256 7b946fb80245b2b1fb75a2932c4d48172cf650af4424f55c55cab9fc59ad92d9

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 33d959b3b8f3d831bbc849c8ce9aaebe82b5609510329f7d1857122722c00d5e
MD5 a995b9227e42089aaad16c26c61121dd
BLAKE2b-256 a3c6b1863948cdd97acfff619a49b5942e9d719e41de1b674a225558b884a2f0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.0.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1a35559e24a69d055b4ea94fb1c984e1a8e67847e8f35179a21bb3e04645c60a
MD5 b2451fb7b520c98eb2626865a3abb5b9
BLAKE2b-256 99c50cc17b0d29cf2e640449a6855236f71cb0012d655c102aa243fea5802d88

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pyopenxlsx-1.0.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 862.1 kB
  • 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.0.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d2b95a8d658e3fe33c99556bd1cfa6ce4ce545f92eea5a4f448abc1b58d054e3
MD5 bccae9b1040470eece2bdc4716b3e4c5
BLAKE2b-256 8f5be31a005686cc56a1979c60e5fce7115670f2b1d1539d321c83f71cde066e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6f95dd1613c31e7c5a07e3074dfe2fc7f8e22f7f003fd42c425138e9f4af5b42
MD5 bbb5b2abed8fcd3dfce949609aeb58c8
BLAKE2b-256 13a29a0788ae87ee11177dc723de4c621fbac14666fb5144b134f8867c3022d3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.0.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 768a072c710c7dd230dad431aca84f3e46e22410940167d8229d729e2ec8d2d7
MD5 96520e615bbfe00366bce2a7fde46e8e
BLAKE2b-256 5c8d17da728fcc20b130ca62ae20e971fa3be029432e0ea00ae0418bb2650d00

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pyopenxlsx-1.0.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 860.8 kB
  • 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.0.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 7694feffae85c55c6c762c58ecbdf1f1a30ccd2484805b8fdb13fa1badd0c9bc
MD5 9832ddc2d4fa0a39d97142722145db7a
BLAKE2b-256 4f2e2791c301a900d78bd2d9747b0753b886c6e7274dedb82205de80fa4243ba

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 7eb195e9679fc11709220251f4ba98fd3314da374ab2b31db86037c8ee43fdb8
MD5 32706de9ab75b74cd8d114b154942ae9
BLAKE2b-256 92acf79388d3f4b1a5d45276f6e58d0202e9bed556c0020d883f0191b1ef8fdf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.0.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fddc331c143387944519436b805e70586671dc22a73e2fab583230ddb0ac03c6
MD5 baea7a6cea7e5e0608f928d7c1f16934
BLAKE2b-256 53fe5b2a7eb8c3fa3523c8a68916f20988bdce41e5165a932ec0ffc7863cf5ad

See more details on using hashes here.

Provenance

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