2017-01-26 18 views
0

私は以下の問題があります。私は大きなXMLファイル(約100 MB)を解析しています。そして、データを処理した後、出力をXLSファイルに書き出しています。xlsファイルに書き込むときのエラー - Apache poiマルチスレッド

処理は、(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 

事が時々は問題なく動作しますが、時には、このエラーでクラッシュしていることである:私が得た

例外は、次のようです。

アイデア?

+0

おそらくExcelシートに空のセルがありますか? – AMB

+0

コードに関するその他の情報は参考になります。 – Nilesh

答えて

0

NullPointerExceptionは、nullというオブジェクトのメンバー/メソッドを使用しようとすることを意味します。おそらく空のセルが原因です。あなたは

RowRecordsAggregate.java:219

をチェックして、例外をスローかを確認する必要があります。例えばそこfoo.bar使用されるが、foonullでされている場合、あなたはこのようなものが必要です。

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

のApache POIは、同じワークブックに書き込む複数のスレッドをサポートしていませんが、これはあなたが持っているだけのように、失敗します。見つかっ

のApache POIは非常に喜んであなたはあなたの適用されること、またはその特定のワークブックにしかつのスレッドの書き込みがあるように、あなたのロジックを再作業する必要があるすべて自分のワークブック

に書き込む複数のスレッドをサポートしています独自の同期ロジックを使用して複数の同じ時間に書き込みを読む

+0

答えをありがとう。私はアプリケーションのロジックを再利用して、1つのスレッドのみを使用します。 – adrian9412

関連する問題