'java 엑셀'에 해당되는 글 2건

  1. 2008.03.20 자바(java)로 엑셀(excel) 읽기(read) -- 2
  2. 2008.03.20 자바(java)로 엑셀(excel) 읽기(read) -- 1

출처 : http://nadachel.tistory.com/entry/자바java로-엑셀excel-읽기read-2

ⅰ. 엑셀을 자바로 읽는방법 두번째를 작성하여 보도록 하겠다.


  POI프로젝트는 아파치구룹의 자카르타 프로젝트 일환으로 poor object importalble과 비슷한 약자였다. (확실하지는 않다ㅡ.ㅡ;) 아무튼 혼자 만으로는 빈약하다는 뜻인거 같다.
그리고 poi자체로 토란이라는 뜻도 있단다. 역시 빈약하다.
아무튼 모든 아파치 구룹이 그러하듯
  http://mirror.apache-kr.org/poi/release/bin/
 가서 zip최신걸로, 덜렁 받아 압축풀고 클레스 패스 잡아준다.
 추신 : POI는 Microsoft Format File을 액세스 할 수 있는 API를 제공한다고 한다.
(엑셀만 할수 있는 것이 아니란 말이다.)

 참고로
http://apache.org/ 가서 poi 선택하고 javadocs가면 API있다.
영어되면 다른 무궁한 프로젝트도 참고 하길 바란다.
 

ⅱ. 역시 예문을 만들어 보면


/***************************************************************
*  기          능    :  엑셀파일 읽어 String으로 반환
*     Function     :  getData(), getData(String sheets, String rows, String cols),
                       :  xlsFormDate..., getXLSDate...
*  참 조 :  C:/Program Files/Java/jdk1.6.0_01/jre/lib/ext/poi-3.0.1-FINAL-20070705.jar
            :  C:/Program Files/Java/jdk1.6.0_01/jre/lib/ext/poi-contrib-3.0.1-FINAL-20070705.jar
            :  C:/Program Files/Java/jdk1.6.0_01/jre/lib/ext/poi-scratchpad-3.0.1-FINAL-20070705.jar
*  Return  value :  String
*  작    성    자  :  유 진 철
*  작    성    일  :  2007-12-17
/***************************************************************/

import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.hssf.record.*;
import org.apache.poi.hssf.model.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.*;

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;

public class ReadXLS
{
   //필드 선언 엑셀파일이름, 내용, 읽을범위
   private String filename = null;
   private HSSFWorkbook hssfworkbook = null;
   private int startSheet =  0;
   private int endSheet   = -1;
   private int startRow   =  0;
   private int endRow     = -1;
   private int startCol   =  0;
   private int endCol     = -1;

