본문 바로가기
개발/Java

[Java] ExcelUpload - AJAX 파일 업로드

by 코딩하는 흰둥이 2025. 4. 8.

이전글

https://greed-yb.tistory.com/236

 

[Java] ExcelUpload - 파일 읽고 DB에 insert 하기

Java 17 Maven Spring Boot 3.0.3 Oracle 11g IntelliJ Ultimate DBeaver SpringBoot 환경에서 메서드만 이용하여 Excel Upload 기능 할 일이 있어서 테스트 Class 에서 진행하였다 main 메서드를 이용해서 하려면 Junit 을 이용

greed-yb.tistory.com

 

 

 

 

poi 추가
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.8</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>3.8</version>
</dependency>

 

 

 

html + js
<div>
	<input type="file" id="uploadTest">
</div>



<script type="application/javascript">
		$("#uploadTest").change(function(event) {
	        let file = event.target.files[0];
	        if (file) {
				
	        	var formData = new FormData();
	           	formData.append("file", file);

	        	$.ajax({
	        		url : "/파일업로드 주소",
	        		method: "POST",
	        		enctype: 'multipart/form-data',
	        		contentType: false,	// FormData 를 사용하면 Content Type 을 multipart/form-data 으로 변경 되므로 덮어쓰지 않도록 false 필수
	        		processData: false,	// 문자열로 변환하지 않고 있는 그대로 전송하기 위함 false 필수
	        		data: formData,
	        		success: function(data){
	        			if(data == "success"){
	        				console.log("success");
	        			}else{
	        				console.log("fail");
	        			}
	        		},
	        		error(e){
	        			console.log("error: " + e);
	        		}
	        	})
	        }
    	});

</script>

 

change 함수를 사용했으나 본인 상황에 맞춰서 click 등으로 변경할 것

 

 

 

 

controller
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;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;


@Controller
@RequestMapping("/주소")
public class TestController {

@RequestMapping(value="/uploadTest.do", method = RequestMethod.POST)
	private String uploadTest(@RequestParam("file") MultipartFile file) throws Exception{
		
        try {
           
            // .xlsx 확장자
            XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());

            // .xls 확장자
//            HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);

            int seetNum = workbook.getNumberOfSheets();

            for (int i = 0; i < seetNum; i++) {
                // .xlsx 확장자
                XSSFSheet sheet = workbook.getSheetAt(i);

                // .xls 확장자
//                HSSFSheet sheet = workbook.getSheetAt(i);

                int rows = sheet.getPhysicalNumberOfRows();

                // 엑셀 데이터를 읽어서 담기 위한 map
                Map<Integer, String> map = new HashMap();
                
                // 0번째 행은 이름인 경우가 대부분이기에 1부터 시작함
                // 필요에 따라 0부터 시작하면 됨
                for (int j = 1; j < rows; j++) {

                    // .xlsx 확장자
                    XSSFRow row = sheet.getRow(j);

                    // .xls 확장자
//                    HSSFRow row = sheet.getRow(j);

                    int cells = row.getPhysicalNumberOfCells();

                    for (int k = 0; k < cells; k++) {
                        // .xlsx 확장자
                        XSSFCell cell = row.getCell(k);

                        // .xls 확장자
//                        HSSFCell cell = row.getCell(k);

                        String value = "";

                        if (cell == null) {
                            continue;
                        } else {
                            switch (cell.getCellType()) {
                                case XSSFCell.CELL_TYPE_FORMULA:
                                    value = cell.getCellFormula();
                                    break;
                                case XSSFCell.CELL_TYPE_NUMERIC:
                                	// 날짜의 경우 숫자로 가져오기 때문에 변환을 해줘야한다
                                	if(DateUtil.isCellDateFormatted(cell)) {
                                    		Date tempDate = cell.getDateCellValue();
                                    		value = new SimpleDateFormat("yyyy-MM-dd").format(tempDate);
                                	}else {
                                       		value = String.valueOf((int) cell.getNumericCellValue()) + "";	
                                	}
                                	break;
                                case XSSFCell.CELL_TYPE_STRING:
                                    value = cell.getStringCellValue() + "";
                                    break;
                                case XSSFCell.CELL_TYPE_BLANK:
                                    value = cell.getBooleanCellValue() + "";
                                    break;
                                case XSSFCell.CELL_TYPE_ERROR:
                                    value = cell.getErrorCellValue() + "";
                                    break;
                            }
                        }
//                        System.out.println(j +"번 행, " + k +" 번 열 값 : "+ value);
                        map.put(k, value);
                    }
                    System.err.println("test : " + map.toString());


                }

            }
        } catch (IOException e) {
            e.printStackTrace();
            return "fail";
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

		
		return "sucess";
	}

 

 

 

TEST

셀 서식을 건들지 않은 임의 excel

 

 

 

생성한 input 태그로 파일을 선택한다

 

1번째 행의 데이터부터 정상적으로 가져온다

 

 

 

 


 

웹에서 업로드하는 글이 없길래 새로 추가해 본다

확장자 검증 및 확장자에 따른 코드 변환은

각각 javascript , controller 에서 해주면 되고,

중복제거는 hashSet 을 선언하여 데이터 중복을 막아줘도 된다

댓글