Async Operations API

To maximize throughput in web servers (like FastAPI or Sanic) or concurrent environments, pyopenxlsx exposes async versions of all I/O-intensive and computationally heavy methods. They run in a threadpool executor under the hood, ensuring the main asyncio event loop is not blocked.

Async Context Managers

import asyncio
from pyopenxlsx import Workbook, load_workbook_async

async def process_file():
    # Loading asynchronously
    async with await load_workbook_async("data.xlsx") as wb:
        ws = wb.active
        
        # Read async
        val = await ws.get_cell_value_async(1, 1)
        
        # Write async
        await ws.set_cell_value_async(2, 1, "Updated")
        
        # Bulk write async
        await ws.write_rows_async(3, [[1, 2], [3, 4]])
        
        # Save async
        await wb.save_async("data_updated.xlsx")

asyncio.run(process_file())

Available Async Methods

Workbook:

  • await load_workbook_async(filename, password=None)

  • await wb.save_async(filename, password=None)

  • await wb.close_async()

  • await wb.create_sheet_async(title)

  • await wb.copy_worksheet_async(ws)

  • await wb.remove_async(ws)

  • await wb.add_style_async(...)

  • await wb.extract_images_async(...)

Worksheet:

  • await ws.append_async(data)

  • await ws.write_row_async(row, data)

  • await ws.write_rows_async(start_row, data)

  • await ws.write_range_async(start_row, start_col, data)

  • await ws.set_cells_async(cells_batch)

  • await ws.get_cell_value_async(row, col)

  • await ws.get_row_values_async(row)

  • await ws.get_range_data_async(r1, c1, r2, c2)

  • await ws.get_range_values_async(r1, c1, r2, c2)

  • await ws.get_rows_data_async()

  • await ws.merge_cells_async(ref)

  • await ws.unmerge_cells_async(ref)

  • await ws.protect_async(password, **granular_options)

  • await ws.unprotect_async()

  • await ws.add_image_async(path, anchor)