写入xls文件时出错 - apache poi multithreading

时间:2017-01-26 15:44:19

标签: java excel multithreading apache apache-poi

我有以下问题。我正在解析一个大的XML文件(大约100 MB) - 然后,在我处理数据后,我将输出写入XLS文件。

处理是并行完成的(使用ExecutorService),并且所有线程都写入同一个工作簿。

我得到的例外情况如下:

Caused by: java.lang.NullPointerException
at org.apache.poi.hssf.record.aggregates.RowRecordsAggregate.getEndRowNumberForBlock(RowRecordsAggregate.java:219)
at org.apache.poi.hssf.record.aggregates.RowRecordsAggregate.createIndexRecord(RowRecordsAggregate.java:469)
at org.apache.poi.hssf.model.InternalSheet.visitContainedRecords(InternalSheet.java:637)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.getBytes(HSSFWorkbook.java:1466)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1380)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1366)
at sample.Controller.buildSpreadsheet(Controller.java:295)
at sample.Controller.generateXLS(Controller.java:325)
... 58 more

问题是有时候没有任何问题,但有时会因此错误而崩溃。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

Apache POI不支持多个线程写入同一个工作簿,因此这将失败,就像您找到的那样

Apache POI非常乐意支持所有写入自己的工作簿的多个线程

您需要重新编写逻辑,以便只有一个线程写入给定的工作簿,或者您应用自己的同步逻辑以防止多个线程同时写入

答案 1 :(得分:0)

NullPointerException表示您尝试使用null对象的成员/方法。这可能是由于空单元格。你需要检查

  

RowRecordsAggregate.java:219

并查看抛出异常的内容。例如,如果使用了foo.bar,但foonull,那么您需要这样的内容:

if (foo == null) {
    foo = "";
}
//Do something with foo.bar