   //ReadXLS 생성자
   public ReadXLS(String filename) throws Exception
   {     
      File file = new File(filename); 

      //존재여부 판단
      if(file.exists())
      {
         //파일여부 판단
         if(file.isFile())
         {
            StringTokenizer st = new StringTokenizer(filename, ".");
            String xls = null;

            //파일 확장자 구하기
            while(st.hasMoreTokens())
            {
               xls = st.nextToken();  
            }

            //확장자 엑셀파일 여부판단
            if(xls.equals("xls"))
            {
               this.filename = filename;
               POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filename));
               hssfworkbook = new HSSFWorkbook(fs);
             
            }
            else
            {
               throw new Exception("엑셀파일이 아닙니다.");
            }

         }
         else
         {
            throw new Exception("파일이 아닙니다.");
         }
      }
      else
      {        
         throw new Exception("존재하지 않는 이름 입니다.");
      }        
   }

   //String 반환하는 메소드
   public String getData() throws Exception
   {
      return getData("ALL","ALL","ALL");
   }

   //String 반환하는 메소드
   public String getData(String sheets, String rows, String cols) throws Exception
   {
      //입력받은 값을 엑셀파일 읽을범위 값으로 전환
      StringTokenizer stTok = new StringTokenizer(sheets, ",");
      StringTokenizer rwTok = new StringTokenizer(rows,   ",");
      StringTokenizer clTok = new StringTokenizer(cols,   ",");

      String startSheetTok = null;
      String endSheetTok   = null;
      String startRowTok   = null;
      String endRowTok     = null; 
      String startColTok   = null;
      String endColTok     = null; 

      int sheetCounts = stTok.countTokens();
      int rowCounts   = rwTok.countTokens();
      int colCounts   = clTok.countTokens();

      //쉬트범위 판단
      if(sheetCounts == 2)
      {
         startSheetTok = stTok.nextToken();
         endSheetTok   = stTok.nextToken();
        
         try
         {
            startSheet = Integer.parseInt(startSheetTok);
            if (startSheet<0) { startSheet = 0; }    
         }
         catch(NumberFormatException ne){}

         try
         {  
            endSheet   = Integer.parseInt(endSheetTok);             
         }
         catch(NumberFormatException ne){}    
      }

      //행범위 판단
      if(rowCounts == 2)
      {
         startRowTok = rwTok.nextToken();
         endRowTok   = rwTok.nextToken();
        
         try
         {
            startRow = Integer.parseInt(startRowTok);
            if (startRow<0) { startRow = 0; }    
         }
         catch(NumberFormatException ne){}

         try
         {  
            endRow   = Integer.parseInt(endRowTok);             
         }
         catch(NumberFormatException ne){}    
      }

      //열범위 판단
      if(colCounts == 2)
      {
         startColTok = clTok.nextToken();
         endColTok   = clTok.nextToken();
        
         try
         {
            startCol = Integer.parseInt(startColTok);
            if (startCol<0) { startCol = 0; }    
         }
         catch(NumberFormatException ne){}

         try
         {  
            endCol   = Integer.parseInt(endColTok);             
         }
         catch(NumberFormatException ne){}    
      }
      //읽어서 처리하는 메소드 호출
      return execute();
   }

   //실행 메소드
   private String execute() throws Exception
   {
      StringBuffer cellData = new StringBuffer();
     
      //읽는범위 유효성검사 및 조정
      int sheetNum = hssfworkbook.getNumberOfSheets()-1;
      if((startSheet-endSheet)>0 || endSheet>sheetNum)
      {           
         endSheet = sheetNum;
      }
     
      //읽는범위 만큼 실행
      for (int k = startSheet; k <= endSheet; k++)
      {
        
         HSSFSheet sheet = hssfworkbook.getSheetAt(k);
         if(sheet!=null)
         {           
            int       rowNum  = sheet.getLastRowNum();
            if((startRow-endRow)>0 || endRow>rowNum)
            {           
               endRow = rowNum;
            }

            for (int r = startRow; r <= endRow; r++)
            {              
               HSSFRow row   = sheet.getRow(r);
               if(row!=null)
               {                 
                  int    colNum = row.getLastCellNum()-1;
                  if((startCol-endCol)>0 || endRow>colNum)
                  {           
                     endCol = colNum;
                  }

                 
                  for (int c = startCol; c <= endCol; c++)
                  {                    
                    HSSFCell cell  = row.getCell((short)c);
                     String   value = null;
                     if(cell!=null)
                     {
                        //셀타입 구분
                        switch (cell.getCellType())
                        {
                           case HSSFCell.CELL_TYPE_BLANK   :                             
                              value = "["+""
                              + "]";
                              break;

                           case HSSFCell.CELL_TYPE_BOOLEAN :                             
                              value = "["+cell.getBooleanCellValue()
                              + "]";
                              break;

                           case HSSFCell.CELL_TYPE_ERROR   :                            
                              value = "["+cell.getErrorCellValue()
                              + "]";
                              break;

                           case HSSFCell.CELL_TYPE_FORMULA :                             
                              value = "["+cell.getCellFormula()                             
                              + "]";
                              break;

                           case HSSFCell.CELL_TYPE_NUMERIC :                             
                              DecimalFormat dft = new DecimalFormat("########################.########");
                              value = "["+dft.format(cell.getNumericCellValue())
                              + "]";
                              break;

                           case HSSFCell.CELL_TYPE_STRING :                                                     
                              value = "["+cell.getRichStringCellValue().getString()
                              + "]";
                              break;

                           default :
                        }//End Of switch
                       
                        cellData.append(value);
 
                     }//End Of if cell
                    
                     else{cellData.append("[]");}                    

                  }//End Of for c++
                  cellData.append("\n");
               }//End Of if row
            }//End Of for r++
         }//End Of if sheet
      }//End Of for k++
     
      return new String(cellData);//String 반환
   }

   /*
   Date and Time Pattern        Result 
   "yyyy.MM.dd G 'at' HH:mm:ss z"   2001.07.04 AD at 12:08:56 PDT 
   "EEE, MMM d, ''yy"           Wed, Jul 4, '01 
   "h:mm a"                  12:08 PM 
   "hh 'o''clock' a, zzzz"       12 o'clock PM, Pacific Daylight Time 
   "K:mm a, z"               0:08 PM, PDT 
   "yyyyy.MMMMM.dd GGG hh:mm aaa"   02001.July.04 AD 12:08 PM 
   "EEE, d MMM yyyy HH:mm:ss Z"   Wed, 4 Jul 2001 12:08:56 -0700 
   "yyMMddHHmmssZ"              010704120856-0700 
   "yyyy-MM-dd'T'HH:mm:ss.SSSZ"   2001-07-04T12:08:56.235-0700
   */

   //원하는 페턴으로 문자형 날짜전달
   public static String xlsFormDate(String Pattern, String Date) throws Exception
   {     
      int date = Integer.parseInt(Date.trim());
      return xlsFormDate(Pattern, date);      
   }

   //원하는 페턴으로 문자형 날짜전달
   public static String xlsFormDate(String Pattern, int Date)
   {
      Calendar cal = Calendar.getInstance();
      cal.clear();  
      cal.add(cal.DATE, Date-25569);
      SimpleDateFormat sdt = new SimpleDateFormat(Pattern);
      return sdt.format(cal.getTime());
   }
  
   //Date 객체전달
   public static Date getXLSDate(String Date) throws Exception
   {     
      int date = Integer.parseInt(Date.trim());
      return getXLSDate(date);      
   }

   //Date 객체전달
   public static Date getXLSDate(int Date)
   {
      Calendar cal = Calendar.getInstance();
      cal.clear();  
      cal.add(cal.DATE, Date-25569);     
      return cal.getTime();
   }  

   public static void main(String [] args)
   {
      try
      {
         ReadXLS readxls = new ReadXLS("ex.xls");
         String xls = readxls.getData("0,0","ALL","ALL");        
         System.out.println(xls );

         /* //날짜 메소드 실험후 주석 처리함
         String Date = ReadXLS.xlsFormDate("yyyy-MM-dd hh:mm", "39423");
         System.out.println("Date : "+Date );

         Date aa = ReadXLS.getXLSDate("39423");
         System.out.println("Object Date : "+aa.toString());
        */

      }//End Of try
      catch (Exception e)
      {
         e.printStackTrace();
      }//End Of catch     
   }//End Of Main 
  
}

