ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] xlsx(엑셀) 파일 읽고 쓰기
    case Computer : 2010. 12. 23. 12:15
    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();
    }

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

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


    반응형

    댓글

Designed by Tistory.