Moong's Project
[SpringBoot] JAVA에서 POI를 이용하여 엑셀 파일 읽어오기 본문
오늘의 포스팅 내용은 자바에서 POI 라이브라리를 활용하여 엑셀 파일(.xls, .xlsx)을 읽어오는 방법입니다.
1. POI 라이브러리
일단 POI 라이브러리에 대해 알아보겠습니다.
POI 라이브러리란 아파치 소프트웨어 재단에서 만든 라이브러리로 마이크로소프트 오피스 파일 포맷(ex. xlsx, ppt ...)을 자바 언어로서 읽고 쓰는 기능을 제공해주는 라이브러리입니다.
자바에서 POI 라이브러리를 사용하기 위해서 pom.xml에 POI를 설정해주어야 합니다.
<!-- POI // start -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
</dependency>
<!-- end // POI -->
2. 자바에서 Excel 파일 일기
파일 업로드한 엑셀 파일을 읽어오기 위해 아래와 같이 코드를 작성하여야 합니다.
1. Controller 작성
package excel;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping(path = "/admin/appmanage/",
consumes = {MediaType.APPLICATION_JSON_VALUE})
public class excelManageRestController {
private @Autowired ExcelManageServiceImpl excelManageServiceImpl;
@PostMapping(path = "upload/excel")
public CustomModel upload(@RequestParam("file") MultipartFile file) {
return excelManageServiceImpl.upload(file);
}
}
@RequestParam을 이용해서 파일을 전달 받습니다. 자료형은 MultipartFile을 사용합니다.
여기서 MultipartFile는 Spring에서 업로드된 파일을 다룰 때 사용되는 인터페이스로 파일의 이름과 실제 데이터, 파일 크기 등을 구할 수 있는 인터페이스입니다.
2. Service 작성
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.springframework.web.multipart.MultipartFile;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.commons.io.FilenameUtils;
@Service
public class excelEvalManageServiceImpl {
public CustomModel upload(MultipartFile file) {
ArrayList<TbComPerson> tbComPersonList = new ArrayList<TbComPerson>();
String fileExtsn = FilenameUtils.getExtension(file.getOriginalFilename()); // 파일 Original 이름 불러오기 ex) 전문가.xlsx
Workbook workbook = null;
try {
// 엑셀 97 - 2003 까지는 HSSF(xls), 엑셀 2007 이상은 XSSF(xlsx)
if (fileExtsn.equals("xls")) {
workbook = new HSSFWorkbook(file.getInputStream());
} else {
workbook = new XSSFWorkbook(file.getInputStream());
}
// 엑셀파일에서 첫번째 시트 불러오기
Sheet worksheet = workbook.getSheetAt(0);
// getPhysicalNumberOfRow 는 행의 갯수를 불러오는 매소드
for (int i = 1; i < worksheet.getPhysicalNumberOfRows(); i++) {
// i번째 행 정보 가져오기
Row row = worksheet.getRow(i);
// 날짜포맷
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
if (row != null) {
for (int j = 1; j <= 12; j++) {
// i번째 행의 j번째 셀 정보 가져오기
Cell cell = row.getCell(j);
String value = "";
if (cell == null) {
continue;
} else {
// 타입별로 내용 읽기
switch (cell.getCellType()) {
case FORMULA:
value = cell.getCellFormula();
break;
case NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) { // 숫자- 날짜 타입이다.
value = formatter.format(cell.getDateCellValue());
} else {
double numericCellValue = cell.getNumericCellValue();
value = String.valueOf(numericCellValue);
if (numericCellValue == Math.rint(numericCellValue)) {
value = String.valueOf((int) numericCellValue);
} else {
value = String.valueOf(numericCellValue);
}
}
break;
case STRING:
value = cell.getStringCellValue() + "";
break;
case BLANK:
value = cell.getBooleanCellValue() + "";
break;
case ERROR:
value = cell.getErrorCellValue() + "";
break;
default:
value = cell.getStringCellValue();
break;
}
}
}
if (value != null) {
// 첫번째
if (j == 1) {
tbComPerson.setInsttNm(value);
// 구분
} else if (j == 2) {
tbComPerson.setInsttCode(value);
// 성명
} else if (j == 3) {
tbComPerson.setKoreanNm(value);
// 부서
} else if (j == 4) {
if (!value.equals("false")) {
tbComPerson.setDept(value);
}
// 직책
} else if (j == 5) {
if (!value.equals("false")) {
tbComPerson.setRspofc(value);
}
// 자격사항
} else if (j == 6) {
if (!value.equals("false")) {
tbComPerson.setQualificationNm(value);
}
// 자격 상세
} else if (j == 7) {
if (!value.equals("false")) {
tbComPerson.setQualificationDetail(value);
}
// 최종학위
} else if (j == 8) {
if (!value.equals("false")) {
tbComPerson.setLastDegreeNm(value);
}
// 전공분야
} else if (j == 9) {
if (!value.equals("false")) {
tbComPerson.setMajorNm(value);
}
// 세부 전공분야
} else if (j == 10) {
if (!value.equals("false")) {
tbComPerson.setMajorDetail(value);
}
// IP가치평가보고서 참여 경력
} else if (j == 11) {
if (!value.equals("false")) {
String str = value;
int totalCo = Integer.parseInt(str);
tbComPerson.setTotalCo(totalCo);
}
}
}
}
tbComPersonList.add(tbComPerson);
}
}
workbook.close();
} catch (Exception e) {
throw new BizException(e);
}
}
}
위에서 작성한 코드 중 i 행 개수만큼 반복문을 돌며 각 행의 대한 데이터를 가져옵니다.
- getCell(j)는 j번째의 셀 데이터를 가져오는 메소드입니다.
- getNumericCellValue() => 실수 데이터 가져오는 메소드입니다.
- getStringCellValue() => 문자열 데이터 가져오는 메소드입니다.
- getBooleanCellValue() => 논리 데이터 가져오는 메소드입니다.
실제 엑셀업로드 화면
- 엑셀파일 내용
- 엑셀파일 업로드
- 엑셀파일 업로드 후 화면에 표시
'BACKEND > Java' 카테고리의 다른 글
[Spring Boot] Spring Boot 개발환경 세팅(feat.Eclipse) (0) | 2023.01.29 |
---|
Comments