首页 文章

Apache POI工作簿中的多线程

提问于
浏览
3

我想在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 回答

  • -1

    请注意:Apache POI显然不支持对同一工作簿对象的多线程访问!这是因为存在在工作簿级别上处理的结构,例如,风格,评论,......

    如果你试图天真地做这件事,你将遇到模糊的错误和损坏的文件 .

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

    应该工作的唯一方法是通过synchronized块同步对工作簿的每次访问:

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

    只读访问可能有效,但Apache POI再次不保证对同一工作簿的并发读取访问将起作用 .

    更新:现在有一个相应的FAQ entry也说明了这一点 .

  • 9

    您可以通过读取文件 C:/Test.xlsx 来创建 XSSFWorkbook ;调用的构造函数是XSSFWorkbook(InputStream),它构造了一个 OPCPackage . 此 C:/Test.xlsx 文件必须有效,即未损坏,不为空 .

    如果要创建新工作簿,则不应读取空文件,而应使用适当的构造函数 .

    关于多线程,我还没有对它进行测试,但是对不同线程可以做什么有限制(例如每 XSSheet 一个) . 看看mail archive .

  • 0

    在主线程内部创建工作簿,工作簿创建工作表并将工作表分发给工作线程 . 主线程应该等到所有工作线程完成 . 主线程工作簿将数据刷新为流 . 然后流入文件 .

    如果您想要源代码示例,请发送邮件给我 . 我将分享ramesh.niwas@gmail.com

相关问题