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(); Listlist = 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(); Listlist = 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 사이트를 방문해보자!!