同一ワークブックの同時アクセスおよび例外送出について

Note

OSBXLでは、 同一Excelファイルに対し、createWorkBook や openWorkBook から WorkBook#close メソッドまでの単一性、逐次性が保証 されます。

それ故、ファイルの同時アクセスの問題を心配する必要がありません。

Python上で非同期処理も可能です。同一Excelファイルへの複数アクセスに関しては、逐次処理となります(待ち受けキューの先頭から処理されます)

Note

OSBXLでは、 バックエンド側でバリデーション例外が起きた時、pyosbxl.PyXlValidationExceptionが送出され 、pytnonのコードでハンドリング可能です。
(try ~ except pyosbxl.PyXlValidationException ロジックで、例外ハンドリング出来ます。)

非同期処理および例外処理のサンプル

以下のコードは、非同期処理で、2並列同時実行を行う例です。

createWorkBookでファイルを新規作成しますが、既にファイルが存在した場合、openWorkBookでファイルオープンに切り替えます。

import random
import pyosbxl
import pyosbxl.enums
import asyncio
import os
import traceback

app = pyosbxl.App()

async def func(n : int):
    print("start" + str(n))

    try:
        # 新規ワークブックを作成しようとします。
        #(同一Excelファイルの複数アクセスに対しては、バックエンド側(C++)側でロックをかけるため、アクセスの早い順に単一処理されます)
        # つまり、同一Excelファイルに対し、createWorkBook や openWorkBook から WorkBook#close メソッドまでの単一性、逐次性が保証されます。
        # それ故、Webのサーバーサイドのプログラムなどでは、同一ファイルの複数アクセスについて、考慮する必要がありません。
        wb = app.createWorkBook("hello.xlsx", pyosbxl.enums.XlFont.MS_PGOTHIC, 12.0)
    # pyosbxlでは、pyosbxl.PyXlValidationExceptionがサーバー側でのバリデーション失敗時に例外送出されます。
    # このサンプルでは、同時にfuncメソッドを2つ並列処理しますが、2つ目の並列処理が実行された際に、例外を投げます。
    # 上の説明に書いた、createWorkBook や openWorkBook から WorkBook#close メソッドまでの単一性が保証されているため、
    # 1つ目の並列処理が終わった時点で、ファイルが作成され、2つ目の並列処理のcreateWorkBookに失敗するからです。
    except pyosbxl.PyXlValidationException:
        # 例外内容を出力します。
        traceback.print_exc()
        # openWorkBook に切り替えます。
        wb = app.openWorkBook("hello.xlsx")

    ws = wb.openWorkSheet("Sheet1")
    for i in range(1,100):
        for j in range(1,100):
            num = random.randint(1,100)
            # ワークシートのセルに値を設定します。
            ws.getCells(i,j).setNumberValue(num)
    # ワークブックを保存します。
    wb.save()
    # ワークブックを閉じ、ワークブックのメモリを解放します。
    wb.close()
    print("end" + str(n))

async def exec():
    # funcメソッドを2並列で同時実行します。
    await asyncio.gather(
        func(1),
        func(2),
    )

if __name__ == "__main__":
    if os.path.isfile("hello.xlsx"):
        os.remove("hello.xlsx")

    # 非同期処理を行います。
    asyncio.run(exec())
    print("endAll")