본문 바로가기
Java

[Java] 엑셀 파일 업로드 & DB 저장하기

by jn4624 2022. 4. 30.
반응형

1. *.xlsx 파일

Logger log = Logger.getLogger(this.getClass());

@Autowired
private insertDAO insertMapper;

public int readExcelFile(MultipartFile file, String siteCode) {
    File destFile = null;

    int resultCode = -1;

    try {
        String resUploadPath = configService.getConfigValue("PATH"); // 임시 디렉토리 경로

        String yearDir = DateUtil.toString(new Date(), "yyyy"); // 연 별 디렉토리 생성
        String monthDir = DateUtil.toString(new Date(), "MM"); // 연 별 디렉토리 생성

        resUploadPath = resUploadPath + yearDir + monthDir + "/";

        if( file == null || file.isEmpty() ) {
            throw new RuntimeException("[readExcelFile] Please select an Excel file....");
        }

        File destdir = new File(resUploadPath); // 디렉토리 조회
        if( !destdir.exists() ) {
            destdir.mkdirs(); //디렉토리가 존재하지 않는다면 생성
        }

        UUID uuid = UUID.randomUUID();

        // 작업할 excelfile을 임시디렉토리에 저장한다.
        destFile = new File(resUploadPath + uuid.toString() + file.getOriginalFilename());

        if( destFile.isFile() ) {
            destFile.delete();
        }

        try {
            file.transferTo(destFile);
        } catch( IllegalStateException e ) {
            throw new RuntimeException(e.getMessage(),e);
        }

        // excel의 컬럼수는 파일마다 다르기때문에 많은 컬럼을 검색할 수 있는 알파벳리스트를 가져온다.
        List<String> alpha = CharCalUtil.alphpCal();

        ExcelReadOption excelReadOption = new ExcelReadOption();

        // excel파일을 가져올 위치를 전달
        excelReadOption.setFilePath(destFile.getAbsolutePath());

        // 몆번째 컬럼까지 검색을 할껀지 지정한다.
        excelReadOption.setOutputColumns(alpha);

        // 몇번째 로우부터 뽑아오는지 지정한다.
        excelReadOption.setStartRow(0);

        // 옵션들을 지정한 후 지정한 옵션에 맞춰 시트안에 있는 데이터들을 추출하고 리턴받는다.
        HashMap<String, Object> excelData = ExcelRead.read(excelReadOption);

        // 엑셀의 데이터를 읽은 후 리턴받은 데이터에는 두가지 타입의 데이터가 있다.(필드수, 필드데이터)
        @SuppressWarnings("unchecked")
        List<Map<String, Object>> excelList = (List<Map<String, Object>>) excelData.get("row");

        // 하나의 로우에는 여러개의 필드가 있다. 그 필드 수에 맞게 데이터를 담기 위해 리턴받은 엑셀데이터에서 필드 수를 따로 뺀다.
        int fieldCount = Integer.parseInt(excelData.get("fieldCount").toString());

        // rowData를 담은 변수를 담은 리스트, 우선 초기화만 시켜놓는다.
        List<Map<String, Object>> rowList = new ArrayList<Map<String,Object>>();

        // 리턴받은 데이터의 첫줄은 데이터베이스에 insert할때의 필드 이름으로 사용한다.
        String[] columnArr = new String[fieldCount];

        int k = 0;
        for( String key : excelList.get(0).keySet() ) {
            columnArr[k] = key;
            k++;
        }

        // 긁어온 row수 만큼 반복하여 rowList에 담는다.
        // i를 1부터 시작하는 이유는 excelList에 0번째 row는 컬럼의 이름이 들어가있기때문에 1부터 시작한다.
        for( int i=1; i<excelList.size(); i++ ) {
            // 컬럼을 제외한 row를 담을 Map객체선언
            Map<String, Object> rowData = new HashMap<String, Object>();

            for( int j=0; j<fieldCount; j++ ) {
                if( !CommonUtil.isEmpty(excelList.get(i)) ) {
                    rowData.put(columnArr[j], excelList.get(i).get(alpha.get(j)));
                }
            }

            rowList.add(rowData);
        }

        // 모든 작업이 끝나면 디렉토리 저장되어있던 임시 Excelfile을 삭제한다.(안해놓으면 오류발생)
        destFile.delete();

        log.info("[readExcelFile] rowList : " + rowList.toString());

        // 생성된 rowList를 데이터베이스에 저장한다.
        for( int i=0; i<rowList.size(); i++ ) {
            if( !CommonUtil.isEmpty(rowList.get(i)) ) {
                try {
                    String A = (String) rowList.get(i).get("A");
                    String B = (String) rowList.get(i).get("B");
                    String C = (String) rowList.get(i).get("C");
                    String D = (String) rowList.get(i).get("D");
                    String E = (String) rowList.get(i).get("E");
                    String F = (String) rowList.get(i).get("E");

                    HashMap<String, Object> paramMap = new HashMap<String, Object>();
                    paramMap.put("A", A);
                    paramMap.put("B", B);
                    paramMap.put("C", C);
                    paramMap.put("D", D);
                    paramMap.put("E", E);
                    paramMap.put("F", F);

                    resultCode = insertMapper.insertData(paramMap);
                } catch( Exception e ) {
                    resultCode = -1;
                    log.error("[readExcelFile] Insert Fail : " + e);
                    e.printStackTrace();
                }
            }
        }
    } catch( Exception e ) {
        resultCode = -1;
        destFile.delete();
        e.printStackTrace();
    }
    return resultCode;
}

 