/*
똑같이 프로그램을 컴파일 해서 돌리면(물론 같은 폴더에 ex.xls라는 엑셀 파일을 하나 실험용으로 만들어서 넣어둔다.)
[xxx][xxx][xxx]...
[xxx][xxx][xxx]
[][][][][][][][]
[][][][][][][][]
.
.
.
이런 식으로 결과가 나온다.
이것 역시 필요없는 부분이 많은데 이것은 신경쓰지 말고 색상 있는 부분만 보면 된다. 좀더 편리하게 날짜를 데이터베이스에 넣거나(xlsFormDate), 지수를 소수로 표현하기 위하여(DecimalFormat) 사용한 겍체가 몇게 있다.  
*/

Posted by [czar]
,
출처 : http://nadachel.tistory.com/entry/자바java로-엑셀excel-읽기read-1

ⅰ.
엑셀을 자바로 읽을(쓰는것 포함) 수 있도록 하는 방법은 jxl과 poi 두가지 방법이 있는데 우선 그나마 간단한 jxl 방법을 몇자 적어 보도록 하겠다.
( jxl과poi차이나 특성, 프로젝트 정보등은 검색엔진을 이용하길 바란다. )

 우선
http://www.andykhan.com/jexcelapi/download.html 에 가서 최신jexcelapi.tar 파일을 다운로드 하고 압축을 풀면 파일안에 jxl.jar파일이 있다. 이 jar파일을 인식 시키기 위하여, 자바가 설치된 곳의 라이브러리 폴더에 이 파일을 넣는다. (예 : C:/Program Files/Java/jdk1.6.0_01/jre/lib/ext/jxl.jar).

 쓰기 등을 원하거나 다른 것을 원할때는
