java에서 기본적으로 엑셀파일 (xls)를 열기위한 라이브러리(jxl)가 존재한다.
그런데 이 라이브러리는 2007버전(xlsx)부터는 읽지 못한다.
그래서 대부분 다른 외부 api를 많이 사용하는데..
apache POI 라이브러리 사용법을 알려주려고 한다.
위에서 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();
}
========================================================================================================================
중요한 부분들만 얻급했기때문에 나머지 실제 구현부는 본인이 해결하시기 바랍니다.