2. *.csv 파일

Logger log = Logger.getLogger(this.getClass());

@Autowired
private insertDAO insertMapper;

public int readCSVFile(MultipartFile file, String siteCode) {
    File destFile = null;
    BufferedReader br = null;

    int resultCode = -1;

    try {
        String resUploadPath = configService.getConfigValue("PATH"); // 임시 디렉토리 경로

        String yearDir = DateUtil.toString(new Date(), "yyyy"); // 연 별 디렉토리 생성
        String monthDir = DateUtil.toString(new Date(), "MM"); // 연 별 디렉토리 생성

        resUploadPath = resUploadPath + yearDir + monthDir + "/";

        if( file == null || file.isEmpty()) {
            throw new RuntimeException("[readCSVFile] Please Select An CSV File....");
        }

        File destdir = new File(resUploadPath); // 디렉토리 조회
        if( !destdir.exists() ) {
            destdir.mkdirs(); //디렉토리가 존재하지 않는다면 생성
        }

        UUID uuid = UUID.randomUUID();

        // 작업할 file 임시디렉토리에 저장
        destFile = new File(resUploadPath + uuid.toString() + file.getOriginalFilename());

        if( destFile.isFile() ) {
            destFile.delete();
        }

        try {
            file.transferTo(destFile);
        } catch(IllegalStateException e) {
            resultCode = -1;
            throw new RuntimeException(e.getMessage(), e);
        }

        List<String> rowList = new ArrayList<String>();

        try {
            br = new BufferedReader(new InputStreamReader(file.getInputStream(), "UTF-8"));

            String line;
            while( (line = br.readLine()) != null ) {
                rowList.add(line);
            }

            log.info("[readCSVFile] rowList : " + rowList.toString());

            // 모든 작업이 끝나면 디렉토리 저장되어있던 임시 file을 삭제한다.(안해놓으면 오류발생)
            destFile.delete();

            // 생성된 rowList를 데이터베이스에 저장한다.
            for( int i=0; i<rowList.size(); i++ ) {
                if( i < 1) {
                    continue;
                }

                try {
                    String[] data = rowList.get((i)).split(",");

                    HashMap<String, Object> paramMap = new HashMap<String, Object>();
                    paramMap.put("A", "Code");
                    paramMap.put("B", data[0]);
                    paramMap.put("C", data[1]);
                    paramMap.put("D", data[2]);
                    paramMap.put("E", data[3]);
                    paramMap.put("F", data[4]);

                    resultCode = insertMapper.insertData(paramMap);
                } catch( Exception e ) {
                    resultCode = -1;
                    log.error("[readCSVFile] Insert Fail : " + e);
                    e.printStackTrace();
                }
            }

            br.close();
        } catch( Exception e ) {
            resultCode = -1;
            e.printStackTrace();
        } finally {
            try {
                if( br != null ) {
                    br.close();
                }
            } catch( Exception e ) {
                resultCode = -1;
                e.printStackTrace();
            }
        }
    } catch( Exception e ) {
        resultCode = -1;
        destFile.delete();
        e.printStackTrace();
    }

    return resultCode;
}
반응형

'Java' 카테고리의 다른 글

[Java] 자료구조 Map 에 관하여  (0) 2022.07.19
[Java] HashSet 컬렉션  (0) 2022.05.01
[Java] 배열 자르기  (0) 2022.04.28
[Java] ArrayList 정렬(오름차순, 내림차순)  (0) 2022.04.28
[Java] 배열의 합계 얻기  (0) 2022.04.28