반응형
2018/01/29 - [java] - java poi excel write 엑셀 쓰기
위 글에서 poi를 이용해 excel write 를 예제를 공유했었습니다.
그런데 데이터가 좀 많아지니 "gc overhead limit exceeded" 요런 Out Of Memory 오류가 발생합니다.
-Xmx 옵션을 통해서 Heap memory 를 늘리는 것도 한계가 있습니다.
이런 경우 해결책으로 org.apache.poi.xssf.usermodel.XSSFWorkbook 대신 org.apache.poi.xssf.streaming.SXSSFWorkbook 를 사용할 수 있습니다.
아래 코드를 참조하세요. SXSSFWorkbook 를 사용하면 지정한 row 개수 단위로 끊어서 flush 할 수 있습니다.
테스트 코드 입니다.
java vm option을 -Xmx60m 정도 설정하고 SXSSFWorkbook 와 XSSFWorkbook 를 번갈아서 테스트하면 맨 아래 오류 코드를 확인할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Font;
public class ExcelUtilTest {
public static void main(String[] args) throws IOException, InvalidFormatException {
ExcelUtil excel = new ExcelUtil("시트이름", 100); // SXSSFWorkbook
//ExcelUtil excel = new ExcelUtil("시트이름"); // XSSFWorkbook
excel.setOffset(1, 1);
List<String> header = Arrays.asList("번호", "이름", "제목", "기간", "기타");
excel.addRow("f8f8f8", Font.BOLDWEIGHT_BOLD, header);
for (int i = 0; i < 10000; i++) {
List<String> body = Arrays.asList(String.valueOf(i), "홍길동", "제목입니다.", "기간입니다.", "기타");
excel.addRow(body);
excel.addRow(body);
excel.addRow(body);
}
FileOutputStream fos = new FileOutputStream("/test/엑셀테스트1.xlsx");
excel.write(fos);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at org.apache.xmlbeans.impl.store.Saver$SynthNamespaceSaver.<init>(Saver.java:883)
at org.apache.xmlbeans.impl.store.Saver.<init>(Saver.java:121)
at org.apache.xmlbeans.impl.store.Saver$TextSaver.<init>(Saver.java:916)
at org.apache.xmlbeans.impl.store.Cursor._xmlText(Cursor.java:546)
at org.apache.xmlbeans.impl.store.Cursor.xmlText(Cursor.java:2436)
at org.apache.xmlbeans.impl.values.XmlObjectBase.xmlText(XmlObjectBase.java:1500)
at org.apache.poi.xssf.model.SharedStringsTable.getKey(SharedStringsTable.java:134)
at org.apache.poi.xssf.model.SharedStringsTable.addEntry(SharedStringsTable.java:180)
at org.apache.poi.xssf.usermodel.XSSFCell.setCellType(XSSFCell.java:797)
at org.apache.poi.xssf.usermodel.XSSFRow.createCell(XSSFRow.java:176)
at org.apache.poi.xssf.usermodel.XSSFRow.createCell(XSSFRow.java:37)
at kr.go.seoul.scc.admin.web.util.ExcelUtil.addRow(ExcelUtil.java:117)
at kr.go.seoul.scc.admin.web.util.ExcelUtil.addRow(ExcelUtil.java:77)
at kr.go.seoul.scc.admin.web.util.ExcelUtilTest.main(ExcelUtilTest.java:21)
|
반응형
'java' 카테고리의 다른 글
spring boot main args - ApplicationArguments (0) | 2018.08.16 |
---|---|
java file create time (0) | 2018.08.13 |
org.apache.ibatis.type.TypeException: Could not resolve type alias (4) | 2018.08.09 |
mybatis large result set. 대용량 select. fetchSize (0) | 2018.08.07 |
spring boot junit test in linux (0) | 2018.08.02 |
maven cache clear. 메이븐 캐시 클리어. (0) | 2018.07.31 |
spring boot 2.0 default connection pool (2) | 2018.07.25 |
fasterxml json parsing uppsercase (0) | 2018.07.24 |