同一ワークブックの同時アクセスおよび例外送出について
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();
}
}