Java 写入xls文件时出错-apache poi多线程
我有以下问题。我正在解析一个大的XML文件(大约100MB),然后,在处理完数据后,我将输出写入一个XLS文件 处理是并行完成的(使用ExecutorService),所有线程都在写入同一工作簿 我得到的例外情况如下:Java 写入xls文件时出错-apache poi多线程,java,excel,multithreading,apache,apache-poi,Java,Excel,Multithreading,Apache,Apache Poi,我有以下问题。我正在解析一个大的XML文件(大约100MB),然后,在处理完数据后,我将输出写入一个XLS文件 处理是并行完成的(使用ExecutorService),所有线程都在写入同一工作簿 我得到的例外情况如下: Caused by: java.lang.NullPointerException at org.apache.poi.hssf.record.aggregates.RowRecordsAggregate.getEndRowNumberForBlock(RowRecordsAgg
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
问题是,有时工作没有任何问题,但有时会因为这个错误而崩溃
有什么想法吗?
NullPointerException
表示您尝试使用对象的成员/方法,该对象为null
。这可能是由于空单元格造成的。你需要检查一下
RowRecordsAggregate.java:219
看看是什么引发了异常。例如,如果使用了foo.bar
,但是foo
是null
,那么您需要如下内容:
if (foo == null) {
foo = "";
}
//Do something with foo.bar
NullPointerException
表示您尝试使用对象的成员/方法,该对象为null
。这可能是由于空单元格造成的。你需要检查一下
RowRecordsAggregate.java:219
看看是什么引发了异常。例如,如果使用了foo.bar
,但是foo
是null
,那么您需要如下内容:
if (foo == null) {
foo = "";
}
//Do something with foo.bar
ApachePOI不支持多线程写入同一工作簿,因此这将失败,正如您所发现的那样 ApachePOI非常高兴地支持多个线程,所有线程都写入自己的工作簿
您需要重新处理您的逻辑,以便只有一个线程写入给定工作簿,或者应用您自己的同步逻辑来防止多个线程同时写入Apache POI不支持多个线程写入同一工作簿,因此这将失败,正如您所发现的那样 ApachePOI非常高兴地支持多个线程,所有线程都写入自己的工作簿
您需要重新处理逻辑,以便只有一个线程写入给定工作簿,或者,您可以应用自己的同步逻辑来防止多个线程同时写入excel工作表中的空单元格?有关代码和其他内容的详细信息将非常有用。excel工作表中的空单元格?有关代码和其他内容的详细信息将非常有用。感谢答案。我将重新处理应用程序的逻辑,只使用一个线程。谢谢您的回答。我将重新处理应用程序的逻辑,以便只使用一个线程。