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

Note

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

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

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

Note

OSBXLでは、 バックエンド側でバリデーション例外が起きた時、例外が送出され 、コードでハンドリング可能です。
(try ~ catch ロジックで、例外ハンドリング出来ます。IOExceptionおよびRuntimeExceptionが送出されます。)

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

以下のコードは、マルスレッドのサンプルです。(8スレッド)

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

package example;

import static org.junit.Assert.assertTrue;

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;

import org.junit.Test;

import com.osboffice.osbxl.AppWrapper;
import com.osboffice.osbxl.WorkBookWrapper;
import com.osboffice.osbxl.WorkSheetWrapper;
import com.osboffice.osbxl.dto.ColorObjectWrapper;
import com.osboffice.osbxl.dto.FontObjectWrapper;
import com.osboffice.osbxl.enums.XlCopyContentType;
import com.osboffice.osbxl.enums.XlThemeColor;

public class SampleTest {

    @Test
    public void multiTheadTest() throws IOException, Exception {

        try {
            Files.deleteIfExists(FileSystems.getDefault().getPath("./hellomt.xlsx"));
        } catch (IOException e) {
            assertTrue(false);
            return;

        }

        Thread[] thlist;
        thlist = new Thread[8];

        for(int i = 0; i < 8; i++){
            // スレッドを作成します。
            Thread th1 = new Thread(() -> {
                try {
                    // サンプルのメイン関数を呼びます。
                    this.createExcelFile();
                } catch (RuntimeException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
            thlist[i] = new Thread(th1);
            // スレッドを開始します。
            thlist[i].start();
        }

        for(int i =0; i <8; i++){
            // スレッドの終了を待ちます。
            thlist[i].join();
        }

        System.out.println("executed all method");
    }

    private void createExcelFile() throws IOException, Exception {

        AppWrapper app = new AppWrapper();
        WorkBookWrapper wb;

        try {
            // 新規Excelファイルを作成します。
            wb = app.createWorkBook("hellomt.xlsx");
        }
        // RuntimeExceptionが送出されたケース(バックエンド側(C++)までたどり着いた例外のケース)
        catch (RuntimeException e) {
            e.printStackTrace();
            // このサンプルでは、既存Excelファイルのオープンを試みます。
            wb = app.openWorkBook("hellomt.xlsx");
        }
        // RuntimeExceptionが送出されたケース(Java側で検出された例外のケース)
        catch (IOException e) {
            e.printStackTrace();
            // このサンプルでは、例外を送出します。
            throw e;
        }
        // その他エラー
        catch (Exception e) {
            e.printStackTrace();
            // このサンプルでは、例外を送出します。
            throw e;
        }


        WorkSheetWrapper ws = wb.openWorkSheet("Sheet1");

        for (int i = 1; i < 6; i++) {
            for (int j = 1; j < 27; j++) {
                int num = (i - 1) * 5 + (j - 1);
                ws.getCells(i, j).setNumberValue(num);
            }
        }

        for (int i = 6; i < 31; i++) {
            for (int j = 1; j < 27; j++) {
                String aCell = app.convertFromRowColNumber(i - 5, j);
                String formula = aCell + " * 2 + 1";
                ws.getCells(i, j).setFormula(formula);

                FontObjectWrapper fontobj = new FontObjectWrapper();
                fontobj.setBold(true);
                fontobj.setSize(14);
                ColorObjectWrapper colorobj = new ColorObjectWrapper();
                colorobj.setThemeColor(XlThemeColor.ThemeColorAccent1);
                // fontobj.setColorObject(colorobj);
                // ws.getCells(i,j).getFont().setObject(fontobj);
                ws.getCells(i, j).getFill().setCellColorObject(colorobj);
            }
        }

        ws.copyRow("Sheet1", 30, 1, 35, XlCopyContentType.CopyContentTypeFormatOnly);

        // ワークブックを保存します。
        wb.save();
        // ワークブックを閉じます。マルチスレッドのこのサンプルでは、同一名称の次のExcelファイルの処理に入ります。
        wb.close();
    }
}