我想在Multhreading环境中写入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中使用MultiThreading在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]
3 回答
请注意:Apache POI显然不支持对同一工作簿对象的多线程访问!这是因为存在在工作簿级别上处理的结构,例如,风格,评论,......
如果你试图天真地做这件事,你将遇到模糊的错误和损坏的文件 .
它唯一的保证是不同线程中的单独工作簿可以正常工作,即没有任何线程不安全的全局状态 .
应该工作的唯一方法是通过synchronized块同步对工作簿的每次访问:
只读访问可能有效,但Apache POI再次不保证对同一工作簿的并发读取访问将起作用 .
更新:现在有一个相应的FAQ entry也说明了这一点 .
您可以通过读取文件
C:/Test.xlsx
来创建XSSFWorkbook
;调用的构造函数是XSSFWorkbook(InputStream),它构造了一个OPCPackage
. 此C:/Test.xlsx
文件必须有效,即未损坏,不为空 .如果要创建新工作簿,则不应读取空文件,而应使用适当的构造函数 .
关于多线程,我还没有对它进行测试,但是对不同线程可以做什么有限制(例如每
XSSheet
一个) . 看看mail archive .在主线程内部创建工作簿,工作簿创建工作表并将工作表分发给工作线程 . 主线程应该等到所有工作线程完成 . 主线程工作簿将数据刷新为流 . 然后流入文件 .
如果您想要源代码示例,请发送邮件给我 . 我将分享ramesh.niwas@gmail.com