2025.02.23 - [파이썬 업무 자동화/한글 문서 작업 자동화] - 파이썬 한글 문서 매크로 제작기 - 2. 내용 바꾸기

 

파이썬 한글 문서 매크로 제작기 - 2. 내용 바꾸기

2025.02.23 - [파이썬 업무 자동화/한글 문서 작업 자동화] - 파이썬 한글 문서 매크로 제작기 - 1. 개발 환경 설정(1) 파이썬 한글 문서 매크로 제작기 - 1. 개발 환경 설정(1)뭔가를 시작하는 일은 막

sunnysides.tistory.com

 

처음부터 차근차근 읽지 말고 쭉 훑어보고 필요한 부분만 찬찬히(?) 읽어 보시길 추천드립니다.

 

2편에 이어 3편은 엑셀로 갖고 있는 회사명을 코드로 갖고 오는 과정입니다.

회사 목록 엑셀 파일을 파이썬 코드로 갖고 오기

 

지난 번 말씀 드렸듯, 코딩은 언제나 알고리즘이 우선입니다. 항상 '어떻게 해야 멍청한 컴퓨터가 내가 하는 작업을 잘 알아들을까?'라는 고민을 먼저 한 후에 코딩을 시작해야 효율이 좋아지기 마련이죠.

 

 이번 프로젝트는 한글 문서 양식에서 회사명을 바꿔가며 서로 다른 이름의 pdf 파일로 저장하고, 메일로 보내는 작업까지 진행할 예정입니다.

 

일단 시작하기에 앞서 아주아주 기초적인 사용법은 익혔기 때문에, 약간의 마음의 여유를 갖고 알고리즘을 고민할 시기가 왔습니다.

 

우리는 한글 문서 양식과 엑셀 회사명 목록을 갖고 있고, 알고리즘을 생각하면

1. 엑셀 파일을 열어 회사 목록을 가져온다.

2. 한글 파일을 열어 앞서 구한 회사명을 입력한다.

3. 수정된 한글 파일을 pdf로 저장한다.

4. pdf 파일을 메일로 첨부해서 보낸다.

 

이런 순서가 될 것 같죠?

 

우리는 1편과 2편에서 위 목록의 2번 한글 파일을 다루는 방법을 익혔습니다. 왜냐하면 1번은 쉽기 때문이죠.(진지)

 

ㅋㅋㅋ1번이 쉬운 이유는 엑셀은 무려 세계적인 프로그램(!)이기 떄문이죠... 아래한글은 우리나라만 쓰는데.... 그러면서 범용성도 꾸진......쿨럭

 

아무튼 다시 본론으로 돌아가서, 회사명이 들어 있는 엑셀 파일을 먼저 살펴봅시다.

그림 1. 회사명.xlsx

 

엑셀은 다들 아시다시피 파일 안에 여러 시트가 들어있는 구조로 되어 있습니다. 파이썬은 화면을 바로 클릭할 수 없기 때문에 시트 정보를 이용해 내용을 처리해야 한답니다.

 

그 다음은 언제나처럼 우리의 구세주(제발)가 되어주던 챗지피티!

그림 2. 엑셀 지피티
그림 3. 엑셀 지피티 2

openpyxl 또는 pandas를 쓰라네요. 우리는 둘 다 모르니 뭔가 있어 보이는 openpyxl을 쓰도록 하겠습니다.

from openpyxl import load_workbook

# 🔹 ① 엑셀 파일 열기
file_path = r"D:/한글 양식 자동화/회사이름.xlsx"
wb = load_workbook(file_path)  # 엑셀 파일 로드
ws = wb.active  # 기본 활성화된 시트 선택

# 🔹 ② 특정 셀 값 읽기 (A1 셀)
print(ws["A1"].value)  # 첫 번째 셀 값 출력

# # 🔹 ③ 특정 셀 값 변경 후 저장
# ws["A1"] = "새로운 값"
# wb.save(r"C:\경로\새로운_파일.xlsx")

응용을 위해 한 줄 단위로 사용해 보겠습니다. 일단 값을 읽고, 다른 값으로 바꿔서 저장하는 코드를 준 것 같은데, 우리는 여러 개 값을 읽어오는 게 목표기 때문에 일단 저장하는 부분은 주석 처리 후 하나만 읽어 보겠습니다.

그림 4. 짜잔

ws["A1"].value를 하면 A1 값이 보이네요. 먼저 데이터가 총 몇 행인지 알아봅시다.

그림 6. 얘로 간다

사실 총 세 가지를 주던데, '회사명' 열에 있는 데이터만 확인하고 가져오면 되겠죠? 고로 두 번째 방식으로 가겠습니다.

from openpyxl import load_workbook

# 🔹 ① 엑셀 파일 열기
file_path = r"D:/한글 양식 자동화/회사이름.xlsx"
wb = load_workbook(file_path)  # 엑셀 파일 로드
ws = wb.active  # 기본 활성화된 시트 선택

