1. Apache POI란 무엇인가?

POI(Poor Obfuscation Implementation)은 아파치에서 제공하는 MS 오피스 관련 라이브러리입니다. 이 라이브러리를 통해 자바로 MS 오피스 파일을 컨트롤할 수 있게 됩니다.
 
  • HSSF : 엑셀 파일을 다루는데 사용 (엑셀 97 이후~)
  • XSSF : 엑셀 2007 이후의 xlsx 파일을 다루는데 사용
  • HPSF : 오피스 파일의 문서요약 정보를 다루는데 사용
  • HWPF : 워드 파일을 다루는데 사용
  • HSLF : 파워포인트 파일을 다루는데 사용
  • HDGF : 비지오 파일을 다루는데 사용
  • HPBF : 퍼블리셔 파일을 다루는데 사용
  • HSMF : 아웃룻의 *.msg 파일을 다루는데 사용
  • DDF : 아웃룩의 이미지 파일을 다루는데 사용
보통은 엑셀을 다루기 위해 많이 사용됩니다.

2. 버전 정보

2-1. POI 3.16 beta 2

2-2. POI 3.17


3. Reader, Writer

내부적으로는 크게 Reader와 Writer가 있습니다.

3-1. Reader

  • Excel, CSV 파일을 객체(VO)로 변환합니다.
  • ExcelReader, CSVReader 등이 있습니다.
ExcelReader er = new ExcelReader();
List list = er(Emp.class, "/text/empExcel.xls");

CSVReader cr = new CSVReader();
List list = cr(Emp.class", "/text/empExcel.csv");

이 때 List<VO>의 멤버변수 이름과 엑셀 파일의 첫 컬럼 이름이 일치해야 합니다.

3-2. Writer

  • 객체(VO)를 Excel CSV로 변환합니다.
  • ExcelWriter, CSVWriter 등이 있습니다.
  • ExcelWriter의 생성자 파라미터에 따라 생성할 엑셀 버전을 정할 수 있습니다. (파라미터로 workbook 등 사용 가능) 기본 생성자는 97-2003 버전입니다.
ExcelWriter ew = new ExcelWriter();
List list = empService.getList();
ew.createSheet(list);
FIle file = ew.write("/text/empExcel.xls", true);

List list = empService.getList();
CSVWriter cw = new CSVWriter();
File file = cw.writer(list, "/text/empExcel.csv", true);


4. Large File Upload

대용량 파일을 업로드할 때 OutOfMemoryError가 발생하는 경우가 많습니다. 이 때는 다음과 같이 엑셀 파일을 Multipart로 업로드 한 후 해당 파일을 XSSF 이벤트 기반 SAX 방식으로 parse하는 동시에 Mybatis Batch로 DB에 저장합니다. 중요한 것은 메모리에 전체 데이터를 담지 않는 것입니다.

4-1. XSSF + SAX (Event API)

org.apache.poi.xssf.eventmodel.XSSFReader의 인스턴스를 사용합니다.


5. Large File Download

스트리밍 방식으로 엑셀을 다운로드합니다. 기본 매커니즘은 JDBC의 ResultSet을 바로 Servlet의 OutputStream으로 보내는 방식입니다. 

5-1. SXSSF (Streaming Usermodel API)

org.apache.poi.xssf.streaming 패키지를 통해 제공합니다.

다음 소스 코드를 살펴보겠습니다.

SXSSFWorkbook wb = new SXSSFWorkbook(100); 

이는 메모리 상에 100 rows를 유지하고, 그 이상의 것은 디스크로 flush하는 것을 의미합니다. 즉,

  • 101번째 row에 도달하면 rownum=0인 row는 디스크로 flush되고 메모리에서 삭제됩니다.
  • 102번째 row에 도달하면 rownum=1인 row는 디스크로 flush되고 메모리에서 삭제됩니다.

 

 

이제 Apache POI 사이트를 방문해보자!!