Mysql for excel => read excel in java

공부는 혼자하는 거·2021년 11월 3일
1

Spring Tip

목록 보기
20/52

설치

https://downloads.mysql.com/archives/excel/

위의 링크를 타서 설치 전에 Visual Studio 2010 Tools for Office Runtime 를 설치해준다.

https://download.cnet.com/Visual-Studio-2010-Tools-for-Office-Runtime-64-bit/3000-2383_4-75453528.html

사용법

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=good_ray&logNo=221538398631

https://mblogthumb-phinf.pstatic.net/MjAxOTA1MTVfMTAg/MDAxNTU3OTA5NDk4OTU0.w0lGVMPDA6DEeMV7Hdtvn-CiBNPe0TieL88aeyIUwpEg.f9YMabrNpTpXRmbgvRkTJCI1l7ku4uJwTdlpBxhoNyMg.PNG.good_ray/SE-94a97d9e-6e35-4e9e-bb7f-958c33d72da6.png?type=w800

'No thanks, just start my download' 라는 문구를 클릭합니다.

그리고 순서대로 내려받으시면 됩니다.

https://mblogthumb-phinf.pstatic.net/MjAxOTA1MTVfNDYg/MDAxNTU3OTA5NDI1MTg3.Ev3j0Rnwfn0TXsRLB9TVxXtHJAxxOyFmx1d3QFcNfIgg.uNbGio8D3fkFjLY917Z97bh-hQpNQM7Qhe0ixViPJCUg.PNG.good_ray/2.PNG?type=w800

최종적으로 Finish를 누르게 되면 자동으로 엑셀에 버튼이 생깁니다.

https://mblogthumb-phinf.pstatic.net/MjAxOTA1MTVfMjM1/MDAxNTU3OTE0NDc4OTEx.gmT76Gdrpb3Y2EoE43Z8LhOxxTlQ6yN8nCQrxupGs3sg.UpfDRh1p1rGQAvkaRN3-ZsVztJYsQ8UBb0iG7-4f2d8g.PNG.good_ray/image.png?type=w800

분명 비어있던 공간인데 버튼이 생겼군요!!

https://mblogthumb-phinf.pstatic.net/MjAxOTA1MTVfNTAg/MDAxNTU3OTE0NTQxNjY0.Xv28uy9D9nPfxUmEnbgqlsXZ2EeGGtZN5XEIwBCOjtYg.Oyfz6Wd3MQelndEjQIVEevR4Z-LoutyiCLR8CRTpgxUg.PNG.good_ray/image.png?type=w800

일단 엑셀에 데이터를 삽입해봅니다.

전부다 삽입했으면 이제 MYSQL에 옮겨야 겠죠??

연결을 시도해봅니다.

https://mblogthumb-phinf.pstatic.net/MjAxOTA1MTVfNjAg/MDAxNTU3OTE0NjUwMjIy.ehG80Uk6O1gEIx34y_-wTw3l3whoKhBGg-JoYLDxzd8g.XzUlgOlUiXtpr_HFnDpaBGjbRlIBZxXwMC_Gg2DNyz4g.PNG.good_ray/image.png?type=w800

Mysql for Excel 이란 단추를 누르면 mysql workbench에 저장된 연결 리스트들이 나옵니다.

원하는 연결로 접속합니다. 접속 후에 스키마를 고르면 다음과 같이 테이블 리스트가 나옵니다.

https://mblogthumb-phinf.pstatic.net/MjAxOTA1MTVfODcg/MDAxNTU3OTE0NzU4NTI0.xtwc8qMG1pColrBxJ_xFe3jdQp3lSCeiBJUOTODwRlQg.PobfsHSpWqLGWQ-wOGS7rkKxGa0iTqzzQQenYFOz0IEg.PNG.good_ray/SE-2dc2a793-6504-4507-93cd-dfcaa0b69b4b.png?type=w800

school을 제외한 나머지 테이블이름은 예민한 정보라서 가립니다.

옮기기 전에, 기본적으로 ctrl + A를 눌러 엑셀의 모든 데이터를 선택해야합니다.

이제 엑셀 데이터를 옮겨볼 준비가 다 되었습니다.

https://mblogthumb-phinf.pstatic.net/MjAxOTA1MTVfMTU1/MDAxNTU3OTE0OTM2NDAz.W8QisaTxLeqHCdmbmXF-4CzOdXzJweVqSKe4yTunHtIg.Z31uMbwUYLnWJWkswIf8iS16aA3Xp3R1vDossRyD1hog.PNG.good_ray/image.png?type=w800

Append Excel Data to Table이라는 위의 형광펜 친 부분을 클릭합니다.

만약 MYSQL에 옮기면서 동시에 새로운 테이블을 누르고 싶으시다면

https://mblogthumb-phinf.pstatic.net/MjAxOTA1MTVfOTIg/MDAxNTU3OTE1MDExNDQz.XdYD8Nyr3Q6ULNGChlPDXD1ODzNJZDYfRtvZe2wuWXYg.wMEbhnxuKc3YM6PDwaA1GWnxEIycElggxq56yqV_k8gg.PNG.good_ray/image.png?type=w800

