2010-07-06 3 views
2

Apache POI를 사용하여 Excel 파일을 작성 중입니다.Excel 파일을 작성하는 동안 Apache POI OutOfMemoryError

는 난에 문자열 []에 저장된 fieldName에 fieldName에 (열)를 갖는 myResultSet

모든 데이터를 기록 할. 행을 쓰는 동안

String xlsFilename = "myXLSX.xlsx"; 
org.apache.poi.ss.usermodel.Workbook myWorkbook = new XSSFWorkbook(); 
org.apache.poi.ss.usermodel.Sheet mySheet = myWorkbook.createSheet("myXLSX"); 
Row currentRow = mySheet.createRow(0); 
for (int k = 0; k < fieldNames.length; k++) { 
    // Add Cells Of Title Of ResultsTable In Excel File 
    currentRow.createCell(k).setCellValue(fieldNames[k]); 
} 

for (int j = 0; j < countOfResultSetRows; j++) { 
    myResultSet.next(); 
    currentRow = mySheet.createRow(j + 1); 
    for (int k = 0; k < fieldNames.length; k++) { 
     currentRow.createCell(k).setCellValue(myResultSet.getString(fieldNames[k])); 
     System.out.println("Processing Row " + j); 
    } 
} 

FileOutputStream myFileOutputStream = new FileOutputStream(xlsFilename); 
myWorkbook.write(myFileOutputStream); 
myFileOutputStream.close(); 

내 문제는 프로그램이 느린 속도가 느린지고 있는지 :

나는 70000 행과 27 열

내 코드

있습니다. 이 행 (3500)에 도달하면

는 예외 중지 : 글

예외 "스레드 3"java.lang.OutOfMemoryError와 :. java.lang.AbstractStringBuilder에서 Java 힙 공백 (AbstractStringBuilder.java:45) at java.lang.StringBuffer. (StringBuffer.java:79)

메모리가 부족한 것 같습니다.

어떻게 해결할 수 있습니까?

1000 개가 넘는 데이터를 임시 파일에 저장할 수 있습니까? 예를 들면?

무엇을 제안하겠습니까?

는 나도 ( JAVA - Out Of Memory Error while writing Excel Cells in jxl)

지금 어쨌든 XLSX 파일이 필요 그것을 해결 JXL을 사용하여 결코 같은 문제가 있었다, 그래서 나는 POI를 사용해야합니다.

+0

사용중인 응용 프로그램 서버는 무엇입니까? –

답변

2

먼저 XML 형식의 데이터 파일을 만든 다음 해당 XML을 기존 템플릿 xlsx 파일로 바꾸는 방법이있는 것처럼 보입니다.

http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/usermodel/examples/BigGridDemo.java

이 비록 XLS 형식의 파일에 적용 할 수 없습니다.

+1

Big Grid Demo보다는 새로운 SXSSF를 사용하는 것이 훨씬 낫습니다. 전자가 후자의 – Gagravarr

+0

덕분에 훨씬 더 효과적입니다! 나는 그 대신에 그것을 시험해 볼 것이다! – ktsujister

+0

BigGridDemo는 기존 스프레드 시트를 수정하려는 경우 유용합니다. 일반 SXSSF는 쓰기 전용 형식으로, 빈 통합 문서 또는 열린 XSSFWorkbook 개체로 시작하며, SAX 이벤트 기반 모델은 읽기 전용입니다. 전체 통합 문서를 메모리에로드하지 않고 기존 파일을 편집 할 수있는 클래스를 가지려면 XML 파일을 작성하고 통합 문서를 재 패키징하는 데 저수준 API를 사용해야합니다. – IceArdor

1

앱이 메모리를 더 많이 사용하도록 허용하는 방법 (예 : 012 MB는 500 MB의 경우 -Xmx500m)? 프로그램을 실행할 때

+0

이미 시도했지만 변경되지 않았습니다. –

+0

CSV는 옵션이 아닙니까? –

1

힙에 메모리를 할당합니다

$ java -Xms256m -Xmx1024m NameOfYourClass 
+0

이미 시도했지만 변경되지 않았습니다. –

1

나는 거기 한 번 이상했습니다.

이 기능을 응용 프로그램 서버에서 실행하고 있습니까?

Pablo가 언급 한 것처럼 내가 과거에 해왔 던 것은 힙 공간을 늘리는 것이지만 실행중인 응용 프로그램 서버에 대해 늘어나고 있는지 확인하는 것입니다.

나는 이것을 수행 할 때 코드를 실제로 최적화해야했습니다.

.xlsx 파일로 출력하기 때문에 XML은 상당한 메모리를 사용합니다. 확실하지 않은 경우이 상황에서 당신을 위해 일할 것이지만, 당신이 정상적인 .xls을 만들 수 있으며, 끝 부분에서 .xlsx 파일 (당연히 아파치 POI 사용)로 변환하는 것보다.