본문 바로가기

IT/Java

POI 라이브러리를 이용한 엑셀파일 쓰기

Apache POI

 - 정의: Microsoft Documents를 사용할 수 있게 해주는 자바 라이브러리 

 - 기능

 1) POIFS Microsoft의 ole2 포맷 형식의 문서를 자바로 읽고 쓸수 있는 컴퍼넌트임. 기본적으로 POI의 모든 컴퍼넌트들이 POIFS를 사용한다.

 2) HSSF Microsoft의 엑셀파일을 읽고 쓸 수 있도록 지원하는 컴퍼넌트임

 3) HWPF Microsoft의 워드파일을 읽고 쓸 수 있도록 지원하는 컴퍼넌트임(핸들링 단계이기 때문에 아직 사용은 못함)

 - 메소드 설명

     * org.apache.poi.hssf.usermodel.HSSFCell 의 setCellFormula("formulaString") 메소드는 스프레드시트에 수식을 추가하는데 사용되고, getCellFormula() 메소드는 수식을 대표하는 문자열을 해석하는데 사용된다.

 

 

 

/* xls 파일 출력시 선언 */

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;


import org.apache.poi.poifs.filesystem.POIFSFileSystem;


/* xlsx 파일 출력시 선언 */
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

 

◆ 2003버전 (= if(fileType.equals("xls") )

 

ArrayList list = new ArrayList();

Hashtable ht = null;

 

FileInputStream inputStream  = new FileInputStream(file);
POIFSFileSystem fileSystem    = new POIFSFileSystem(inputStream); 
HSSFWorkbook workbook     = new HSSFWorkbook(fileSystem);   //POISFS를 이용하여 엑셀 워크북 생성

 

/* xlsx 파일 사용 시(2007 이상 버전)*/

// XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(file));

 

1) 하나의 시트만 사용할 경우

 HSSFSheet sheet = workbook.getSheetAt(0);  //첫번째 쉬트

 

 /* xlsx 파일 사용 시(2007 이상 버전)*/ 

 // XSSFSheet sheet = workbook.getSheetAt(0);

 

2) 두개의 시트 이상 사용할 경우

 int sheetNum = workbook.getNumberOfSheets();

 for(int s=0; s < sheetNum; s++){

HSSFSheet sheet = workbook.getSheetAt(s);

 }

 

int rows = sheet.getPhysicalNumberOfRows(); // 행개수

 

for(int i=1; i<rows; i++){                        // 생성된 시트를 이용하여 그 행의 수만큼 돌면서 행을 하나씩 생성함

      ht = new Hashtable();
      HSSFRow row = sheet.getRow(i);      //row 가져오기

 

      /* xlsx 파일 사용 시(2007 이상 버전)*/ 

      // XSSFCell cell= row.getCell(c);
      
      if(row!=null){
          int count=0;
          int cells = row.getPhysicalNumberOfCells(); //셀 개수 가져오기
          
          for(short c=0;c<cells;c++){
              HSSFCell cell= row.getCell(c);
              
              if(cell != null){
                  String value = null;
                 

                 // 아파치 HSSFCell 에는 모두 6가지의 Cell Type이 있다.

// getCellFormula(): 수식 자체를 가져올 때

// getNumericCellValue():숫자 타입일 때

// getStringCellValue(): 수식 반환값이 문자일 때

// getBooleanCellValue(): 볼룬  타입일 때

// getDateCellValue(): 날짜 타입일 때

// getErrorCellValue(): 에러


                  switch(cell.getCellType()){   // 각셀의 데이터값을 가져올때 맞는 데이터형으로 변환한다.
                      case HSSFCell.CELL_TYPE_FORMULA:       
                          value = cell.getCellFormula();       
                          break;
                      case HSSFCell.CELL_TYPE_NUMERIC:
                          value = String.format("%.5f", cell.getNumericCellValue());    
                          break;
                      case HSSFCell.CELL_TYPE_STRING:
                          value =""+cell.getStringCellValue();
                          break;
                      case HSSFCell.CELL_TYPE_BLANK:
                          value = null;
                          break;
                      case HSSFCell.CELL_TYPE_ERROR:
                          value=""+cell.getErrorCellValue();
                          break;
                      default:
                  }
                  ht.put("CELL"+cell.getCellNum(), value);                   // hashtable에 값을 넣어 둔다.
              }else{
                  ht.put("CELL"+cell.getCellNum(), "NULL");
              }
          }
      }

      list.add(ht);                // 넣어둔 hashtable의 값을 arrayList에 담는다.

}