2017-01-26 2 views
0

다음과 같은 문제가 있습니다. 큰 XML 파일 (약 100MB)을 파싱합니다. 그런 다음 데이터를 처리 한 후 출력을 XLS 파일에 쓰고 있습니다.xls 파일에 쓰는 중 오류가 발생했습니다 - apache poi multithreading

처리가 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

엑셀 시트에 빈 셀이 있습니까? – AMB

+0

코드 및 기타 사항에 관한 자세한 정보는 도움이 될 것입니다. – Nilesh

답변

0

NullPointerExceptionnull 인 개체의 멤버/메서드를 사용하려고 함을 의미합니다. 빈 셀 때문일 것입니다. 당신은

RowRecordsAggregate.java:219

을 확인하고 예외를 throw 무엇을 볼 필요가있다. 예를 들어이 foo.bar 사용하지만, foonull 인 경우에, 당신은 다음과 같이해야합니다 :

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

아파치 POI가 같은 통합 문서에 쓰기 다중 스레드를 지원하지 않습니다, 그래서 이것은 당신이 가진 것처럼 실패합니다 발견

아파치 POI는 아주 행복하게 당신은 당신이 당신 적용하는 것이, 또는 이렇게 주어진 통합 문서에 오직 하나의 스레드 쓰기가 있도록 논리를 다시 작동에 필요한 모든 자신의 통합 문서

쓰기 다중 스레드를 지원합니다 자신의 동기화 논리를 사용하여 여러 번을 방지 동시에 글을 읽습니다.

+0

답변 해 주셔서 감사합니다. 하나의 스레드 만 사용하려면 응용 프로그램의 논리를 다시 고칩니다. – adrian9412

관련 문제