반응형
오늘은 Spring에서 엑셀(Excel) 파일 업로드에 대해 포스팅 하려고 합니다.
먼저 pom.xml에 poi 라이브러리를 사용하기 위해 dependency를 등록합니다.
// pom.xml
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.12</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.12</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.12</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.12</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>3.12</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-contrib</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-security</artifactId>
<version>1.0</version>
</dependency>
그리고 엑셀(Excel) 업로드를 사용하기 위한 비즈니스 로직을 구성합니다.
저는 Service와 ServiceImpl에서 사용하는 것으로 하겠습니다.
// Service
public List<CreateUserVo> uploadExcelFile(MultipartFile excelFile);
// ServiceImpl
public List<CreateUserVo> uploadExcelFile(MultipartFile excelFile){
List<CreateUserVo> list = new ArrayList<CreateUserVo>();
try {
OPCPackage opcPackage = OPCPackage.open(excelFile.getInputStream());
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);
// 첫번째 시트 불러오기
XSSFSheet sheet = workbook.getSheetAt(0);
for(int i=1; i<sheet.getLastRowNum() + 1; i++) {
CreateUserVo createUserVo = new CreateUserVo();
XSSFRow row = sheet.getRow(i);
// 행이 존재하기 않으면 패스
if(null == row) {
continue;
}
// 행의 1번째 열(아이디)
XSSFCell cell = row.getCell(0);
if(null != cell)
createUserVo.setUser_id(cell.getStringCellValue());
// 행의 2번째 열(이름)
cell = row.getCell(1);
if(null != cell)
createUserVo.setUser_name(cell.getStringCellValue());
// 행의 3번째 열(사용 만료일)
cell = row.getCell(2);
if(null != cell)
createUserVo.setExpire(cell.getStringCellValue());
// 행의 4번째 열(부서명)
cell = row.getCell(3);
if(null != cell)
createUserVo.setDeptname(cell.getStringCellValue());
// 행의 5번째 열(휴대전화 번호)
cell = row.getCell(4);
if(null != cell)
createUserVo.setPhone(cell.getStringCellValue());
// 행의 6번째 열(이메일)
cell = row.getCell(5);
if(null != cell)
createUserVo.setEmail(cell.getStringCellValue());
// 행의 7번째 열(설명)
cell = row.getCell(6);
if(null != cell)
createUserVo.setDesc(cell.getStringCellValue());
// 행의 8번째 열(사무실 코드)
cell = row.getCell(7);
if(null != cell)
createUserVo.setOffice_code(cell.getStringCellValue());
list.add(createUserVo);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
Controller에서 MultipartFile 객체를 선언하여 ServiceImpl 메소드를 사용합니다.
// Controller
@POST
@RequestMapping(value = "/uploadExcelFile.do")
public void uploadExcelFile(MultipartHttpServletRequest request, Model model, HttpServletResponse response) {
logger.debug("############## /admin/uploadExcelFile.do Start!!! ##############");
response.setCharacterEncoding("UTF-8");
try {
PrintWriter printWriter = response.getWriter();
JSONObject jsonObject = new JSONObject();
MultipartFile file = null;
Iterator<String> iterator = request.getFileNames();
if(iterator.hasNext()) {
file = request.getFile(iterator.next());
}
List<CreateUserVo> list = vdiMgmtService.uploadExcelFile(file);
if(list !=null) {
jsonObject.put("rs", "0000");
}else {
jsonObject.put("rs", "9999");
}
printWriter.print(JSONArray.fromObject(list));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
logger.debug("############## /admin/uploadExcelFile.do End!!! ##############");
}
마지막으로 jsp에서 엑셀 업로드하여 화면에 나타내는 UI만 만들어 주면
엑셀 업로드에 대한 구성이 끝나게 됩니다.
// javascript
function doExcelUploadProcess(){
var form = new FormData(document.getElementById('form1'));
$.ajax({
url: "${ContextPath}/admin/uploadExcelFile.do",
dataType: "json",
data: form,
processData: false,
contentType: false,
type: "POST",
success: function(data){
var htmlValue;
for (var i = 0; i < data.length; i++) {
user_id.push(data[i].user_id);
user_name.push(data[i].user_name);
expire.push(data[i].expire);
deptname.push(data[i].deptname);
phone.push(data[i].phone);
email.push(data[i].email);
desc.push(data[i].desc);
office_code.push(data[i].office_code);
htmlValue += "<tr>";
htmlValue += "<td>"+data[i].user_id+"</td>";
htmlValue += "<td>"+data[i].user_name+"</td>";
htmlValue += "<td>"+data[i].expire+"</td>";
htmlValue += "<td>"+data[i].deptname+"</td>";
htmlValue += "<td>"+data[i].phone+"</td>";
htmlValue += "<td>"+data[i].email+"</td>";
htmlValue += "<td>"+data[i].desc+"</td>";
htmlValue += "<td>"+data[i].office_code+"</td>";
htmlValue += "</tr>";
}
$("#muntiUserInfo").html(htmlValue)
},
error: function(xhr, status, error){
console.log("xhr:"+xhr+", status:"+ status + ", error:"+error);
}
})
}
// HTML
<form id="form1" name="form1" method="post" enctype="multipart/form-data">
<input type="file" id="fileInput" name="fileInput">
<button type="button" onclick="doExcelUploadProcess()">엑셀업로드 작업</button>
</form>
위의 구성이 완료되면 아래 그림과 같은 형태로 만들어 낼 수 있습니다.
아래 그림의 UI는 설명과는 별도로 HTML과 CSS를 수정하였기 때문에
UI구성은 따로 만드셔야합니다.
질문 또는 이견이 있으시면 아래 댓글에 작성해 주시면 감사하겠습니다.
지금까지 SpringBoot 엑셀(Excel) 파일 업로드 방법(poi 라이브러리) 에 대한 포스팅이였습니다.
반응형
'Develope > Spring' 카테고리의 다른 글
[Spring] Google OTP QR코드 자체 생성 (NOT API) (2) | 2024.05.21 |
---|---|
[Spring] JpaRepository where에 List 사용 방법 (3) | 2024.04.18 |
[SpringBoot] Ajax 배열, 리스트로 값 넘기기 (0) | 2020.02.14 |
[SpringBoot] mysql jdbc driver 설정 및 사용방법 (0) | 2020.02.14 |
[Spring] @RequestMapping produces를 이용한 Response Content-Type 변경 (0) | 2019.09.20 |