Skip to main content

Python bindings for OpenXLSX using nanobind

Project description

PyOpenXLSX

PyPI version Python versions Downloads Build Status Docs 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
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.
  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.1.0.tar.gz (2.9 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.1.0-cp314-cp314-win_amd64.whl (991.0 kB view details)

Uploaded CPython 3.14Windows x86-64

pyopenxlsx-1.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (954.7 kB view details)

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

pyopenxlsx-1.1.0-cp314-cp314-macosx_11_0_arm64.whl (890.3 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

pyopenxlsx-1.1.0-cp313-cp313-win_amd64.whl (966.0 kB view details)

Uploaded CPython 3.13Windows x86-64

pyopenxlsx-1.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (954.2 kB view details)

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

pyopenxlsx-1.1.0-cp313-cp313-macosx_11_0_arm64.whl (889.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

pyopenxlsx-1.1.0-cp312-cp312-win_amd64.whl (966.0 kB view details)

Uploaded CPython 3.12Windows x86-64

pyopenxlsx-1.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (954.3 kB view details)

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

pyopenxlsx-1.1.0-cp312-cp312-macosx_11_0_arm64.whl (890.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

pyopenxlsx-1.1.0-cp311-cp311-win_amd64.whl (964.9 kB view details)

Uploaded CPython 3.11Windows x86-64

pyopenxlsx-1.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (955.7 kB view details)

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

pyopenxlsx-1.1.0-cp311-cp311-macosx_11_0_arm64.whl (890.7 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for pyopenxlsx-1.1.0.tar.gz
Algorithm Hash digest
SHA256 f478df9987358fc40a9c2fd48d55233a1978356ddc92dd2f9e10e47c52316b73
MD5 f7b4a0a882dc147f2874194475268f42
BLAKE2b-256 37aa7af669509f089b4b9996ded488292830e3c7f3d7bcd09ea0353935bad543

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pyopenxlsx-1.1.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 991.0 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.1.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 cc2a6128d687eb9a85b20ca85ebf6130f93c0d9e717e5f5df99ccfeb3ba4f8bf
MD5 2115d8b9f2d4c361898ecdd6a09cae58
BLAKE2b-256 cfe91a6535a4bbd7593616e8af08021c7463614a0835557800fc119941d0c62e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.1.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b28aabf4db10c920156beebce33efd6a05062c8be0438f6c06b11361f52de4ec
MD5 8a1a2f4fe650a8f647da63c8fd27ca11
BLAKE2b-256 da4b480519cd837e215d8558ea63a4d004c502f6d09bef44f178d8a50320bb50

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.1.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d6e9196140cd55a5a98faae8c6d8169e3c73bff746c9f352e13d0fc9ee7d019e
MD5 fc94411debf13fff6145283e40fa6f3a
BLAKE2b-256 5e3888650c4e402aec0a3de79a9db894d5e7c9bc4efb4e4f57710aa9018d0d38

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pyopenxlsx-1.1.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 966.0 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.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 34e522d1f033afb6ce86351031aa35d1d5034901ed3ab94d7e58e771e30c5646
MD5 c254eed465de4818a924c3f6164a8196
BLAKE2b-256 cd2f82782446be550f7b25f796cad90ad2e6861e4282c92a14bcbb8ed2515fdf

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.1.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5c0c38d674c830f7a055bab2184af1c017beb7708a9f84b92df7532f9e41cdf7
MD5 c29c1ac0062b963f197efc6562372e58
BLAKE2b-256 2d12db91773088152b86c2e9d32e26b47eaf658fb41f8ddbe085dbb0e22c40de

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c9e18e614fb88f75137bbfbbf7540eb5df024df6d2f893a3afe5afbb97e5083b
MD5 2ce81c8bc13e23c4411083842a9f4bbe
BLAKE2b-256 871aa01b9c027ef84e4b224ebdab5be81e7772d106a06f3c32c1f0f5989407b8

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pyopenxlsx-1.1.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 966.0 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.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c4102269ec4d8c355fccb290ca723c63d9076cd3f9ff9434de637a1720316ff7
MD5 80d8974e2b7bbbd1bdaf35fb5d7eaa03
BLAKE2b-256 5ed03576d38eeb87c51f74f143148c9fb0bf9591e6ef5d8faf803abe84a40dfa

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a671649ad7136c3d344846f890205c274e8592eb92d53312e3004dcc7b9ed7dc
MD5 16247cf32b8342d637155d07a87b75d8
BLAKE2b-256 ebea5b4db2f631c691cac3625ad1b38f82311d945dc6ad9c646a68e7957b6184

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.1.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cd3b0a89ba89eb0cb4f733afeff226008c7d65e6c04d7abf50bc61fe773a0a68
MD5 7447e5279ceaefee83043e0a8abeebb4
BLAKE2b-256 c9069aeb3883e9ee76a8682ea022790f069a8772b2ade87ab775161ead07dbd1

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: pyopenxlsx-1.1.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 964.9 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.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d869b96c6b748785aa38139fe45362892f05ac10d3ef0def0796c9039f59df76
MD5 9e6438598888d85a6142ceb112f62851
BLAKE2b-256 f921cd58482bfac9ac44d36fd467a3f80e71d7bac3e59256730ee835dce8d17c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9926a2b7a2b3a5c376d01f24073dd4283108fa8e2034d653e9b3d2de18a72a7b
MD5 8de4f712e078f79ac7ae9c748f31d95a
BLAKE2b-256 0300e307114bb64f49f1d1e759d100af9737c5868a10d064eb8f0b4d10404b22

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyopenxlsx-1.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 76c7838f6932d154fc6a11e7a12ac8595402493bc0fcbdbd3dfe4fe96c1cc642
MD5 b9413bdcafdc9b41e71c823108d14e56
BLAKE2b-256 bb0490b648f75ccb07486e2b4b6cd34b5a49b660fa1c6a66d938607157b83f78

See more details on using hashes here.

Provenance

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