gpt4 book ai didi

java - Apache POI 工作簿中的多线程

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:09:13 27 4
gpt4 key购买 nike

我想在多线程环境中写入 HSSFWorkBook 或 XSSFWorkBook。每个线程将在相同或不同的工作表中进行修改。

try {
String filePath="C:/Test.xlsx";
FileInputStream fileInputStream = new FileInputStream(filePath);
Workbook workbook = new XSSFWorkbook(fileInputStream);
FileOutputStream fos = new FileOutputStream(filePath);
workbook.write(fos);
fos.close();
fileInputStream.close();
} catch(Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}

在 SOAPUI 中使用多线程在 LoadTest 中测试此代码时。我得到了异常:

Workbook workbook = new XSSFWorkbook(fileInputStream);

异常情况如下:

org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]

最佳答案

请注意:Apache POI 明确不支持对同一工作簿对象的多线程访问!这是因为有些结构是在工作簿级别处理的,例如样式、评论、...

如果您尝试天真地执行此操作,您将遇到难以理解的错误和损坏的文档。

它所做的唯一保证是不同线程中的单独工作簿可以正常工作,即没有线程不安全的全局状态保留在任何地方。

唯一可行的方法是通过同步块(synchronized block)同步对工作簿的每次访问:

synchronized (workbook) {
... access the sheet and the contents
}

只读访问可能有效,但 Apache POI 不保证对同一工作簿的并发读取访问有效。

更新:现在有一个对应的FAQ entry也说明这一点。

关于java - Apache POI 工作簿中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28626848/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com