본문 바로가기
IT 개발/JAVA

poi 라이브러리 / Excel DB 적재

by Love of fate 2020. 1. 14.
728x90
반응형

1. pom.xml 라이브러리 추가

 

 

2. jsp 파일에 파일 업로드 Element를 만든다

 

 

3. javscript 파일에서 jQuery와 Ajax를 통해 file을 넘긴다


- jsp에서 FORM을 생성하여 넘기지 않았을때 스크립트에서 formData로 file을 가져올 수 있다.
- FormData object를 사용해야 하는데 IE브라우저에서는 10부터 지원이 된다고 한다.
- 해당 코드는 네이밍을 APPEND 해주는 형식으로 하여 KEY,VALUE 형식으로 넘겨주는 방식

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
$(document).ready(function() {
    
    $("#article").hide();
    ready();
    
    //fileData DB 넣기
    $(".Upload #fileUpload").click(function(){
        
        //jsp에서 FORM을 생성하여 넘기지 않았을때 스크립트에서 formData로 file을 가져올 수 있다.
        var formData = new FormData(); 
        formData.append("file", $('#fileExcel')[0].files[0]); //배열로 되어있음 / formData는 Map과 같은 형태
        
        var fileName = formData.get('file').name;
        
        //console.log(fileName);
        
        $.ajax({
            type : "POST",
            url : "/test/fileDBUpload.do",
            data : {"fileName" : fileName}, //ajax로 데이터를 보낼땐 JSON 형태(Map 형태)로 보낸다.
            success : function(data){
                
                if(data.RESULT == "SUCCESS"){
                    
                    alert("업로드 성공");
                    
                }else{
                    
                    alert(data.RESULT);
                }
            }
        })
    });
});
 

 

4. Controller 

- /test/fileDBUpload.do에서 RequestParam 어노테이션을 통해 fileName을 받는다

- ReadExcelFileToList 서비스 readExcelData 메소드에 fileName넘기고

  엑셀을 읽어 데이터를 담은 fileList를 반환받음

  (서비스 단은 아래에서 다시 언급할 예정)

