출처 : 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) 사용한 겍체가 몇게 있다.
*/