제공 :
한빛 네트워크
저자 : 이상호
1. 준비
http://poi.apache.org 에서 가장 최근 버전을 받아 WEB-INF/lib 폴더에 넣어주고 Eclipse에서 Build Path에 poi jar 파일을 추가한다.
2. 사용
Excel 파일을 생성하고자 하는 Class 또는 JSP 파일에서 다음 패키지를 Import 한다.
org.apache.poi.hssf.usermodel.*
POI에서 Excel 파일은 기본적인 2개의 단계를 거쳐서 생성하게 된다.
개념모델 상으로 워크북은 다수의 워크시트를 포함하는 Excel 파일로 볼 수 있으며, 워크시트가 실제 사용자가 저장할 데이터를 포함하고 있다.
// 워크북 생성
HSSFWorkbook objWorkBook = new HSSFWorkbook();
// 워크시트 생성
HSSFSheet objSheet = objWorkBook.createSheet();
POI에서는 워크 시트 생성시 워크북을 인자로 받지 않고 워크북으로부터 워크시트를 생성하는 객체 트리 모델을 가지고 있다. 실제 구현 코드로는 위와 같은 모습을 가진다. 워크북은 POI의 HSSFWorkbook 클래스를 사용하여 생성하고 워크북 생성이 끝나면 워크북의 워크시트를 생성하는 메소드를 사용해 워크 시트를 생성할 수 있다. 이때 워크 시트를 담는 클래스는 HSSFSheet 를 사용한다.
워크 시트에 데이터를 넣으려면 우선 행을 먼저 생성해야 한다. 다음은 워크 시트에 데이터를 추가하는 모습을 도식한 모습이다.
Row(행)가 먼저 오는 이유는 Excel이 데이터를 구분하는 방법이 Row 단위로 구별되기 때문이다. 그리고 Row가 생성되면 실제 데이터를 넣기 위해 Cell을 생성해야 한다. Excel의 기본개념과 맞물려 보면 Cell은 “A1”, “C2” 같은 특정 공간을 하나의 Cell이라고 보는 것과 동일한 개념이라고 볼 수 있다. POI에선 Row단위로 데이터가 추가되기 때문에 한 Row의 어느 위치에 데이터를 넣을 것인가는 Cell 생성 인자로 주는 값에 따라 달라지게 된다.
// 행생성
HSSFRow objRow = objSheet.createRow((short)0);
// 셀 생성
HSSFCell objCell = objRow.createCell((short)0);
앞의 도식도에 따라 Row는 워크 시트 객체의 createRow 메소드를 사용해서 생성하게 된다. createRow 메소드가 돌려주는 객체는 HSSFRow 클래스가 사용된다. createRow는 인자로 short 형태의 숫자를 받게 된다. 인자는 0부터 시작하며 0은 Excel로 보면 1번째 줄과 같다.
Cell은 Row 객체의 createCell 메소드를 사용하며 인자는 short 형태의 숫자값을 받게 되는데, 0번부터 Excel의 A, B, C, .. 컬럼을 의미한다고 볼 수 있게 된다. 정리하면 row 생성시 인자를 3으로 주고 cell 생성시 인자를 10으로 주면 K4에 데이터를 저장할 수 있는 기회가 주어지는 것이다.
본론으로 돌아와서 createCell 메소드는 HSSFCell 객체 형태로 값을 돌려주게 된다. Cell까지 생성을 완료했다면 Cell에 데이터를 저장해야 한다. Cell에 데이터를 저장하기 위해선 Cell 객체가 가지고 있는 1개의 메소드인 setCellValue만 사용해도 되지만 한글 데이터 저장에는 문제가 발생할 수 있다. 따라서 다음과 같은 최종 코드를 가지게 된다.
objCell.setEncoding(HSSFCell.ENCODING_UTF_16);
objCell.setCellValue("연도");
한글 저장을 피해가기 위해서 Cell 객체의 setEncoding 메소드를 사용해 HSSFCell 클래스의 ENCODING_UTF_16 상수를 사용하게 되면 MS 오피스 2003, 2007에서도 무리없이 읽을 수 있게 된다.
이렇게 워크 시트를 모두 구성하고 더 이상 넣을 데이터가 없다면 워크북 객체를 파일로 출판해야 한다. 워크북 객체는 바깥으로 내용을 전달하기 위해서 write 메소드를 가지고 있다. Write 메소드는 모든 OutputStream 객체를 지원한다. 웹에서 사용하기 위해선 다음과 같은 코드를 사용한다.
objWorkBook.write(response.getOutputStream());
이것으로서 POI로 Excel 파일을 만드는 방법을 알아보았다. POI는 단순히 데이터의 저장 뿐 아니라 서식을 지원하는 기능도 가지고 있지만 서식 지원 기능은 POI 문서를 참조하면 쉽게 볼 수 있을 것이라 생각한다.