http://www.andykhan.com/jexcelapi/tutorial.html로 가면 tutorial이 있으니 이걸 참고하길 바란다.

--참고로 엔디칸인가 하는 주인장 한테 메일 보내 봤는데 답장이 없으니 편지 보내지는 말자.

ⅱ. 그럼 예문을 만들어 보면

/***************************************************************
*  기          능   :  엑셀파일 읽어 String으로 반환
*     Function    :  getData(int row) row : 읽을 시작행 번호
*  참          조   :  C:/Program Files/Java/jdk1.6.0_01/jre/lib/ext/jxl.jar
*  Return value  :  String
*  작    성    자  :  유 진 철
*  작    성    일  :  2007-08-17
/***************************************************************/

import jxl.*;
import java.io.*;
import java.util.*;

public class ReadXLS
{
   String filename = null;

   //ReadXLS 생성자
   public ReadXLS(String filename)
   {
      this.filename = filename.trim();  
   }

   //String 반환하는 메소드
   public String getData(int row) throws Exception
   {
      //파일 생성및 데이터 선언
      StringBuffer cellData = new StringBuffer();                     
      File file = new File(filename); 

      //존재여부 판단
      if(file.exists())
      {
         //파일여부 판단
         if(file.isFile())
         {
            StringTokenizer st = new StringTokenizer(filename, ".");
            String xls = null;

            //파일 확장자 구하기
            while(st.hasMoreTokens())
            {
               xls = st.nextToken();  
            }

            //확장자 엑셀파일 여부판단
            if(xls.equals("xls"))
            {
               //엑셀정보 에서 쉬트정보 가져오기
               Workbook workbook = Workbook.getWorkbook(file);
               Sheet sheet = workbook.getSheet(0);
              
              //데이터 생성및 구분자 삽입 col=>[xxx] / row=>\n
               for (int i=row; i<sheet.getRows(); i++ )
               { 
                  for (int j=0; j<sheet.getColumns(); j++ )
                  { 
                     Cell cell = sheet.getCell(j,i);
                     cellData.append("["+cell.getContents().trim()+"]");
                                  
                  }
                  cellData.append("\n");
               }            
               workbook.close();
            }
            else
            {
               throw new Exception("엑셀파일이 아닙니다.");
            }

         }
         else
         {
            throw new Exception("파일이 아닙니다.");
         }
      }
      else
      {        
         throw new Exception("존재하지 않는 이름 입니다.");
      }           
      return new String(cellData);//String 반환
   }//end getData()

   public static void main(String [] args)
   {
      try
      {
         ReadXLS readxls = new ReadXLS("ex.xls");
         String xls = readxls.getData(0); //0번 행 부터 읽기      
         System.out.println(xls );
      }//End Of try
      catch (Exception e)
      {
         e.printStackTrace();
      }//End Of catch     
   }//End Of Main 
  
}


/*
다음과 같은 프로그램을 컴파일 해서 돌리면(물론 같은 폴더에 ex.xls라는 엑셀 파일을 하나 실험용으로 만들어서 넣어둔다.)
[xxx][xxx][xxx]...
[xxx][xxx][xxx]
[][][][][][][][]
[][][][][][][][]
.
.
.
이런 식으로 결과가 나온다.
프로그램에서 파일겍체를 만들거나 하는것은 안전한 실행을 위해서 한것이고 핵심은 색상이 다른 부분을 중점적으로 보면 될것이다.
*/

Posted by [czar]
,