728x90
반응형

엑셀 파일을 읽기위해서 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();

}

}

}
===============================================================================================
사용법(확장자가 xls인것만 가능하다)

String path = "파일명을 포함한 경로";
List<TestVO> list = ExcelUtil.readXLS(path, TestVO.class);

===============================================================================================

POI dependency

<!-- POI -->

<dependency>

<groupId>org.apache.poi</groupId>

<artifactId>poi</artifactId>

<version>3.10-FINAL</version>

</dependency>

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,