Programming

[JAVA] xlsx(엑셀) 파일 읽고 쓰기

steloflute 2016. 1. 7. 23:30

http://visu4l.tistory.com/362



java에서 기본적으로 엑셀파일 (xls)를 열기위한  라이브러리(jxl)가 존재한다.
그런데 이 라이브러리는 2007버전(xlsx)부터는 읽지 못한다.
그래서 대부분 다른 외부 api를 많이 사용하는데..
apache POI 라이브러리 사용법을 알려주려고 한다.


라이브러리 다운받는곳 : http://poi.apache.org/ 

위에서 download에서 bin(binary)파일을 다운받는다.
windows에서 개발중이라면 .zip을 받고 리눅스라면 tar.gz 파일을 받는다.


해당 라이브러리를 프로젝트에 추가시키는 방법입니다.
===================================================================================================================================
라이브러리 파일을 받고 압축을 풀면
루트에 
poi-xxxx.jar
ooxml-lib/xxx.jar

.jar 파일만 필요한 어느 한 폴더에 풀어놓습니다.
첨부파일로 2009년 버젼을 올려놓았습니다.(만약에 안된다면 제가 올려놓은 파일로 해보시기 바람니다)

POI 라이브러리(v 20090928)

이클립스에 넣으려는 프로젝트를 선택하고 
메뉴에 Project>Properties>Java Build Path 그리고 가운데 Libraries 를 선택합니다.
아래와 같이 곳으로 이동후에 Add External JARs... 을 선택후에 자신이 풀어푼 곳에 있는 라이브러리들을 모두 추가 시킴니다.




그러면 자신의 프로젝트에 Referenced Libraries 라는 게 생겨 있을 것을 볼수 있을겁니다.

그려면 지금부터 해당 라이브러리를 import후에 사용하면 됩니다.

========================================================================================================================
========================================================================
파일 읽어 오기(.xlsx)
 읽어온 data는 String vector에 저장하는 형태입니다.
=======================================================================
엑셀관련 import 파일들...
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
=======================================================================

File file = new File(super.FileName);
        XSSFWorkbook wb = null;
        
try {//엑셀 파일 오픈
wb = new XSSFWorkbook(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

//라인 저장 임시 벡터
        Vector<String> tmpContent = new Vector<String>();
        boolean isNull = false;
        
        for( Row row : wb.getSheetAt(0) ) {// 행 구분
         String str = new String();
            for( Cell cell : row ) { // 열구분
             isNull = false;
                
             // 셀의 타입 따라 받아서 구분지어 받되 한 행을 하나의 스트링으로 저장
                switch( cell.getCellType()) {
                    case Cell.CELL_TYPE_STRING :
                        str = str + cell.getRichStringCellValue().getString();
                        break;

                    case Cell.CELL_TYPE_NUMERIC :
                        if(DateUtil.isCellDateFormatted(cell))
                         str = str + cell.getDateCellValue().toString();
                        else
                            str = str + Integer.toString((int)cell.getNumericCellValue());
                        break;
                        
                    case Cell.CELL_TYPE_BOOLEAN :
                        str = str + cell.getBooleanCellValue();
                        break;

                    case Cell.CELL_TYPE_FORMULA :
                        str = str + cell.getCellFormula();
                        break;

                    default: // 값이 없는 열은 포함되지 않게 함. 
                        isNull = true;
                }                
                if(isNull != true)
                 str = str + " ";
            }
            // 한 행이 읽혀 지면 벡터에 추가
            tmpContent.add(str);
        }

        Vector<String> Content = new Vector<String>();
        
        //한 행씩 넣으면서 마지막 배열에 space가 추가되것을 제거 시킴.
      //이부분은 space가 있을때만 사용합니다.
        for(int i=0; i< tmpContent.size(); i++)
{
         String str = tmpContent.get(i);
         str = str.substring(0, str.length()-1);
         Content.add(str);
}
return Content;

========================================================================================================================
========================================================================
파일 저장(.xlsx)
   newContent라는 String vector 에 저장할 data가 있습니다.
=======================================================================
엑셀관련 import 파일들...
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
=======================================================================


// 새로운 엑셀 워크 시트 생성
XSSFWorkbook wb = new XSSFWorkbook();
        Sheet sheet = wb.createSheet();
        
        // 해당 시트의 행별로 결과값 입력
        for(int rownum = 0; rownum < newContent.size(); rownum++) 
        {
         Row r = sheet.createRow(rownum);         

         // 열별로 나눔 구분자 '\t'
         String[] str = newContent.get(rownum).split(" ");
         for(int cellnum = 0; cellnum < str.length; cellnum++) 
         {
         Cell c = r.createCell(cellnum);
         c.setCellValue(str[cellnum]);
         }
        }
        
        // 해당 워크시트를 저장함.
        FileOutputStream stream = null;
try {
stream = new FileOutputStream(FullPath);
wb.write(stream);
stream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}

========================================================================================================================

중요한 부분들만 얻급했기때문에 나머지 실제 구현부는 본인이 해결하시기 바랍니다.