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가 있을때만 사용합니다.
//이부분은 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();
}
========================================================================================================================
중요한 부분들만 얻급했기때문에 나머지 실제 구현부는 본인이 해결하시기 바랍니다.
'Programming' 카테고리의 다른 글
virtualenv를 사용하자 - 가상 개발환경 구축하기 (0) | 2016.01.07 |
---|---|
파이썬 엑셀 쓰기 라이브러리 비교 (0) | 2016.01.07 |
[js] c#과 같은 string.format 구현하기 (0) | 2015.12.30 |
cons (0) | 2015.10.15 |
자바의 Dynamic Proxies (0) | 2015.09.25 |