위의 형광펜 부분을 누르시고 진행하시면 됩니다.

https://mblogthumb-phinf.pstatic.net/MjAxOTA1MTVfMTAy/MDAxNTU3OTE1MDk1ODIy.vswai8KMcQqRY-tJ911g8DS_qnr3NI5BOW9i8LVkz2Qg.5s43yvUuwXNBFn_7ViBen_4GB0iDIsqVKaMQFmG9l2Yg.PNG.good_ray/image.png?type=w800

이제 excel의 칼럼부분을 마우스 좌클릭으로 끌어서 mysql 칼럼에 대입시키면 자동으로 대입이 됩니다.

Append 버튼을 누르면 데이터 삽입이 시작이 되는데, 삽입과정에서 예외발생 시 중간에서 멈춥니다.

https://itsarang.tistory.com/456

https://excelyouth.tistory.com/48

이슈

이렇게 해서 업체에서 보낸 회원사 리스트를 member table에 insert하였다. 문제는 이렇게 집어넣은 비밀번호는 BCryptPasswordEncoder 로 해시암호화 되지 않은 상태로 문자열 그대로 넣어진다는 점.. 스프링 시큐리티를 도입했기 때문에 로그인 시 BCryptPasswordEncoder matches - Encoded password does not look like BCrypt 이슈가 터진다.. 그렇다고 시큐리티에서 패스워드 인코딩을 disable 하고 쓰자니, 그것도 뭔가 말이 안 되는 것 같고.. 일일히 노가다로 집어넣자니 그것대로 하기가 싫고..

https://stackoverflow.com/questions/51208425/how-to-use-spring-security-without-password-encoding

해결

https://www.baeldung.com/java-microsoft-excel

https://shinsunyoung.tistory.com/71

https://4urdev.tistory.com/109

결국에는 Excel file을 spring boot 에서 읽어서 암호화를 시킨 다음 DB에 저장하는 방식으로 이슈를 해결했다. excel file을 java 에서 읽기 위해서 아래와 같은 의존성을 추가했다.

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

commons-io 같은 경우 파일 확장자 가져오기 기능을 사용하려고 넣은 건데, 딱히 필요는 없더라. 안 넣어도 될 듯..

public List<MemberReqDto> readExcelFile() {

        String filePath = "C:/Users/songn/Documents/카카오톡 받은 파일/충전기연동프로토콜_custom.xlsx";
        List<MemberReqDto> members = new ArrayList<>();

        try {
            FileInputStream file = new FileInputStream(filePath);

            XSSFWorkbook workbook = new XSSFWorkbook(file); //xlsx 확장자만
            int rowindex = 0;
            int columnindex = 0; //시트 수 (첫번째에만 존재하므로 0을 준다) //만약 각 시트를 읽기위해서는 FOR문을 한번더 돌려준다
            XSSFSheet sheet = workbook.getSheetAt(0); //행의 수

            int rows = sheet.getPhysicalNumberOfRows();
            Sheet worksheet = workbook.getSheetAt(0);

            for (rowindex = 2; rowindex < rows; rowindex++) { //행을읽는다
                XSSFRow row = sheet.getRow(rowindex);
                Row row2 = worksheet.getRow(rowindex);

                MemberReqDto reqDto = new MemberReqDto();
                log.info("==============================================");

                reqDto.setMember_name(row2.getCell(2).getStringCellValue());

                reqDto.setMember_userId(row2.getCell(3).getStringCellValue());
                reqDto.setMember_password(row2.getCell(3).getStringCellValue());

                reqDto.setParking_id(String.valueOf(row2.getCell(4).getNumericCellValue()));
                reqDto.setMember_car_number(String.valueOf(row2.getCell(5).getStringCellValue()));
                System.out.println(reqDto);

                if (row != null) { //셀의 수
                    int cells = row.getPhysicalNumberOfCells();

                    for (columnindex = 0; columnindex <= cells; columnindex++) { //셀값을 읽는다

                        XSSFCell cell = row.getCell(columnindex);
                        String value = ""; //셀이 빈값일경우를 위한 널체크
                        if (cell == null) {
                            continue;
                        } else { //타입별로 내용 읽기

                            switch (cell.getCellType()) {
                                case FORMULA:
                                    value = cell.getCellFormula();
                                    break;
                                case NUMERIC:
                                    value = cell.getNumericCellValue() + "";
                                    break;
                                case STRING:
                                    value = cell.getStringCellValue() + "";
                                    break;
                                case BLANK:
                                    value = cell.getBooleanCellValue() + "";
                                    break;
                                case ERROR:
                                    value = cell.getErrorCellValue() + "";
                                    break;
                            }
                        }

                        System.out.println(rowindex + "번 행 : " + columnindex + "번 열 값은: " + value);

                    }

                }
                members.add(reqDto);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return members;
    }
//    @Test
//    public void excelReadAndInsertMemberListTest(){
//
//        List<MemberReqDto> members = excelService.readExcelFile();
//
//        for (MemberReqDto reqDto : members) {
//            adminService.memberAdd(reqDto);
//        }
//    }
profile
시간대비효율

0개의 댓글