[BE/JAVA] JSP에서 엑셀파일 읽어서 DB에 저장하기 - 3

2021. 7. 3. 17:41
728x90
반응형

2021.07.03

48번째 포스팅

 

입사 117일차.

이제 jsp로 전달한 엑셀파일과 파일명을 사용해서 엑셀파일을 읽어올 수 있다.

파일을 업로드하는 코드는 다른 블로그에 더 자세하고 잘 설명되어있으니 엑셀파일을 읽는 코드만 작성해보려고 한다.

 

 

1. import

  ① 외부 jar파일로 등록한 poi.jar를 사용하기 위해서는 import 코드를 작성해야한다.

  ② 4개의 객체에 대한 import가 필요하다.

객체명 기능 import 코드
XSSFWorkbook 입력한 경로를 통해 가져온 엑셀파일의 정보를 받는다 org.apache.poi.xssf.usermodel.XSSFWorkbook
XSSFSheet 엑셀파일의 시트에 대한 정보를 받는다 org.apache.poi.xssf.usermodel.XSSFSheet
XSSFRow 선택한 시트의 행에 입력한 데이터를 받는다 org.apache.poi.xssf.usermodel.XSSFRow
XSSFCell 선택한 시트의 열에 입력한 데이터를 받는다 org.apache.poi.xssf.usermodel.XSSFCell

 

  ③ 완성한 jsp파일

       업로드한 파일을 삭제해주는 코드를 넣어주면 더 좋은 코드가 될 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<%    
    // 파일을 업로드한 경로\파일명 의 경로를 설정 후, justFileName에 담긴 파일명을 붙여서 경로완성!
    String filePath = "C:\\업로드경로\\" + request.getParameter("justFileName");
 
    try {
        
        // FileInputStream을 이용해서 완성한 파일경로에 있는 파일의 정보를 받는다
        FileInputStream excelFile = new FileInputStream(new File(filePath));
 
        // XSSFWorkbook 객체를 이용해서 엑셀파일의 정보를 읽어들인다
        XSSFWorkbook workbook = new XSSFWorkbook(excelFile);
        
        // XSSFSheet 객체를 이용해서 시트의 정보를 읽어들인다 (getSheetAt(번호), 0 = 맨 첫번째 시트)
        XSSFSheet sheet = workbook.getSheetAt(0);
        
        // getPhysicalNumberOfRows(); 메소드를 사용해서 데이터가 있는 마지막 행의 번호를 받는다
        int rowEnd = sheet.getPhysicalNumberOfRows();
        
        // 읽어들이고 싶은 행의 번호는 '읽어들이고 싶은 행 - 1'로 설정 ( 0은 첫번째줄부터 ~ )
        for ( int i = 0; i <= rowEnd; i++) {
            
            // 차례대로 한줄씩 데이터를 읽어들인다
            XSSFRow row = sheet.getRow(i);
            
            // 반복문을 통해 선택된 row에 데이터가 있으면
            if ( row != null ) {
                
                // getPhysicalNumberOfCells(); 메소드를 사용해서 데이터가 있는 마지막 cell의 열 번호를 받는다
                int cellEnd = row.getPhysicalNumberOfCells();
                
                // 읽어들이고 싶은 cell의 열번호는 '읽어들이고 싶은 열번호 - 1'로 설정
                for ( int j = 0; j <= cellEnd; j++) {
                    
                    // 차례대로 하나의 셀씩 데이터를 읽어들인다
                    XSSFCell cell = row.getCell(columnindex);
                    
                    // 읽어들인 데이터는 자료형에 맞게 출력하는 메소드가 다르다
                    String value = "";
                    if ( cell == nullcontinue;
                    else {
                        
                        switch( cell.getCellType() ) {
                        case XSSFCell.CELL_TYPE_FORMULA:
                            value = cell.getCellFormula();
                            break;    
                        case XSSFCell.CELL_TYPE_NUMERIC:
                            value = 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;
                        }
                    }
                    
                    // DB에 VO형태로 cell번호를 구분하여 Setter메소드를 사용해서 값을 받는다
                    if( j == 0 ) tableVO.setColumn1(value);
                    if( j == 1 ) tableVO.setColumn2(value);
                    if( j == 2 ) tableVO.setColumn3(value);
                    if( j == 3 ) tableVO.setColumn4(value);
 
                }
                
                // VO형태로 받은 데이터를 DB에 저장하는 클래스의 메소드와 연결한다
               MyBatisMapper.setExcelData();
            }
 
        }
 
    } catch ( Exception e ) {
        e.printStackTrace();
    }


%>
cs

 

  ④ catch에서 에러를 잡아내지 않았다면 위의 코드가 정상적으로 실행되었다.

        정상적으로 실행이 되었다면 DB를 열어 정상적으로 데이터가 입력되었는지 확인해보자.

728x90
반응형

BELATED ARTICLES

more