형식이 다른 여러 엑셀파일들을 하나의 통합 엑셀 양식 자동화 by 파이썬 (2/2)

지난 글에서 언급했듯이 저는 제각기 다른 플랫폼 별 고객정보 엑셀파일을 끌어와서 하나의 통합된 양식의 엑셀 파일로 저장하여, 이를 바로 택배사 송장 출력 시스템으로 간편하게 넣는 자동화를 파이썬 프로그램으로 구현해보고자 하였습니다.

|형식이 다른 여러 엑셀파일들을 하나의 통합 엑셀 양식 자동화 by 파이썬 (1/2)

시간이 없어서 코딩까지 하지 못했지만, 우리 클로드씨가 1~2일면 넉넉하게 만들 수 있다고 자신만만하길래, 아 그런가부다 했는데… (우리의 대화가 이렇게 길어질 줄이야~)


먼저 구현할 파이썬 코드를 순차적으로 시켜보기로 했습니다. 저번에 클로드가 답변주기로는 openpyxl 구현가능하다 했습니다. 그러나, 제가 설명하려는것이 복잡해서, 일단 순차적으로 프롬프트를 줬습니다. 실제사용할 더미파일을 만들어서 데이터를 확인했습니다.



그러니, 바로 코드를 만들어줬습니다. 여기서 첫번째 난관이 발생했죠.



바로 첫번째, 가져온 A 파일이 패스워드가 걸려서 openpyxl로 해결할 수 가 없는 것이었습니다.

재차 클로드에게 해결방법을 물었지만, 계속해서 A파일은 열리지 않았습니다. 시작하자마자 난관에….


코딩천재라는 콜르도의 무책임(?)한 답변에 이리저리 수정해서 물어봤지만 해결이 바로 되지 않았네요.

openpyxl 최신버전임에도 최신버전으로 깔으라는 둥, 암호를 해제한 후 저장하라는둥….



2. 그래서 생각해낸 계책이 챗지피티에게 가서 암호화가 되어있는 엑셀파일을 자동으로 열 수 있는 파이썬 코드를 알려달라고 해봅니다. 기대안했던 챗지피티 동지는 의미심장한 메시지를 던집니다.

“흐흐흐, 다른 라이브러리랑 같이 쓰면 되지~”

openpyxl는 패스워드로 보호된 엑셀 파일을 지원하지 않기 때문에, 대신 msoffcrypto-tool 라이브러리를 사용하여 파일을 먼저 해독한 후 openpyxl로 작업할 수 있습니다.라고합니다.

빙고! msoffcrypto-tool 을 깔고, 다시 클로드씨에게 갑니다.




3. 그리고 다시 클로드에게 암호를 풀 수 있는 코드를 가지고 가서 전체코드를 짜달라고 했습니다.



그랬더니 전체 코드를 다시 짜줍니다.

import os

import msoffcrypto

import openpyxl

import io

# 파일이 위치한 폴더 경로

folder_path = os.path.dirname(os.path.abspath(__file__))

# 각 파일의 필수 포함 문자열

a_file_must_contain = "스마트스토어"

b_file_must_contain = "DeliveryList"

c_file_must_contain = "모카팩토리_주문 내역_"

# A 파일 찾기

a_file = None

for file in os.listdir(folder_path):

    if a_file_must_contain in file and file.endswith(".xlsx"):

        a_file = os.path.join(folder_path, file)

        break

# B 파일 찾기

b_file = None

for file in os.listdir(folder_path):

    if b_file_must_contain in file and file.endswith(".xlsx"):

        b_file = os.path.join(folder_path, file)

        break

# C 파일 찾기

c_file = None

for file in os.listdir(folder_path):

    if c_file_must_contain in file and file.endswith(".xlsx"):

        c_file = os.path.join(folder_path, file)

        break

# 결과물 파일 경로

result_file = os.path.join(folder_path, "result.xlsx")

# 결과물 파일 생성

wb_result = openpyxl.Workbook()

ws_result = wb_result.active

# 헤더 행 추가

ws_result.append(['스토어명', '보내시는분 연락처', '발송지 주소', '받는분성명', '받는분전화번호', 

                  '받는분기타연락처', '받는분우편번호', '받는분 주소(전체)', '받는분주소(세부주소)',

                  '스토어명', '내품명', '내품수량', '박스타입', '배송메세지'])

