[Java] 바코드 리더기를 이용해서 엑셀 파일의 데이터를 읽은 후 CSV 파일 만들기

Denia·2022년 6월 30일
0

가족 중에 쇼핑몰을 하시는 분이 있어서 그분의 일을 돕다가 너무 불편한 부분이 있어서, "프로그램적으로 해결하면 좋겠다" 라고 생각한 부분이 있어서 프로그램으로 만들어봤습니다.

불편한 부분

해당 프로그램을 만들기 전에는 송장에 기록된 고객을 쇼핑몰에서 찾고 (운송장 번호를 등록하기 위해서 쇼핑몰에서 고객 검색이 필요함), 송장에 적혀있는 운송장 번호를 상품 배송정보에 하나 하나 직접 입력해서 등록함

이렇게 하다보니 시간은 시간대로 엄청 걸리고 눈도 아프고 번호를 잘못보고 실수로 다른 번호를 입력하게 되면 입력을 안하니만 못한 결과가 발생

프로그램 동작시에 필요한 파일

  1. 운송장 번호 와 주문번호가 담겨있는 엑셀 파일. (송장 출력하는 택배사 사이트에서 다운로드 받음.)

프로그램 동작 구성

  1. 바코드 리더기로 송장의 바코드를 읽는다. (송장의 바코드 == 운송장 번호)
  2. 읽은 바코드를 기반으로 주문번호를 찾아낸다
  3. 주문번호 와 운송장 번호를 CSV 파일에 저장한다. (기존에 데이터가 있으면 아래에 데이터를 붙여 넣는다.)
  4. 다시 1번을 반복

CSV 파일을 만드는 이유

  1. 주문번호 와 운송장 번호를 가지고 CSV 파일로 만들어서 쇼핑몰 사이트에 업로드 시켜야 고객들의 주문에 운송장 번호가 등록되고 배송대기 에서 배송중으로 바뀌기 때문에

프로그램 사용법

  1. IDE에서 해당 코드를 JAR 파일로 만듬
  2. Launch4J 프로그램을 사용하여 JAR 파일을 exe 파일로 변환
  3. 지인 컴퓨터에서 exe 파일을 다운로드 하여 사용
    (※Launch4J를 사용할때 설정을 좀 만져주면 exe 파일로 실행 시켰을때 JRE가 없으면 자동으로 JRE를 다운로드 받을 수 있게 사이트가 열린다.)

사용한 코드 (주석을 달아놓음)

특징

  1. HashMap 사용
    1. 운송장 번호 를 Key 로 해서 주문번호를 알아내기 위해서 HashMap 사용
  2. 등록한 운송장 번호를 관리하기 위해서 ArrayList를 추가로 사용
    1. 등록한 송장번호는 ArrayList에 추가함
  3. 프로그램 종료 전에 스캐너의 nextLine 메서드를 추가해서 에러 발생시에 바로 꺼지지 않고 메세지를 확인 후 꺼지게 만듬
  4. 바코드 리더기에서 \n 까지 입력이 되기 때문에 String.replace 메서드를 이용해서 \n 을 "" 로 변경
  5. Gradle을 사용해서 Build 후 jar 파일로 만듬 -> 다른 컴퓨터에서 사용하기 위해서
  6. OpenCSV , apache.poi 라이브러리를 사용함

더 자세한 내용은 아래의 Github 을 참고해주세요.

Github

https://github.com/Denia-park/CheckDeliNum

Main

    public static void main(String[] args) {
        System.out.println("송장 번호 등록 프로그램을 시작합니다. [ " + PROGRAM_VERSION + " ]");

        HashMap<String, String> hashMap = new HashMap<>(1500);//초기 용량(capacity)지정 , 운송장 번호 를 Key 로 해서 주문번호를 알아내기 위해서 HashMap 사용
        List<String> savedDeliNumList = new ArrayList<>(500);//초기 용량(capacity)지정 , 등록한 운송장 번호를 관리하기 위해서 ArrayList를 추가로 사용
        Scanner sc = new Scanner(System.in); // 사용자로부터 데이터를 받기 위한 Scanner

        String path = System.getProperty("user.dir") + "\\"; //현재 작업 경로
        String fileName = "parcelExcel.xlsx"; //파일명 설정

        XSSFSheet sheetDataFromExcel = readExcel(path, fileName); //엑셀 파일 Read
        if (sheetDataFromExcel == null) { //파일을 못 읽어오면 종료.
            System.out.println("파일을 찾지 못했으므로 프로그램을 종료 합니다.");

            System.out.println("Enter 를 치면 정상 종료됩니다.");
            sc.nextLine(); //프로그램 종료 전 Holding
            return; //프로그램 종료
        }

        saveReadDataToHashMap(sheetDataFromExcel,hashMap); //읽은 엑셀 파일 HashMap으로 저장

        System.out.print("Excel 파일을 읽었습니다. \n\n" +
                "이제 바코드를 입력해주시면 됩니다!!! \n" +
                "===========================================================================\n\n");

        Toolkit toolkit = Toolkit.getDefaultToolkit(); // 비프음 내기 위해서 생성해야할 인스턴스

        while(true){
            //바코드 입력을 무한으로 Read , "qq" 입력이 들어오면 프로그램 종료
            String barcodeNumber = getBarcodeNumber(sc).replace("\n", ""); // \n을 없애고 저장
//            System.out.println(barcodeNumber);
            if (barcodeNumber.equals("qq") || barcodeNumber.equals("QQ")) {
                break;
            }

            //이미 등록된 송장 번호 인지 확인하기.
            if(savedDeliNumList.contains(barcodeNumber)){
                System.out.println("이미 등록된 송장입니다.");
                System.out.println();
                continue;
            }

            //바코드 입력이 들어오면 HashMap에서 주문번호 확인
            ActualData actualData = getActualData(hashMap, barcodeNumber, toolkit);
            if(!actualData.isValidBarcodeNumInHashMap){
                continue;
            }
            //주문번호 확인이 되면 CSV 파일에 내용을 추가 (추가할때 "상품별주문번호"도 추가해줘야함)
            writeDataToCSV(path,actualData,savedDeliNumList);
        }

        System.out.println("오늘 처리한 송장 개수 : "+ completeDeliProduct +" 개 , 사용해주셔서 감사합니다.");
        System.out.println("Enter 를 치면 정상 종료됩니다.");
        sc.nextLine(); //프로그램 종료 전 Holding
    }

Build.gradle

//JAR 파일을 만들기 위해서 필요한 부분
jar {
    manifest {
        attributes 'Main-Class': 'org.example.Main'
    }
    // 이 부분 추가
    from {
        configurations.runtimeClasspath.collect {
            it.isDirectory() ? it : zipTree(it)
        }
    }
    // 이 부분 추가
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

//의존성
dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'

    // https://mvnrepository.com/artifact/com.opencsv/opencsv
    implementation 'com.opencsv:opencsv:5.6'

    // https://mvnrepository.com/artifact/org.apache.poi/poi
    implementation 'org.apache.poi:poi:5.2.2'

    // https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml
    implementation 'org.apache.poi:poi-ooxml:5.2.2'
}
profile
HW -> FW -> Web

0개의 댓글