반응형

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(11);
    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)
 
반응형

+ Recent posts