본문 바로가기
Project/소경관

[소경관] : Apache poi 라이브러리를 사용하여 View에서 Excel 파일 읽어 저장하기

by 오주현 2022. 4. 30.
반응형

apache poi를 사용해서 View에서 엑셀 파일을 첨부받아 Controller로 가져와 리스트에 담아봤다.

 

implementation 'org.ahache.poi:poi:4.1.2'
implementation 'org.apache.poi:poi-ooxml:4.1.2'

의존성을 추가한다.

 

<form th:action="@{/carManagement/csv}" method="post" enctype="multipart/form-data">
    <ul>
        <li>첨부파일<input th:type="file" name="fileUpload"></li>
    </ul>
    <input th:type="submit" th:value="전송">
</form>

input의 type을 file로 설정하고 파일을 받아온다.

 

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
...

@PostMapping("/csv")
public String addCsvCar(@RequestParam(value = "fileUpload")MultipartFile mf, Model model) throws Exception{

    List<CarDTO> list = new ArrayList<CarDTO>();

    OPCPackage opcPackage = OPCPackage.open(mf.getInputStream());
    XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

    // 첫 번째 시트를 불러온다.
    XSSFSheet sheet = workbook.getSheetAt(0);

    // i는 몇 번째 행 부터 체크를 할 것인지 정한다.
    for (int i=0; i<sheet.getLastRowNum() + 1; i++) {
        CarDTO carDTO = new CarDTO();
        XSSFRow row = sheet.getRow(i);

        // 행이 존재하지 않으면 패스한다.
        if (null == row) {
            continue;
        }

        // 행의 첫 번째 열(이름)
        XSSFCell cell = row.getCell(0);
        if (null != cell) {
            carDTO.setName(cell.getStringCellValue());
        }

        // 행의 두 번째 열(핸드폰번호)
        cell = row.getCell(1);
         if (null != cell){
             carDTO.setPhoneNumber(cell.getStringCellValue());
         }

        // 행의 세 번째 열(차량번호)
         cell = row.getCell(2);
         if (null != cell) {
             carDTO.setCarNumber(cell.getStringCellValue());
         }

        // 행의 네 번째 열(주소)
        cell = row.getCell(3);
        if (null != cell) {
            carDTO.setAddress(cell.getStringCellValue());
        }

        // 리스트에 담는다.
        list.add(carDTO);

        log.debug("리스트 안에 옮겨 담기 : {}", carDTO);
    }

    return "carManagement/carManagement";
}

컨트롤러에서 poi라이브러리를 사용하여 엑셀에 있는 값을 list로 옮겨 담아주었다.

 

그 뒤, debug로 체크해 보니 값이 정상적으로 들어간 것을 확인할 수 있었다.

 

엑셀 파일 내용은 간단하게 테스트용으로 만들어 주었다.

 

맨 위에 구분 행은 i를 0으로 바꾸면 출력되지 않는데 아직 처리를 고민중이다.

 

이제 값을 JSON 구조로 바꾸고 mongoDB에 넣는 작업과, 위 작업을 Controller가 아니라 Service에서 할 수 있게 하는 것에 신경을 쓰면 될 것 같다.

 

https://ohju96.notion.site/apache-poi-view-excel-8e49ced4674b42b5bf8e6196450370bb

 

apache poi 라이브러리를 사용하여 view에서 excel 읽어오기

apache poi를 사용해서 View에서 엑셀 파일을 첨부받아 Controller로 가져와 리스트에 담아봤다.

ohju96.notion.site

 

반응형

댓글