- Map에 fileList를 담고 dao로 넘겨 insert 시킴 

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
    //excel File DB 적재
    @RequestMapping(value = "/fileDBUpload.do", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> fileDBUpload(
            @RequestParam(value = "fileName"String fileName) {
 
        ResultMap result = new ResultMap();
        Map<String, Object> map = new HashMap<String, Object>();
        
        try {
            List<ExcelDTO> fileList = ReadExcelFileToList.readExcelData(fileName);
            
            map.put("list", fileList);
            
            dao.addExcel(map);
            
            result.setSuccess();
            
        } catch (Exception e) {
            e.printStackTrace();
            result.setFailure();
        }
        
        return result;
    }

 

 

5. ServiceImpl

 - fileName.endsWith("xlsx") : 확장자 확인

   확장자가  xlsx이면 XSSFWorkbook()로 객체 생성

   확장자가  XLS이면 HSSFWorkbook()로 객체 생성

 - workbook.getNumberOfSheets(); : 엑셀 파일의 시트 갯수 추출 

 - workbook.getSheetAt(i);  : 원하는 시트 찾음

 - curRow = curSheet.getRow(n); : 현재 시트의 원하는 행을 찾음

 - String wlobscd = curRow.getCell(n).getStringCellValue() : 현재시트의 원하는 셀을 검색하여 값을 가져옴

 - switch문으로 Cell의 Type으로 case를 구분하여 셀의 타입에 따라 코드가 작동할 수 있도록 구성

   1. Cell.CELL_TYPE_BOOLEAN

   2. Cell.CELL_TYPE_NUMERIC

   3. Cell.CELL_TYPE_ERROR

   4. Cell.CELL_TYPE_BLANK

   5. Cell.CELL_TYPE_STRING

   6. Cell.CELL_TYPE_FORMULA

  - dto에 데이터를 담고 list.add(dto)로 list에 dto를 담는다. 

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package com.test.jbt.service.impl;
 
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
import com.test.jbt.dto.ExcelDTO;
 
public class ReadExcelFileToList {
 
    public static List<ExcelDTO> readExcelData(String fileName) {
 
        List<ExcelDTO> list = new ArrayList<ExcelDTO>();
 
        try {
 
            //02.한국수자원공사
            String file = "C:\\Users\\82109\\Desktop\\남은주\\유량\\
+ 2017 일유량 연표(2017)\\한국수자원공사"+ "\\" + fileName;
 
            FileInputStream fis = new FileInputStream(file);
 
            Workbook workbook = null;
 
            /*
             * if(fileName.endsWith("xlsx")){ workbook = new XSSFWorkbook(); }else
             * if(fileName.endsWith("xls")){ workbook = new HSSFWorkbook(); }
             */
 
            workbook = new HSSFWorkbook(fis);
 
            // 탐색에 사용할 Sheet, Row, Cell 객체
            HSSFSheet curSheet;
            HSSFRow curRow;
            HSSFCell curCell; // 행
            ExcelDTO dto;
 
            String year = "2017";
            String month = null// 월
            String date = null// 일
 
            int day = 0;
            int mon = 0;
 
            int numberOfSheets = workbook.getNumberOfSheets(); // 시트의 갯수 추출
 
            for (int i = 0; i < numberOfSheets; i++) {
 
                // 현재 sheet 반환
                curSheet = (HSSFSheet) workbook.getSheetAt(i);
 
                curRow = curSheet.getRow(1); // 두번째 행 추출
 
// 두번째 행의 첫번째 Cell 값 가져오기
                String wlobscd = curRow.getCell(0).getStringCellValue();
// code 분할
                wlobscd = wlobscd.substring(wlobscd.length() - 8, wlobscd.length() - 1);
 
                // Row 돌리기/*
                //for(int rowIndex = 5; rowIndex < 36; rowIndex++) {
                for (int rowIndex = 7; rowIndex < 38; rowIndex++) {
                //for (int rowIndex = 8; rowIndex < 39; rowIndex++) {
                //for (int rowIndex = 6; rowIndex < 37; rowIndex++) {
 
                    curRow = curSheet.getRow(rowIndex); // 현재 행 읽기
                    day++;
 
// 현재 행의 셀의 수 만큼 읽기
                    for (int cellIndex = 1; cellIndex < 25; cellIndex++) {
 
                        if (cellIndex % 2 != 0) {
                            mon++;
 
                            if (mon == 13) {
                                mon = 1;
                            }
 
                            if (day == 32) {
                                day = 1;
                            }
 
                            if (mon <= 9) {
                                month = "0" + mon;
                            } else {
 
                                month = Integer.toString(mon);
                            }
 
                            if (day <= 9) {
                                date = "0" + day;
                            } else {
                                date = Integer.toString(day);
                            }
 
                            curCell = curRow.getCell(cellIndex);
                            
                            curCell.setCellType(HSSFCell.CELL_TYPE_STRING);
 
                            switch (curCell.getCellType()) {
 
                            case HSSFCell.CELL_TYPE_NUMERIC:
 
                                dto = new ExcelDTO();
 
                                dto.setFw((float) curCell.getNumericCellValue());
                                dto.setTgt_de(year + "-" + month + "-" + date);
                                dto.setFwobscd(wlobscd);
 
                                curCell = curRow.getCell(cellIndex + 1);
 
                                if (curCell.getStringCellValue().trim().equals("*")
                                        || curCell.getStringCellValue().trim() == "*") {
                                    dto.setRev_at("Y");
                                }else {
                                    dto.setRev_at("N");
                                }
 
                                list.add(dto);
 
                                break;
 
                            case HSSFCell.CELL_TYPE_STRING:
                                
                                if("".equals(curCell.getStringCellValue().trim()) ||
 curCell.getStringCellValue().isEmpty() || 
curCell.equals(null)) {
                                    break;
                                }
                                
                                dto = new ExcelDTO();
                                
                                dto.setFw(Float.valueOf(curCell.getStringCellValue()));
                                dto.setTgt_de(year + "-" + month + "-" + date);
                                dto.setFwobscd(wlobscd);
 
                                curCell = curRow.getCell(cellIndex + 1);
 
                                if (curCell.getStringCellValue().trim().equals("*")
                                        || curCell.getStringCellValue().trim() == "*") {
                                    dto.setRev_at("Y");
 
                                }else {
                                    dto.setRev_at("N");
                                }
 
                                list.add(dto);
 
                                break;
                            }
                        }
                    }
                }
            }
 
            fis.close();
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return list;
 
    }
 
}
 
 

5. daoImpl

- addExcel메소드에 list를 담은 Map을 넘겨 mapper로 넘긴다.

 

6. Mapper

 - foreach를 사용하여 list를 돌려 list가 없을때까지 실행.

 - ON CONFLICT : 사용자가 명시한 컬럼으로 중복체크를 함 (PostgreSql)

   - 아래 쿼리문에서는 FWOBSCD, TGT_DE가 있으면 update, 없으면 insert 하도록 함

 

 

* 참고 

- serviceImpl Exccel 읽기 참고 자료

ReadExcelFileToList_엑셀 읽기.java
0.01MB

728x90
반응형

'IT 개발 > JAVA' 카테고리의 다른 글

JAVA에서 CMD 명령어 사용 (Path 클래스, FileUtil)  (0) 2020.06.12
JDBC : HDF 파일 Insert  (0) 2020.03.23
Date 관련 클래스  (0) 2019.08.13
JAVA (3일차) - 반복분  (0) 2019.06.15
JAVA (2일차) - 기초 다지기  (0) 2019.06.13