엑셀 파일을 읽기위해서 poi 라이브러리를 사용했다.
엑셀을 읽어서 List<VO> 의 형태로 리턴받는 메소드를 구상했고
그 메소드의 인수로는 경로 또는 File 객체와 List에 담길 객체 type을 넘겨주는걸로 생각해서 구현해 봤다.
사용할 때 원하는 값을 얻기 위해서는 VO 클래스의 필드 선언 순서와 엑셀 데이터의 cell 순서가 일치해야한다.
String a;
String b;
String c;
라고 선언했다면 엑셀에서는
형태로 저장되 있어야 한다.
그리고 각 row의 값들은 VO의 자료형과 일치 하지 않는다면 또 원하는 값이 나오지 않을 수 있다.
엑셀을 읽는 method 는
public static <VO> List<VO> readXLS(String path, Class<VO> resultType)
public static <VO> List<VO> readXLS(File file, Class<VO> resultType)
위와 같은 형태로 2개를 만들었고 첫번째 메소드는 File 객체를 만들어서 2번째 메소드를 호출하는 구조이다.
===============================================================================================
public class ExcelUtil {
private ExcelUtil(){ }
public static <VO> List<VO> readXLS(String path, Class<VO> resultType) throws Exception{
if(!(path.endsWith(".xls") || path.endsWith(".XLS"))){
throw new FileIsNotXLSException("xls 파일이 아닙니다.");
}
return readXLS(new File(path), resultType);
}
public static <VO> List<VO> readXLS(File file, Class<VO> resultType) throws IOException, IllegalArgumentException, IllegalAccessException, SecurityException, ClassNotFoundException, InstantiationException{
FileInputStream fis = null;
HSSFSheet sheet = null;
HSSFRow row =null;
HSSFCell cell = null;
try{
// 엑셀 파일로 연결된 스트림 생성
fis = new FileInputStream(file);
// 스트림으로 부터 엑셀파일을 읽어온다.
HSSFWorkbook workbook = new HSSFWorkbook(fis);
if(workbook == null){
return null;
}
// 첫번째 시트를 가져온다.
sheet = workbook.getSheetAt(0);
int startRow = 1;
int endRow = sheet.getLastRowNum();
List<VO> rowValues = new ArrayList<>();
VO cellValues = null;
// VO의 필드들을 전부 가져온다.
// VO.java 에 작성된 필드 순서대로 배열에 정렬되어 나온다.
Field[] field = resultType.getDeclaredFields();
for(int i=startRow; i<=endRow; i++){
// row를 가져온다
row = sheet.getRow(i);
// VO 객체 생성
cellValues = resultType.newInstance();
// 필드의 갯수만큼 반복
// VO.java 에 작성된 필드 순서와 엑셀에 작성된 cell 순서가 일치하지 않으면
// 원하는 결과가 나오지 않을 수 있다.
for(int j=0; j < field.length; j++){
// cell 을 가져온다.
cell = row.getCell(j);
if(cell == null){
continue;
}
// field 의 접근제한자 때문에 접근을 못한다면 접근가능으로 바꾼다.
if(!field[j].isAccessible()){
field[j].setAccessible(true);
}
try{
// 필드 type에 맞게 cell의 값을 바꿔서 세팅한다.
if(field[j].getType() == int.class || field[j].getType() == Integer.class){
field[j].set(cellValues, (int)cell.getNumericCellValue());
} else if(field[j].getType() == double.class || field[j].getType() == Double.class){
field[j].set(cellValues, cell.getNumericCellValue());
} else if(field[j].getType() == String.class){
field[j].set(cellValues, cell.getStringCellValue());
} else if(field[j].getType() == Date.class){
field[j].set(cellValues, cell.getDateCellValue());
}
}catch(IllegalStateException e){
System.out.println("cell 과 " + field[j].getName() + "의 Type 이 맞지 않습니다.");
}
}
// 위에서 세팅된 값을 List에 추가한다.
rowValues.add(cellValues);
}
return rowValues;
}finally{
fis.close();
}
}
===============================================================================================
POI dependency
<!-- POI -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.10-FINAL</version>
</dependency>
[출처] [JAVA] POI 라이브러리를 이용한 엑셀 읽기|작성자 wofmaker
'JAVA > EXCEL컨트롤관련' 카테고리의 다른 글
poi를 사용한 엑셀 생성 (0) | 2014.11.27 |
---|---|
[JAVA] 자바에서 엑셀을 만들자 : Apache POI (0) | 2014.11.27 |
POI - Excel Read/Write(xls, xlsx) sample (0) | 2014.11.27 |
xbeans 관련오류수정 (0) | 2014.11.17 |
apache poi 를 이용한 엑셀 다운로드 처리 (0) | 2014.10.17 |
[Java] POI - 자바로 엑셀 파일 출력하기 (0) | 2014.10.17 |
opencsv 사이트 (0) | 2014.10.17 |
apache poi 사이트 (0) | 2014.10.17 |