同时读取多个线程中的单元格值

如何使用 Aspose.Cells for Java 在多个线程中同时读取单元格值。

为了在多个线程中同时读取单元格值,将Worksheet.getCells().setMultiThreadReading() 设置为true。如果不设置,可能会得到错误的单元格值。请注意,某些功能,比如格式化单元格值,在多线程环境下是不支持的。因此,多线程读取只能访问单元格的原始数据。在多线程环境中,如果尝试获取单元格的格式化值,比如对于数字值使用Cell.getStringValue(),可能会得到意外的结果或异常。

以下代码:

  1. 创建一个工作簿。
  2. 添加一个工作表。
  3. 用字符串值填充工作表。
  4. 然后创建两个同时从随机单元格中读取值的线程。 如果读取的值是正确的,则不会发生任何事情。如果读取的值不正确,则会显示一条消息。

如果您注释掉这一行:

testWorkbook.getWorksheets().get(0).getCells().setMultiThreadReading(true);

那么将显示以下消息:

if (s.equals("R" + row + "C" + col)!=true)

{

    System.out.println("This message box will show up when cells read values are incorrect.");

}

否则,程序将在不显示任何消息的情况下运行,这意味着从单元格中读取的所有值都是正确的。

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
public abstract class ThreadProc implements Runnable {
boolean isRunning = true;
Workbook testWorkbook;
Random r = new Random();
public ThreadProc(Workbook workbook) {
this.testWorkbook = workbook;
}
public int randomNext(int Low, int High) {
int R = r.nextInt(High - Low) + Low;
return R;
}
public void kill() {
this.isRunning = false;
}
public void run() {
while (this.isRunning) {
int row = randomNext(0, 10000);
int col = randomNext(0, 100);
//Commonly you can only access Cell.Value instead of Cell.StringValue.
//In this demo all cell values are string, so Cell.StringValue is same with Cell.Value here and can be used.
//For other values such as numeric, if you call Cell.StringValue here, you may get unexpected result or exception here.
//It is because that Cell.getStringValue() will format those values according to the number format but the formatting process
//does not support multi-threads.
String s = testWorkbook.getWorksheets().get(0).getCells().get(row, col).getStringValue();
if (s.equals("R" + row + "C" + col) != true) {
System.out.println("This message box will show up when cells read values are incorrect.");
}
}
}
}
// Main.Java
static void TestMultiThreadingRead() throws Exception {
Workbook testWorkbook = new Workbook();
testWorkbook.getWorksheets().clear();
testWorkbook.getWorksheets().add("Sheet1");
for (int row = 0; row < 10000; row++)
for (int col = 0; col < 100; col++)
testWorkbook.getWorksheets().get(0).getCells().get(row, col).setValue("R" + row + "C" + col);
//Commenting this line will show a pop-up message
testWorkbook.getWorksheets().get(0).getCells().setMultiThreadReading(true);
ThreadProc tp = new ThreadProc(testWorkbook);
Thread myThread1 = new Thread(tp);
myThread1.start();
Thread myThread2 = new Thread(tp);
myThread2.start();
Thread.currentThread().sleep(5*1000);
tp.kill();
}