# 🔹 ② 특정 셀 값 읽기 (A1 셀)
print(ws["A1"].value)  # 첫 번째 셀 값 출력
# len(ws)

total_rows = sum(1 for row in ws["B"] if row.value is not None)
print(f"A열의 데이터 개수: {total_rows}줄")

# # 🔹 ③ 특정 셀 값 변경 후 저장
# ws["A1"] = "새로운 값"
# wb.save(r"C:\경로\새로운_파일.xlsx")

저장을 하는 건 결국 마지막 단계일 테니 중간에 끼워 넣겠습니다.

그림 7. 오 된다

우린 데이터가 총 4개 여야 하는데, 5줄이라 나오죠? 첫 줄도 포함하는가 보네...하면서 야매로 -1을 해줍시다.

from openpyxl import load_workbook

# 🔹 ① 엑셀 파일 열기
file_path = r"D:/한글 양식 자동화/회사이름.xlsx"
wb = load_workbook(file_path)  # 엑셀 파일 로드
ws = wb.active  # 기본 활성화된 시트 선택

# 🔹 ② 특정 셀 값 읽기 (A1 셀)
print(ws["A1"].value)  # 첫 번째 셀 값 출력
# len(ws)

total_rows = sum(1 for row in ws["B"] if row.value is not None)
print(f"A열의 데이터 개수: {total_rows-1}줄")

# # 🔹 ③ 특정 셀 값 변경 후 저장
# ws["A1"] = "새로운 값"
# wb.save(r"C:\경로\새로운_파일.xlsx")

뭔가 바꼇습니다. 대충 total_rows에 1을 빼면 되니 그 자리에 일단 넣어봤더니 되는군요. 굳

그림 8. 야매로 갯수 맞추기

다음으로 넘어가기 전에 python의 기초적인 반복문을 알아보겠습니다. 파이썬에서 반복문은 for라는 놈을 쓴다고 생각하시면 됩니다. for 구문은

for (변수 이름) in (변수 범위):
(반복할 내용)

의 구조로 이뤄져 있습니다.

변수 이름은 보통 몇 번째인지를 index라고 해서 i 라 하고, 밑의 양식을 따른답니다.

company_list = []

for i in range(total_rows-1):
    company_list += [ws['B%s'%(i+2)].value]
    # company_list += [ws['B'+str(i+2)].value]

요기서 뜬금 없이 등장한 %는 파이썬에서 글자에 임의의 변수를 넣는 방식이랍니다. 바로 밑의 주석 처리 된 부분과 같은 의미에요. 요기는 파이썬 문법이기 때문에 이번 글에서는 넘어가도록 하겠습니다..만 간단하게 설명하자면,

1. 빈 리스트 만들기
2. 총 데이터 행 수만큼 반복하기
3. 앞서 만든 리스트에 B(숫자) 위치의 데이터 추가하기

순서로 이뤄진 코드랍니다. 자세한 사용법(?)이 궁금하신 분들은 파이썬 기본 문법을 익히시면 된답니다. 저는 위키독스를 스승님으로 모시고 있...ㅋㅋㅋ

https://wikidocs.net/book/1

 

점프 투 파이썬

이 책은 파이썬이란 언어를 처음 접해보는 독자들과 프로그래밍을 한 번도 해 본적이 없는 사람들을 대상으로 한다. 프로그래밍을 할 때 사용되는 전문적인 용어들을 알기 쉽게 풀어서 …

wikidocs.net

책 사세요 여러분. 제 책은 아닙니다... 제 마음 속 스승님께 커피 한 잔이라도...

사실 '파이썬 % 뜻' 이렇게 검색해도 나온답니다ㅋㅋㅋ

아무튼 위의 코드를 조합하면

그림 9. 변수 리스트가 만들어졌다!

이렇게 데이터를 쫘라락 뽑을 수 있습니다!!

from openpyxl import load_workbook

# 🔹 ① 엑셀 파일 열기
file_path = r"D:/한글 양식 자동화/회사이름.xlsx"
wb = load_workbook(file_path)  # 엑셀 파일 로드
ws = wb.active  # 기본 활성화된 시트 선택

# 🔹 ② 특정 셀 값 읽기 (A1 셀)
# print(ws["A1"].value)  # 첫 번째 셀 값 출력
# len(ws)

total_rows = sum(1 for row in ws["B"] if row.value is not None)
# print(f"A열의 데이터 개수: {total_rows-1}줄")

company_list = []

for i in range(total_rows-1):
    company_list += [ws['B%s'%(i+2)].value]
    
    # company_list += [ws['B'+str(i+2)].value]
    


# # 🔹 ③ 특정 셀 값 변경 후 저장
# ws["A1"] = "새로운 값"
# wb.save(r"C:\경로\새로운_파일.xlsx")

정리하자면 이렇게 간단한(?) 코드가 완성된답니다.

주석 처리된 부분은 전부 지워도 되기 때문에 사실은 엄청 간단한 코드가 된다는 것~

+ Recent posts