def process_file(file_path, columns, store_name, password=None):

    try:

        if password:

            # 암호화된 파일 해독

            encrypted_file = msoffcrypto.OfficeFile(open(file_path, "rb"))

            decrypted_stream = io.BytesIO()

            encrypted_file.load_key(password=password)

            encrypted_file.decrypt(decrypted_stream)

            decrypted_stream.seek(0)

            wb = openpyxl.load_workbook(decrypted_stream)

        else:

            wb = openpyxl.load_workbook(file_path)

        ws = wb.active

        

        for row in ws.iter_rows(min_row=2, values_only=True):

            data = [''] * 14

            

            # 고정값 채우기

            data[0] = store_name

            data[1] = '0507-1315-7424'

            data[2] = '경기도 고양시 덕양구 마상로 125 주교대리점'

            data[9] = '모카팩토리'

            

            # 지정된 열 데이터 채우기

            for i, col in enumerate(columns):

                if col is not None:

                    data[i+3] = row[col]

            

            ws_result.append(data)

        

    except Exception as e:

        print(f"Error processing file {file_path}: {str(e)}")

# A 파일 처리

if a_file:

    columns_a = [3, 30, 31, 32, 33, 34, 35, 36, 38]

    process_file(a_file, columns_a, '2H9M(모카팩토리)', password='1111')

else:

    print("A file not found.")

# B 파일 처리

if b_file:

    columns_b = [26, 27, 25, 28, 29, 30, 16, 22]

    process_file(b_file, columns_b, None)

else:

    print("B file not found.")

    

# C 파일 처리

if c_file:

    columns_c = [18, 19, 15, 14, 16, 17, 3, 22]

    process_file(c_file, columns_c, None)

else:

    print("C file not found.")

# 완성된 엑셀 파일 저장

wb_result.save(result_file)

print("작업이 완료되었습니다.")


  1. 이후 자잘한 수정 요구를 하다보니, 시간이 2시간이 넘었네요. 행렬이 잘못 출력되는 부분을 바로 잡다가 보니, 허접한 저도 이렇게 고생하는데 찐 개발자분들은 어떨지. 클로드에게 지적해서 절받는 것도 한두번이지^^요청을 잘못하는 저는 머리가 고생합니다~






  1. 여기서 어찌저차 해서 A,B,C 플랫폼에서 가져온 각각의 파일들을 D라는 엑셀시트에 제대로 합치는 것을 성공했습니다. 문제는 한 열의 데이터를 내가 지시한대로 수정을 하지 못하고 하지 못하는 것이었습니다. 사실 큰 부분은 아니었는데, 10% 부족한 부분을 고치고 싶어서 드잡이질을 했습니다.


대화량이 늘다보니, 클로드가 기억력이 떨어지는 것같은 느낌이 들어 대화창을 새롭게 열어 기존 코드내용을 전달하고 내가 원하는 사항을 다시 말했습니다.

코드를 분리했다가 다시 합쳤다가 난리도 아니었네요, 초보자에겐 이것조차 빡씨네요.

나중엔 클로드한테 화냄^^



6. 그러다 결국 소 뒷걸음치다가 쥐잡은 격으로 결국 4시간만에 성공. 바보같쥬ㅜ 그래도 그냥 자려다가 끝장보고 만다 해서 완벽하게 마무리했더니 속이 씌원합니다.



  1. 여기서 끝낼 수는 없죠. 공언한대로 GUI를 붙여보기로 합니다. GUI 코드를 만들고 이를 EXE 실행파일로 구현 해달라고 합니다.



    엇 잘되네요 :) GUI는 pyinstaller 를 사용해서 심플(?)하게 만들었습니다.


    잘 취합되었습니다. 아래 데이터는 더미라서 노출되도 괜찮습니다.


  2. 자 이제는 하나 더!! 소잡는 칼을 닭잡는데 써봅니다. 지피터스에서 알게된 streamlit 패키지로 씌워봅니다.



    오히려 후반부가 더 쉽네요.


    —-
    뭐라 그럴까 대단한 작업은 절대아닌데, 뭔가 결과물이 나오는 재미는 좋네요^^ 클로드로 코드를 만들어보는 게 처음이라 그런가요, 아직 많이 부실합니다. 일주일에 한번이라도 연습해봐야겠어요. #10기로우코드

6
4개의 답글

👉 이 게시글도 읽어보세요